diff --git a/.hgignore b/.hgignore
index 454be00dbffc27a0c6969fb3561556f08d5c1d96..e390f591e576abb75b643a4862d097e1ca33ca68 100644
--- a/.hgignore
+++ b/.hgignore
@@ -7,6 +7,8 @@ syntax: glob
 # Emacs temp files
 *~
 .*.swp
+#OSX image cache file
+*.DS_Store
 LICENSES
 indra/.distcc
 indra/build-darwin-*
@@ -48,3 +50,7 @@ tarfile_tmp
 ^indra/web/dataservice/lib/shared/vault.*
 ^indra/web/dataservice/vendor.*
 glob:indra/newview/dbghelp.dll
+glob:*.cpp.orig
+glob:*.cpp.bak
+glob:*.h.bak
+glob:*.h.orig
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 942ba0f0b9727b55fd8a2b8ac60ee8ff3dd5c8e0..4b36c44a5f7b5921e3a5ea110c2807ebd7fab119 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -139,6 +139,7 @@ Blakar Ogre
 blino Nakamura
 	VWR-17
 Boroondas Gupte
+	SNOW-278
 	VWR-233
 	WEB-262
 Bulli Schumann
@@ -296,6 +297,7 @@ Jacek Antonelli
 	VWR-2947
 	VWR-2948
 	VWR-3605
+	VWR-8617
 JB Kraft
 	VWR-5283
 	VWR-7802
@@ -372,6 +374,7 @@ Michelle2 Zenovka
 	VWR-8310
 	VWR-9499
 Mm Alder
+	VWR-197
 	VWR-3777
 	VWR-4794
 	VWR-13578
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index 17bce6f43445792c586a0644880e59ba955b1c8a..fff78ecbe330e1ecabcde00276c154ae37407eff 100644
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -1,111 +1,111 @@
-#!/usr/bin/python
-"""\
-@file   run_build_test.py
-@author Nat Goodspeed
-@date   2009-09-03
-@brief  Helper script to allow CMake to run some command after setting
-        environment variables.
-
-CMake has commands to run an external program. But remember that each CMake
-command must be backed by multiple build-system implementations. Unfortunately
-it seems CMake can't promise that every target build system can set specified
-environment variables before running the external program of interest.
-
-This helper script is a workaround. It simply sets the requested environment
-variables and then executes the program specified on the rest of its command
-line.
-
-Example:
-
-python run_build_test.py -DFOO=bar myprog somearg otherarg
-
-sets environment variable FOO=bar, then runs:
-myprog somearg otherarg
-
-$LicenseInfo:firstyear=2009&license=internal$
-Copyright (c) 2009, Linden Research, Inc.
-$/LicenseInfo$
-"""
-
-import os
-import sys
-import subprocess
-
-def main(command, libpath=[], vars={}):
-    """Pass:
-    command is a sequence (e.g. a list) of strings. The first item in the list
-    must be the command name, the rest are its arguments.
-
-    libpath is a sequence of directory pathnames. These will be appended to
-    the platform-specific dynamic library search path environment variable.
-
-    vars is a dict of arbitrary (var, value) pairs to be added to the
-    environment before running 'command'.
-
-    This function runs the specified command, waits for it to terminate and
-    returns its return code. This will be negative if the command terminated
-    with a signal, else it will be the process's specified exit code.
-    """
-    # Handle platform-dependent libpath first.
-    if sys.platform == "win32":
-        lpvars = ["PATH"]
-    elif sys.platform == "darwin":
-        lpvars = ["LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH"]
-    elif sys.platform.startswith("linux"):
-        lpvars = ["LD_LIBRARY_PATH"]
-    else:
-        # No idea what the right pathname might be! But only crump if this
-        # feature is requested.
-        if libpath:
-            raise NotImplemented("run_build_test: unknown platform %s" % sys.platform)
-        lpvars = []
-    for var in lpvars:
-        # Split the existing path. Bear in mind that the variable in question
-        # might not exist; instead of KeyError, just use an empty string.
-        dirs = os.environ.get(var, "").split(os.pathsep)
-        # Append the sequence in libpath
-##         print "%s += %r" % (var, libpath)
-        dirs.extend(libpath)
-        # Now rebuild the path string. This way we use a minimum of separators
-        # -- and we avoid adding a pointless separator when libpath is empty.
-        os.environ[var] = os.pathsep.join(dirs)
-    # Now handle arbitrary environment variables. The tricky part is ensuring
-    # that all the keys and values we try to pass are actually strings.
-##     if vars:
-##         print "Setting:"
-##         for key, value in vars.iteritems():
-##             print "%s=%s" % (key, value)
-    os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
-    # Run the child process.
-##     print "Running: %s" % " ".join(command)
-    return subprocess.call(command)
-
-if __name__ == "__main__":
-    from optparse import OptionParser
-    parser = OptionParser(usage="usage: %prog [options] command args...")
-    # We want optparse support for the options we ourselves handle -- but we
-    # DO NOT want it looking at options for the executable we intend to run,
-    # rejecting them as invalid because we don't define them. So configure the
-    # parser to stop looking for options as soon as it sees the first
-    # positional argument (traditional Unix syntax).
-    parser.disable_interspersed_args()
-    parser.add_option("-D", "--define", dest="vars", default=[], action="append",
-                      metavar="VAR=value",
-                      help="Add VAR=value to the env variables defined")
-    parser.add_option("-l", "--libpath", dest="libpath", default=[], action="append",
-                      metavar="DIR",
-                      help="Add DIR to the platform-dependent DLL search path")
-    opts, args = parser.parse_args()
-    # What we have in opts.vars is a list of strings of the form "VAR=value"
-    # or possibly just "VAR". What we want is a dict. We can build that dict by
-    # constructing a list of ["VAR", "value"] pairs -- so split each
-    # "VAR=value" string on the '=' sign (but only once, in case we have
-    # "VAR=some=user=string"). To handle the case of just "VAR", append "" to
-    # the list returned by split(), then slice off anything after the pair we
-    # want.
-    rc = main(command=args, libpath=opts.libpath,
-              vars=dict([(pair.split('=', 1) + [""])[:2] for pair in opts.vars]))
-    if rc not in (None, 0):
-        print >>sys.stderr, "Failure running: %s" % " ".join(args)
-        print >>sys.stderr, "Error: %s" % rc
-    sys.exit((rc < 0) and 255 or rc)
+#!/usr/bin/python
+"""\
+@file   run_build_test.py
+@author Nat Goodspeed
+@date   2009-09-03
+@brief  Helper script to allow CMake to run some command after setting
+        environment variables.
+
+CMake has commands to run an external program. But remember that each CMake
+command must be backed by multiple build-system implementations. Unfortunately
+it seems CMake can't promise that every target build system can set specified
+environment variables before running the external program of interest.
+
+This helper script is a workaround. It simply sets the requested environment
+variables and then executes the program specified on the rest of its command
+line.
+
+Example:
+
+python run_build_test.py -DFOO=bar myprog somearg otherarg
+
+sets environment variable FOO=bar, then runs:
+myprog somearg otherarg
+
+$LicenseInfo:firstyear=2009&license=internal$
+Copyright (c) 2009, Linden Research, Inc.
+$/LicenseInfo$
+"""
+
+import os
+import sys
+import subprocess
+
+def main(command, libpath=[], vars={}):
+    """Pass:
+    command is a sequence (e.g. a list) of strings. The first item in the list
+    must be the command name, the rest are its arguments.
+
+    libpath is a sequence of directory pathnames. These will be appended to
+    the platform-specific dynamic library search path environment variable.
+
+    vars is a dict of arbitrary (var, value) pairs to be added to the
+    environment before running 'command'.
+
+    This function runs the specified command, waits for it to terminate and
+    returns its return code. This will be negative if the command terminated
+    with a signal, else it will be the process's specified exit code.
+    """
+    # Handle platform-dependent libpath first.
+    if sys.platform == "win32":
+        lpvars = ["PATH"]
+    elif sys.platform == "darwin":
+        lpvars = ["LD_LIBRARY_PATH", "DYLD_LIBRARY_PATH"]
+    elif sys.platform.startswith("linux"):
+        lpvars = ["LD_LIBRARY_PATH"]
+    else:
+        # No idea what the right pathname might be! But only crump if this
+        # feature is requested.
+        if libpath:
+            raise NotImplemented("run_build_test: unknown platform %s" % sys.platform)
+        lpvars = []
+    for var in lpvars:
+        # Split the existing path. Bear in mind that the variable in question
+        # might not exist; instead of KeyError, just use an empty string.
+        dirs = os.environ.get(var, "").split(os.pathsep)
+        # Append the sequence in libpath
+##         print "%s += %r" % (var, libpath)
+        dirs.extend(libpath)
+        # Now rebuild the path string. This way we use a minimum of separators
+        # -- and we avoid adding a pointless separator when libpath is empty.
+        os.environ[var] = os.pathsep.join(dirs)
+    # Now handle arbitrary environment variables. The tricky part is ensuring
+    # that all the keys and values we try to pass are actually strings.
+##     if vars:
+##         print "Setting:"
+##         for key, value in vars.iteritems():
+##             print "%s=%s" % (key, value)
+    os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
+    # Run the child process.
+##     print "Running: %s" % " ".join(command)
+    return subprocess.call(command)
+
+if __name__ == "__main__":
+    from optparse import OptionParser
+    parser = OptionParser(usage="usage: %prog [options] command args...")
+    # We want optparse support for the options we ourselves handle -- but we
+    # DO NOT want it looking at options for the executable we intend to run,
+    # rejecting them as invalid because we don't define them. So configure the
+    # parser to stop looking for options as soon as it sees the first
+    # positional argument (traditional Unix syntax).
+    parser.disable_interspersed_args()
+    parser.add_option("-D", "--define", dest="vars", default=[], action="append",
+                      metavar="VAR=value",
+                      help="Add VAR=value to the env variables defined")
+    parser.add_option("-l", "--libpath", dest="libpath", default=[], action="append",
+                      metavar="DIR",
+                      help="Add DIR to the platform-dependent DLL search path")
+    opts, args = parser.parse_args()
+    # What we have in opts.vars is a list of strings of the form "VAR=value"
+    # or possibly just "VAR". What we want is a dict. We can build that dict by
+    # constructing a list of ["VAR", "value"] pairs -- so split each
+    # "VAR=value" string on the '=' sign (but only once, in case we have
+    # "VAR=some=user=string"). To handle the case of just "VAR", append "" to
+    # the list returned by split(), then slice off anything after the pair we
+    # want.
+    rc = main(command=args, libpath=opts.libpath,
+              vars=dict([(pair.split('=', 1) + [""])[:2] for pair in opts.vars]))
+    if rc not in (None, 0):
+        print >>sys.stderr, "Failure running: %s" % " ".join(args)
+        print >>sys.stderr, "Error: %s" % rc
+    sys.exit((rc < 0) and 255 or rc)
diff --git a/indra/llcharacter/llvisualparam.h b/indra/llcharacter/llvisualparam.h
index affc49debfecfabe30852965e747046bf69ebec3..eec56d78443d010db7df8b1e2f05b39ecd241a63 100644
--- a/indra/llcharacter/llvisualparam.h
+++ b/indra/llcharacter/llvisualparam.h
@@ -151,7 +151,7 @@ class LLVisualParam
 	virtual void			setAnimating(BOOL is_animating) { mIsAnimating = is_animating && !mIsDummy; }
 	BOOL					getAnimating() const { return mIsAnimating; }
 
-	void					setIsDummy(BOOL is_self) { mIsDummy = is_self; }
+	void					setIsDummy(BOOL is_dummy) { mIsDummy = is_dummy; }
 
 protected:
 	F32					mCurWeight;			// current weight
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index e7aaf3c984de74f5c3ed45d38b50cdb7931273a6..f7856986121958e39e123447888cab3bd6d1c377 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -50,6 +50,7 @@ set(llcommon_SOURCE_FILES
     llfile.cpp
     llfindlocale.cpp
     llfixedbuffer.cpp
+    llfoldertype.cpp
     llformat.cpp
     llframetimer.cpp
     llheartbeat.cpp
@@ -150,6 +151,7 @@ set(llcommon_HEADER_FILES
     llfile.h
     llfindlocale.h
     llfixedbuffer.h
+    llfoldertype.h
     llformat.h
     llframetimer.h
     llhash.h
diff --git a/indra/llcommon/llallocator.h b/indra/llcommon/llallocator.h
index 0d6f18c5d47a80cc06499df7b2e50eddd0ce0ffd..50129b4526d7d2bb4ac4120cedc352fda79cfc06 100644
--- a/indra/llcommon/llallocator.h
+++ b/indra/llcommon/llallocator.h
@@ -1,63 +1,63 @@
-/** 
- * @file llallocator.h
- * @brief Declaration of the LLAllocator class.
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * 
- * Copyright (c) 2009-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLALLOCATOR_H
-#define LL_LLALLOCATOR_H
-
-#include <string>
-
-#include "llmemtype.h"
-#include "llallocator_heap_profile.h"
-
-class LL_COMMON_API LLAllocator {
-    friend class LLMemoryView;
-    friend class LLMemType;
-
-private:
-	static void pushMemType(S32 type);
-	static S32 popMemType();
-
-public:
-    void setProfilingEnabled(bool should_enable);
-
-    static bool isProfiling();
-
-    LLAllocatorHeapProfile const & getProfile();
-
-private:
-    std::string getRawProfile();
-
-private:
-    LLAllocatorHeapProfile mProf;
-};
-
-#endif // LL_LLALLOCATOR_H
+/** 
+ * @file llallocator.h
+ * @brief Declaration of the LLAllocator class.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLALLOCATOR_H
+#define LL_LLALLOCATOR_H
+
+#include <string>
+
+#include "llmemtype.h"
+#include "llallocator_heap_profile.h"
+
+class LL_COMMON_API LLAllocator {
+    friend class LLMemoryView;
+    friend class LLMemType;
+
+private:
+	static void pushMemType(S32 type);
+	static S32 popMemType();
+
+public:
+    void setProfilingEnabled(bool should_enable);
+
+    static bool isProfiling();
+
+    LLAllocatorHeapProfile const & getProfile();
+
+private:
+    std::string getRawProfile();
+
+private:
+    LLAllocatorHeapProfile mProf;
+};
+
+#endif // LL_LLALLOCATOR_H
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index 0898aeec470e26e02717b8dddf03352f6e8c2373..a1fcd2cf8ddd0814d7c374da579f4d1285ba0882 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -1,259 +1,259 @@
-/** 
- * @file llapr.h
- * @author Phoenix
- * @date 2004-11-28
- * @brief Helper functions for using the apache portable runtime library.
- *
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- * 
- * Copyright (c) 2004-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLAPR_H
-#define LL_LLAPR_H
-
-#if LL_LINUX || LL_SOLARIS
-#include <sys/param.h>  // Need PATH_MAX in APR headers...
-#endif
-
-#include <boost/noncopyable.hpp>
-
-#include "apr_thread_proc.h"
-#include "apr_thread_mutex.h"
-#include "apr_getopt.h"
-#include "apr_signal.h"
-#include "apr_atomic.h"
-#include "llstring.h"
-
-extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp;
-extern apr_thread_mutex_t* gCallStacksLogMutexp;
-
-/** 
- * @brief initialize the common apr constructs -- apr itself, the
- * global pool, and a mutex.
- */
-void LL_COMMON_API ll_init_apr();
-
-/** 
- * @brief Cleanup those common apr constructs.
- */
-void LL_COMMON_API ll_cleanup_apr();
-
-//
-//LL apr_pool
-//manage apr_pool_t, destroy allocated apr_pool in the destruction function.
-//
-class LL_COMMON_API LLAPRPool
-{
-public:
-	LLAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE) ;
-	~LLAPRPool() ;
-
-	apr_pool_t* getAPRPool() ;
-	apr_status_t getStatus() {return mStatus ; }
-
-protected:
-	void releaseAPRPool() ;
-	void createAPRPool() ;
-
-protected:
-	apr_pool_t*  mPool ;              //pointing to an apr_pool
-	apr_pool_t*  mParent ;			  //parent pool
-	apr_size_t   mMaxSize ;           //max size of mPool, mPool should return memory to system if allocated memory beyond this limit. However it seems not to work.
-	apr_status_t mStatus ;            //status when creating the pool
-	BOOL         mReleasePoolFlag ;   //if set, mPool is destroyed when LLAPRPool is deleted. default value is true.
-};
-
-//
-//volatile LL apr_pool
-//which clears memory automatically.
-//so it can not hold static data or data after memory is cleared
-//
-class LL_COMMON_API LLVolatileAPRPool : public LLAPRPool
-{
-public:
-	LLVolatileAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE);
-	~LLVolatileAPRPool(){}
-
-	apr_pool_t* getVolatileAPRPool() ;
-	
-	void        clearVolatileAPRPool() ;
-
-	BOOL        isFull() ;
-	BOOL        isEmpty() {return !mNumActiveRef ;}
-private:
-	S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool.
-	S32 mNumTotalRef ;  //number of total pointers pointing to the apr_pool since last creating.   
-} ;
-
-/** 
- * @class LLScopedLock
- * @brief Small class to help lock and unlock mutexes.
- *
- * This class is used to have a stack level lock once you already have
- * an apr mutex handy. The constructor handles the lock, and the
- * destructor handles the unlock. Instances of this class are
- * <b>not</b> thread safe.
- */
-class LL_COMMON_API LLScopedLock : private boost::noncopyable
-{
-public:
-	/**
-	 * @brief Constructor which accepts a mutex, and locks it.
-	 *
-	 * @param mutex An allocated APR mutex. If you pass in NULL,
-	 * this wrapper will not lock.
-	 */
-	LLScopedLock(apr_thread_mutex_t* mutex);
-
-	/**
-	 * @brief Destructor which unlocks the mutex if still locked.
-	 */
-	~LLScopedLock();
-
-	/** 
-	 * @brief Check lock.
-	 */
-	bool isLocked() const { return mLocked; }
-
-	/** 
-	 * @brief This method unlocks the mutex.
-	 */
-	void unlock();
-
-protected:
-	bool mLocked;
-	apr_thread_mutex_t* mMutex;
-};
-
-template <typename Type> class LLAtomic32
-{
-public:
-	LLAtomic32<Type>() {};
-	LLAtomic32<Type>(Type x) {apr_atomic_set32(&mData, apr_uint32_t(x)); };
-	~LLAtomic32<Type>() {};
-
-	operator const Type() { apr_uint32_t data = apr_atomic_read32(&mData); return Type(data); }
-	Type operator =(const Type& x) { apr_atomic_set32(&mData, apr_uint32_t(x)); return Type(mData); }
-	void operator -=(Type x) { apr_atomic_sub32(&mData, apr_uint32_t(x)); }
-	void operator +=(Type x) { apr_atomic_add32(&mData, apr_uint32_t(x)); }
-	Type operator ++(int) { return apr_atomic_inc32(&mData); } // Type++
-	Type operator --(int) { return apr_atomic_dec32(&mData); } // Type--
-	
-private:
-	apr_uint32_t mData;
-};
-
-typedef LLAtomic32<U32> LLAtomicU32;
-typedef LLAtomic32<S32> LLAtomicS32;
-
-// File IO convenience functions.
-// Returns NULL if the file fails to openm sets *sizep to file size of not NULL
-// abbreviated flags
-#define LL_APR_R (APR_READ) // "r"
-#define LL_APR_W (APR_CREATE|APR_TRUNCATE|APR_WRITE) // "w"
-#define LL_APR_RB (APR_READ|APR_BINARY) // "rb"
-#define LL_APR_WB (APR_CREATE|APR_TRUNCATE|APR_WRITE|APR_BINARY) // "wb"
-#define LL_APR_RPB (APR_READ|APR_WRITE|APR_BINARY) // "r+b"
-#define LL_APR_WPB (APR_CREATE|APR_TRUNCATE|APR_READ|APR_WRITE|APR_BINARY) // "w+b"
-
-//
-//apr_file manager
-//which: 1)only keeps one file open;
-//       2)closes the open file in the destruction function
-//       3)informs the apr_pool to clean the memory when the file is closed.
-//Note: please close an open file at the earliest convenience. 
-//      especially do not put some time-costly operations between open() and close().
-//      otherwise it might lock the APRFilePool.
-//there are two different apr_pools the APRFile can use:
-//      1, a temperary pool passed to an APRFile function, which is used within this function and only once.
-//      2, a global pool.
-//
-class LL_COMMON_API LLAPRFile
-{
-private:
-	apr_file_t* mFile ;
-	LLVolatileAPRPool *mCurrentFilePoolp ; //currently in use apr_pool, could be one of them: sAPRFilePoolp, or a temp pool. 
-
-public:
-	LLAPRFile() ;
-	~LLAPRFile() ;
-
-	apr_status_t open(LLVolatileAPRPool* pool, const std::string& filename, apr_int32_t flags, S32* sizep = NULL);
-	apr_status_t open(const std::string& filename, apr_int32_t flags, apr_pool_t* pool = NULL, S32* sizep = NULL);
-	apr_status_t close() ;
-
-	// Returns actual offset, -1 if seek fails
-	S32 seek(apr_seek_where_t where, S32 offset);
-	apr_status_t eof() { return apr_file_eof(mFile);}
-
-	// Returns bytes read/written, 0 if read/write fails:
-	S32 read(void* buf, S32 nbytes);
-	S32 write(const void* buf, S32 nbytes);
-	
-	apr_file_t* getFileHandle() {return mFile;}	
-
-private:
-	apr_pool_t* getAPRFilePool(apr_pool_t* pool) ;
-
-//
-//*******************************************************************************************************************************
-//static components
-//
-public:
-	static LLVolatileAPRPool *sAPRFilePoolp ; //a global apr_pool for APRFile, which is used only when local pool does not exist.
-
-private:
-	static apr_file_t* open(const std::string& filename, LLVolatileAPRPool* pool, apr_int32_t flags);
-	static apr_status_t close(apr_file_t* file, LLVolatileAPRPool* pool) ;
-	static S32 seek(apr_file_t* file, apr_seek_where_t where, S32 offset);
-public:
-	// returns false if failure:
-	static bool remove(const std::string& filename, LLVolatileAPRPool* pool = NULL);
-	static bool rename(const std::string& filename, const std::string& newname, LLVolatileAPRPool* pool = NULL);
-	static bool isExist(const std::string& filename, LLVolatileAPRPool* pool = NULL, apr_int32_t flags = APR_READ);
-	static S32 size(const std::string& filename, LLVolatileAPRPool* pool = NULL);
-	static bool makeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
-	static bool removeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
-
-	// Returns bytes read/written, 0 if read/write fails:
-	static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);	
-	static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);	
-//*******************************************************************************************************************************
-};
-
-/**
- * @brief Function which approprately logs error or remains quiet on
- * APR_SUCCESS.
- * @return Returns <code>true</code> if status is an error condition.
- */
-bool LL_COMMON_API ll_apr_warn_status(apr_status_t status);
-
-void LL_COMMON_API ll_apr_assert_status(apr_status_t status);
-
-extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool
-
-#endif // LL_LLAPR_H
+/** 
+ * @file llapr.h
+ * @author Phoenix
+ * @date 2004-11-28
+ * @brief Helper functions for using the apache portable runtime library.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLAPR_H
+#define LL_LLAPR_H
+
+#if LL_LINUX || LL_SOLARIS
+#include <sys/param.h>  // Need PATH_MAX in APR headers...
+#endif
+
+#include <boost/noncopyable.hpp>
+
+#include "apr_thread_proc.h"
+#include "apr_thread_mutex.h"
+#include "apr_getopt.h"
+#include "apr_signal.h"
+#include "apr_atomic.h"
+#include "llstring.h"
+
+extern LL_COMMON_API apr_thread_mutex_t* gLogMutexp;
+extern apr_thread_mutex_t* gCallStacksLogMutexp;
+
+/** 
+ * @brief initialize the common apr constructs -- apr itself, the
+ * global pool, and a mutex.
+ */
+void LL_COMMON_API ll_init_apr();
+
+/** 
+ * @brief Cleanup those common apr constructs.
+ */
+void LL_COMMON_API ll_cleanup_apr();
+
+//
+//LL apr_pool
+//manage apr_pool_t, destroy allocated apr_pool in the destruction function.
+//
+class LL_COMMON_API LLAPRPool
+{
+public:
+	LLAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE) ;
+	~LLAPRPool() ;
+
+	apr_pool_t* getAPRPool() ;
+	apr_status_t getStatus() {return mStatus ; }
+
+protected:
+	void releaseAPRPool() ;
+	void createAPRPool() ;
+
+protected:
+	apr_pool_t*  mPool ;              //pointing to an apr_pool
+	apr_pool_t*  mParent ;			  //parent pool
+	apr_size_t   mMaxSize ;           //max size of mPool, mPool should return memory to system if allocated memory beyond this limit. However it seems not to work.
+	apr_status_t mStatus ;            //status when creating the pool
+	BOOL         mReleasePoolFlag ;   //if set, mPool is destroyed when LLAPRPool is deleted. default value is true.
+};
+
+//
+//volatile LL apr_pool
+//which clears memory automatically.
+//so it can not hold static data or data after memory is cleared
+//
+class LL_COMMON_API LLVolatileAPRPool : public LLAPRPool
+{
+public:
+	LLVolatileAPRPool(apr_pool_t *parent = NULL, apr_size_t size = 0, BOOL releasePoolFlag = TRUE);
+	~LLVolatileAPRPool(){}
+
+	apr_pool_t* getVolatileAPRPool() ;
+	
+	void        clearVolatileAPRPool() ;
+
+	BOOL        isFull() ;
+	BOOL        isEmpty() {return !mNumActiveRef ;}
+private:
+	S32 mNumActiveRef ; //number of active pointers pointing to the apr_pool.
+	S32 mNumTotalRef ;  //number of total pointers pointing to the apr_pool since last creating.   
+} ;
+
+/** 
+ * @class LLScopedLock
+ * @brief Small class to help lock and unlock mutexes.
+ *
+ * This class is used to have a stack level lock once you already have
+ * an apr mutex handy. The constructor handles the lock, and the
+ * destructor handles the unlock. Instances of this class are
+ * <b>not</b> thread safe.
+ */
+class LL_COMMON_API LLScopedLock : private boost::noncopyable
+{
+public:
+	/**
+	 * @brief Constructor which accepts a mutex, and locks it.
+	 *
+	 * @param mutex An allocated APR mutex. If you pass in NULL,
+	 * this wrapper will not lock.
+	 */
+	LLScopedLock(apr_thread_mutex_t* mutex);
+
+	/**
+	 * @brief Destructor which unlocks the mutex if still locked.
+	 */
+	~LLScopedLock();
+
+	/** 
+	 * @brief Check lock.
+	 */
+	bool isLocked() const { return mLocked; }
+
+	/** 
+	 * @brief This method unlocks the mutex.
+	 */
+	void unlock();
+
+protected:
+	bool mLocked;
+	apr_thread_mutex_t* mMutex;
+};
+
+template <typename Type> class LLAtomic32
+{
+public:
+	LLAtomic32<Type>() {};
+	LLAtomic32<Type>(Type x) {apr_atomic_set32(&mData, apr_uint32_t(x)); };
+	~LLAtomic32<Type>() {};
+
+	operator const Type() { apr_uint32_t data = apr_atomic_read32(&mData); return Type(data); }
+	Type operator =(const Type& x) { apr_atomic_set32(&mData, apr_uint32_t(x)); return Type(mData); }
+	void operator -=(Type x) { apr_atomic_sub32(&mData, apr_uint32_t(x)); }
+	void operator +=(Type x) { apr_atomic_add32(&mData, apr_uint32_t(x)); }
+	Type operator ++(int) { return apr_atomic_inc32(&mData); } // Type++
+	Type operator --(int) { return apr_atomic_dec32(&mData); } // Type--
+	
+private:
+	apr_uint32_t mData;
+};
+
+typedef LLAtomic32<U32> LLAtomicU32;
+typedef LLAtomic32<S32> LLAtomicS32;
+
+// File IO convenience functions.
+// Returns NULL if the file fails to openm sets *sizep to file size of not NULL
+// abbreviated flags
+#define LL_APR_R (APR_READ) // "r"
+#define LL_APR_W (APR_CREATE|APR_TRUNCATE|APR_WRITE) // "w"
+#define LL_APR_RB (APR_READ|APR_BINARY) // "rb"
+#define LL_APR_WB (APR_CREATE|APR_TRUNCATE|APR_WRITE|APR_BINARY) // "wb"
+#define LL_APR_RPB (APR_READ|APR_WRITE|APR_BINARY) // "r+b"
+#define LL_APR_WPB (APR_CREATE|APR_TRUNCATE|APR_READ|APR_WRITE|APR_BINARY) // "w+b"
+
+//
+//apr_file manager
+//which: 1)only keeps one file open;
+//       2)closes the open file in the destruction function
+//       3)informs the apr_pool to clean the memory when the file is closed.
+//Note: please close an open file at the earliest convenience. 
+//      especially do not put some time-costly operations between open() and close().
+//      otherwise it might lock the APRFilePool.
+//there are two different apr_pools the APRFile can use:
+//      1, a temperary pool passed to an APRFile function, which is used within this function and only once.
+//      2, a global pool.
+//
+class LL_COMMON_API LLAPRFile
+{
+private:
+	apr_file_t* mFile ;
+	LLVolatileAPRPool *mCurrentFilePoolp ; //currently in use apr_pool, could be one of them: sAPRFilePoolp, or a temp pool. 
+
+public:
+	LLAPRFile() ;
+	~LLAPRFile() ;
+
+	apr_status_t open(LLVolatileAPRPool* pool, const std::string& filename, apr_int32_t flags, S32* sizep = NULL);
+	apr_status_t open(const std::string& filename, apr_int32_t flags, apr_pool_t* pool = NULL, S32* sizep = NULL);
+	apr_status_t close() ;
+
+	// Returns actual offset, -1 if seek fails
+	S32 seek(apr_seek_where_t where, S32 offset);
+	apr_status_t eof() { return apr_file_eof(mFile);}
+
+	// Returns bytes read/written, 0 if read/write fails:
+	S32 read(void* buf, S32 nbytes);
+	S32 write(const void* buf, S32 nbytes);
+	
+	apr_file_t* getFileHandle() {return mFile;}	
+
+private:
+	apr_pool_t* getAPRFilePool(apr_pool_t* pool) ;
+
+//
+//*******************************************************************************************************************************
+//static components
+//
+public:
+	static LLVolatileAPRPool *sAPRFilePoolp ; //a global apr_pool for APRFile, which is used only when local pool does not exist.
+
+private:
+	static apr_file_t* open(const std::string& filename, LLVolatileAPRPool* pool, apr_int32_t flags);
+	static apr_status_t close(apr_file_t* file, LLVolatileAPRPool* pool) ;
+	static S32 seek(apr_file_t* file, apr_seek_where_t where, S32 offset);
+public:
+	// returns false if failure:
+	static bool remove(const std::string& filename, LLVolatileAPRPool* pool = NULL);
+	static bool rename(const std::string& filename, const std::string& newname, LLVolatileAPRPool* pool = NULL);
+	static bool isExist(const std::string& filename, LLVolatileAPRPool* pool = NULL, apr_int32_t flags = APR_READ);
+	static S32 size(const std::string& filename, LLVolatileAPRPool* pool = NULL);
+	static bool makeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
+	static bool removeDir(const std::string& dirname, LLVolatileAPRPool* pool = NULL);
+
+	// Returns bytes read/written, 0 if read/write fails:
+	static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);	
+	static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);	
+//*******************************************************************************************************************************
+};
+
+/**
+ * @brief Function which approprately logs error or remains quiet on
+ * APR_SUCCESS.
+ * @return Returns <code>true</code> if status is an error condition.
+ */
+bool LL_COMMON_API ll_apr_warn_status(apr_status_t status);
+
+void LL_COMMON_API ll_apr_assert_status(apr_status_t status);
+
+extern "C" LL_COMMON_API apr_pool_t* gAPRPoolp; // Global APR memory pool
+
+#endif // LL_LLAPR_H
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index b2a92861cc31a43e602fb710a9b8e694b8ff7a95..6d5b12d840b25123e18a775c16ba693a3c417a7b 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -43,30 +43,21 @@
 struct AssetEntry : public LLDictionaryEntry
 {
 	AssetEntry(const char *desc_name,
-			   const char *type_name, // 8 character limit!
-			   const char *human_name, // for decoding to human readable form; put any and as many printable characters you want in each one
-			   const char *category_name, // used by llinventorymodel when creating new categories
-			   EDragAndDropType dad_type,
-			   bool can_link, // can you create a link to this type?
-			   bool is_protected) // can the viewer change categories of this type?
+			   const char *type_name, 	// 8 character limit!
+			   const char *human_name, 	// for decoding to human readable form; put any and as many printable characters you want in each one
+			   bool can_link) 			// can you create a link to this type?
 		:
 		LLDictionaryEntry(desc_name),
 		mTypeName(type_name),
 		mHumanName(human_name),
-		mCategoryName(category_name),
-		mDadType(dad_type),
-		mCanLink(can_link),
-		mIsProtected(is_protected)
+		mCanLink(can_link)
 	{
 		llassert(strlen(mTypeName) <= 8);
 	}
 
 	const char *mTypeName;
 	const char *mHumanName;
-	const char *mCategoryName;
-	EDragAndDropType mDadType;
 	bool mCanLink;
-	bool mIsProtected;
 };
 
 class LLAssetDictionary : public LLSingleton<LLAssetDictionary>,
@@ -78,48 +69,32 @@ class LLAssetDictionary : public LLSingleton<LLAssetDictionary>,
 
 LLAssetDictionary::LLAssetDictionary()
 {
-	//       												   DESCRIPTION			TYPE NAME	HUMAN NAME			CATEGORY NAME 		DRAG&DROP		CAN LINK?	PROTECTED?
-	//      												  |--------------------|-----------|-------------------|-------------------|---------------|-----------|-----------|
-	addEntry(LLAssetType::AT_TEXTURE, 			new AssetEntry("TEXTURE",			"texture",	"texture",			"Textures", 		DAD_TEXTURE,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_SOUND, 			new AssetEntry("SOUND",				"sound",	"sound",			"Sounds", 			DAD_SOUND,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_CALLINGCARD, 		new AssetEntry("CALLINGCARD",		"callcard",	"calling card",		"Calling Cards", 	DAD_CALLINGCARD, TRUE,		TRUE));
-	addEntry(LLAssetType::AT_LANDMARK, 			new AssetEntry("LANDMARK",			"landmark",	"landmark",			"Landmarks", 		DAD_LANDMARK,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_SCRIPT, 			new AssetEntry("SCRIPT",			"script",	"legacy script",	"Scripts", 			DAD_NONE,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_CLOTHING, 			new AssetEntry("CLOTHING",			"clothing",	"clothing",			"Clothing", 		DAD_CLOTHING,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_OBJECT, 			new AssetEntry("OBJECT",			"object",	"object",			"Objects", 			DAD_OBJECT,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_NOTECARD, 			new AssetEntry("NOTECARD",			"notecard",	"note card",		"Notecards", 		DAD_NOTECARD,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_CATEGORY, 			new AssetEntry("CATEGORY",			"category",	"folder",			"New Folder", 		DAD_CATEGORY,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_ROOT_CATEGORY, 	new AssetEntry("ROOT_CATEGORY",		"root",		"root",				"Inventory", 		DAD_ROOT_CATEGORY, TRUE,	TRUE));
-	addEntry(LLAssetType::AT_LSL_TEXT, 			new AssetEntry("LSL_TEXT",			"lsltext",	"lsl2 script",		"Scripts", 			DAD_SCRIPT,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_LSL_BYTECODE, 		new AssetEntry("LSL_BYTECODE",		"lslbyte",	"lsl bytecode",		"Scripts", 			DAD_NONE,		TRUE,		TRUE));
-	addEntry(LLAssetType::AT_TEXTURE_TGA, 		new AssetEntry("TEXTURE_TGA",		"txtr_tga",	"tga texture",		"Uncompressed Images", DAD_NONE,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_BODYPART, 			new AssetEntry("BODYPART",			"bodypart",	"body part",		"Body Parts", 		DAD_BODYPART,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_TRASH, 			new AssetEntry("TRASH",				"trash",	"trash",			"Trash", 			DAD_NONE,		FALSE,		TRUE));
-	addEntry(LLAssetType::AT_SNAPSHOT_CATEGORY, new AssetEntry("SNAPSHOT_CATEGORY", "snapshot",	"snapshot",			"Photo Album", 		DAD_NONE,		FALSE,		TRUE));
-	addEntry(LLAssetType::AT_LOST_AND_FOUND, 	new AssetEntry("LOST_AND_FOUND", 	"lstndfnd",	"lost and found",	"Lost And Found", 	DAD_NONE,		FALSE,		TRUE));
-	addEntry(LLAssetType::AT_SOUND_WAV, 		new AssetEntry("SOUND_WAV",			"snd_wav",	"sound",			"Uncompressed SoundS", DAD_NONE,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_IMAGE_TGA, 		new AssetEntry("IMAGE_TGA",			"img_tga",	"targa image",		"Uncompressed Images", DAD_NONE,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_IMAGE_JPEG, 		new AssetEntry("IMAGE_JPEG",		"jpeg",		"jpeg image",		"Uncompressed Images", DAD_NONE,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_ANIMATION, 		new AssetEntry("ANIMATION",			"animatn",	"animation",		"Animations", 		DAD_ANIMATION,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_GESTURE, 			new AssetEntry("GESTURE",			"gesture",	"gesture",			"Gestures", 		DAD_GESTURE,	TRUE,		TRUE));
-	addEntry(LLAssetType::AT_SIMSTATE, 			new AssetEntry("SIMSTATE",			"simstate",	"simstate",			"New Folder", 		DAD_NONE,		FALSE,		TRUE));
-	addEntry(LLAssetType::AT_FAVORITE, 			new AssetEntry("FAVORITE",			"favorite",	"favorite",			"favorite", 		DAD_NONE,		FALSE,		TRUE));
-
-	addEntry(LLAssetType::AT_LINK, 				new AssetEntry("LINK",				"link",		"symbolic link",	"Link", 			DAD_LINK,		FALSE,		TRUE));
-	addEntry(LLAssetType::AT_LINK_FOLDER, 		new AssetEntry("FOLDER_LINK",		"link_f", 	"symbolic folder link", "New Folder", 	DAD_LINK,		FALSE,		TRUE));
-
-	for (S32 ensemble_num = S32(LLAssetType::AT_FOLDER_ENSEMBLE_START); 
-		 ensemble_num <= S32(LLAssetType::AT_FOLDER_ENSEMBLE_END); 
-		 ensemble_num++)
-	{
-		addEntry(LLAssetType::EType(ensemble_num), new AssetEntry("ENSEMBLE",		"ensemble", "ensemble", 		"New Folder", 		DAD_CATEGORY,	FALSE,		FALSE)); 
-	}
-
-	addEntry(LLAssetType::AT_CURRENT_OUTFIT, 	new AssetEntry("CURRENT",			"current",	"current outfit",	"Current Look", 	DAD_CATEGORY,	FALSE,		TRUE));
-	addEntry(LLAssetType::AT_OUTFIT, 			new AssetEntry("OUTFIT",			"outfit",	"outfit",			"New Look", 		DAD_CATEGORY,	FALSE,		FALSE));
-	addEntry(LLAssetType::AT_MY_OUTFITS, 		new AssetEntry("MY_OUTFITS",		"my_otfts",	"my outfits",		"My Looks", 		DAD_CATEGORY,	FALSE,		TRUE));
-		 
-	addEntry(LLAssetType::AT_NONE, 				new AssetEntry("NONE",				"-1",		NULL,		  		"New Folder", 		DAD_NONE,		FALSE,		FALSE));
+	//       												   DESCRIPTION			TYPE NAME	HUMAN NAME			CAN LINK?	
+	//      												  |--------------------|-----------|-------------------|-----------|
+	addEntry(LLAssetType::AT_TEXTURE, 			new AssetEntry("TEXTURE",			"texture",	"texture",			FALSE));
+	addEntry(LLAssetType::AT_SOUND, 			new AssetEntry("SOUND",				"sound",	"sound",			FALSE));
+	addEntry(LLAssetType::AT_CALLINGCARD, 		new AssetEntry("CALLINGCARD",		"callcard",	"calling card",		FALSE));
+	addEntry(LLAssetType::AT_LANDMARK, 			new AssetEntry("LANDMARK",			"landmark",	"landmark",			FALSE));
+	addEntry(LLAssetType::AT_SCRIPT, 			new AssetEntry("SCRIPT",			"script",	"legacy script",	FALSE));
+	addEntry(LLAssetType::AT_CLOTHING, 			new AssetEntry("CLOTHING",			"clothing",	"clothing",			TRUE));
+	addEntry(LLAssetType::AT_OBJECT, 			new AssetEntry("OBJECT",			"object",	"object",			TRUE));
+	addEntry(LLAssetType::AT_NOTECARD, 			new AssetEntry("NOTECARD",			"notecard",	"note card",		FALSE));
+	addEntry(LLAssetType::AT_CATEGORY, 			new AssetEntry("CATEGORY",			"category",	"folder",			TRUE));
+	addEntry(LLAssetType::AT_LSL_TEXT, 			new AssetEntry("LSL_TEXT",			"lsltext",	"lsl2 script",		FALSE));
+	addEntry(LLAssetType::AT_LSL_BYTECODE, 		new AssetEntry("LSL_BYTECODE",		"lslbyte",	"lsl bytecode",		FALSE));
+	addEntry(LLAssetType::AT_TEXTURE_TGA, 		new AssetEntry("TEXTURE_TGA",		"txtr_tga",	"tga texture",		FALSE));
+	addEntry(LLAssetType::AT_BODYPART, 			new AssetEntry("BODYPART",			"bodypart",	"body part",		TRUE));
+	addEntry(LLAssetType::AT_SOUND_WAV, 		new AssetEntry("SOUND_WAV",			"snd_wav",	"sound",			FALSE));
+	addEntry(LLAssetType::AT_IMAGE_TGA, 		new AssetEntry("IMAGE_TGA",			"img_tga",	"targa image",		FALSE));
+	addEntry(LLAssetType::AT_IMAGE_JPEG, 		new AssetEntry("IMAGE_JPEG",		"jpeg",		"jpeg image",		FALSE));
+	addEntry(LLAssetType::AT_ANIMATION, 		new AssetEntry("ANIMATION",			"animatn",	"animation",		FALSE));
+	addEntry(LLAssetType::AT_GESTURE, 			new AssetEntry("GESTURE",			"gesture",	"gesture",			TRUE));
+	addEntry(LLAssetType::AT_SIMSTATE, 			new AssetEntry("SIMSTATE",			"simstate",	"simstate",			FALSE));
+
+	addEntry(LLAssetType::AT_LINK, 				new AssetEntry("LINK",				"link",		"symbolic link",	FALSE));
+	addEntry(LLAssetType::AT_LINK_FOLDER, 		new AssetEntry("FOLDER_LINK",		"link_f", 	"symbolic folder link", FALSE));
+
+	addEntry(LLAssetType::AT_NONE, 				new AssetEntry("NONE",				"-1",		NULL,		  		FALSE));
 };
 
 // static
@@ -140,8 +115,7 @@ const std::string &LLAssetType::getDesc(LLAssetType::EType asset_type)
 	}
 	else
 	{
-		static const std::string error_string = "BAD TYPE";
-		return error_string;
+		return badLookup();
 	}
 }
 
@@ -156,7 +130,7 @@ const char *LLAssetType::lookup(LLAssetType::EType asset_type)
 	}
 	else
 	{
-		return "-1";
+		return badLookup().c_str();
 	}
 }
 
@@ -166,6 +140,7 @@ LLAssetType::EType LLAssetType::lookup(const char* name)
 	return lookup(ll_safe_string(name));
 }
 
+// static
 LLAssetType::EType LLAssetType::lookup(const std::string& type_name)
 {
 	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
@@ -193,7 +168,7 @@ const char *LLAssetType::lookupHumanReadable(LLAssetType::EType asset_type)
 	}
 	else
 	{
-		return NULL;
+		return badLookup().c_str();
 	}
 }
 
@@ -203,6 +178,7 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const char* name)
 	return lookupHumanReadable(ll_safe_string(name));
 }
 
+// static
 LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_name)
 {
 	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
@@ -219,32 +195,6 @@ LLAssetType::EType LLAssetType::lookupHumanReadable(const std::string& readable_
 	return AT_NONE;
 }
 
-// static
-const char *LLAssetType::lookupCategoryName(LLAssetType::EType asset_type)
-{
-	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
-	const AssetEntry *entry = dict->lookup(asset_type);
-	if (entry)
-	{
-		return entry->mCategoryName;
-	}
-	else
-	{
-		return "New Folder";
-	}
-}
-
-// static
-EDragAndDropType LLAssetType::lookupDragAndDropType(EType asset_type)
-{
-	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
-	const AssetEntry *entry = dict->lookup(asset_type);
-	if (entry)
-		return entry->mDadType;
-	else
-		return DAD_NONE;
-}
-
 // static
 bool LLAssetType::lookupCanLink(EType asset_type)
 {
@@ -269,37 +219,9 @@ bool LLAssetType::lookupIsLinkType(EType asset_type)
 }
 
 // static
-// Only ensembles and plain folders aren't protected.  "Protected" means
-// you can't change certain properties such as their type.
-bool LLAssetType::lookupIsProtectedCategoryType(EType asset_type)
+const std::string &LLAssetType::badLookup()
 {
-	const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
-	const AssetEntry *entry = dict->lookup(asset_type);
-	if (entry)
-	{
-		return entry->mIsProtected;
-	}
-	return true;
-}
+	static const std::string sBadLookup = "llassettype_bad_lookup";
+	return sBadLookup;
 
-// static
-bool LLAssetType::lookupIsEnsembleCategoryType(EType asset_type)
-{
-	return (asset_type >= AT_FOLDER_ENSEMBLE_START &&
-			asset_type <= AT_FOLDER_ENSEMBLE_END);
-}
-
-
-// static. Generate a good default description
-void LLAssetType::generateDescriptionFor(LLAssetType::EType asset_type,
-										 std::string& description)
-{
-	const S32 BUF_SIZE = 30;
-	char time_str[BUF_SIZE];	/* Flawfinder: ignore */
-	time_t now;
-	time(&now);
-	memset(time_str, '\0', BUF_SIZE);
-	strftime(time_str, BUF_SIZE - 1, "%Y-%m-%d %H:%M:%S ", localtime(&now));
-	description.assign(time_str);
-	description.append(LLAssetType::lookupHumanReadable(asset_type));
 }
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index 33705cd2b1bc36a5e6d4e5c8100e0725b4b472c3..ec2290d30e80c77e9b66b56c03cea8ea94a5faf8 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -1,205 +1,161 @@
-/** 
- * @file llassettype.h
- * @brief Declaration of LLAssetType.
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLASSETTYPE_H
-#define LL_LLASSETTYPE_H
-
-#include <string>
-
-#include "stdenums.h" 	// for EDragAndDropType
-
-class LL_COMMON_API LLAssetType
-{
-public:
-	enum EType
-	{
-		AT_TEXTURE = 0,
-			// Used for painting the faces of geometry.
-			// Stored in typical j2c stream format.
-
-		AT_SOUND = 1, 
-			// Used to fill the aural spectrum.
-
-		AT_CALLINGCARD = 2,
-		    // Links instant message access to the user on the card.
-			// : E.G. A card for yourself, for linden support, for
-			// : the guy you were talking to in the coliseum.
-
-		AT_LANDMARK = 3,
-			// Links to places in the world with location and a screen shot or image saved.
-			// : E.G. Home, linden headquarters, the coliseum, destinations where 
-			// : we want to increase traffic.
-
-		AT_SCRIPT = 4,
-			// Valid scripts that can be attached to an object.
-			// : E.G. Open a door, jump into the air.
-
-		AT_CLOTHING = 5,
-			// A collection of textures and parameters that can be worn by an avatar.
-
-		AT_OBJECT = 6,
-			// Any combination of textures, sounds, and scripts that are
-			// associated with a fixed piece of geometry.
-			// : E.G. A hot tub, a house with working door.
-
-		AT_NOTECARD = 7,
-			// Just text.
-
-		AT_CATEGORY = 8,
-			// Holds a collection of inventory items.
-			// It's treated as an item in the inventory and therefore needs a type.
-
-		AT_ROOT_CATEGORY = 9,
-			// A user's root inventory category.
-			// We decided to expose it visually, so it seems logical to fold
-			// it into the asset types.
-
-		AT_LSL_TEXT = 10,
-		AT_LSL_BYTECODE = 11,
-			// The LSL is the scripting language. 
-			// We've split it into a text and bytecode representation.
-		
-		AT_TEXTURE_TGA = 12,
-			// Uncompressed TGA texture.
-
-		AT_BODYPART = 13,
-			// A collection of textures and parameters that can be worn by an avatar.
-
-		AT_TRASH = 14,
-			// Only to be used as a marker for a category preferred type. 
-			// Using this, we can throw things in the trash before completely deleting.
-
-		AT_SNAPSHOT_CATEGORY = 15,
-			// A marker for a folder meant for snapshots. 
-			// No actual assets will be snapshots, though if there were, you
-			// could interpret them as textures.
-
-		AT_LOST_AND_FOUND = 16,
-			// Used to stuff lost&found items into.
-
-		AT_SOUND_WAV = 17,
-			// Uncompressed sound.
-
-		AT_IMAGE_TGA = 18,
-			// Uncompressed image, non-square.
-			// Not appropriate for use as a texture.
-
-		AT_IMAGE_JPEG = 19,
-			// Compressed image, non-square.
-			// Not appropriate for use as a texture.
-
-		AT_ANIMATION = 20,
-			// Animation.
-
-		AT_GESTURE = 21,
-			// Gesture, sequence of animations, sounds, chat, wait steps.
-
-		AT_SIMSTATE = 22,
-			// Simstate file.
-
-		AT_FAVORITE = 23,
-			// favorite items
-
-		AT_LINK = 24,
-			// Inventory symbolic link
-
-		AT_LINK_FOLDER = 25,
-			// Inventory folder link
-
-		AT_FOLDER_ENSEMBLE_START = 26,
-		AT_FOLDER_ENSEMBLE_END = 45,
-			// This range is reserved for special clothing folder types.
-
-		AT_CURRENT_OUTFIT = 46,
-			// Current outfit
-
-		AT_OUTFIT = 47,
-			// Predefined outfit ("look")
-
-		AT_MY_OUTFITS = 48,
-			// Folder that holds your outfits.
-
-		
-		AT_COUNT = 49,
-
-			// +*********************************************************+
-			// |  TO ADD AN ELEMENT TO THIS ENUM:                        |
-			// +*********************************************************+
-			// | 1. INSERT BEFORE AT_COUNT                               |
-			// | 2. INCREMENT AT_COUNT BY 1                              |
-			// | 3. ADD TO LLAssetDictionary in LLAssetType.cpp          |
-			// | 3. ADD TO DEFAULT_ASSET_FOR_INV in LLInventoryType.cpp  |
-			// +*********************************************************+
-
-		AT_NONE = -1
-	};
-
-	// machine transation between type and strings
-	static EType 				lookup(const char* name); // safe conversion to std::string, *TODO: deprecate
-	static EType 				lookup(const std::string& type_name);
-	static const char*			lookup(EType asset_type);
-
-	// translation from a type to a human readable form.
-	static EType 				lookupHumanReadable(const char* desc_name); // safe conversion to std::string, *TODO: deprecate
-	static EType 				lookupHumanReadable(const std::string& readable_name);
-	static const char*			lookupHumanReadable(EType asset_type);
-
-	// Generate a good default description. You may want to add a verb
-	// or agent name after this depending on your application.
-	static void 				generateDescriptionFor(LLAssetType::EType asset_type,
-													   std::string& description);
-
-	static EType 				getType(const std::string& desc_name);
-	static const std::string&	getDesc(EType asset_type);
-	static EDragAndDropType   	lookupDragAndDropType(EType asset_type);
-
-	static bool 				lookupCanLink(EType asset_type);
-	static bool 				lookupIsLinkType(EType asset_type);
-
-	static const char*  		lookupCategoryName(EType asset_type);
-	static bool 				lookupIsProtectedCategoryType(EType asset_type);
-	static bool 				lookupIsEnsembleCategoryType(EType asset_type);
-
-	/* TODO: Change return types from "const char *" to "const std::string &".
-	This is fairly straightforward, but requires changing some calls to use .c_str().
-	e.g.:
-	-	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType));
-	+	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType).c_str());
-	*/
-	
-private:
-	// don't instantiate or derive one of these objects
-	LLAssetType( void ) {}
-	~LLAssetType( void ) {}
-};
-
-#endif // LL_LLASSETTYPE_H
+/** 
+ * @file llassettype.h
+ * @brief Declaration of LLAssetType.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLASSETTYPE_H
+#define LL_LLASSETTYPE_H
+
+#include <string>
+
+#include "stdenums.h" 	// for EDragAndDropType
+
+class LL_COMMON_API LLAssetType
+{
+public:
+	enum EType
+	{
+		AT_TEXTURE = 0,
+			// Used for painting the faces of geometry.
+			// Stored in typical j2c stream format.
+
+		AT_SOUND = 1, 
+			// Used to fill the aural spectrum.
+
+		AT_CALLINGCARD = 2,
+		    // Links instant message access to the user on the card.
+			// : E.G. A card for yourself, for linden support, for
+			// : the guy you were talking to in the coliseum.
+
+		AT_LANDMARK = 3,
+			// Links to places in the world with location and a screen shot or image saved.
+			// : E.G. Home, linden headquarters, the coliseum, destinations where 
+			// : we want to increase traffic.
+
+		AT_SCRIPT = 4,
+			// Valid scripts that can be attached to an object.
+			// : E.G. Open a door, jump into the air.
+
+		AT_CLOTHING = 5,
+			// A collection of textures and parameters that can be worn by an avatar.
+
+		AT_OBJECT = 6,
+			// Any combination of textures, sounds, and scripts that are
+			// associated with a fixed piece of geometry.
+			// : E.G. A hot tub, a house with working door.
+
+		AT_NOTECARD = 7,
+			// Just text.
+
+		AT_CATEGORY = 8,
+			// Holds a collection of inventory items.
+			// It's treated as an item in the inventory and therefore needs a type.
+
+		AT_ROOT_CATEGORY = 9,
+			// A user's root inventory category.
+			// We decided to expose it visually, so it seems logical to fold
+			// it into the asset types.
+
+		AT_LSL_TEXT = 10,
+		AT_LSL_BYTECODE = 11,
+			// The LSL is the scripting language. 
+			// We've split it into a text and bytecode representation.
+		
+		AT_TEXTURE_TGA = 12,
+			// Uncompressed TGA texture.
+
+		AT_BODYPART = 13,
+			// A collection of textures and parameters that can be worn by an avatar.
+
+		AT_SOUND_WAV = 17,
+			// Uncompressed sound.
+
+		AT_IMAGE_TGA = 18,
+			// Uncompressed image, non-square.
+			// Not appropriate for use as a texture.
+
+		AT_IMAGE_JPEG = 19,
+			// Compressed image, non-square.
+			// Not appropriate for use as a texture.
+
+		AT_ANIMATION = 20,
+			// Animation.
+
+		AT_GESTURE = 21,
+			// Gesture, sequence of animations, sounds, chat, wait steps.
+
+		AT_SIMSTATE = 22,
+			// Simstate file.
+
+		AT_LINK = 24,
+			// Inventory symbolic link
+
+		AT_LINK_FOLDER = 25,
+			// Inventory folder link
+		
+		AT_COUNT = 26,
+
+			// +*********************************************************+
+			// |  TO ADD AN ELEMENT TO THIS ENUM:                        |
+			// +*********************************************************+
+			// | 1. INSERT BEFORE AT_COUNT                               |
+			// | 2. INCREMENT AT_COUNT BY 1                              |
+			// | 3. ADD TO LLAssetType.cpp                               |
+			// | 4. ADD TO LLViewerAssetType.cpp                         |
+			// | 5. ADD TO DEFAULT_ASSET_FOR_INV in LLInventoryType.cpp  |
+			// +*********************************************************+
+
+		AT_NONE = -1
+	};
+
+	// machine transation between type and strings
+	static EType 				lookup(const char* name); // safe conversion to std::string, *TODO: deprecate
+	static EType 				lookup(const std::string& type_name);
+	static const char*			lookup(EType asset_type);
+
+	// translation from a type to a human readable form.
+	static EType 				lookupHumanReadable(const char* desc_name); // safe conversion to std::string, *TODO: deprecate
+	static EType 				lookupHumanReadable(const std::string& readable_name);
+	static const char*			lookupHumanReadable(EType asset_type);
+
+	static EType 				getType(const std::string& desc_name);
+	static const std::string&	getDesc(EType asset_type);
+
+	static bool 				lookupCanLink(EType asset_type);
+	static bool 				lookupIsLinkType(EType asset_type);
+
+	static const std::string&	badLookup(); // error string when a lookup fails
+
+protected:
+	LLAssetType() {}
+	~LLAssetType() {}
+};
+
+#endif // LL_LLASSETTYPE_H
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index 6c5fa5af6d6884908d36fcbd64e0510a72de6a7d..141b0df43cfbc9581abe6f5d141f1f47423d1ce4 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -1,149 +1,149 @@
-/**
- * @file   llcoros.h
- * @author Nat Goodspeed
- * @date   2009-06-02
- * @brief  Manage running boost::coroutine instances
- * 
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * Copyright (c) 2009, Linden Research, Inc.
- * $/LicenseInfo$
- */
-
-#if ! defined(LL_LLCOROS_H)
-#define LL_LLCOROS_H
-
-#include <boost/coroutine/coroutine.hpp>
-#include "llsingleton.h"
-#include <boost/ptr_container/ptr_map.hpp>
-#include <string>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/iteration/local.hpp>
-#include <stdexcept>
-
-/**
- * Registry of named Boost.Coroutine instances
- *
- * The Boost.Coroutine library supports the general case of a coroutine
- * accepting arbitrary parameters and yielding multiple (sets of) results. For
- * such use cases, it's natural for the invoking code to retain the coroutine
- * instance: the consumer repeatedly calls into the coroutine, perhaps passing
- * new parameter values, prompting it to yield its next result.
- *
- * Our typical coroutine usage is different, though. For us, coroutines
- * provide an alternative to the @c Responder pattern. Our typical coroutine
- * has @c void return, invoked in fire-and-forget mode: the handler for some
- * user gesture launches the coroutine and promptly returns to the main loop.
- * The coroutine initiates some action that will take multiple frames (e.g. a
- * capability request), waits for its result, processes it and silently steals
- * away.
- *
- * This usage poses two (related) problems:
- *
- * # Who should own the coroutine instance? If it's simply local to the
- *   handler code that launches it, return from the handler will destroy the
- *   coroutine object, terminating the coroutine.
- * # Once the coroutine terminates, in whatever way, who's responsible for
- *   cleaning up the coroutine object?
- *
- * LLCoros is a Singleton collection of currently-active coroutine instances.
- * Each has a name. You ask LLCoros to launch a new coroutine with a suggested
- * name prefix; from your prefix it generates a distinct name, registers the
- * new coroutine and returns the actual name.
- *
- * The name can be used to kill off the coroutine prematurely, if needed. It
- * can also provide diagnostic info: we can look up the name of the
- * currently-running coroutine.
- *
- * Finally, the next frame ("mainloop" event) after the coroutine terminates,
- * LLCoros will notice its demise and destroy it.
- */
-class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
-{
-public:
-    /// Canonical boost::coroutines::coroutine signature we use
-    typedef boost::coroutines::coroutine<void()> coro;
-    /// Canonical 'self' type
-    typedef coro::self self;
-
-    /**
-     * Create and start running a new coroutine with specified name. The name
-     * string you pass is a suggestion; it will be tweaked for uniqueness. The
-     * actual name is returned to you.
-     *
-     * Usage looks like this, for (e.g.) two coroutine parameters:
-     * @code
-     * class MyClass
-     * {
-     * public:
-     *     ...
-     *     // Do NOT NOT NOT accept reference params other than 'self'!
-     *     // Pass by value only!
-     *     void myCoroutineMethod(LLCoros::self& self, std::string, LLSD);
-     *     ...
-     * };
-     * ...
-     * std::string name = LLCoros::instance().launch(
-     *    "mycoro", boost::bind(&MyClass::myCoroutineMethod, this, _1,
-     *                          "somestring", LLSD(17));
-     * @endcode
-     *
-     * Your function/method must accept LLCoros::self& as its first parameter.
-     * It can accept any other parameters you want -- but ONLY BY VALUE!
-     * Other reference parameters are a BAD IDEA! You Have Been Warned. See
-     * DEV-32777 comments for an explanation.
-     *
-     * Pass a callable that accepts the single LLCoros::self& parameter. It
-     * may work to pass a free function whose only parameter is 'self'; for
-     * all other cases use boost::bind(). Of course, for a non-static class
-     * method, the first parameter must be the class instance. Use the
-     * placeholder _1 for the 'self' parameter. Any other parameters should be
-     * passed via the bind() expression.
-     *
-     * launch() tweaks the suggested name so it won't collide with any
-     * existing coroutine instance, creates the coroutine instance, registers
-     * it with the tweaked name and runs it until its first wait. At that
-     * point it returns the tweaked name.
-     */
-    template <typename CALLABLE>
-    std::string launch(const std::string& prefix, const CALLABLE& callable)
-    {
-        return launchImpl(prefix, new coro(callable));
-    }
-
-    /**
-     * Abort a running coroutine by name. Normally, when a coroutine either
-     * runs to completion or terminates with an exception, LLCoros quietly
-     * cleans it up. This is for use only when you must explicitly interrupt
-     * one prematurely. Returns @c true if the specified name was found and
-     * still running at the time.
-     */
-    bool kill(const std::string& name);
-
-    /**
-     * From within a coroutine, pass its @c self object to look up the
-     * (tweaked) name string by which this coroutine is registered. Returns
-     * the empty string if not found (e.g. if the coroutine was launched by
-     * hand rather than using LLCoros::launch()).
-     */
-    template <typename COROUTINE_SELF>
-    std::string getName(const COROUTINE_SELF& self) const
-    {
-        return getNameByID(self.get_id());
-    }
-
-    /// getName() by self.get_id()
-    std::string getNameByID(const void* self_id) const;
-
-private:
-    friend class LLSingleton<LLCoros>;
-    LLCoros();
-    std::string launchImpl(const std::string& prefix, coro* newCoro);
-    std::string generateDistinctName(const std::string& prefix) const;
-    bool cleanup(const LLSD&);
-
-    typedef boost::ptr_map<std::string, coro> CoroMap;
-    CoroMap mCoros;
-};
-
-#endif /* ! defined(LL_LLCOROS_H) */
+/**
+ * @file   llcoros.h
+ * @author Nat Goodspeed
+ * @date   2009-06-02
+ * @brief  Manage running boost::coroutine instances
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLCOROS_H)
+#define LL_LLCOROS_H
+
+#include <boost/coroutine/coroutine.hpp>
+#include "llsingleton.h"
+#include <boost/ptr_container/ptr_map.hpp>
+#include <string>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/enum_binary_params.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <stdexcept>
+
+/**
+ * Registry of named Boost.Coroutine instances
+ *
+ * The Boost.Coroutine library supports the general case of a coroutine
+ * accepting arbitrary parameters and yielding multiple (sets of) results. For
+ * such use cases, it's natural for the invoking code to retain the coroutine
+ * instance: the consumer repeatedly calls into the coroutine, perhaps passing
+ * new parameter values, prompting it to yield its next result.
+ *
+ * Our typical coroutine usage is different, though. For us, coroutines
+ * provide an alternative to the @c Responder pattern. Our typical coroutine
+ * has @c void return, invoked in fire-and-forget mode: the handler for some
+ * user gesture launches the coroutine and promptly returns to the main loop.
+ * The coroutine initiates some action that will take multiple frames (e.g. a
+ * capability request), waits for its result, processes it and silently steals
+ * away.
+ *
+ * This usage poses two (related) problems:
+ *
+ * # Who should own the coroutine instance? If it's simply local to the
+ *   handler code that launches it, return from the handler will destroy the
+ *   coroutine object, terminating the coroutine.
+ * # Once the coroutine terminates, in whatever way, who's responsible for
+ *   cleaning up the coroutine object?
+ *
+ * LLCoros is a Singleton collection of currently-active coroutine instances.
+ * Each has a name. You ask LLCoros to launch a new coroutine with a suggested
+ * name prefix; from your prefix it generates a distinct name, registers the
+ * new coroutine and returns the actual name.
+ *
+ * The name can be used to kill off the coroutine prematurely, if needed. It
+ * can also provide diagnostic info: we can look up the name of the
+ * currently-running coroutine.
+ *
+ * Finally, the next frame ("mainloop" event) after the coroutine terminates,
+ * LLCoros will notice its demise and destroy it.
+ */
+class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
+{
+public:
+    /// Canonical boost::coroutines::coroutine signature we use
+    typedef boost::coroutines::coroutine<void()> coro;
+    /// Canonical 'self' type
+    typedef coro::self self;
+
+    /**
+     * Create and start running a new coroutine with specified name. The name
+     * string you pass is a suggestion; it will be tweaked for uniqueness. The
+     * actual name is returned to you.
+     *
+     * Usage looks like this, for (e.g.) two coroutine parameters:
+     * @code
+     * class MyClass
+     * {
+     * public:
+     *     ...
+     *     // Do NOT NOT NOT accept reference params other than 'self'!
+     *     // Pass by value only!
+     *     void myCoroutineMethod(LLCoros::self& self, std::string, LLSD);
+     *     ...
+     * };
+     * ...
+     * std::string name = LLCoros::instance().launch(
+     *    "mycoro", boost::bind(&MyClass::myCoroutineMethod, this, _1,
+     *                          "somestring", LLSD(17));
+     * @endcode
+     *
+     * Your function/method must accept LLCoros::self& as its first parameter.
+     * It can accept any other parameters you want -- but ONLY BY VALUE!
+     * Other reference parameters are a BAD IDEA! You Have Been Warned. See
+     * DEV-32777 comments for an explanation.
+     *
+     * Pass a callable that accepts the single LLCoros::self& parameter. It
+     * may work to pass a free function whose only parameter is 'self'; for
+     * all other cases use boost::bind(). Of course, for a non-static class
+     * method, the first parameter must be the class instance. Use the
+     * placeholder _1 for the 'self' parameter. Any other parameters should be
+     * passed via the bind() expression.
+     *
+     * launch() tweaks the suggested name so it won't collide with any
+     * existing coroutine instance, creates the coroutine instance, registers
+     * it with the tweaked name and runs it until its first wait. At that
+     * point it returns the tweaked name.
+     */
+    template <typename CALLABLE>
+    std::string launch(const std::string& prefix, const CALLABLE& callable)
+    {
+        return launchImpl(prefix, new coro(callable));
+    }
+
+    /**
+     * Abort a running coroutine by name. Normally, when a coroutine either
+     * runs to completion or terminates with an exception, LLCoros quietly
+     * cleans it up. This is for use only when you must explicitly interrupt
+     * one prematurely. Returns @c true if the specified name was found and
+     * still running at the time.
+     */
+    bool kill(const std::string& name);
+
+    /**
+     * From within a coroutine, pass its @c self object to look up the
+     * (tweaked) name string by which this coroutine is registered. Returns
+     * the empty string if not found (e.g. if the coroutine was launched by
+     * hand rather than using LLCoros::launch()).
+     */
+    template <typename COROUTINE_SELF>
+    std::string getName(const COROUTINE_SELF& self) const
+    {
+        return getNameByID(self.get_id());
+    }
+
+    /// getName() by self.get_id()
+    std::string getNameByID(const void* self_id) const;
+
+private:
+    friend class LLSingleton<LLCoros>;
+    LLCoros();
+    std::string launchImpl(const std::string& prefix, coro* newCoro);
+    std::string generateDistinctName(const std::string& prefix) const;
+    bool cleanup(const LLSD&);
+
+    typedef boost::ptr_map<std::string, coro> CoroMap;
+    CoroMap mCoros;
+};
+
+#endif /* ! defined(LL_LLCOROS_H) */
diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h
index 671f2a4d1cf19944a659d9d3e21704db4485db63..5a86b90bff1924a5357b843f3dab622df4262a39 100644
--- a/indra/llcommon/lleventdispatcher.h
+++ b/indra/llcommon/lleventdispatcher.h
@@ -1,130 +1,130 @@
-/**
- * @file   lleventdispatcher.h
- * @author Nat Goodspeed
- * @date   2009-06-18
- * @brief  Central mechanism for dispatching events by string name. This is
- *         useful when you have a single LLEventPump listener on which you can
- *         request different operations, vs. instantiating a different
- *         LLEventPump for each such operation.
- * 
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * Copyright (c) 2009, Linden Research, Inc.
- * $/LicenseInfo$
- */
-
-#if ! defined(LL_LLEVENTDISPATCHER_H)
-#define LL_LLEVENTDISPATCHER_H
-
-#include <string>
-#include <map>
-#include <boost/function.hpp>
-#include <boost/bind.hpp>
-#include <typeinfo>
-#include "llevents.h"
-
-class LLSD;
-
-/**
- * Given an LLSD map, examine a string-valued key and call a corresponding
- * callable. This class is designed to be contained by an LLEventPump
- * listener class that will register some of its own methods, though any
- * callable can be used.
- */
-class LL_COMMON_API LLEventDispatcher
-{
-public:
-    LLEventDispatcher(const std::string& desc, const std::string& key);
-    virtual ~LLEventDispatcher();
-
-    /// Accept any C++ callable, typically a boost::bind() expression
-    typedef boost::function<void(const LLSD&)> Callable;
-
-    /**
-     * Register a @a callable by @a name. The optional @a required parameter
-     * is used to validate the structure of each incoming event (see
-     * llsd_matches()).
-     */
-    void add(const std::string& name, const Callable& callable, const LLSD& required=LLSD());
-
-    /**
-     * Special case: a subclass of this class can pass an unbound member
-     * function pointer without explicitly specifying the
-     * <tt>boost::bind()</tt> expression.
-     */
-    template <class CLASS>
-    void add(const std::string& name, void (CLASS::*method)(const LLSD&),
-             const LLSD& required=LLSD())
-    {
-        addMethod<CLASS>(name, method, required);
-    }
-
-    /// Overload for both const and non-const methods
-    template <class CLASS>
-    void add(const std::string& name, void (CLASS::*method)(const LLSD&) const,
-             const LLSD& required=LLSD())
-    {
-        addMethod<CLASS>(name, method, required);
-    }
-
-    /// Unregister a callable
-    bool remove(const std::string& name);
-
-    /// Call a registered callable with an explicitly-specified name. If no
-    /// such callable exists, die with LL_ERRS. If the @a event fails to match
-    /// the @a required prototype specified at add() time, die with LL_ERRS.
-    void operator()(const std::string& name, const LLSD& event) const;
-
-    /// Extract the @a key value from the incoming @a event, and call the
-    /// callable whose name is specified by that map @a key. If no such
-    /// callable exists, die with LL_ERRS. If the @a event fails to match the
-    /// @a required prototype specified at add() time, die with LL_ERRS.
-    void operator()(const LLSD& event) const;
-
-    /// Fetch the Callable for the specified name. If no such name was
-    /// registered, return an empty() Callable.
-    Callable get(const std::string& name) const;
-
-private:
-    template <class CLASS, typename METHOD>
-    void addMethod(const std::string& name, const METHOD& method, const LLSD& required)
-    {
-        CLASS* downcast = dynamic_cast<CLASS*>(this);
-        if (! downcast)
-        {
-            addFail(name, typeid(CLASS).name());
-        }
-        else
-        {
-            add(name, boost::bind(method, downcast, _1), required);
-        }
-    }
-    void addFail(const std::string& name, const std::string& classname) const;
-    /// try to dispatch, return @c true if success
-    bool attemptCall(const std::string& name, const LLSD& event) const;
-
-    std::string mDesc, mKey;
-    typedef std::map<std::string, std::pair<Callable, LLSD> > DispatchMap;
-    DispatchMap mDispatch;
-};
-
-/**
- * Bundle an LLEventPump and a listener with an LLEventDispatcher. A class
- * that contains (or derives from) LLDispatchListener need only specify the
- * LLEventPump name and dispatch key, and add() its methods. Incoming events
- * will automatically be dispatched.
- */
-class LL_COMMON_API LLDispatchListener: public LLEventDispatcher
-{
-public:
-    LLDispatchListener(const std::string& pumpname, const std::string& key);
-
-    std::string getPumpName() const { return mPump.getName(); }
-
-private:
-    bool process(const LLSD& event);
-
-    LLEventStream mPump;
-    LLTempBoundListener mBoundListener;
-};
-
-#endif /* ! defined(LL_LLEVENTDISPATCHER_H) */
+/**
+ * @file   lleventdispatcher.h
+ * @author Nat Goodspeed
+ * @date   2009-06-18
+ * @brief  Central mechanism for dispatching events by string name. This is
+ *         useful when you have a single LLEventPump listener on which you can
+ *         request different operations, vs. instantiating a different
+ *         LLEventPump for each such operation.
+ * 
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLEVENTDISPATCHER_H)
+#define LL_LLEVENTDISPATCHER_H
+
+#include <string>
+#include <map>
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+#include <typeinfo>
+#include "llevents.h"
+
+class LLSD;
+
+/**
+ * Given an LLSD map, examine a string-valued key and call a corresponding
+ * callable. This class is designed to be contained by an LLEventPump
+ * listener class that will register some of its own methods, though any
+ * callable can be used.
+ */
+class LL_COMMON_API LLEventDispatcher
+{
+public:
+    LLEventDispatcher(const std::string& desc, const std::string& key);
+    virtual ~LLEventDispatcher();
+
+    /// Accept any C++ callable, typically a boost::bind() expression
+    typedef boost::function<void(const LLSD&)> Callable;
+
+    /**
+     * Register a @a callable by @a name. The optional @a required parameter
+     * is used to validate the structure of each incoming event (see
+     * llsd_matches()).
+     */
+    void add(const std::string& name, const Callable& callable, const LLSD& required=LLSD());
+
+    /**
+     * Special case: a subclass of this class can pass an unbound member
+     * function pointer without explicitly specifying the
+     * <tt>boost::bind()</tt> expression.
+     */
+    template <class CLASS>
+    void add(const std::string& name, void (CLASS::*method)(const LLSD&),
+             const LLSD& required=LLSD())
+    {
+        addMethod<CLASS>(name, method, required);
+    }
+
+    /// Overload for both const and non-const methods
+    template <class CLASS>
+    void add(const std::string& name, void (CLASS::*method)(const LLSD&) const,
+             const LLSD& required=LLSD())
+    {
+        addMethod<CLASS>(name, method, required);
+    }
+
+    /// Unregister a callable
+    bool remove(const std::string& name);
+
+    /// Call a registered callable with an explicitly-specified name. If no
+    /// such callable exists, die with LL_ERRS. If the @a event fails to match
+    /// the @a required prototype specified at add() time, die with LL_ERRS.
+    void operator()(const std::string& name, const LLSD& event) const;
+
+    /// Extract the @a key value from the incoming @a event, and call the
+    /// callable whose name is specified by that map @a key. If no such
+    /// callable exists, die with LL_ERRS. If the @a event fails to match the
+    /// @a required prototype specified at add() time, die with LL_ERRS.
+    void operator()(const LLSD& event) const;
+
+    /// Fetch the Callable for the specified name. If no such name was
+    /// registered, return an empty() Callable.
+    Callable get(const std::string& name) const;
+
+private:
+    template <class CLASS, typename METHOD>
+    void addMethod(const std::string& name, const METHOD& method, const LLSD& required)
+    {
+        CLASS* downcast = dynamic_cast<CLASS*>(this);
+        if (! downcast)
+        {
+            addFail(name, typeid(CLASS).name());
+        }
+        else
+        {
+            add(name, boost::bind(method, downcast, _1), required);
+        }
+    }
+    void addFail(const std::string& name, const std::string& classname) const;
+    /// try to dispatch, return @c true if success
+    bool attemptCall(const std::string& name, const LLSD& event) const;
+
+    std::string mDesc, mKey;
+    typedef std::map<std::string, std::pair<Callable, LLSD> > DispatchMap;
+    DispatchMap mDispatch;
+};
+
+/**
+ * Bundle an LLEventPump and a listener with an LLEventDispatcher. A class
+ * that contains (or derives from) LLDispatchListener need only specify the
+ * LLEventPump name and dispatch key, and add() its methods. Incoming events
+ * will automatically be dispatched.
+ */
+class LL_COMMON_API LLDispatchListener: public LLEventDispatcher
+{
+public:
+    LLDispatchListener(const std::string& pumpname, const std::string& key);
+
+    std::string getPumpName() const { return mPump.getName(); }
+
+private:
+    bool process(const LLSD& event);
+
+    LLEventStream mPump;
+    LLTempBoundListener mBoundListener;
+};
+
+#endif /* ! defined(LL_LLEVENTDISPATCHER_H) */
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index 64e5cb5da7f290134b89f988e806f71dcd16f0b0..192d79b27ddb2658c4fda32c1fdc1d83d8502588 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -1,943 +1,943 @@
-/**
- * @file   llevents.h
- * @author Kent Quirk, Nat Goodspeed
- * @date   2008-09-11
- * @brief  This is an implementation of the event system described at
- *         https://wiki.lindenlab.com/wiki/Viewer:Messaging/Event_System,
- *         originally introduced in llnotifications.h. It has nothing
- *         whatsoever to do with the older system in llevent.h.
- * 
- * $LicenseInfo:firstyear=2008&license=viewergpl$
- * Copyright (c) 2008, Linden Research, Inc.
- * $/LicenseInfo$
- */
-
-#if ! defined(LL_LLEVENTS_H)
-#define LL_LLEVENTS_H
-
-#include <string>
-#include <map>
-#include <set>
-#include <vector>
-#include <deque>
-#include <stdexcept>
-#if LL_WINDOWS
-	#pragma warning (push)
-	#pragma warning (disable : 4263) // boost::signals2::expired_slot::what() has const mismatch
-	#pragma warning (disable : 4264) 
-#endif
-#include <boost/signals2.hpp>
-#if LL_WINDOWS
-	#pragma warning (pop)
-#endif
-
-#include <boost/bind.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/enable_shared_from_this.hpp>
-#include <boost/utility.hpp>        // noncopyable
-#include <boost/optional/optional.hpp>
-#include <boost/visit_each.hpp>
-#include <boost/ref.hpp>            // reference_wrapper
-#include <boost/type_traits/is_pointer.hpp>
-#include <boost/function.hpp>
-#include <boost/static_assert.hpp>
-#include "llsd.h"
-#include "llsingleton.h"
-#include "lldependencies.h"
-
-// override this to allow binding free functions with more parameters
-#ifndef LLEVENTS_LISTENER_ARITY
-#define LLEVENTS_LISTENER_ARITY 10
-#endif
-
-// hack for testing
-#ifndef testable
-#define testable private
-#endif
-
-/*****************************************************************************
-*   Signal and handler declarations
-*   Using a single handler signature means that we can have a common handler
-*   type, rather than needing a distinct one for each different handler.
-*****************************************************************************/
-
-/**
- * A boost::signals Combiner that stops the first time a handler returns true
- * We need this because we want to have our handlers return bool, so that
- * we have the option to cause a handler to stop further processing. The
- * default handler fails when the signal returns a value but has no slots.
- */
-struct LLStopWhenHandled
-{
-    typedef bool result_type;
-
-    template<typename InputIterator>
-    result_type operator()(InputIterator first, InputIterator last) const
-    {
-        for (InputIterator si = first; si != last; ++si)
-		{
-            if (*si)
-			{
-                return true;
-			}
-		}
-        return false;
-    }
-};
-
-/**
- * We want to have a standard signature for all signals; this way,
- * we can easily document a protocol for communicating across
- * dlls and into scripting languages someday.
- *
- * We want to return a bool to indicate whether the signal has been
- * handled and should NOT be passed on to other listeners.
- * Return true to stop further handling of the signal, and false
- * to continue.
- *
- * We take an LLSD because this way the contents of the signal
- * are independent of the API used to communicate it.
- * It is const ref because then there's low cost to pass it;
- * if you only need to inspect it, it's very cheap.
- *
- * @internal
- * The @c float template parameter indicates that we will internally use @c
- * float to indicate relative listener order on a given LLStandardSignal.
- * Don't worry, the @c float values are strictly internal! They are not part
- * of the interface, for the excellent reason that requiring the caller to
- * specify a numeric key to establish order means that the caller must know
- * the universe of possible values. We use LLDependencies for that instead.
- */
-typedef boost::signals2::signal<bool(const LLSD&), LLStopWhenHandled, float>  LLStandardSignal;
-/// Methods that forward listeners (e.g. constructed with
-/// <tt>boost::bind()</tt>) should accept (const LLEventListener&)
-typedef LLStandardSignal::slot_type LLEventListener;
-/// Result of registering a listener, supports <tt>connected()</tt>,
-/// <tt>disconnect()</tt> and <tt>blocked()</tt>
-typedef boost::signals2::connection LLBoundListener;
-/// Storing an LLBoundListener in LLTempBoundListener will disconnect the
-/// referenced listener when the LLTempBoundListener instance is destroyed.
-typedef boost::signals2::scoped_connection LLTempBoundListener;
-
-/**
- * A common idiom for event-based code is to accept either a callable --
- * directly called on completion -- or the string name of an LLEventPump on
- * which to post the completion event. Specifying a parameter as <tt>const
- * LLListenerOrPumpName&</tt> allows either.
- *
- * Calling a validly-constructed LLListenerOrPumpName, passing the LLSD
- * 'event' object, either calls the callable or posts the event to the named
- * LLEventPump.
- *
- * A default-constructed LLListenerOrPumpName is 'empty'. (This is useful as
- * the default value of an optional method parameter.) Calling it throws
- * LLListenerOrPumpName::Empty. Test for this condition beforehand using
- * either <tt>if (param)</tt> or <tt>if (! param)</tt>.
- */
-class LL_COMMON_API LLListenerOrPumpName
-{
-public:
-    /// passing string name of LLEventPump
-    LLListenerOrPumpName(const std::string& pumpname);
-    /// passing string literal (overload so compiler isn't forced to infer
-    /// double conversion)
-    LLListenerOrPumpName(const char* pumpname);
-    /// passing listener -- the "anything else" catch-all case. The type of an
-    /// object constructed by boost::bind() isn't intended to be written out.
-    /// Normally we'd just accept 'const LLEventListener&', but that would
-    /// require double implicit conversion: boost::bind() object to
-    /// LLEventListener, LLEventListener to LLListenerOrPumpName. So use a
-    /// template to forward anything.
-    template<typename T>
-    LLListenerOrPumpName(const T& listener): mListener(listener) {}
-
-    /// for omitted method parameter: uninitialized mListener
-    LLListenerOrPumpName() {}
-
-    /// test for validity
-    operator bool() const { return bool(mListener); }
-    bool operator! () const { return ! mListener; }
-
-    /// explicit accessor
-    const LLEventListener& getListener() const { return *mListener; }
-
-    /// implicit conversion to LLEventListener
-    operator LLEventListener() const { return *mListener; }
-
-    /// allow calling directly
-    bool operator()(const LLSD& event) const;
-
-    /// exception if you try to call when empty
-    struct Empty: public std::runtime_error
-    {
-        Empty(const std::string& what):
-            std::runtime_error(std::string("LLListenerOrPumpName::Empty: ") + what) {}
-    };
-
-private:
-    boost::optional<LLEventListener> mListener;
-};
-
-/*****************************************************************************
-*   LLEventPumps
-*****************************************************************************/
-class LLEventPump;
-
-/**
- * LLEventPumps is a Singleton manager through which one typically accesses
- * this subsystem.
- */
-class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>
-{
-    friend class LLSingleton<LLEventPumps>;
-public:
-    /**
-     * Find or create an LLEventPump instance with a specific name. We return
-     * a reference so there's no question about ownership. obtain() @em finds
-     * an instance without conferring @em ownership.
-     */
-    LLEventPump& obtain(const std::string& name);
-    /**
-     * Flush all known LLEventPump instances
-     */
-    void flush();
-
-    /**
-     * Reset all known LLEventPump instances
-     * workaround for DEV-35406 crash on shutdown
-     */
-    void reset();
-
-private:
-    friend class LLEventPump;
-    /**
-     * Register a new LLEventPump instance (internal)
-     */
-    std::string registerNew(const LLEventPump&, const std::string& name, bool tweak);
-    /**
-     * Unregister a doomed LLEventPump instance (internal)
-     */
-    void unregister(const LLEventPump&);
-
-private:
-    LLEventPumps();
-    ~LLEventPumps();
-
-testable:
-    // Map of all known LLEventPump instances, whether or not we instantiated
-    // them. We store a plain old LLEventPump* because this map doesn't claim
-    // ownership of the instances. Though the common usage pattern is to
-    // request an instance using obtain(), it's fair to instantiate an
-    // LLEventPump subclass statically, as a class member, on the stack or on
-    // the heap. In such cases, the instantiating party is responsible for its
-    // lifespan.
-    typedef std::map<std::string, LLEventPump*> PumpMap;
-    PumpMap mPumpMap;
-    // Set of all LLEventPumps we instantiated. Membership in this set means
-    // we claim ownership, and will delete them when this LLEventPumps is
-    // destroyed.
-    typedef std::set<LLEventPump*> PumpSet;
-    PumpSet mOurPumps;
-    // LLEventPump names that should be instantiated as LLEventQueue rather
-    // than as LLEventStream
-    typedef std::set<std::string> PumpNames;
-    PumpNames mQueueNames;
-};
-
-/*****************************************************************************
-*   details
-*****************************************************************************/
-namespace LLEventDetail
-{
-    /// Any callable capable of connecting an LLEventListener to an
-    /// LLStandardSignal to produce an LLBoundListener can be mapped to this
-    /// signature.
-    typedef boost::function<LLBoundListener(const LLEventListener&)> ConnectFunc;
-
-    /**
-     * Utility template function to use Visitor appropriately
-     *
-     * @param listener Callable to connect, typically a boost::bind()
-     * expression. This will be visited by Visitor using boost::visit_each().
-     * @param connect_func Callable that will connect() @a listener to an
-     * LLStandardSignal, returning LLBoundListener.
-     */
-    template <typename LISTENER>
-    LLBoundListener visit_and_connect(const LISTENER& listener,
-                                      const ConnectFunc& connect_func);
-} // namespace LLEventDetail
-
-/*****************************************************************************
-*   LLEventTrackable
-*****************************************************************************/
-/**
- * LLEventTrackable wraps boost::signals2::trackable, which resembles
- * boost::trackable. Derive your listener class from LLEventTrackable instead,
- * and use something like
- * <tt>LLEventPump::listen(boost::bind(&YourTrackableSubclass::method,
- * instance, _1))</tt>. This will implicitly disconnect when the object
- * referenced by @c instance is destroyed.
- *
- * @note
- * LLEventTrackable doesn't address a couple of cases:
- * * Object destroyed during call
- *   - You enter a slot call in thread A.
- *   - Thread B destroys the object, which of course disconnects it from any
- *     future slot calls.
- *   - Thread A's call uses 'this', which now refers to a defunct object.
- *     Undefined behavior results.
- * * Call during destruction
- *   - @c MySubclass is derived from LLEventTrackable.
- *   - @c MySubclass registers one of its own methods using
- *     <tt>LLEventPump::listen()</tt>.
- *   - The @c MySubclass object begins destruction. <tt>~MySubclass()</tt>
- *     runs, destroying state specific to the subclass. (For instance, a
- *     <tt>Foo*</tt> data member is <tt>delete</tt>d but not zeroed.)
- *   - The listening method will not be disconnected until
- *     <tt>~LLEventTrackable()</tt> runs.
- *   - Before we get there, another thread posts data to the @c LLEventPump
- *     instance, calling the @c MySubclass method.
- *   - The method in question relies on valid @c MySubclass state. (For
- *     instance, it attempts to dereference the <tt>Foo*</tt> pointer that was
- *     <tt>delete</tt>d but not zeroed.)
- *   - Undefined behavior results.
- * If you suspect you may encounter any such scenario, you're better off
- * managing the lifespan of your object with <tt>boost::shared_ptr</tt>.
- * Passing <tt>LLEventPump::listen()</tt> a <tt>boost::bind()</tt> expression
- * involving a <tt>boost::weak_ptr<Foo></tt> is recognized specially, engaging
- * thread-safe Boost.Signals2 machinery.
- */
-typedef boost::signals2::trackable LLEventTrackable;
-
-/*****************************************************************************
-*   LLEventPump
-*****************************************************************************/
-/**
- * LLEventPump is the base class interface through which we access the
- * concrete subclasses LLEventStream and LLEventQueue.
- *
- * @NOTE
- * LLEventPump derives from LLEventTrackable so that when you "chain"
- * LLEventPump instances together, they will automatically disconnect on
- * destruction. Please see LLEventTrackable documentation for situations in
- * which this may be perilous across threads.
- */
-class LL_COMMON_API LLEventPump: public LLEventTrackable
-{
-public:
-    /**
-     * Exception thrown by LLEventPump(). You are trying to instantiate an
-     * LLEventPump (subclass) using the same name as some other instance, and
-     * you didn't pass <tt>tweak=true</tt> to permit it to generate a unique
-     * variant.
-     */
-    struct DupPumpName: public std::runtime_error
-    {
-        DupPumpName(const std::string& what):
-            std::runtime_error(std::string("DupPumpName: ") + what) {}
-    };
-
-    /**
-     * Instantiate an LLEventPump (subclass) with the string name by which it
-     * can be found using LLEventPumps::obtain().
-     *
-     * If you pass (or default) @a tweak to @c false, then a duplicate name
-     * will throw DupPumpName. This won't happen if LLEventPumps::obtain()
-     * instantiates the LLEventPump, because obtain() uses find-or-create
-     * logic. It can only happen if you instantiate an LLEventPump in your own
-     * code -- and a collision with the name of some other LLEventPump is
-     * likely to cause much more subtle problems!
-     *
-     * When you hand-instantiate an LLEventPump, consider passing @a tweak as
-     * @c true. This directs LLEventPump() to append a suffix to the passed @a
-     * name to make it unique. You can retrieve the adjusted name by calling
-     * getName() on your new instance.
-     */
-    LLEventPump(const std::string& name, bool tweak=false);
-    virtual ~LLEventPump();
-
-    /// group exceptions thrown by listen(). We use exceptions because these
-    /// particular errors are likely to be coding errors, found and fixed by
-    /// the developer even before preliminary checkin.
-    struct ListenError: public std::runtime_error
-    {
-        ListenError(const std::string& what): std::runtime_error(what) {}
-    };
-    /**
-     * exception thrown by listen(). You are attempting to register a
-     * listener on this LLEventPump using the same listener name as an
-     * already-registered listener.
-     */
-    struct DupListenerName: public ListenError
-    {
-        DupListenerName(const std::string& what):
-            ListenError(std::string("DupListenerName: ") + what)
-        {}
-    };
-    /**
-     * exception thrown by listen(). The order dependencies specified for your
-     * listener are incompatible with existing listeners.
-     *
-     * Consider listener "a" which specifies before "b" and "b" which
-     * specifies before "c". You are now attempting to register "c" before
-     * "a". There is no order that can satisfy all constraints.
-     */
-    struct Cycle: public ListenError
-    {
-        Cycle(const std::string& what): ListenError(std::string("Cycle: ") + what) {}
-    };
-    /**
-     * exception thrown by listen(). This one means that your new listener
-     * would force a change to the order of previously-registered listeners,
-     * and we don't have a good way to implement that.
-     *
-     * Consider listeners "some", "other" and "third". "some" and "other" are
-     * registered earlier without specifying relative order, so "other"
-     * happens to be first. Now you attempt to register "third" after "some"
-     * and before "other". Whoops, that would require swapping "some" and
-     * "other", which we can't do. Instead we throw this exception.
-     *
-     * It may not be possible to change the registration order so we already
-     * know "third"s order requirement by the time we register the second of
-     * "some" and "other". A solution would be to specify that "some" must
-     * come before "other", or equivalently that "other" must come after
-     * "some".
-     */
-    struct OrderChange: public ListenError
-    {
-        OrderChange(const std::string& what): ListenError(std::string("OrderChange: ") + what) {}
-    };
-
-    /// used by listen()
-    typedef std::vector<std::string> NameList;
-    /// convenience placeholder for when you explicitly want to pass an empty
-    /// NameList
-    const static NameList empty;
-
-    /// Get this LLEventPump's name
-    std::string getName() const { return mName; }
-
-    /**
-     * Register a new listener with a unique name. Specify an optional list
-     * of other listener names after which this one must be called, likewise
-     * an optional list of other listener names before which this one must be
-     * called. The other listeners mentioned need not yet be registered
-     * themselves. listen() can throw any ListenError; see ListenError
-     * subclasses.
-     *
-     * The listener name must be unique among active listeners for this
-     * LLEventPump, else you get DupListenerName. If you don't care to invent
-     * a name yourself, use inventName(). (I was tempted to recognize e.g. ""
-     * and internally generate a distinct name for that case. But that would
-     * handle badly the scenario in which you want to add, remove, re-add,
-     * etc. the same listener: each new listen() call would necessarily
-     * perform a new dependency sort. Assuming you specify the same
-     * after/before lists each time, using inventName() when you first
-     * instantiate your listener, then passing the same name on each listen()
-     * call, allows us to optimize away the second and subsequent dependency
-     * sorts.
-     *
-     * If (as is typical) you pass a <tt>boost::bind()</tt> expression as @a
-     * listener, listen() will inspect the components of that expression. If a
-     * bound object matches any of several cases, the connection will
-     * automatically be disconnected when that object is destroyed.
-     *
-     * * You bind a <tt>boost::weak_ptr</tt>.
-     * * Binding a <tt>boost::shared_ptr</tt> that way would ensure that the
-     *   referenced object would @em never be destroyed, since the @c
-     *   shared_ptr stored in the LLEventPump would remain an outstanding
-     *   reference. Use the weaken() function to convert your @c shared_ptr to
-     *   @c weak_ptr. Because this is easy to forget, binding a @c shared_ptr
-     *   will produce a compile error (@c BOOST_STATIC_ASSERT failure).
-     * * You bind a simple pointer or reference to an object derived from
-     *   <tt>boost::enable_shared_from_this</tt>. (UNDER CONSTRUCTION)
-     * * You bind a simple pointer or reference to an object derived from
-     *   LLEventTrackable. Unlike the cases described above, though, this is
-     *   vulnerable to a couple of cross-thread race conditions, as described
-     *   in the LLEventTrackable documentation.
-     */
-    template <typename LISTENER>
-    LLBoundListener listen(const std::string& name, const LISTENER& listener,
-                           const NameList& after=NameList(),
-                           const NameList& before=NameList())
-    {
-        // Examine listener, using our listen_impl() method to make the
-        // actual connection.
-        // This is why listen() is a template. Conversion from boost::bind()
-        // to LLEventListener performs type erasure, so it's important to look
-        // at the boost::bind object itself before that happens.
-        return LLEventDetail::visit_and_connect(listener,
-                                                boost::bind(&LLEventPump::listen_impl,
-                                                            this,
-                                                            name,
-                                                            _1,
-                                                            after,
-                                                            before));
-    }
-
-    /// Get the LLBoundListener associated with the passed name (dummy
-    /// LLBoundListener if not found)
-    virtual LLBoundListener getListener(const std::string& name) const;
-    /**
-     * Instantiate one of these to block an existing connection:
-     * @code
-     * { // in some local scope
-     *     LLEventPump::Blocker block(someLLBoundListener);
-     *     // code that needs the connection blocked
-     * } // unblock the connection again
-     * @endcode
-     */
-    typedef boost::signals2::shared_connection_block Blocker;
-    /// Unregister a listener by name. Prefer this to
-    /// <tt>getListener(name).disconnect()</tt> because stopListening() also
-    /// forgets this name.
-    virtual void stopListening(const std::string& name);
-    /// Post an event to all listeners. The @c bool return is only meaningful
-    /// if the underlying leaf class is LLEventStream -- beware of relying on
-    /// it too much! Truthfully, we return @c bool mostly to permit chaining
-    /// one LLEventPump as a listener on another.
-    virtual bool post(const LLSD&) = 0;
-    /// Enable/disable: while disabled, silently ignore all post() calls
-    virtual void enable(bool enabled=true) { mEnabled = enabled; }
-    /// query
-    virtual bool enabled() const { return mEnabled; }
-
-    /// Generate a distinct name for a listener -- see listen()
-    static std::string inventName(const std::string& pfx="listener");
-
-private:
-    friend class LLEventPumps;
-    /// flush queued events
-    virtual void flush() {}
-
-    virtual void reset();
-
-private:
-    virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&,
-                                        const NameList& after,
-                                        const NameList& before);
-    std::string mName;
-
-protected:
-    /// implement the dispatching
-    boost::scoped_ptr<LLStandardSignal> mSignal;
-
-    /// valve open?
-    bool mEnabled;
-    /// Map of named listeners. This tracks the listeners that actually exist
-    /// at this moment. When we stopListening(), we discard the entry from
-    /// this map.
-    typedef std::map<std::string, boost::signals2::connection> ConnectionMap;
-    ConnectionMap mConnections;
-    typedef LLDependencies<std::string, float> DependencyMap;
-    /// Dependencies between listeners. For each listener, track the float
-    /// used to establish its place in mSignal's order. This caches all the
-    /// listeners that have ever registered; stopListening() does not discard
-    /// the entry from this map. This is to avoid a new dependency sort if the
-    /// same listener with the same dependencies keeps hopping on and off this
-    /// LLEventPump.
-    DependencyMap mDeps;
-};
-
-/*****************************************************************************
-*   LLEventStream
-*****************************************************************************/
-/**
- * LLEventStream is a thin wrapper around LLStandardSignal. Posting an
- * event immediately calls all registered listeners.
- */
-class LL_COMMON_API LLEventStream: public LLEventPump
-{
-public:
-    LLEventStream(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
-    virtual ~LLEventStream() {}
-
-    /// Post an event to all listeners
-    virtual bool post(const LLSD& event);
-};
-
-/*****************************************************************************
-*   LLEventQueue
-*****************************************************************************/
-/**
- * LLEventQueue isa LLEventPump whose post() method defers calling registered
- * listeners until flush() is called.
- */
-class LL_COMMON_API LLEventQueue: public LLEventPump
-{
-public:
-    LLEventQueue(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
-    virtual ~LLEventQueue() {}
-
-    /// Post an event to all listeners
-    virtual bool post(const LLSD& event);
-
-private:
-    /// flush queued events
-    virtual void flush();
-
-private:
-    typedef std::deque<LLSD> EventQueue;
-    EventQueue mEventQueue;
-};
-
-/*****************************************************************************
-*   LLReqID
-*****************************************************************************/
-/**
- * This class helps the implementer of a given event API to honor the
- * ["reqid"] convention. By this convention, each event API stamps into its
- * response LLSD a ["reqid"] key whose value echoes the ["reqid"] value, if
- * any, from the corresponding request.
- *
- * This supports an (atypical, but occasionally necessary) use case in which
- * two or more asynchronous requests are multiplexed onto the same ["reply"]
- * LLEventPump. Since the response events could arrive in arbitrary order, the
- * caller must be able to demux them. It does so by matching the ["reqid"]
- * value in each response with the ["reqid"] value in the corresponding
- * request.
- *
- * It is the caller's responsibility to ensure distinct ["reqid"] values for
- * that case. Though LLSD::UUID is guaranteed to work, it might be overkill:
- * the "namespace" of unique ["reqid"] values is simply the set of requests
- * specifying the same ["reply"] LLEventPump name.
- *
- * Making a given event API echo the request's ["reqid"] into the response is
- * nearly trivial. This helper is mostly for mnemonic purposes, to serve as a
- * place to put these comments. We hope that each time a coder implements a
- * new event API based on some existing one, s/he will say, "Huh, what's an
- * LLReqID?" and look up this material.
- *
- * The hardest part about the convention is deciding where to store the
- * ["reqid"] value. Ironically, LLReqID can't help with that: you must store
- * an LLReqID instance in whatever storage will persist until the reply is
- * sent. For example, if the request ultimately ends up using a Responder
- * subclass, storing an LLReqID instance in the Responder works.
- *
- * @note
- * The @em implementer of an event API must honor the ["reqid"] convention.
- * However, the @em caller of an event API need only use it if s/he is sharing
- * the same ["reply"] LLEventPump for two or more asynchronous event API
- * requests.
- *
- * In most cases, it's far easier for the caller to instantiate a local
- * LLEventStream and pass its name to the event API in question. Then it's
- * perfectly reasonable not to set a ["reqid"] key in the request, ignoring
- * the @c isUndefined() ["reqid"] value in the response.
- */
-class LL_COMMON_API LLReqID
-{
-public:
-    /**
-     * If you have the request in hand at the time you instantiate the
-     * LLReqID, pass that request to extract its ["reqid"].
- */
-    LLReqID(const LLSD& request):
-        mReqid(request["reqid"])
-    {}
-    /// If you don't yet have the request, use setFrom() later.
-    LLReqID() {}
-
-    /// Extract and store the ["reqid"] value from an incoming request.
-    void setFrom(const LLSD& request)
-    {
-        mReqid = request["reqid"];
-    }
-
-    /// Set ["reqid"] key into a pending response LLSD object.
-    void stamp(LLSD& response) const;
-
-    /// Make a whole new response LLSD object with our ["reqid"].
-    LLSD makeResponse() const
-    {
-        LLSD response;
-        stamp(response);
-        return response;
-    }
-
-    /// Not really sure of a use case for this accessor...
-    LLSD getReqID() const { return mReqid; }
-
-private:
-    LLSD mReqid;
-};
-
-/*****************************************************************************
-*   Underpinnings
-*****************************************************************************/
-/**
- * We originally provided a suite of overloaded
- * LLEventTrackable::listenTo(LLEventPump&, ...) methods that would call
- * LLEventPump::listen(...) and then pass the returned LLBoundListener to
- * LLEventTrackable::track(). This was workable but error-prone: the coder
- * must remember to call listenTo() rather than the more straightforward
- * listen() method.
- *
- * Now we publish only the single canonical listen() method, so there's a
- * uniform mechanism. Having a single way to do this is good, in that there's
- * no question in the coder's mind which of several alternatives to choose.
- *
- * To support automatic connection management, we use boost::visit_each
- * (http://www.boost.org/doc/libs/1_37_0/doc/html/boost/visit_each.html) to
- * inspect each argument of a boost::bind expression. (Although the visit_each
- * mechanism was first introduced with the original Boost.Signals library, it
- * was only later documented.)
- *
- * Cases:
- * * At least one of the function's arguments is a boost::weak_ptr<T>. Pass
- *   the corresponding shared_ptr to slot_type::track(). Ideally that would be
- *   the object whose method we want to call, but in fact we do the same for
- *   any weak_ptr we might find among the bound arguments. If we're passing
- *   our bound method a weak_ptr to some object, wouldn't the destruction of
- *   that object invalidate the call? So we disconnect automatically when any
- *   such object is destroyed. This is the mechanism preferred by boost::
- *   signals2.
- * * One of the functions's arguments is a boost::shared_ptr<T>. This produces
- *   a compile error: the bound copy of the shared_ptr stored in the
- *   boost_bind object stored in the signal object would make the referenced
- *   T object immortal. We provide a weaken() function. Pass
- *   weaken(your_shared_ptr) instead. (We can inspect, but not modify, the
- *   boost::bind object. Otherwise we'd replace the shared_ptr with weak_ptr
- *   implicitly and just proceed.)
- * * One of the function's arguments is a plain pointer/reference to an object
- *   derived from boost::enable_shared_from_this. We assume that this object
- *   is managed using boost::shared_ptr, so we implicitly extract a shared_ptr
- *   and track that. (UNDER CONSTRUCTION)
- * * One of the function's arguments is derived from LLEventTrackable. Pass
- *   the LLBoundListener to its LLEventTrackable::track(). This is vulnerable
- *   to a couple different race conditions, as described in LLEventTrackable
- *   documentation. (NOTE: Now that LLEventTrackable is a typedef for
- *   boost::signals2::trackable, the Signals2 library handles this itself, so
- *   our visitor needs no special logic for this case.)
- * * Any other argument type is irrelevant to automatic connection management.
- */
-
-namespace LLEventDetail
-{
-    template <typename F>
-    const F& unwrap(const F& f) { return f; }
-
-    template <typename F>
-    const F& unwrap(const boost::reference_wrapper<F>& f) { return f.get(); }
-
-    // Most of the following is lifted from the Boost.Signals use of
-    // visit_each.
-    template<bool Cond> struct truth {};
-
-    /**
-     * boost::visit_each() Visitor, used on a template argument <tt>const F&
-     * f</tt> as follows (see visit_and_connect()):
-     * @code
-     * LLEventListener listener(f);
-     * Visitor visitor(listener); // bind listener so it can track() shared_ptrs
-     * using boost::visit_each;   // allow unqualified visit_each() call for ADL
-     * visit_each(visitor, unwrap(f));
-     * @endcode
-     */
-    class Visitor
-    {
-    public:
-        /**
-         * Visitor binds a reference to LLEventListener so we can track() any
-         * shared_ptrs we find in the argument list.
-         */
-        Visitor(LLEventListener& listener):
-            mListener(listener)
-        {
-        }
-
-        /**
-         * boost::visit_each() calls this method for each component of a
-         * boost::bind() expression.
-         */
-        template <typename T>
-        void operator()(const T& t) const
-        {
-            decode(t, 0);
-        }
-
-    private:
-        // decode() decides between a reference wrapper and anything else
-        // boost::ref() variant
-        template<typename T>
-        void decode(const boost::reference_wrapper<T>& t, int) const
-        {
-//          add_if_trackable(t.get_pointer());
-        }
-
-        // decode() anything else
-        template<typename T>
-        void decode(const T& t, long) const
-        {
-            typedef truth<(boost::is_pointer<T>::value)> is_a_pointer;
-            maybe_get_pointer(t, is_a_pointer());
-        }
-
-        // maybe_get_pointer() decides between a pointer and a non-pointer
-        // plain pointer variant
-        template<typename T>
-        void maybe_get_pointer(const T& t, truth<true>) const
-        {
-//          add_if_trackable(t);
-        }
-
-        // shared_ptr variant
-        template<typename T>
-        void maybe_get_pointer(const boost::shared_ptr<T>& t, truth<false>) const
-        {
-            // If we have a shared_ptr to this object, it doesn't matter
-            // whether the object is derived from LLEventTrackable, so no
-            // further analysis of T is needed.
-//          mListener.track(t);
-
-            // Make this case illegal. Passing a bound shared_ptr to
-            // slot_type::track() is useless, since the bound shared_ptr will
-            // keep the object alive anyway! Force the coder to cast to weak_ptr.
-
-            // Trivial as it is, make the BOOST_STATIC_ASSERT() condition
-            // dependent on template param so the macro is only evaluated if
-            // this method is in fact instantiated, as described here:
-            // http://www.boost.org/doc/libs/1_34_1/doc/html/boost_staticassert.html
-
-            // ATTENTION: Don't bind a shared_ptr<anything> using
-            // LLEventPump::listen(boost::bind()). Doing so captures a copy of
-            // the shared_ptr, making the referenced object effectively
-            // immortal. Use the weaken() function, e.g.:
-            // somepump.listen(boost::bind(...weaken(my_shared_ptr)...));
-            // This lets us automatically disconnect when the referenced
-            // object is destroyed.
-            BOOST_STATIC_ASSERT(sizeof(T) == 0);
-        }
-
-        // weak_ptr variant
-        template<typename T>
-        void maybe_get_pointer(const boost::weak_ptr<T>& t, truth<false>) const
-        {
-            // If we have a weak_ptr to this object, it doesn't matter
-            // whether the object is derived from LLEventTrackable, so no
-            // further analysis of T is needed.
-            mListener.track(t);
-//          std::cout << "Found weak_ptr<" << typeid(T).name() << ">!\n";
-        }
-
-#if 0
-        // reference to anything derived from boost::enable_shared_from_this
-        template <typename T>
-        inline void maybe_get_pointer(const boost::enable_shared_from_this<T>& ct,
-                                      truth<false>) const
-        {
-            // Use the slot_type::track(shared_ptr) mechanism. Cast away
-            // const-ness because (in our code base anyway) it's unusual
-            // to find shared_ptr<const T>.
-            boost::enable_shared_from_this<T>&
-                t(const_cast<boost::enable_shared_from_this<T>&>(ct));
-            std::cout << "Capturing shared_from_this()" << std::endl;
-            boost::shared_ptr<T> sp(t.shared_from_this());
-/*==========================================================================*|
-            std::cout << "Capturing weak_ptr" << std::endl;
-            boost::weak_ptr<T> wp(sp);
-|*==========================================================================*/
-            std::cout << "Tracking shared__ptr" << std::endl;
-            mListener.track(sp);
-        }
-#endif
-
-        // non-pointer variant
-        template<typename T>
-        void maybe_get_pointer(const T& t, truth<false>) const
-        {
-            // Take the address of this object, because the object itself may be
-            // trackable
-//          add_if_trackable(boost::addressof(t));
-        }
-
-/*==========================================================================*|
-        // add_if_trackable() adds LLEventTrackable objects to mTrackables
-        inline void add_if_trackable(const LLEventTrackable* t) const
-        {
-            if (t)
-            {
-            }
-        }
-
-        // pointer to anything not an LLEventTrackable subclass
-        inline void add_if_trackable(const void*) const
-        {
-        }
-
-        // pointer to free function
-        // The following construct uses the preprocessor to generate
-        // add_if_trackable() overloads accepting pointer-to-function taking
-        // 0, 1, ..., LLEVENTS_LISTENER_ARITY parameters of arbitrary type.
-#define BOOST_PP_LOCAL_MACRO(n)                                     \
-        template <typename R                                        \
-                  BOOST_PP_COMMA_IF(n)                              \
-                  BOOST_PP_ENUM_PARAMS(n, typename T)>              \
-        inline void                                                 \
-        add_if_trackable(R (*)(BOOST_PP_ENUM_PARAMS(n, T))) const   \
-        {                                                           \
-        }
-#define BOOST_PP_LOCAL_LIMITS (0, LLEVENTS_LISTENER_ARITY)
-#include BOOST_PP_LOCAL_ITERATE()
-#undef  BOOST_PP_LOCAL_MACRO
-#undef  BOOST_PP_LOCAL_LIMITS
-|*==========================================================================*/
-
-        /// Bind a reference to the LLEventListener to call its track() method.
-        LLEventListener& mListener;
-    };
-
-    /**
-     * Utility template function to use Visitor appropriately
-     *
-     * @param raw_listener Callable to connect, typically a boost::bind()
-     * expression. This will be visited by Visitor using boost::visit_each().
-     * @param connect_funct Callable that will connect() @a raw_listener to an
-     * LLStandardSignal, returning LLBoundListener.
-     */
-    template <typename LISTENER>
-    LLBoundListener visit_and_connect(const LISTENER& raw_listener,
-                                      const ConnectFunc& connect_func)
-    {
-        // Capture the listener
-        LLEventListener listener(raw_listener);
-        // Define our Visitor, binding the listener so we can call
-        // listener.track() if we discover any shared_ptr<Foo>.
-        LLEventDetail::Visitor visitor(listener);
-        // Allow unqualified visit_each() call for ADL
-        using boost::visit_each;
-        // Visit each component of a boost::bind() expression. Pass
-        // 'raw_listener', our template argument, rather than 'listener' from
-        // which type details have been erased. unwrap() comes from
-        // Boost.Signals, in case we were passed a boost::ref().
-        visit_each(visitor, LLEventDetail::unwrap(raw_listener));
-        // Make the connection using passed function. At present, wrapping
-        // this functionality into this function is a bit silly: we don't
-        // really need a visit_and_connect() function any more, just a visit()
-        // function. The definition of this function dates from when, after
-        // visit_each(), after establishing the connection, we had to
-        // postprocess the new connection with the visitor object. That's no
-        // longer necessary.
-        return connect_func(listener);
-    }
-} // namespace LLEventDetail
-
-// Somewhat to my surprise, passing boost::bind(...boost::weak_ptr<T>...) to
-// listen() fails in Boost code trying to instantiate LLEventListener (i.e.
-// LLStandardSignal::slot_type) because the boost::get_pointer() utility function isn't
-// specialized for boost::weak_ptr. This remedies that omission.
-namespace boost
-{
-    template <typename T>
-    T* get_pointer(const weak_ptr<T>& ptr) { return shared_ptr<T>(ptr).get(); }
-}
-
-/// Since we forbid use of listen(boost::bind(...shared_ptr<T>...)), provide an
-/// easy way to cast to the corresponding weak_ptr.
-template <typename T>
-boost::weak_ptr<T> weaken(const boost::shared_ptr<T>& ptr)
-{
-    return boost::weak_ptr<T>(ptr);
-}
-
-#endif /* ! defined(LL_LLEVENTS_H) */
+/**
+ * @file   llevents.h
+ * @author Kent Quirk, Nat Goodspeed
+ * @date   2008-09-11
+ * @brief  This is an implementation of the event system described at
+ *         https://wiki.lindenlab.com/wiki/Viewer:Messaging/Event_System,
+ *         originally introduced in llnotifications.h. It has nothing
+ *         whatsoever to do with the older system in llevent.h.
+ * 
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * Copyright (c) 2008, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLEVENTS_H)
+#define LL_LLEVENTS_H
+
+#include <string>
+#include <map>
+#include <set>
+#include <vector>
+#include <deque>
+#include <stdexcept>
+#if LL_WINDOWS
+	#pragma warning (push)
+	#pragma warning (disable : 4263) // boost::signals2::expired_slot::what() has const mismatch
+	#pragma warning (disable : 4264) 
+#endif
+#include <boost/signals2.hpp>
+#if LL_WINDOWS
+	#pragma warning (pop)
+#endif
+
+#include <boost/bind.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+#include <boost/utility.hpp>        // noncopyable
+#include <boost/optional/optional.hpp>
+#include <boost/visit_each.hpp>
+#include <boost/ref.hpp>            // reference_wrapper
+#include <boost/type_traits/is_pointer.hpp>
+#include <boost/function.hpp>
+#include <boost/static_assert.hpp>
+#include "llsd.h"
+#include "llsingleton.h"
+#include "lldependencies.h"
+
+// override this to allow binding free functions with more parameters
+#ifndef LLEVENTS_LISTENER_ARITY
+#define LLEVENTS_LISTENER_ARITY 10
+#endif
+
+// hack for testing
+#ifndef testable
+#define testable private
+#endif
+
+/*****************************************************************************
+*   Signal and handler declarations
+*   Using a single handler signature means that we can have a common handler
+*   type, rather than needing a distinct one for each different handler.
+*****************************************************************************/
+
+/**
+ * A boost::signals Combiner that stops the first time a handler returns true
+ * We need this because we want to have our handlers return bool, so that
+ * we have the option to cause a handler to stop further processing. The
+ * default handler fails when the signal returns a value but has no slots.
+ */
+struct LLStopWhenHandled
+{
+    typedef bool result_type;
+
+    template<typename InputIterator>
+    result_type operator()(InputIterator first, InputIterator last) const
+    {
+        for (InputIterator si = first; si != last; ++si)
+		{
+            if (*si)
+			{
+                return true;
+			}
+		}
+        return false;
+    }
+};
+
+/**
+ * We want to have a standard signature for all signals; this way,
+ * we can easily document a protocol for communicating across
+ * dlls and into scripting languages someday.
+ *
+ * We want to return a bool to indicate whether the signal has been
+ * handled and should NOT be passed on to other listeners.
+ * Return true to stop further handling of the signal, and false
+ * to continue.
+ *
+ * We take an LLSD because this way the contents of the signal
+ * are independent of the API used to communicate it.
+ * It is const ref because then there's low cost to pass it;
+ * if you only need to inspect it, it's very cheap.
+ *
+ * @internal
+ * The @c float template parameter indicates that we will internally use @c
+ * float to indicate relative listener order on a given LLStandardSignal.
+ * Don't worry, the @c float values are strictly internal! They are not part
+ * of the interface, for the excellent reason that requiring the caller to
+ * specify a numeric key to establish order means that the caller must know
+ * the universe of possible values. We use LLDependencies for that instead.
+ */
+typedef boost::signals2::signal<bool(const LLSD&), LLStopWhenHandled, float>  LLStandardSignal;
+/// Methods that forward listeners (e.g. constructed with
+/// <tt>boost::bind()</tt>) should accept (const LLEventListener&)
+typedef LLStandardSignal::slot_type LLEventListener;
+/// Result of registering a listener, supports <tt>connected()</tt>,
+/// <tt>disconnect()</tt> and <tt>blocked()</tt>
+typedef boost::signals2::connection LLBoundListener;
+/// Storing an LLBoundListener in LLTempBoundListener will disconnect the
+/// referenced listener when the LLTempBoundListener instance is destroyed.
+typedef boost::signals2::scoped_connection LLTempBoundListener;
+
+/**
+ * A common idiom for event-based code is to accept either a callable --
+ * directly called on completion -- or the string name of an LLEventPump on
+ * which to post the completion event. Specifying a parameter as <tt>const
+ * LLListenerOrPumpName&</tt> allows either.
+ *
+ * Calling a validly-constructed LLListenerOrPumpName, passing the LLSD
+ * 'event' object, either calls the callable or posts the event to the named
+ * LLEventPump.
+ *
+ * A default-constructed LLListenerOrPumpName is 'empty'. (This is useful as
+ * the default value of an optional method parameter.) Calling it throws
+ * LLListenerOrPumpName::Empty. Test for this condition beforehand using
+ * either <tt>if (param)</tt> or <tt>if (! param)</tt>.
+ */
+class LL_COMMON_API LLListenerOrPumpName
+{
+public:
+    /// passing string name of LLEventPump
+    LLListenerOrPumpName(const std::string& pumpname);
+    /// passing string literal (overload so compiler isn't forced to infer
+    /// double conversion)
+    LLListenerOrPumpName(const char* pumpname);
+    /// passing listener -- the "anything else" catch-all case. The type of an
+    /// object constructed by boost::bind() isn't intended to be written out.
+    /// Normally we'd just accept 'const LLEventListener&', but that would
+    /// require double implicit conversion: boost::bind() object to
+    /// LLEventListener, LLEventListener to LLListenerOrPumpName. So use a
+    /// template to forward anything.
+    template<typename T>
+    LLListenerOrPumpName(const T& listener): mListener(listener) {}
+
+    /// for omitted method parameter: uninitialized mListener
+    LLListenerOrPumpName() {}
+
+    /// test for validity
+    operator bool() const { return bool(mListener); }
+    bool operator! () const { return ! mListener; }
+
+    /// explicit accessor
+    const LLEventListener& getListener() const { return *mListener; }
+
+    /// implicit conversion to LLEventListener
+    operator LLEventListener() const { return *mListener; }
+
+    /// allow calling directly
+    bool operator()(const LLSD& event) const;
+
+    /// exception if you try to call when empty
+    struct Empty: public std::runtime_error
+    {
+        Empty(const std::string& what):
+            std::runtime_error(std::string("LLListenerOrPumpName::Empty: ") + what) {}
+    };
+
+private:
+    boost::optional<LLEventListener> mListener;
+};
+
+/*****************************************************************************
+*   LLEventPumps
+*****************************************************************************/
+class LLEventPump;
+
+/**
+ * LLEventPumps is a Singleton manager through which one typically accesses
+ * this subsystem.
+ */
+class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>
+{
+    friend class LLSingleton<LLEventPumps>;
+public:
+    /**
+     * Find or create an LLEventPump instance with a specific name. We return
+     * a reference so there's no question about ownership. obtain() @em finds
+     * an instance without conferring @em ownership.
+     */
+    LLEventPump& obtain(const std::string& name);
+    /**
+     * Flush all known LLEventPump instances
+     */
+    void flush();
+
+    /**
+     * Reset all known LLEventPump instances
+     * workaround for DEV-35406 crash on shutdown
+     */
+    void reset();
+
+private:
+    friend class LLEventPump;
+    /**
+     * Register a new LLEventPump instance (internal)
+     */
+    std::string registerNew(const LLEventPump&, const std::string& name, bool tweak);
+    /**
+     * Unregister a doomed LLEventPump instance (internal)
+     */
+    void unregister(const LLEventPump&);
+
+private:
+    LLEventPumps();
+    ~LLEventPumps();
+
+testable:
+    // Map of all known LLEventPump instances, whether or not we instantiated
+    // them. We store a plain old LLEventPump* because this map doesn't claim
+    // ownership of the instances. Though the common usage pattern is to
+    // request an instance using obtain(), it's fair to instantiate an
+    // LLEventPump subclass statically, as a class member, on the stack or on
+    // the heap. In such cases, the instantiating party is responsible for its
+    // lifespan.
+    typedef std::map<std::string, LLEventPump*> PumpMap;
+    PumpMap mPumpMap;
+    // Set of all LLEventPumps we instantiated. Membership in this set means
+    // we claim ownership, and will delete them when this LLEventPumps is
+    // destroyed.
+    typedef std::set<LLEventPump*> PumpSet;
+    PumpSet mOurPumps;
+    // LLEventPump names that should be instantiated as LLEventQueue rather
+    // than as LLEventStream
+    typedef std::set<std::string> PumpNames;
+    PumpNames mQueueNames;
+};
+
+/*****************************************************************************
+*   details
+*****************************************************************************/
+namespace LLEventDetail
+{
+    /// Any callable capable of connecting an LLEventListener to an
+    /// LLStandardSignal to produce an LLBoundListener can be mapped to this
+    /// signature.
+    typedef boost::function<LLBoundListener(const LLEventListener&)> ConnectFunc;
+
+    /**
+     * Utility template function to use Visitor appropriately
+     *
+     * @param listener Callable to connect, typically a boost::bind()
+     * expression. This will be visited by Visitor using boost::visit_each().
+     * @param connect_func Callable that will connect() @a listener to an
+     * LLStandardSignal, returning LLBoundListener.
+     */
+    template <typename LISTENER>
+    LLBoundListener visit_and_connect(const LISTENER& listener,
+                                      const ConnectFunc& connect_func);
+} // namespace LLEventDetail
+
+/*****************************************************************************
+*   LLEventTrackable
+*****************************************************************************/
+/**
+ * LLEventTrackable wraps boost::signals2::trackable, which resembles
+ * boost::trackable. Derive your listener class from LLEventTrackable instead,
+ * and use something like
+ * <tt>LLEventPump::listen(boost::bind(&YourTrackableSubclass::method,
+ * instance, _1))</tt>. This will implicitly disconnect when the object
+ * referenced by @c instance is destroyed.
+ *
+ * @note
+ * LLEventTrackable doesn't address a couple of cases:
+ * * Object destroyed during call
+ *   - You enter a slot call in thread A.
+ *   - Thread B destroys the object, which of course disconnects it from any
+ *     future slot calls.
+ *   - Thread A's call uses 'this', which now refers to a defunct object.
+ *     Undefined behavior results.
+ * * Call during destruction
+ *   - @c MySubclass is derived from LLEventTrackable.
+ *   - @c MySubclass registers one of its own methods using
+ *     <tt>LLEventPump::listen()</tt>.
+ *   - The @c MySubclass object begins destruction. <tt>~MySubclass()</tt>
+ *     runs, destroying state specific to the subclass. (For instance, a
+ *     <tt>Foo*</tt> data member is <tt>delete</tt>d but not zeroed.)
+ *   - The listening method will not be disconnected until
+ *     <tt>~LLEventTrackable()</tt> runs.
+ *   - Before we get there, another thread posts data to the @c LLEventPump
+ *     instance, calling the @c MySubclass method.
+ *   - The method in question relies on valid @c MySubclass state. (For
+ *     instance, it attempts to dereference the <tt>Foo*</tt> pointer that was
+ *     <tt>delete</tt>d but not zeroed.)
+ *   - Undefined behavior results.
+ * If you suspect you may encounter any such scenario, you're better off
+ * managing the lifespan of your object with <tt>boost::shared_ptr</tt>.
+ * Passing <tt>LLEventPump::listen()</tt> a <tt>boost::bind()</tt> expression
+ * involving a <tt>boost::weak_ptr<Foo></tt> is recognized specially, engaging
+ * thread-safe Boost.Signals2 machinery.
+ */
+typedef boost::signals2::trackable LLEventTrackable;
+
+/*****************************************************************************
+*   LLEventPump
+*****************************************************************************/
+/**
+ * LLEventPump is the base class interface through which we access the
+ * concrete subclasses LLEventStream and LLEventQueue.
+ *
+ * @NOTE
+ * LLEventPump derives from LLEventTrackable so that when you "chain"
+ * LLEventPump instances together, they will automatically disconnect on
+ * destruction. Please see LLEventTrackable documentation for situations in
+ * which this may be perilous across threads.
+ */
+class LL_COMMON_API LLEventPump: public LLEventTrackable
+{
+public:
+    /**
+     * Exception thrown by LLEventPump(). You are trying to instantiate an
+     * LLEventPump (subclass) using the same name as some other instance, and
+     * you didn't pass <tt>tweak=true</tt> to permit it to generate a unique
+     * variant.
+     */
+    struct DupPumpName: public std::runtime_error
+    {
+        DupPumpName(const std::string& what):
+            std::runtime_error(std::string("DupPumpName: ") + what) {}
+    };
+
+    /**
+     * Instantiate an LLEventPump (subclass) with the string name by which it
+     * can be found using LLEventPumps::obtain().
+     *
+     * If you pass (or default) @a tweak to @c false, then a duplicate name
+     * will throw DupPumpName. This won't happen if LLEventPumps::obtain()
+     * instantiates the LLEventPump, because obtain() uses find-or-create
+     * logic. It can only happen if you instantiate an LLEventPump in your own
+     * code -- and a collision with the name of some other LLEventPump is
+     * likely to cause much more subtle problems!
+     *
+     * When you hand-instantiate an LLEventPump, consider passing @a tweak as
+     * @c true. This directs LLEventPump() to append a suffix to the passed @a
+     * name to make it unique. You can retrieve the adjusted name by calling
+     * getName() on your new instance.
+     */
+    LLEventPump(const std::string& name, bool tweak=false);
+    virtual ~LLEventPump();
+
+    /// group exceptions thrown by listen(). We use exceptions because these
+    /// particular errors are likely to be coding errors, found and fixed by
+    /// the developer even before preliminary checkin.
+    struct ListenError: public std::runtime_error
+    {
+        ListenError(const std::string& what): std::runtime_error(what) {}
+    };
+    /**
+     * exception thrown by listen(). You are attempting to register a
+     * listener on this LLEventPump using the same listener name as an
+     * already-registered listener.
+     */
+    struct DupListenerName: public ListenError
+    {
+        DupListenerName(const std::string& what):
+            ListenError(std::string("DupListenerName: ") + what)
+        {}
+    };
+    /**
+     * exception thrown by listen(). The order dependencies specified for your
+     * listener are incompatible with existing listeners.
+     *
+     * Consider listener "a" which specifies before "b" and "b" which
+     * specifies before "c". You are now attempting to register "c" before
+     * "a". There is no order that can satisfy all constraints.
+     */
+    struct Cycle: public ListenError
+    {
+        Cycle(const std::string& what): ListenError(std::string("Cycle: ") + what) {}
+    };
+    /**
+     * exception thrown by listen(). This one means that your new listener
+     * would force a change to the order of previously-registered listeners,
+     * and we don't have a good way to implement that.
+     *
+     * Consider listeners "some", "other" and "third". "some" and "other" are
+     * registered earlier without specifying relative order, so "other"
+     * happens to be first. Now you attempt to register "third" after "some"
+     * and before "other". Whoops, that would require swapping "some" and
+     * "other", which we can't do. Instead we throw this exception.
+     *
+     * It may not be possible to change the registration order so we already
+     * know "third"s order requirement by the time we register the second of
+     * "some" and "other". A solution would be to specify that "some" must
+     * come before "other", or equivalently that "other" must come after
+     * "some".
+     */
+    struct OrderChange: public ListenError
+    {
+        OrderChange(const std::string& what): ListenError(std::string("OrderChange: ") + what) {}
+    };
+
+    /// used by listen()
+    typedef std::vector<std::string> NameList;
+    /// convenience placeholder for when you explicitly want to pass an empty
+    /// NameList
+    const static NameList empty;
+
+    /// Get this LLEventPump's name
+    std::string getName() const { return mName; }
+
+    /**
+     * Register a new listener with a unique name. Specify an optional list
+     * of other listener names after which this one must be called, likewise
+     * an optional list of other listener names before which this one must be
+     * called. The other listeners mentioned need not yet be registered
+     * themselves. listen() can throw any ListenError; see ListenError
+     * subclasses.
+     *
+     * The listener name must be unique among active listeners for this
+     * LLEventPump, else you get DupListenerName. If you don't care to invent
+     * a name yourself, use inventName(). (I was tempted to recognize e.g. ""
+     * and internally generate a distinct name for that case. But that would
+     * handle badly the scenario in which you want to add, remove, re-add,
+     * etc. the same listener: each new listen() call would necessarily
+     * perform a new dependency sort. Assuming you specify the same
+     * after/before lists each time, using inventName() when you first
+     * instantiate your listener, then passing the same name on each listen()
+     * call, allows us to optimize away the second and subsequent dependency
+     * sorts.
+     *
+     * If (as is typical) you pass a <tt>boost::bind()</tt> expression as @a
+     * listener, listen() will inspect the components of that expression. If a
+     * bound object matches any of several cases, the connection will
+     * automatically be disconnected when that object is destroyed.
+     *
+     * * You bind a <tt>boost::weak_ptr</tt>.
+     * * Binding a <tt>boost::shared_ptr</tt> that way would ensure that the
+     *   referenced object would @em never be destroyed, since the @c
+     *   shared_ptr stored in the LLEventPump would remain an outstanding
+     *   reference. Use the weaken() function to convert your @c shared_ptr to
+     *   @c weak_ptr. Because this is easy to forget, binding a @c shared_ptr
+     *   will produce a compile error (@c BOOST_STATIC_ASSERT failure).
+     * * You bind a simple pointer or reference to an object derived from
+     *   <tt>boost::enable_shared_from_this</tt>. (UNDER CONSTRUCTION)
+     * * You bind a simple pointer or reference to an object derived from
+     *   LLEventTrackable. Unlike the cases described above, though, this is
+     *   vulnerable to a couple of cross-thread race conditions, as described
+     *   in the LLEventTrackable documentation.
+     */
+    template <typename LISTENER>
+    LLBoundListener listen(const std::string& name, const LISTENER& listener,
+                           const NameList& after=NameList(),
+                           const NameList& before=NameList())
+    {
+        // Examine listener, using our listen_impl() method to make the
+        // actual connection.
+        // This is why listen() is a template. Conversion from boost::bind()
+        // to LLEventListener performs type erasure, so it's important to look
+        // at the boost::bind object itself before that happens.
+        return LLEventDetail::visit_and_connect(listener,
+                                                boost::bind(&LLEventPump::listen_impl,
+                                                            this,
+                                                            name,
+                                                            _1,
+                                                            after,
+                                                            before));
+    }
+
+    /// Get the LLBoundListener associated with the passed name (dummy
+    /// LLBoundListener if not found)
+    virtual LLBoundListener getListener(const std::string& name) const;
+    /**
+     * Instantiate one of these to block an existing connection:
+     * @code
+     * { // in some local scope
+     *     LLEventPump::Blocker block(someLLBoundListener);
+     *     // code that needs the connection blocked
+     * } // unblock the connection again
+     * @endcode
+     */
+    typedef boost::signals2::shared_connection_block Blocker;
+    /// Unregister a listener by name. Prefer this to
+    /// <tt>getListener(name).disconnect()</tt> because stopListening() also
+    /// forgets this name.
+    virtual void stopListening(const std::string& name);
+    /// Post an event to all listeners. The @c bool return is only meaningful
+    /// if the underlying leaf class is LLEventStream -- beware of relying on
+    /// it too much! Truthfully, we return @c bool mostly to permit chaining
+    /// one LLEventPump as a listener on another.
+    virtual bool post(const LLSD&) = 0;
+    /// Enable/disable: while disabled, silently ignore all post() calls
+    virtual void enable(bool enabled=true) { mEnabled = enabled; }
+    /// query
+    virtual bool enabled() const { return mEnabled; }
+
+    /// Generate a distinct name for a listener -- see listen()
+    static std::string inventName(const std::string& pfx="listener");
+
+private:
+    friend class LLEventPumps;
+    /// flush queued events
+    virtual void flush() {}
+
+    virtual void reset();
+
+private:
+    virtual LLBoundListener listen_impl(const std::string& name, const LLEventListener&,
+                                        const NameList& after,
+                                        const NameList& before);
+    std::string mName;
+
+protected:
+    /// implement the dispatching
+    boost::scoped_ptr<LLStandardSignal> mSignal;
+
+    /// valve open?
+    bool mEnabled;
+    /// Map of named listeners. This tracks the listeners that actually exist
+    /// at this moment. When we stopListening(), we discard the entry from
+    /// this map.
+    typedef std::map<std::string, boost::signals2::connection> ConnectionMap;
+    ConnectionMap mConnections;
+    typedef LLDependencies<std::string, float> DependencyMap;
+    /// Dependencies between listeners. For each listener, track the float
+    /// used to establish its place in mSignal's order. This caches all the
+    /// listeners that have ever registered; stopListening() does not discard
+    /// the entry from this map. This is to avoid a new dependency sort if the
+    /// same listener with the same dependencies keeps hopping on and off this
+    /// LLEventPump.
+    DependencyMap mDeps;
+};
+
+/*****************************************************************************
+*   LLEventStream
+*****************************************************************************/
+/**
+ * LLEventStream is a thin wrapper around LLStandardSignal. Posting an
+ * event immediately calls all registered listeners.
+ */
+class LL_COMMON_API LLEventStream: public LLEventPump
+{
+public:
+    LLEventStream(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
+    virtual ~LLEventStream() {}
+
+    /// Post an event to all listeners
+    virtual bool post(const LLSD& event);
+};
+
+/*****************************************************************************
+*   LLEventQueue
+*****************************************************************************/
+/**
+ * LLEventQueue isa LLEventPump whose post() method defers calling registered
+ * listeners until flush() is called.
+ */
+class LL_COMMON_API LLEventQueue: public LLEventPump
+{
+public:
+    LLEventQueue(const std::string& name, bool tweak=false): LLEventPump(name, tweak) {}
+    virtual ~LLEventQueue() {}
+
+    /// Post an event to all listeners
+    virtual bool post(const LLSD& event);
+
+private:
+    /// flush queued events
+    virtual void flush();
+
+private:
+    typedef std::deque<LLSD> EventQueue;
+    EventQueue mEventQueue;
+};
+
+/*****************************************************************************
+*   LLReqID
+*****************************************************************************/
+/**
+ * This class helps the implementer of a given event API to honor the
+ * ["reqid"] convention. By this convention, each event API stamps into its
+ * response LLSD a ["reqid"] key whose value echoes the ["reqid"] value, if
+ * any, from the corresponding request.
+ *
+ * This supports an (atypical, but occasionally necessary) use case in which
+ * two or more asynchronous requests are multiplexed onto the same ["reply"]
+ * LLEventPump. Since the response events could arrive in arbitrary order, the
+ * caller must be able to demux them. It does so by matching the ["reqid"]
+ * value in each response with the ["reqid"] value in the corresponding
+ * request.
+ *
+ * It is the caller's responsibility to ensure distinct ["reqid"] values for
+ * that case. Though LLSD::UUID is guaranteed to work, it might be overkill:
+ * the "namespace" of unique ["reqid"] values is simply the set of requests
+ * specifying the same ["reply"] LLEventPump name.
+ *
+ * Making a given event API echo the request's ["reqid"] into the response is
+ * nearly trivial. This helper is mostly for mnemonic purposes, to serve as a
+ * place to put these comments. We hope that each time a coder implements a
+ * new event API based on some existing one, s/he will say, "Huh, what's an
+ * LLReqID?" and look up this material.
+ *
+ * The hardest part about the convention is deciding where to store the
+ * ["reqid"] value. Ironically, LLReqID can't help with that: you must store
+ * an LLReqID instance in whatever storage will persist until the reply is
+ * sent. For example, if the request ultimately ends up using a Responder
+ * subclass, storing an LLReqID instance in the Responder works.
+ *
+ * @note
+ * The @em implementer of an event API must honor the ["reqid"] convention.
+ * However, the @em caller of an event API need only use it if s/he is sharing
+ * the same ["reply"] LLEventPump for two or more asynchronous event API
+ * requests.
+ *
+ * In most cases, it's far easier for the caller to instantiate a local
+ * LLEventStream and pass its name to the event API in question. Then it's
+ * perfectly reasonable not to set a ["reqid"] key in the request, ignoring
+ * the @c isUndefined() ["reqid"] value in the response.
+ */
+class LL_COMMON_API LLReqID
+{
+public:
+    /**
+     * If you have the request in hand at the time you instantiate the
+     * LLReqID, pass that request to extract its ["reqid"].
+ */
+    LLReqID(const LLSD& request):
+        mReqid(request["reqid"])
+    {}
+    /// If you don't yet have the request, use setFrom() later.
+    LLReqID() {}
+
+    /// Extract and store the ["reqid"] value from an incoming request.
+    void setFrom(const LLSD& request)
+    {
+        mReqid = request["reqid"];
+    }
+
+    /// Set ["reqid"] key into a pending response LLSD object.
+    void stamp(LLSD& response) const;
+
+    /// Make a whole new response LLSD object with our ["reqid"].
+    LLSD makeResponse() const
+    {
+        LLSD response;
+        stamp(response);
+        return response;
+    }
+
+    /// Not really sure of a use case for this accessor...
+    LLSD getReqID() const { return mReqid; }
+
+private:
+    LLSD mReqid;
+};
+
+/*****************************************************************************
+*   Underpinnings
+*****************************************************************************/
+/**
+ * We originally provided a suite of overloaded
+ * LLEventTrackable::listenTo(LLEventPump&, ...) methods that would call
+ * LLEventPump::listen(...) and then pass the returned LLBoundListener to
+ * LLEventTrackable::track(). This was workable but error-prone: the coder
+ * must remember to call listenTo() rather than the more straightforward
+ * listen() method.
+ *
+ * Now we publish only the single canonical listen() method, so there's a
+ * uniform mechanism. Having a single way to do this is good, in that there's
+ * no question in the coder's mind which of several alternatives to choose.
+ *
+ * To support automatic connection management, we use boost::visit_each
+ * (http://www.boost.org/doc/libs/1_37_0/doc/html/boost/visit_each.html) to
+ * inspect each argument of a boost::bind expression. (Although the visit_each
+ * mechanism was first introduced with the original Boost.Signals library, it
+ * was only later documented.)
+ *
+ * Cases:
+ * * At least one of the function's arguments is a boost::weak_ptr<T>. Pass
+ *   the corresponding shared_ptr to slot_type::track(). Ideally that would be
+ *   the object whose method we want to call, but in fact we do the same for
+ *   any weak_ptr we might find among the bound arguments. If we're passing
+ *   our bound method a weak_ptr to some object, wouldn't the destruction of
+ *   that object invalidate the call? So we disconnect automatically when any
+ *   such object is destroyed. This is the mechanism preferred by boost::
+ *   signals2.
+ * * One of the functions's arguments is a boost::shared_ptr<T>. This produces
+ *   a compile error: the bound copy of the shared_ptr stored in the
+ *   boost_bind object stored in the signal object would make the referenced
+ *   T object immortal. We provide a weaken() function. Pass
+ *   weaken(your_shared_ptr) instead. (We can inspect, but not modify, the
+ *   boost::bind object. Otherwise we'd replace the shared_ptr with weak_ptr
+ *   implicitly and just proceed.)
+ * * One of the function's arguments is a plain pointer/reference to an object
+ *   derived from boost::enable_shared_from_this. We assume that this object
+ *   is managed using boost::shared_ptr, so we implicitly extract a shared_ptr
+ *   and track that. (UNDER CONSTRUCTION)
+ * * One of the function's arguments is derived from LLEventTrackable. Pass
+ *   the LLBoundListener to its LLEventTrackable::track(). This is vulnerable
+ *   to a couple different race conditions, as described in LLEventTrackable
+ *   documentation. (NOTE: Now that LLEventTrackable is a typedef for
+ *   boost::signals2::trackable, the Signals2 library handles this itself, so
+ *   our visitor needs no special logic for this case.)
+ * * Any other argument type is irrelevant to automatic connection management.
+ */
+
+namespace LLEventDetail
+{
+    template <typename F>
+    const F& unwrap(const F& f) { return f; }
+
+    template <typename F>
+    const F& unwrap(const boost::reference_wrapper<F>& f) { return f.get(); }
+
+    // Most of the following is lifted from the Boost.Signals use of
+    // visit_each.
+    template<bool Cond> struct truth {};
+
+    /**
+     * boost::visit_each() Visitor, used on a template argument <tt>const F&
+     * f</tt> as follows (see visit_and_connect()):
+     * @code
+     * LLEventListener listener(f);
+     * Visitor visitor(listener); // bind listener so it can track() shared_ptrs
+     * using boost::visit_each;   // allow unqualified visit_each() call for ADL
+     * visit_each(visitor, unwrap(f));
+     * @endcode
+     */
+    class Visitor
+    {
+    public:
+        /**
+         * Visitor binds a reference to LLEventListener so we can track() any
+         * shared_ptrs we find in the argument list.
+         */
+        Visitor(LLEventListener& listener):
+            mListener(listener)
+        {
+        }
+
+        /**
+         * boost::visit_each() calls this method for each component of a
+         * boost::bind() expression.
+         */
+        template <typename T>
+        void operator()(const T& t) const
+        {
+            decode(t, 0);
+        }
+
+    private:
+        // decode() decides between a reference wrapper and anything else
+        // boost::ref() variant
+        template<typename T>
+        void decode(const boost::reference_wrapper<T>& t, int) const
+        {
+//          add_if_trackable(t.get_pointer());
+        }
+
+        // decode() anything else
+        template<typename T>
+        void decode(const T& t, long) const
+        {
+            typedef truth<(boost::is_pointer<T>::value)> is_a_pointer;
+            maybe_get_pointer(t, is_a_pointer());
+        }
+
+        // maybe_get_pointer() decides between a pointer and a non-pointer
+        // plain pointer variant
+        template<typename T>
+        void maybe_get_pointer(const T& t, truth<true>) const
+        {
+//          add_if_trackable(t);
+        }
+
+        // shared_ptr variant
+        template<typename T>
+        void maybe_get_pointer(const boost::shared_ptr<T>& t, truth<false>) const
+        {
+            // If we have a shared_ptr to this object, it doesn't matter
+            // whether the object is derived from LLEventTrackable, so no
+            // further analysis of T is needed.
+//          mListener.track(t);
+
+            // Make this case illegal. Passing a bound shared_ptr to
+            // slot_type::track() is useless, since the bound shared_ptr will
+            // keep the object alive anyway! Force the coder to cast to weak_ptr.
+
+            // Trivial as it is, make the BOOST_STATIC_ASSERT() condition
+            // dependent on template param so the macro is only evaluated if
+            // this method is in fact instantiated, as described here:
+            // http://www.boost.org/doc/libs/1_34_1/doc/html/boost_staticassert.html
+
+            // ATTENTION: Don't bind a shared_ptr<anything> using
+            // LLEventPump::listen(boost::bind()). Doing so captures a copy of
+            // the shared_ptr, making the referenced object effectively
+            // immortal. Use the weaken() function, e.g.:
+            // somepump.listen(boost::bind(...weaken(my_shared_ptr)...));
+            // This lets us automatically disconnect when the referenced
+            // object is destroyed.
+            BOOST_STATIC_ASSERT(sizeof(T) == 0);
+        }
+
+        // weak_ptr variant
+        template<typename T>
+        void maybe_get_pointer(const boost::weak_ptr<T>& t, truth<false>) const
+        {
+            // If we have a weak_ptr to this object, it doesn't matter
+            // whether the object is derived from LLEventTrackable, so no
+            // further analysis of T is needed.
+            mListener.track(t);
+//          std::cout << "Found weak_ptr<" << typeid(T).name() << ">!\n";
+        }
+
+#if 0
+        // reference to anything derived from boost::enable_shared_from_this
+        template <typename T>
+        inline void maybe_get_pointer(const boost::enable_shared_from_this<T>& ct,
+                                      truth<false>) const
+        {
+            // Use the slot_type::track(shared_ptr) mechanism. Cast away
+            // const-ness because (in our code base anyway) it's unusual
+            // to find shared_ptr<const T>.
+            boost::enable_shared_from_this<T>&
+                t(const_cast<boost::enable_shared_from_this<T>&>(ct));
+            std::cout << "Capturing shared_from_this()" << std::endl;
+            boost::shared_ptr<T> sp(t.shared_from_this());
+/*==========================================================================*|
+            std::cout << "Capturing weak_ptr" << std::endl;
+            boost::weak_ptr<T> wp(sp);
+|*==========================================================================*/
+            std::cout << "Tracking shared__ptr" << std::endl;
+            mListener.track(sp);
+        }
+#endif
+
+        // non-pointer variant
+        template<typename T>
+        void maybe_get_pointer(const T& t, truth<false>) const
+        {
+            // Take the address of this object, because the object itself may be
+            // trackable
+//          add_if_trackable(boost::addressof(t));
+        }
+
+/*==========================================================================*|
+        // add_if_trackable() adds LLEventTrackable objects to mTrackables
+        inline void add_if_trackable(const LLEventTrackable* t) const
+        {
+            if (t)
+            {
+            }
+        }
+
+        // pointer to anything not an LLEventTrackable subclass
+        inline void add_if_trackable(const void*) const
+        {
+        }
+
+        // pointer to free function
+        // The following construct uses the preprocessor to generate
+        // add_if_trackable() overloads accepting pointer-to-function taking
+        // 0, 1, ..., LLEVENTS_LISTENER_ARITY parameters of arbitrary type.
+#define BOOST_PP_LOCAL_MACRO(n)                                     \
+        template <typename R                                        \
+                  BOOST_PP_COMMA_IF(n)                              \
+                  BOOST_PP_ENUM_PARAMS(n, typename T)>              \
+        inline void                                                 \
+        add_if_trackable(R (*)(BOOST_PP_ENUM_PARAMS(n, T))) const   \
+        {                                                           \
+        }
+#define BOOST_PP_LOCAL_LIMITS (0, LLEVENTS_LISTENER_ARITY)
+#include BOOST_PP_LOCAL_ITERATE()
+#undef  BOOST_PP_LOCAL_MACRO
+#undef  BOOST_PP_LOCAL_LIMITS
+|*==========================================================================*/
+
+        /// Bind a reference to the LLEventListener to call its track() method.
+        LLEventListener& mListener;
+    };
+
+    /**
+     * Utility template function to use Visitor appropriately
+     *
+     * @param raw_listener Callable to connect, typically a boost::bind()
+     * expression. This will be visited by Visitor using boost::visit_each().
+     * @param connect_funct Callable that will connect() @a raw_listener to an
+     * LLStandardSignal, returning LLBoundListener.
+     */
+    template <typename LISTENER>
+    LLBoundListener visit_and_connect(const LISTENER& raw_listener,
+                                      const ConnectFunc& connect_func)
+    {
+        // Capture the listener
+        LLEventListener listener(raw_listener);
+        // Define our Visitor, binding the listener so we can call
+        // listener.track() if we discover any shared_ptr<Foo>.
+        LLEventDetail::Visitor visitor(listener);
+        // Allow unqualified visit_each() call for ADL
+        using boost::visit_each;
+        // Visit each component of a boost::bind() expression. Pass
+        // 'raw_listener', our template argument, rather than 'listener' from
+        // which type details have been erased. unwrap() comes from
+        // Boost.Signals, in case we were passed a boost::ref().
+        visit_each(visitor, LLEventDetail::unwrap(raw_listener));
+        // Make the connection using passed function. At present, wrapping
+        // this functionality into this function is a bit silly: we don't
+        // really need a visit_and_connect() function any more, just a visit()
+        // function. The definition of this function dates from when, after
+        // visit_each(), after establishing the connection, we had to
+        // postprocess the new connection with the visitor object. That's no
+        // longer necessary.
+        return connect_func(listener);
+    }
+} // namespace LLEventDetail
+
+// Somewhat to my surprise, passing boost::bind(...boost::weak_ptr<T>...) to
+// listen() fails in Boost code trying to instantiate LLEventListener (i.e.
+// LLStandardSignal::slot_type) because the boost::get_pointer() utility function isn't
+// specialized for boost::weak_ptr. This remedies that omission.
+namespace boost
+{
+    template <typename T>
+    T* get_pointer(const weak_ptr<T>& ptr) { return shared_ptr<T>(ptr).get(); }
+}
+
+/// Since we forbid use of listen(boost::bind(...shared_ptr<T>...)), provide an
+/// easy way to cast to the corresponding weak_ptr.
+template <typename T>
+boost::weak_ptr<T> weaken(const boost::shared_ptr<T>& ptr)
+{
+    return boost::weak_ptr<T>(ptr);
+}
+
+#endif /* ! defined(LL_LLEVENTS_H) */
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 905d736d6213a1a38f1db81e2bced96c40d1ddab..45b84ea3eaa5c353913b7bc3acfec5ddbe6bafce 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -1,317 +1,317 @@
-/** 
- * @file llfasttimer.h
- * @brief Declaration of a fast timer.
- *
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- * 
- * Copyright (c) 2004-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_FASTTIMER_H
-#define LL_FASTTIMER_H
-
-#include "llinstancetracker.h"
-
-#define FAST_TIMER_ON 1
-
-#if LL_WINDOWS
-
-// shift off lower 8 bits for lower resolution but longer term timing
-// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
-inline U32 get_cpu_clock_count_32()
-{
-	U32 ret_val;
-	__asm 
-	{
-        _emit   0x0f
-        _emit   0x31
-		shr eax,8
-		shl edx,24
-		or eax, edx
-		mov dword ptr [ret_val], eax
-	}
-    return ret_val;
-}
-
-// return full timer value, still shifted by 8 bits
-inline U64 get_cpu_clock_count_64()
-{
-	U64 ret_val;
-	__asm 
-	{
-        _emit   0x0f
-        _emit   0x31
-		mov eax,eax
-		mov edx,edx
-		mov dword ptr [ret_val+4], edx
-		mov dword ptr [ret_val], eax
-	}
-    return ret_val >> 8;
-}
-
-#endif // LL_WINDOWS
-
-#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
-inline U32 get_cpu_clock_count_32()
-{																	
-	U64 x;															
-	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));					
-	return (U32)x >> 8;													
-}
-
-inline U32 get_cpu_clock_count_64()
-{																	
-	U64 x;
-	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
-	return x >> 8;
-}
-#endif
-
-#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__))) || (LL_SOLARIS && defined(__sparc__))
-//
-// Mac PPC (deprecated) & Solaris SPARC implementation of CPU clock
-//
-// Just use gettimeofday implementation for now
-
-inline U32 get_cpu_clock_count_32()
-{
-	return (U32)get_clock_count();
-}
-
-inline U32 get_cpu_clock_count_64()
-{																	
-	return get_clock_count();
-}
-#endif
-
-class LLMutex;
-
-#include <queue>
-#include "llsd.h"
-
-
-class LL_COMMON_API LLFastTimer
-{
-public:
-	// stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
-	class LL_COMMON_API NamedTimer 
-	:	public LLInstanceTracker<NamedTimer>
-	{
-		friend class DeclareTimer;
-	public:
-		~NamedTimer();
-
-		enum { HISTORY_NUM = 60 };
-
-		const std::string& getName() const { return mName; }
-		NamedTimer* getParent() const { return mParent; }
-		void setParent(NamedTimer* parent);
-		S32 getDepth();
-		std::string getToolTip(S32 history_index = -1);
-
-		typedef std::vector<NamedTimer*>::const_iterator child_const_iter;
-		child_const_iter beginChildren();
-		child_const_iter endChildren();
-		std::vector<NamedTimer*>& getChildren();
-
-		void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
-		bool getCollapsed() const { return mCollapsed; }
-
-		U32 getCountAverage() const { return mCountAverage; }
-		U32 getCallAverage() const { return mCallAverage; }
-
-		U32 getHistoricalCount(S32 history_index = 0) const;
-		U32 getHistoricalCalls(S32 history_index = 0) const;
-
-		static NamedTimer& getRootNamedTimer();
-
-		struct FrameState
-		{
-			FrameState(NamedTimer* timerp);
-
-			U32 		mSelfTimeCounter;
-			U32 		mCalls;
-			FrameState*	mParent;		// info for caller timer
-			FrameState*	mLastCaller;	// used to bootstrap tree construction
-			NamedTimer*	mTimer;
-			U16			mActiveCount;	// number of timers with this ID active on stack
-			bool		mMoveUpTree;	// needs to be moved up the tree of timers at the end of frame
-		};
-
-		S32 getFrameStateIndex() const { return mFrameStateIndex; }
-
-		FrameState& getFrameState() const;
-
-
-	private: 
-		friend class LLFastTimer;
-		friend class NamedTimerFactory;
-
-		//
-		// methods
-		//
-		NamedTimer(const std::string& name);
-		// recursive call to gather total time from children
-		static void accumulateTimings();
-
-		// updates cumulative times and hierarchy, 
-		// can be called multiple times in a frame, at any point
-		static void processTimes();
-
-		static void buildHierarchy();
-		static void resetFrame();
-		static void reset();
-
-	
-		//
-		// members
-		//
-		S32			mFrameStateIndex;
-
-		std::string	mName;
-
-		U32 		mTotalTimeCounter;
-
-		U32 		mCountAverage;
-		U32			mCallAverage;
-
-		U32*		mCountHistory;
-		U32*		mCallHistory;
-
-		// tree structure
-		NamedTimer*					mParent;				// NamedTimer of caller(parent)
-		std::vector<NamedTimer*>	mChildren;
-		bool						mCollapsed;				// don't show children
-		bool						mNeedsSorting;			// sort children whenever child added
-
-	};
-
-	// used to statically declare a new named timer
-	class LL_COMMON_API DeclareTimer
-	:	public LLInstanceTracker<DeclareTimer>
-	{
-	public:
-		DeclareTimer(const std::string& name, bool open);
-		DeclareTimer(const std::string& name);
-
-		static void updateCachedPointers();
-
-		// convertable to NamedTimer::FrameState for convenient usage of LLFastTimer(declared_timer)
-		operator NamedTimer::FrameState&() { return *mFrameState; }
-	private:
-		NamedTimer&				mTimer;
-		NamedTimer::FrameState* mFrameState; 
-	};
-
-
-public:
-	static LLMutex* sLogLock;
-	static std::queue<LLSD> sLogQueue;
-	static BOOL sLog;
-	static BOOL sMetricLog;
-
-	typedef std::vector<NamedTimer::FrameState> info_list_t;
-	static info_list_t& getFrameStateList();
-
-	enum RootTimerMarker { ROOT };
-	LLFastTimer(RootTimerMarker);
-
-	LLFastTimer(NamedTimer::FrameState& timer)
-	:	mFrameState(&timer)
-	{
-#if FAST_TIMER_ON
-		NamedTimer::FrameState* frame_state = &timer;
-		U32 cur_time = get_cpu_clock_count_32();
-		mStartSelfTime = cur_time;
-		mStartTotalTime = cur_time;
-
-		frame_state->mActiveCount++;
-		frame_state->mCalls++;
-		// keep current parent as long as it is active when we are
-		frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
-	
-		mLastTimer = sCurTimer;
-		sCurTimer = this;
-#endif
-	}
-
-	~LLFastTimer()
-	{
-#if FAST_TIMER_ON
-		NamedTimer::FrameState* frame_state = mFrameState;
-		U32 cur_time = get_cpu_clock_count_32();
-		frame_state->mSelfTimeCounter += cur_time - mStartSelfTime;
-
-		frame_state->mActiveCount--;
-		LLFastTimer* last_timer = mLastTimer;
-		sCurTimer = last_timer;
-
-		// store last caller to bootstrap tree creation
-		frame_state->mLastCaller = last_timer->mFrameState;
-
-		// we are only tracking self time, so subtract our total time delta from parents
-		U32 total_time = cur_time - mStartTotalTime;
-		last_timer->mStartSelfTime += total_time;
-#endif
-	}
-
-
-	// call this once a frame to reset timers
-	static void nextFrame();
-
-	// dumps current cumulative frame stats to log
-	// call nextFrame() to reset timers
-	static void dumpCurTimes(); 
-
-	// call this to reset timer hierarchy, averages, etc.
-	static void reset();
-
-	static U64 countsPerSecond();
-	static S32 getLastFrameIndex() { return sLastFrameIndex; }
-	static S32 getCurFrameIndex() { return sCurFrameIndex; }
-
-	static void writeLog(std::ostream& os);
-	static const NamedTimer* getTimerByName(const std::string& name);
-
-public:
-	static bool 		sPauseHistory;
-	static bool 		sResetHistory;
-	
-private:
-	typedef std::vector<LLFastTimer*> timer_stack_t;
-	static LLFastTimer*		sCurTimer;
-	static S32				sCurFrameIndex;
-	static S32				sLastFrameIndex;
-	static U64				sLastFrameTime;
-	static info_list_t*		sTimerInfos;
-
-	U32						mStartSelfTime;	// start time + time of all child timers
-	U32						mStartTotalTime;	// start time + time of all child timers
-	NamedTimer::FrameState*	mFrameState;
-	LLFastTimer*			mLastTimer;
-};
-
-#endif // LL_LLFASTTIMER_H
+/** 
+ * @file llfasttimer.h
+ * @brief Declaration of a fast timer.
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FASTTIMER_H
+#define LL_FASTTIMER_H
+
+#include "llinstancetracker.h"
+
+#define FAST_TIMER_ON 1
+
+#if LL_WINDOWS
+
+// shift off lower 8 bits for lower resolution but longer term timing
+// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
+inline U32 get_cpu_clock_count_32()
+{
+	U32 ret_val;
+	__asm 
+	{
+        _emit   0x0f
+        _emit   0x31
+		shr eax,8
+		shl edx,24
+		or eax, edx
+		mov dword ptr [ret_val], eax
+	}
+    return ret_val;
+}
+
+// return full timer value, still shifted by 8 bits
+inline U64 get_cpu_clock_count_64()
+{
+	U64 ret_val;
+	__asm 
+	{
+        _emit   0x0f
+        _emit   0x31
+		mov eax,eax
+		mov edx,edx
+		mov dword ptr [ret_val+4], edx
+		mov dword ptr [ret_val], eax
+	}
+    return ret_val >> 8;
+}
+
+#endif // LL_WINDOWS
+
+#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
+inline U32 get_cpu_clock_count_32()
+{																	
+	U64 x;															
+	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));					
+	return (U32)x >> 8;													
+}
+
+inline U32 get_cpu_clock_count_64()
+{																	
+	U64 x;
+	__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
+	return x >> 8;
+}
+#endif
+
+#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__))) || (LL_SOLARIS && defined(__sparc__))
+//
+// Mac PPC (deprecated) & Solaris SPARC implementation of CPU clock
+//
+// Just use gettimeofday implementation for now
+
+inline U32 get_cpu_clock_count_32()
+{
+	return (U32)get_clock_count();
+}
+
+inline U32 get_cpu_clock_count_64()
+{																	
+	return get_clock_count();
+}
+#endif
+
+class LLMutex;
+
+#include <queue>
+#include "llsd.h"
+
+
+class LL_COMMON_API LLFastTimer
+{
+public:
+	// stores a "named" timer instance to be reused via multiple LLFastTimer stack instances
+	class LL_COMMON_API NamedTimer 
+	:	public LLInstanceTracker<NamedTimer>
+	{
+		friend class DeclareTimer;
+	public:
+		~NamedTimer();
+
+		enum { HISTORY_NUM = 60 };
+
+		const std::string& getName() const { return mName; }
+		NamedTimer* getParent() const { return mParent; }
+		void setParent(NamedTimer* parent);
+		S32 getDepth();
+		std::string getToolTip(S32 history_index = -1);
+
+		typedef std::vector<NamedTimer*>::const_iterator child_const_iter;
+		child_const_iter beginChildren();
+		child_const_iter endChildren();
+		std::vector<NamedTimer*>& getChildren();
+
+		void setCollapsed(bool collapsed) { mCollapsed = collapsed; }
+		bool getCollapsed() const { return mCollapsed; }
+
+		U32 getCountAverage() const { return mCountAverage; }
+		U32 getCallAverage() const { return mCallAverage; }
+
+		U32 getHistoricalCount(S32 history_index = 0) const;
+		U32 getHistoricalCalls(S32 history_index = 0) const;
+
+		static NamedTimer& getRootNamedTimer();
+
+		struct FrameState
+		{
+			FrameState(NamedTimer* timerp);
+
+			U32 		mSelfTimeCounter;
+			U32 		mCalls;
+			FrameState*	mParent;		// info for caller timer
+			FrameState*	mLastCaller;	// used to bootstrap tree construction
+			NamedTimer*	mTimer;
+			U16			mActiveCount;	// number of timers with this ID active on stack
+			bool		mMoveUpTree;	// needs to be moved up the tree of timers at the end of frame
+		};
+
+		S32 getFrameStateIndex() const { return mFrameStateIndex; }
+
+		FrameState& getFrameState() const;
+
+
+	private: 
+		friend class LLFastTimer;
+		friend class NamedTimerFactory;
+
+		//
+		// methods
+		//
+		NamedTimer(const std::string& name);
+		// recursive call to gather total time from children
+		static void accumulateTimings();
+
+		// updates cumulative times and hierarchy, 
+		// can be called multiple times in a frame, at any point
+		static void processTimes();
+
+		static void buildHierarchy();
+		static void resetFrame();
+		static void reset();
+
+	
+		//
+		// members
+		//
+		S32			mFrameStateIndex;
+
+		std::string	mName;
+
+		U32 		mTotalTimeCounter;
+
+		U32 		mCountAverage;
+		U32			mCallAverage;
+
+		U32*		mCountHistory;
+		U32*		mCallHistory;
+
+		// tree structure
+		NamedTimer*					mParent;				// NamedTimer of caller(parent)
+		std::vector<NamedTimer*>	mChildren;
+		bool						mCollapsed;				// don't show children
+		bool						mNeedsSorting;			// sort children whenever child added
+
+	};
+
+	// used to statically declare a new named timer
+	class LL_COMMON_API DeclareTimer
+	:	public LLInstanceTracker<DeclareTimer>
+	{
+	public:
+		DeclareTimer(const std::string& name, bool open);
+		DeclareTimer(const std::string& name);
+
+		static void updateCachedPointers();
+
+		// convertable to NamedTimer::FrameState for convenient usage of LLFastTimer(declared_timer)
+		operator NamedTimer::FrameState&() { return *mFrameState; }
+	private:
+		NamedTimer&				mTimer;
+		NamedTimer::FrameState* mFrameState; 
+	};
+
+
+public:
+	static LLMutex* sLogLock;
+	static std::queue<LLSD> sLogQueue;
+	static BOOL sLog;
+	static BOOL sMetricLog;
+
+	typedef std::vector<NamedTimer::FrameState> info_list_t;
+	static info_list_t& getFrameStateList();
+
+	enum RootTimerMarker { ROOT };
+	LLFastTimer(RootTimerMarker);
+
+	LLFastTimer(NamedTimer::FrameState& timer)
+	:	mFrameState(&timer)
+	{
+#if FAST_TIMER_ON
+		NamedTimer::FrameState* frame_state = &timer;
+		U32 cur_time = get_cpu_clock_count_32();
+		mStartSelfTime = cur_time;
+		mStartTotalTime = cur_time;
+
+		frame_state->mActiveCount++;
+		frame_state->mCalls++;
+		// keep current parent as long as it is active when we are
+		frame_state->mMoveUpTree |= (frame_state->mParent->mActiveCount == 0);
+	
+		mLastTimer = sCurTimer;
+		sCurTimer = this;
+#endif
+	}
+
+	~LLFastTimer()
+	{
+#if FAST_TIMER_ON
+		NamedTimer::FrameState* frame_state = mFrameState;
+		U32 cur_time = get_cpu_clock_count_32();
+		frame_state->mSelfTimeCounter += cur_time - mStartSelfTime;
+
+		frame_state->mActiveCount--;
+		LLFastTimer* last_timer = mLastTimer;
+		sCurTimer = last_timer;
+
+		// store last caller to bootstrap tree creation
+		frame_state->mLastCaller = last_timer->mFrameState;
+
+		// we are only tracking self time, so subtract our total time delta from parents
+		U32 total_time = cur_time - mStartTotalTime;
+		last_timer->mStartSelfTime += total_time;
+#endif
+	}
+
+
+	// call this once a frame to reset timers
+	static void nextFrame();
+
+	// dumps current cumulative frame stats to log
+	// call nextFrame() to reset timers
+	static void dumpCurTimes(); 
+
+	// call this to reset timer hierarchy, averages, etc.
+	static void reset();
+
+	static U64 countsPerSecond();
+	static S32 getLastFrameIndex() { return sLastFrameIndex; }
+	static S32 getCurFrameIndex() { return sCurFrameIndex; }
+
+	static void writeLog(std::ostream& os);
+	static const NamedTimer* getTimerByName(const std::string& name);
+
+public:
+	static bool 		sPauseHistory;
+	static bool 		sResetHistory;
+	
+private:
+	typedef std::vector<LLFastTimer*> timer_stack_t;
+	static LLFastTimer*		sCurTimer;
+	static S32				sCurFrameIndex;
+	static S32				sLastFrameIndex;
+	static U64				sLastFrameTime;
+	static info_list_t*		sTimerInfos;
+
+	U32						mStartSelfTime;	// start time + time of all child timers
+	U32						mStartTotalTime;	// start time + time of all child timers
+	NamedTimer::FrameState*	mFrameState;
+	LLFastTimer*			mLastTimer;
+};
+
+#endif // LL_LLFASTTIMER_H
diff --git a/indra/llcommon/llfoldertype.cpp b/indra/llcommon/llfoldertype.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9107b11597e8df4427dc1481a3d86b0ae8d9a8ce
--- /dev/null
+++ b/indra/llcommon/llfoldertype.cpp
@@ -0,0 +1,165 @@
+/** 
+ * @file llfoldertype.cpp
+ * @brief Implementatino of LLFolderType functionality.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llfoldertype.h"
+#include "lldictionary.h"
+#include "llmemory.h"
+#include "llsingleton.h"
+
+///----------------------------------------------------------------------------
+/// Class LLFolderType
+///----------------------------------------------------------------------------
+struct FolderEntry : public LLDictionaryEntry
+{
+	FolderEntry(const std::string &type_name, // 8 character limit!
+				bool is_protected) // can the viewer change categories of this type?
+		:
+	LLDictionaryEntry(type_name),
+	mIsProtected(is_protected)
+	{
+		llassert(type_name.length() <= 8);
+	}
+
+	const bool mIsProtected;
+};
+
+class LLFolderDictionary : public LLSingleton<LLFolderDictionary>,
+						   public LLDictionary<LLFolderType::EType, FolderEntry>
+{
+public:
+	LLFolderDictionary();
+};
+
+LLFolderDictionary::LLFolderDictionary()
+{
+	//       													    TYPE NAME	PROTECTED
+	//      													   |-----------|---------|
+	addEntry(LLFolderType::FT_TEXTURE, 				new FolderEntry("texture",	TRUE));
+	addEntry(LLFolderType::FT_SOUND, 				new FolderEntry("sound",	TRUE));
+	addEntry(LLFolderType::FT_CALLINGCARD, 			new FolderEntry("callcard",	TRUE));
+	addEntry(LLFolderType::FT_LANDMARK, 			new FolderEntry("landmark",	TRUE));
+	addEntry(LLFolderType::FT_CLOTHING, 			new FolderEntry("clothing",	TRUE));
+	addEntry(LLFolderType::FT_OBJECT, 				new FolderEntry("object",	TRUE));
+	addEntry(LLFolderType::FT_NOTECARD, 			new FolderEntry("notecard",	TRUE));
+	addEntry(LLFolderType::FT_CATEGORY, 			new FolderEntry("category",	TRUE));
+	addEntry(LLFolderType::FT_ROOT_CATEGORY, 		new FolderEntry("root",		TRUE));
+	addEntry(LLFolderType::FT_LSL_TEXT, 			new FolderEntry("lsltext",	TRUE));
+	addEntry(LLFolderType::FT_BODYPART, 			new FolderEntry("bodypart",	TRUE));
+	addEntry(LLFolderType::FT_TRASH, 				new FolderEntry("trash",	TRUE));
+	addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, 	new FolderEntry("snapshot", TRUE));
+	addEntry(LLFolderType::FT_LOST_AND_FOUND, 		new FolderEntry("lstndfnd",	TRUE));
+	addEntry(LLFolderType::FT_ANIMATION, 			new FolderEntry("animatn",	TRUE));
+	addEntry(LLFolderType::FT_GESTURE, 				new FolderEntry("gesture",	TRUE));
+	addEntry(LLFolderType::FT_FAVORITE, 			new FolderEntry("favorite",	TRUE));
+	
+	for (S32 ensemble_num = S32(LLFolderType::FT_ENSEMBLE_START); ensemble_num <= S32(LLFolderType::FT_ENSEMBLE_END); ensemble_num++)
+	{
+		addEntry(LLFolderType::EType(ensemble_num), new FolderEntry("ensemble", FALSE)); 
+	}
+
+	addEntry(LLFolderType::FT_CURRENT_OUTFIT, 		new FolderEntry("current",	TRUE));
+	addEntry(LLFolderType::FT_OUTFIT, 				new FolderEntry("outfit",	FALSE));
+	addEntry(LLFolderType::FT_MY_OUTFITS, 			new FolderEntry("my_otfts",	TRUE));
+	addEntry(LLFolderType::FT_INBOX, 				new FolderEntry("inbox",	TRUE));
+		 
+	addEntry(LLFolderType::FT_NONE, 				new FolderEntry("-1",		FALSE));
+};
+
+// static
+LLFolderType::EType LLFolderType::lookup(const std::string& name)
+{
+	return LLFolderDictionary::getInstance()->lookup(name);
+}
+
+// static
+const std::string &LLFolderType::lookup(LLFolderType::EType folder_type)
+{
+	const FolderEntry *entry = LLFolderDictionary::getInstance()->lookup(folder_type);
+	if (entry)
+	{
+		return entry->mName;
+	}
+	else
+	{
+		return badLookup();
+	}
+}
+
+// static
+// Only ensembles and plain folders aren't protected.  "Protected" means
+// you can't change certain properties such as their type.
+bool LLFolderType::lookupIsProtectedType(EType folder_type)
+{
+	const LLFolderDictionary *dict = LLFolderDictionary::getInstance();
+	const FolderEntry *entry = dict->lookup(folder_type);
+	if (entry)
+	{
+		return entry->mIsProtected;
+	}
+	return true;
+}
+
+// static
+bool LLFolderType::lookupIsEnsembleType(EType folder_type)
+{
+	return (folder_type >= FT_ENSEMBLE_START &&
+			folder_type <= FT_ENSEMBLE_END);
+}
+
+// static
+LLAssetType::EType LLFolderType::folderTypeToAssetType(LLFolderType::EType folder_type)
+{
+	if (LLAssetType::lookup(LLAssetType::EType(folder_type)) == LLAssetType::badLookup())
+	{
+		llwarns << "Converting to unknown asset type " << folder_type << llendl;
+	}
+	return (LLAssetType::EType)folder_type;
+}
+
+// static
+LLFolderType::EType LLFolderType::assetTypeToFolderType(LLAssetType::EType asset_type)
+{
+	if (LLFolderType::lookup(LLFolderType::EType(asset_type)) == LLFolderType::badLookup())
+	{
+		llwarns << "Converting to unknown folder type " << asset_type << llendl;
+	}
+	return (LLFolderType::EType)asset_type;
+}
+
+// static
+const std::string &LLFolderType::badLookup()
+{
+	static const std::string sBadLookup = "llfoldertype_bad_lookup";
+	return sBadLookup;
+}
diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h
new file mode 100644
index 0000000000000000000000000000000000000000..5374ffd829aae75dbc607b30e2d429d9aa6fc131
--- /dev/null
+++ b/indra/llcommon/llfoldertype.h
@@ -0,0 +1,123 @@
+/** 
+ * @file llfoldertype.h
+ * @brief Declaration of LLFolderType.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFOLDERTYPE_H
+#define LL_LLFOLDERTYPE_H
+
+#include <string>
+#include "llassettype.h"
+
+// This class handles folder types (similar to assettype, except for folders)
+// and operations on those.
+class LL_COMMON_API LLFolderType
+{
+public:
+	// ! BACKWARDS COMPATIBILITY ! Folder type enums must match asset type enums.
+	enum EType
+	{
+		FT_TEXTURE = 0,
+
+		FT_SOUND = 1, 
+
+		FT_CALLINGCARD = 2,
+
+		FT_LANDMARK = 3,
+
+		// FT_SCRIPT = 4,
+
+		FT_CLOTHING = 5,
+
+		FT_OBJECT = 6,
+
+		FT_NOTECARD = 7,
+
+		FT_CATEGORY = 8,
+
+		FT_ROOT_CATEGORY = 9,
+
+		FT_LSL_TEXT = 10,
+
+		// FT_LSL_BYTECODE = 11,
+		// FT_TEXTURE_TGA = 12,
+
+		FT_BODYPART = 13,
+
+		FT_TRASH = 14,
+
+		FT_SNAPSHOT_CATEGORY = 15,
+
+		FT_LOST_AND_FOUND = 16,
+
+		// FT_SOUND_WAV = 17,
+		// FT_IMAGE_TGA = 18,
+		// FT_IMAGE_JPEG = 19,
+
+		FT_ANIMATION = 20,
+
+		FT_GESTURE = 21,
+
+		// FT_SIMSTATE = 22,
+
+		FT_FAVORITE = 23,
+
+		FT_ENSEMBLE_START = 26,
+		FT_ENSEMBLE_END = 45,
+			// This range is reserved for special clothing folder types.
+
+		FT_CURRENT_OUTFIT = 46,
+		FT_OUTFIT = 47,
+		FT_MY_OUTFITS = 48,
+		
+		FT_INBOX = 49,
+
+		FT_COUNT = 50,
+
+		FT_NONE = -1
+	};
+
+	static EType 				lookup(const std::string& type_name);
+	static const std::string&	lookup(EType folder_type);
+
+	static bool 				lookupIsProtectedType(EType folder_type);
+	static bool 				lookupIsEnsembleType(EType folder_type);
+
+	static LLAssetType::EType	folderTypeToAssetType(LLFolderType::EType folder_type);
+	static LLFolderType::EType	assetTypeToFolderType(LLAssetType::EType asset_type);
+
+	static const std::string&	badLookup(); // error string when a lookup fails
+
+protected:
+	LLFolderType() {}
+	~LLFolderType() {}
+};
+
+#endif // LL_LLFOLDERTYPE_H
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 09f19532b7c56439e2b580cdffd326ba9b14cf1d..1c6f64dd8bcc5ad0fb112abce920352156adca74 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -1,65 +1,65 @@
-/** 
- * @file llmemory.h
- * @brief Memory allocation/deallocation header-stuff goes here.
- *
- * $LicenseInfo:firstyear=2002&license=viewergpl$
- * 
- * Copyright (c) 2002-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-#ifndef LLMEMORY_H
-#define LLMEMORY_H
-
-
-
-extern S32 gTotalDAlloc;
-extern S32 gTotalDAUse;
-extern S32 gDACount;
-
-extern void* ll_allocate (size_t size);
-extern void ll_release (void *p);
-
-class LL_COMMON_API LLMemory
-{
-public:
-	static void initClass();
-	static void cleanupClass();
-	static void freeReserve();
-	// Return the resident set size of the current process, in bytes.
-	// Return value is zero if not known.
-	static U64 getCurrentRSS();
-private:
-	static char* reserveMem;
-};
-
-// LLRefCount moved to llrefcount.h
-
-// LLPointer moved to llpointer.h
-
-// LLSafeHandle moved to llsafehandle.h
-
-// LLSingleton moved to llsingleton.h
-
-#endif
+/** 
+ * @file llmemory.h
+ * @brief Memory allocation/deallocation header-stuff goes here.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#ifndef LLMEMORY_H
+#define LLMEMORY_H
+
+
+
+extern S32 gTotalDAlloc;
+extern S32 gTotalDAUse;
+extern S32 gDACount;
+
+extern void* ll_allocate (size_t size);
+extern void ll_release (void *p);
+
+class LL_COMMON_API LLMemory
+{
+public:
+	static void initClass();
+	static void cleanupClass();
+	static void freeReserve();
+	// Return the resident set size of the current process, in bytes.
+	// Return value is zero if not known.
+	static U64 getCurrentRSS();
+private:
+	static char* reserveMem;
+};
+
+// LLRefCount moved to llrefcount.h
+
+// LLPointer moved to llpointer.h
+
+// LLSafeHandle moved to llsafehandle.h
+
+// LLSingleton moved to llsingleton.h
+
+#endif
diff --git a/indra/llcommon/llmemtype.h b/indra/llcommon/llmemtype.h
index 5952a3a7c5a5b69ea782a1b174aaf145db0aa774..677fad3034d033d558c3584ca1ffe6052f94689f 100644
--- a/indra/llcommon/llmemtype.h
+++ b/indra/llcommon/llmemtype.h
@@ -1,248 +1,248 @@
-/** 
- * @file llmemtype.h
- * @brief Runtime memory usage debugging utilities.
- *
- * $LicenseInfo:firstyear=2005&license=viewergpl$
- * 
- * Copyright (c) 2005-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_MEMTYPE_H
-#define LL_MEMTYPE_H
-
-//----------------------------------------------------------------------------
-//----------------------------------------------------------------------------
-
-//----------------------------------------------------------------------------
-
-#include "linden_common.h"
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-// WARNING: Never commit with MEM_TRACK_MEM == 1
-//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-#define MEM_TRACK_MEM (0 && LL_WINDOWS)
-
-#include <vector>
-
-#define MEM_TYPE_NEW(T)
-
-class LL_COMMON_API LLMemType
-{
-public:
-
-	// class we'll initialize all instances of as
-	// static members of MemType.  Then use
-	// to construct any new mem type.
-	class LL_COMMON_API DeclareMemType
-	{
-	public:
-		DeclareMemType(char const * st);
-		~DeclareMemType();
-	
-		S32 mID;
-		char const * mName;
-		
-		// array so we can map an index ID to Name
-		static std::vector<char const *> mNameList;
-	};
-
-	LLMemType(DeclareMemType& dt);
-	~LLMemType();
-
-	static char const * getNameFromID(S32 id);
-
-	static DeclareMemType MTYPE_INIT;
-	static DeclareMemType MTYPE_STARTUP;
-	static DeclareMemType MTYPE_MAIN;
-	static DeclareMemType MTYPE_FRAME;
-
-	static DeclareMemType MTYPE_GATHER_INPUT;
-	static DeclareMemType MTYPE_JOY_KEY;
-
-	static DeclareMemType MTYPE_IDLE;
-	static DeclareMemType MTYPE_IDLE_PUMP;
-	static DeclareMemType MTYPE_IDLE_NETWORK;
-	static DeclareMemType MTYPE_IDLE_UPDATE_REGIONS;
-	static DeclareMemType MTYPE_IDLE_UPDATE_VIEWER_REGION;
-	static DeclareMemType MTYPE_IDLE_UPDATE_SURFACE;
-	static DeclareMemType MTYPE_IDLE_UPDATE_PARCEL_OVERLAY;
-	static DeclareMemType MTYPE_IDLE_AUDIO;
-
-	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING;
-	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_ASKS;
-	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_REPLIES;
-
-	static DeclareMemType MTYPE_MESSAGE_CHECK_ALL;
-	static DeclareMemType MTYPE_MESSAGE_PROCESS_ACKS;
-
-	static DeclareMemType MTYPE_RENDER;
-	static DeclareMemType MTYPE_SLEEP;
-
-	static DeclareMemType MTYPE_NETWORK;
-	static DeclareMemType MTYPE_PHYSICS;
-	static DeclareMemType MTYPE_INTERESTLIST;
-
-	static DeclareMemType MTYPE_IMAGEBASE;
-	static DeclareMemType MTYPE_IMAGERAW;
-	static DeclareMemType MTYPE_IMAGEFORMATTED;
-	
-	static DeclareMemType MTYPE_APPFMTIMAGE;
-	static DeclareMemType MTYPE_APPRAWIMAGE;
-	static DeclareMemType MTYPE_APPAUXRAWIMAGE;
-	
-	static DeclareMemType MTYPE_DRAWABLE;
-	
-	static DeclareMemType MTYPE_OBJECT;
-	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE;
-	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE_CORE;
-
-	static DeclareMemType MTYPE_DISPLAY;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE_CAMERA;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE_GEOM;
-	static DeclareMemType MTYPE_DISPLAY_SWAP;
-	static DeclareMemType MTYPE_DISPLAY_UPDATE_HUD;
-	static DeclareMemType MTYPE_DISPLAY_GEN_REFLECTION;
-	static DeclareMemType MTYPE_DISPLAY_IMAGE_UPDATE;
-	static DeclareMemType MTYPE_DISPLAY_STATE_SORT;
-	static DeclareMemType MTYPE_DISPLAY_SKY;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_GEOM;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_FLUSH;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_UI;
-	static DeclareMemType MTYPE_DISPLAY_RENDER_ATTACHMENTS;
-
-	static DeclareMemType MTYPE_VERTEX_DATA;
-	static DeclareMemType MTYPE_VERTEX_CONSTRUCTOR;
-	static DeclareMemType MTYPE_VERTEX_DESTRUCTOR;
-	static DeclareMemType MTYPE_VERTEX_CREATE_VERTICES;
-	static DeclareMemType MTYPE_VERTEX_CREATE_INDICES;
-	static DeclareMemType MTYPE_VERTEX_DESTROY_BUFFER;	
-	static DeclareMemType MTYPE_VERTEX_DESTROY_INDICES;
-	static DeclareMemType MTYPE_VERTEX_UPDATE_VERTS;
-	static DeclareMemType MTYPE_VERTEX_UPDATE_INDICES;
-	static DeclareMemType MTYPE_VERTEX_ALLOCATE_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_RESIZE_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_VERTICES;
-	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_INDICES;
-	static DeclareMemType MTYPE_VERTEX_UNMAP_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_SET_STRIDE;
-	static DeclareMemType MTYPE_VERTEX_SET_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_SETUP_VERTEX_BUFFER;
-	static DeclareMemType MTYPE_VERTEX_CLEANUP_CLASS;
-
-	static DeclareMemType MTYPE_SPACE_PARTITION;
-
-	static DeclareMemType MTYPE_PIPELINE;
-	static DeclareMemType MTYPE_PIPELINE_INIT;
-	static DeclareMemType MTYPE_PIPELINE_CREATE_BUFFERS;
-	static DeclareMemType MTYPE_PIPELINE_RESTORE_GL;
-	static DeclareMemType MTYPE_PIPELINE_UNLOAD_SHADERS;
-	static DeclareMemType MTYPE_PIPELINE_LIGHTING_DETAIL;
-	static DeclareMemType MTYPE_PIPELINE_GET_POOL_TYPE;
-	static DeclareMemType MTYPE_PIPELINE_ADD_POOL;
-	static DeclareMemType MTYPE_PIPELINE_ALLOCATE_DRAWABLE;
-	static DeclareMemType MTYPE_PIPELINE_ADD_OBJECT;
-	static DeclareMemType MTYPE_PIPELINE_CREATE_OBJECTS;
-	static DeclareMemType MTYPE_PIPELINE_UPDATE_MOVE;
-	static DeclareMemType MTYPE_PIPELINE_UPDATE_GEOM;
-	static DeclareMemType MTYPE_PIPELINE_MARK_VISIBLE;
-	static DeclareMemType MTYPE_PIPELINE_MARK_MOVED;
-	static DeclareMemType MTYPE_PIPELINE_MARK_SHIFT;
-	static DeclareMemType MTYPE_PIPELINE_SHIFT_OBJECTS;
-	static DeclareMemType MTYPE_PIPELINE_MARK_TEXTURED;
-	static DeclareMemType MTYPE_PIPELINE_MARK_REBUILD;
-	static DeclareMemType MTYPE_PIPELINE_UPDATE_CULL;
-	static DeclareMemType MTYPE_PIPELINE_STATE_SORT;
-	static DeclareMemType MTYPE_PIPELINE_POST_SORT;
-	
-	static DeclareMemType MTYPE_PIPELINE_RENDER_HUD_ELS;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_HL;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_POST_DEF;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_SHADOW;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_SELECT;
-	static DeclareMemType MTYPE_PIPELINE_REBUILD_POOLS;
-	static DeclareMemType MTYPE_PIPELINE_QUICK_LOOKUP;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_OBJECTS;
-	static DeclareMemType MTYPE_PIPELINE_GENERATE_IMPOSTOR;
-	static DeclareMemType MTYPE_PIPELINE_RENDER_BLOOM;
-
-	static DeclareMemType MTYPE_UPKEEP_POOLS;
-
-	static DeclareMemType MTYPE_AVATAR;
-	static DeclareMemType MTYPE_AVATAR_MESH;
-	static DeclareMemType MTYPE_PARTICLES;
-	static DeclareMemType MTYPE_REGIONS;
-
-	static DeclareMemType MTYPE_INVENTORY;
-	static DeclareMemType MTYPE_INVENTORY_DRAW;
-	static DeclareMemType MTYPE_INVENTORY_BUILD_NEW_VIEWS;
-	static DeclareMemType MTYPE_INVENTORY_DO_FOLDER;
-	static DeclareMemType MTYPE_INVENTORY_POST_BUILD;
-	static DeclareMemType MTYPE_INVENTORY_FROM_XML;
-	static DeclareMemType MTYPE_INVENTORY_CREATE_NEW_ITEM;
-	static DeclareMemType MTYPE_INVENTORY_VIEW_INIT;
-	static DeclareMemType MTYPE_INVENTORY_VIEW_SHOW;
-	static DeclareMemType MTYPE_INVENTORY_VIEW_TOGGLE;
-
-	static DeclareMemType MTYPE_ANIMATION;
-	static DeclareMemType MTYPE_VOLUME;
-	static DeclareMemType MTYPE_PRIMITIVE;
-	
-	static DeclareMemType MTYPE_SCRIPT;
-	static DeclareMemType MTYPE_SCRIPT_RUN;
-	static DeclareMemType MTYPE_SCRIPT_BYTECODE;
-	
-	static DeclareMemType MTYPE_IO_PUMP;
-	static DeclareMemType MTYPE_IO_TCP;
-	static DeclareMemType MTYPE_IO_BUFFER;
-	static DeclareMemType MTYPE_IO_HTTP_SERVER;
-	static DeclareMemType MTYPE_IO_SD_SERVER;
-	static DeclareMemType MTYPE_IO_SD_CLIENT;
-	static DeclareMemType MTYPE_IO_URL_REQUEST;
-
-	static DeclareMemType MTYPE_DIRECTX_INIT;
-
-	static DeclareMemType MTYPE_TEMP1;
-	static DeclareMemType MTYPE_TEMP2;
-	static DeclareMemType MTYPE_TEMP3;
-	static DeclareMemType MTYPE_TEMP4;
-	static DeclareMemType MTYPE_TEMP5;
-	static DeclareMemType MTYPE_TEMP6;
-	static DeclareMemType MTYPE_TEMP7;
-	static DeclareMemType MTYPE_TEMP8;
-	static DeclareMemType MTYPE_TEMP9;
-
-	static DeclareMemType MTYPE_OTHER; // Special; used by display code
-
-	S32 mTypeIndex;
-};
-
-//----------------------------------------------------------------------------
-
-#endif
-
+/** 
+ * @file llmemtype.h
+ * @brief Runtime memory usage debugging utilities.
+ *
+ * $LicenseInfo:firstyear=2005&license=viewergpl$
+ * 
+ * Copyright (c) 2005-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_MEMTYPE_H
+#define LL_MEMTYPE_H
+
+//----------------------------------------------------------------------------
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+
+#include "linden_common.h"
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+// WARNING: Never commit with MEM_TRACK_MEM == 1
+//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+#define MEM_TRACK_MEM (0 && LL_WINDOWS)
+
+#include <vector>
+
+#define MEM_TYPE_NEW(T)
+
+class LL_COMMON_API LLMemType
+{
+public:
+
+	// class we'll initialize all instances of as
+	// static members of MemType.  Then use
+	// to construct any new mem type.
+	class LL_COMMON_API DeclareMemType
+	{
+	public:
+		DeclareMemType(char const * st);
+		~DeclareMemType();
+	
+		S32 mID;
+		char const * mName;
+		
+		// array so we can map an index ID to Name
+		static std::vector<char const *> mNameList;
+	};
+
+	LLMemType(DeclareMemType& dt);
+	~LLMemType();
+
+	static char const * getNameFromID(S32 id);
+
+	static DeclareMemType MTYPE_INIT;
+	static DeclareMemType MTYPE_STARTUP;
+	static DeclareMemType MTYPE_MAIN;
+	static DeclareMemType MTYPE_FRAME;
+
+	static DeclareMemType MTYPE_GATHER_INPUT;
+	static DeclareMemType MTYPE_JOY_KEY;
+
+	static DeclareMemType MTYPE_IDLE;
+	static DeclareMemType MTYPE_IDLE_PUMP;
+	static DeclareMemType MTYPE_IDLE_NETWORK;
+	static DeclareMemType MTYPE_IDLE_UPDATE_REGIONS;
+	static DeclareMemType MTYPE_IDLE_UPDATE_VIEWER_REGION;
+	static DeclareMemType MTYPE_IDLE_UPDATE_SURFACE;
+	static DeclareMemType MTYPE_IDLE_UPDATE_PARCEL_OVERLAY;
+	static DeclareMemType MTYPE_IDLE_AUDIO;
+
+	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING;
+	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_ASKS;
+	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_REPLIES;
+
+	static DeclareMemType MTYPE_MESSAGE_CHECK_ALL;
+	static DeclareMemType MTYPE_MESSAGE_PROCESS_ACKS;
+
+	static DeclareMemType MTYPE_RENDER;
+	static DeclareMemType MTYPE_SLEEP;
+
+	static DeclareMemType MTYPE_NETWORK;
+	static DeclareMemType MTYPE_PHYSICS;
+	static DeclareMemType MTYPE_INTERESTLIST;
+
+	static DeclareMemType MTYPE_IMAGEBASE;
+	static DeclareMemType MTYPE_IMAGERAW;
+	static DeclareMemType MTYPE_IMAGEFORMATTED;
+	
+	static DeclareMemType MTYPE_APPFMTIMAGE;
+	static DeclareMemType MTYPE_APPRAWIMAGE;
+	static DeclareMemType MTYPE_APPAUXRAWIMAGE;
+	
+	static DeclareMemType MTYPE_DRAWABLE;
+	
+	static DeclareMemType MTYPE_OBJECT;
+	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE;
+	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE_CORE;
+
+	static DeclareMemType MTYPE_DISPLAY;
+	static DeclareMemType MTYPE_DISPLAY_UPDATE;
+	static DeclareMemType MTYPE_DISPLAY_UPDATE_CAMERA;
+	static DeclareMemType MTYPE_DISPLAY_UPDATE_GEOM;
+	static DeclareMemType MTYPE_DISPLAY_SWAP;
+	static DeclareMemType MTYPE_DISPLAY_UPDATE_HUD;
+	static DeclareMemType MTYPE_DISPLAY_GEN_REFLECTION;
+	static DeclareMemType MTYPE_DISPLAY_IMAGE_UPDATE;
+	static DeclareMemType MTYPE_DISPLAY_STATE_SORT;
+	static DeclareMemType MTYPE_DISPLAY_SKY;
+	static DeclareMemType MTYPE_DISPLAY_RENDER_GEOM;
+	static DeclareMemType MTYPE_DISPLAY_RENDER_FLUSH;
+	static DeclareMemType MTYPE_DISPLAY_RENDER_UI;
+	static DeclareMemType MTYPE_DISPLAY_RENDER_ATTACHMENTS;
+
+	static DeclareMemType MTYPE_VERTEX_DATA;
+	static DeclareMemType MTYPE_VERTEX_CONSTRUCTOR;
+	static DeclareMemType MTYPE_VERTEX_DESTRUCTOR;
+	static DeclareMemType MTYPE_VERTEX_CREATE_VERTICES;
+	static DeclareMemType MTYPE_VERTEX_CREATE_INDICES;
+	static DeclareMemType MTYPE_VERTEX_DESTROY_BUFFER;	
+	static DeclareMemType MTYPE_VERTEX_DESTROY_INDICES;
+	static DeclareMemType MTYPE_VERTEX_UPDATE_VERTS;
+	static DeclareMemType MTYPE_VERTEX_UPDATE_INDICES;
+	static DeclareMemType MTYPE_VERTEX_ALLOCATE_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_RESIZE_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_VERTICES;
+	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_INDICES;
+	static DeclareMemType MTYPE_VERTEX_UNMAP_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_SET_STRIDE;
+	static DeclareMemType MTYPE_VERTEX_SET_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_SETUP_VERTEX_BUFFER;
+	static DeclareMemType MTYPE_VERTEX_CLEANUP_CLASS;
+
+	static DeclareMemType MTYPE_SPACE_PARTITION;
+
+	static DeclareMemType MTYPE_PIPELINE;
+	static DeclareMemType MTYPE_PIPELINE_INIT;
+	static DeclareMemType MTYPE_PIPELINE_CREATE_BUFFERS;
+	static DeclareMemType MTYPE_PIPELINE_RESTORE_GL;
+	static DeclareMemType MTYPE_PIPELINE_UNLOAD_SHADERS;
+	static DeclareMemType MTYPE_PIPELINE_LIGHTING_DETAIL;
+	static DeclareMemType MTYPE_PIPELINE_GET_POOL_TYPE;
+	static DeclareMemType MTYPE_PIPELINE_ADD_POOL;
+	static DeclareMemType MTYPE_PIPELINE_ALLOCATE_DRAWABLE;
+	static DeclareMemType MTYPE_PIPELINE_ADD_OBJECT;
+	static DeclareMemType MTYPE_PIPELINE_CREATE_OBJECTS;
+	static DeclareMemType MTYPE_PIPELINE_UPDATE_MOVE;
+	static DeclareMemType MTYPE_PIPELINE_UPDATE_GEOM;
+	static DeclareMemType MTYPE_PIPELINE_MARK_VISIBLE;
+	static DeclareMemType MTYPE_PIPELINE_MARK_MOVED;
+	static DeclareMemType MTYPE_PIPELINE_MARK_SHIFT;
+	static DeclareMemType MTYPE_PIPELINE_SHIFT_OBJECTS;
+	static DeclareMemType MTYPE_PIPELINE_MARK_TEXTURED;
+	static DeclareMemType MTYPE_PIPELINE_MARK_REBUILD;
+	static DeclareMemType MTYPE_PIPELINE_UPDATE_CULL;
+	static DeclareMemType MTYPE_PIPELINE_STATE_SORT;
+	static DeclareMemType MTYPE_PIPELINE_POST_SORT;
+	
+	static DeclareMemType MTYPE_PIPELINE_RENDER_HUD_ELS;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_HL;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_POST_DEF;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_SHADOW;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_SELECT;
+	static DeclareMemType MTYPE_PIPELINE_REBUILD_POOLS;
+	static DeclareMemType MTYPE_PIPELINE_QUICK_LOOKUP;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_OBJECTS;
+	static DeclareMemType MTYPE_PIPELINE_GENERATE_IMPOSTOR;
+	static DeclareMemType MTYPE_PIPELINE_RENDER_BLOOM;
+
+	static DeclareMemType MTYPE_UPKEEP_POOLS;
+
+	static DeclareMemType MTYPE_AVATAR;
+	static DeclareMemType MTYPE_AVATAR_MESH;
+	static DeclareMemType MTYPE_PARTICLES;
+	static DeclareMemType MTYPE_REGIONS;
+
+	static DeclareMemType MTYPE_INVENTORY;
+	static DeclareMemType MTYPE_INVENTORY_DRAW;
+	static DeclareMemType MTYPE_INVENTORY_BUILD_NEW_VIEWS;
+	static DeclareMemType MTYPE_INVENTORY_DO_FOLDER;
+	static DeclareMemType MTYPE_INVENTORY_POST_BUILD;
+	static DeclareMemType MTYPE_INVENTORY_FROM_XML;
+	static DeclareMemType MTYPE_INVENTORY_CREATE_NEW_ITEM;
+	static DeclareMemType MTYPE_INVENTORY_VIEW_INIT;
+	static DeclareMemType MTYPE_INVENTORY_VIEW_SHOW;
+	static DeclareMemType MTYPE_INVENTORY_VIEW_TOGGLE;
+
+	static DeclareMemType MTYPE_ANIMATION;
+	static DeclareMemType MTYPE_VOLUME;
+	static DeclareMemType MTYPE_PRIMITIVE;
+	
+	static DeclareMemType MTYPE_SCRIPT;
+	static DeclareMemType MTYPE_SCRIPT_RUN;
+	static DeclareMemType MTYPE_SCRIPT_BYTECODE;
+	
+	static DeclareMemType MTYPE_IO_PUMP;
+	static DeclareMemType MTYPE_IO_TCP;
+	static DeclareMemType MTYPE_IO_BUFFER;
+	static DeclareMemType MTYPE_IO_HTTP_SERVER;
+	static DeclareMemType MTYPE_IO_SD_SERVER;
+	static DeclareMemType MTYPE_IO_SD_CLIENT;
+	static DeclareMemType MTYPE_IO_URL_REQUEST;
+
+	static DeclareMemType MTYPE_DIRECTX_INIT;
+
+	static DeclareMemType MTYPE_TEMP1;
+	static DeclareMemType MTYPE_TEMP2;
+	static DeclareMemType MTYPE_TEMP3;
+	static DeclareMemType MTYPE_TEMP4;
+	static DeclareMemType MTYPE_TEMP5;
+	static DeclareMemType MTYPE_TEMP6;
+	static DeclareMemType MTYPE_TEMP7;
+	static DeclareMemType MTYPE_TEMP8;
+	static DeclareMemType MTYPE_TEMP9;
+
+	static DeclareMemType MTYPE_OTHER; // Special; used by display code
+
+	S32 mTypeIndex;
+};
+
+//----------------------------------------------------------------------------
+
+#endif
+
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index 48baa50edbe809cd5a8c4f850966f281ea5f7955..48244480b1276e271669fbfb406db8d97d03098f 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -1,168 +1,168 @@
-/** 
- * @file llpreprocessor.h
- * @brief This file should be included in all Linden Lab files and
- * should only contain special preprocessor directives
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LLPREPROCESSOR_H
-#define LLPREPROCESSOR_H
-
-// Figure out endianness of platform
-#ifdef LL_LINUX
-#define __ENABLE_WSTRING
-#include <endian.h>
-#endif	//	LL_LINUX
-
-#if LL_SOLARIS
-#   ifdef  __sparc     // Since we're talking Solaris 10 and up, only 64 bit is supported.
-#      define LL_BIG_ENDIAN 1
-#      define LL_SOLARIS_ALIGNED_CPU 1     //  used to designate issues where SPARC alignment is addressed
-#      define LL_SOLARIS_NON_MESA_GL 1      //  The SPARC GL does not provide a MESA-based GL API
-#   endif
-#   include <sys/isa_defs.h> // ensure we know which end is up
-#endif // LL_SOLARIS
-
-#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386)))
-#define LL_LITTLE_ENDIAN 1
-#else
-#define LL_BIG_ENDIAN 1
-#endif
-
-// Per-compiler switches
-#ifdef __GNUC__
-#define LL_FORCE_INLINE inline __attribute__((always_inline))
-#else
-#define LL_FORCE_INLINE __forceinline
-#endif
-
-// Figure out differences between compilers
-#if defined(__GNUC__)
-	#define GCC_VERSION (__GNUC__ * 10000 \
-						+ __GNUC_MINOR__ * 100 \
-						+ __GNUC_PATCHLEVEL__)
-	#ifndef LL_GNUC
-		#define LL_GNUC 1
-	#endif
-#elif defined(__MSVC_VER__) || defined(_MSC_VER)
-	#ifndef LL_MSVC
-		#define LL_MSVC 1
-	#endif
-	#if _MSC_VER < 1400
-		#define LL_MSVC7 //Visual C++ 2003 or earlier
-	#endif
-#endif
-
-// Deal with minor differences on Unixy OSes.
-#if LL_DARWIN || LL_LINUX
-	// Different name, same functionality.
-	#define stricmp strcasecmp
-	#define strnicmp strncasecmp
-
-	// Not sure why this is different, but...
-	#ifndef MAX_PATH
-		#define MAX_PATH PATH_MAX
-	#endif	//	not MAX_PATH
-
-#endif
-
-
-// Static linking with apr on windows needs to be declared.
-#if LL_WINDOWS && !LL_COMMON_LINK_SHARED
-#ifndef APR_DECLARE_STATIC
-#define APR_DECLARE_STATIC // For APR on Windows
-#endif
-#ifndef APU_DECLARE_STATIC
-#define APU_DECLARE_STATIC // For APR util on Windows
-#endif
-#endif
-
-#if defined(LL_WINDOWS)
-#define BOOST_REGEX_NO_LIB 1
-#define CURL_STATICLIB 1
-#ifndef XML_STATIC
-#define XML_STATIC
-#endif
-#endif	//	LL_WINDOWS
-
-
-// Deal with VC6 problems
-#if LL_MSVC
-#pragma warning( 3	     : 4701 )	// "local variable used without being initialized"  Treat this as level 3, not level 4.
-#pragma warning( 3	     : 4702 )	// "unreachable code"  Treat this as level 3, not level 4.
-#pragma warning( 3	     : 4189 )	// "local variable initialized but not referenced"  Treat this as level 3, not level 4.
-//#pragma warning( 3	: 4018 )	// "signed/unsigned mismatch"  Treat this as level 3, not level 4.
-#pragma warning( 3      :  4263 )	// 'function' : member function does not override any base class virtual member function
-#pragma warning( 3      :  4264 )	// "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden"
-#pragma warning( 3       : 4265 )	// "class has virtual functions, but destructor is not virtual"
-#pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden
-#pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file
-#pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
-#pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
-#pragma warning( disable : 4996 )	// warning: deprecated
-
-// level 4 warnings that we need to disable:
-#pragma warning (disable : 4100) // unreferenced formal parameter
-#pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) )
-#pragma warning (disable : 4244) // possible loss of data on conversions
-#pragma warning (disable : 4396) // the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
-#pragma warning (disable : 4512) // assignment operator could not be generated
-#pragma warning (disable : 4706) // assignment within conditional (even if((x = y)) )
-
-#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class
-#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class
-#endif	//	LL_MSVC
-
-#if LL_WINDOWS
-#define LL_DLLEXPORT __declspec(dllexport)
-#define LL_DLLIMPORT __declspec(dllimport)
-#elif LL_LINUX
-#define LL_DLLEXPORT __attribute__ ((visibility("default")))
-#define LL_DLLIMPORT
-#else
-#define LL_DLLEXPORT
-#define LL_DLLIMPORT
-#endif // LL_WINDOWS
-
-#if LL_COMMON_LINK_SHARED
-// CMake automagically defines llcommon_EXPORTS only when building llcommon
-// sources, and only when llcommon is a shared library (i.e. when
-// LL_COMMON_LINK_SHARED). We must still test LL_COMMON_LINK_SHARED because
-// otherwise we can't distinguish between (non-llcommon source) and (llcommon
-// not shared).
-# if defined(llcommon_EXPORTS)
-#   define LL_COMMON_API LL_DLLEXPORT
-# else //llcommon_EXPORTS
-#   define LL_COMMON_API LL_DLLIMPORT
-# endif //llcommon_EXPORTS
-#else // LL_COMMON_LINK_SHARED
-# define LL_COMMON_API
-#endif // LL_COMMON_LINK_SHARED
-
-#endif	//	not LL_LINDEN_PREPROCESSOR_H
+/** 
+ * @file llpreprocessor.h
+ * @brief This file should be included in all Linden Lab files and
+ * should only contain special preprocessor directives
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLPREPROCESSOR_H
+#define LLPREPROCESSOR_H
+
+// Figure out endianness of platform
+#ifdef LL_LINUX
+#define __ENABLE_WSTRING
+#include <endian.h>
+#endif	//	LL_LINUX
+
+#if LL_SOLARIS
+#   ifdef  __sparc     // Since we're talking Solaris 10 and up, only 64 bit is supported.
+#      define LL_BIG_ENDIAN 1
+#      define LL_SOLARIS_ALIGNED_CPU 1     //  used to designate issues where SPARC alignment is addressed
+#      define LL_SOLARIS_NON_MESA_GL 1      //  The SPARC GL does not provide a MESA-based GL API
+#   endif
+#   include <sys/isa_defs.h> // ensure we know which end is up
+#endif // LL_SOLARIS
+
+#if (defined(LL_WINDOWS) || (defined(LL_LINUX) && (__BYTE_ORDER == __LITTLE_ENDIAN)) || (defined(LL_DARWIN) && defined(__LITTLE_ENDIAN__)) || (defined(LL_SOLARIS) && defined(__i386)))
+#define LL_LITTLE_ENDIAN 1
+#else
+#define LL_BIG_ENDIAN 1
+#endif
+
+// Per-compiler switches
+#ifdef __GNUC__
+#define LL_FORCE_INLINE inline __attribute__((always_inline))
+#else
+#define LL_FORCE_INLINE __forceinline
+#endif
+
+// Figure out differences between compilers
+#if defined(__GNUC__)
+	#define GCC_VERSION (__GNUC__ * 10000 \
+						+ __GNUC_MINOR__ * 100 \
+						+ __GNUC_PATCHLEVEL__)
+	#ifndef LL_GNUC
+		#define LL_GNUC 1
+	#endif
+#elif defined(__MSVC_VER__) || defined(_MSC_VER)
+	#ifndef LL_MSVC
+		#define LL_MSVC 1
+	#endif
+	#if _MSC_VER < 1400
+		#define LL_MSVC7 //Visual C++ 2003 or earlier
+	#endif
+#endif
+
+// Deal with minor differences on Unixy OSes.
+#if LL_DARWIN || LL_LINUX
+	// Different name, same functionality.
+	#define stricmp strcasecmp
+	#define strnicmp strncasecmp
+
+	// Not sure why this is different, but...
+	#ifndef MAX_PATH
+		#define MAX_PATH PATH_MAX
+	#endif	//	not MAX_PATH
+
+#endif
+
+
+// Static linking with apr on windows needs to be declared.
+#if LL_WINDOWS && !LL_COMMON_LINK_SHARED
+#ifndef APR_DECLARE_STATIC
+#define APR_DECLARE_STATIC // For APR on Windows
+#endif
+#ifndef APU_DECLARE_STATIC
+#define APU_DECLARE_STATIC // For APR util on Windows
+#endif
+#endif
+
+#if defined(LL_WINDOWS)
+#define BOOST_REGEX_NO_LIB 1
+#define CURL_STATICLIB 1
+#ifndef XML_STATIC
+#define XML_STATIC
+#endif
+#endif	//	LL_WINDOWS
+
+
+// Deal with VC6 problems
+#if LL_MSVC
+#pragma warning( 3	     : 4701 )	// "local variable used without being initialized"  Treat this as level 3, not level 4.
+#pragma warning( 3	     : 4702 )	// "unreachable code"  Treat this as level 3, not level 4.
+#pragma warning( 3	     : 4189 )	// "local variable initialized but not referenced"  Treat this as level 3, not level 4.
+//#pragma warning( 3	: 4018 )	// "signed/unsigned mismatch"  Treat this as level 3, not level 4.
+#pragma warning( 3      :  4263 )	// 'function' : member function does not override any base class virtual member function
+#pragma warning( 3      :  4264 )	// "'virtual_function' : no override available for virtual member function from base 'class'; function is hidden"
+#pragma warning( 3       : 4265 )	// "class has virtual functions, but destructor is not virtual"
+#pragma warning( 3      :  4266 )	// 'function' : no override available for virtual member function from base 'type'; function is hidden
+#pragma warning( disable : 4284 )	// silly MS warning deep inside their <map> include file
+#pragma warning( disable : 4503 )	// 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
+#pragma warning( disable : 4800 )	// 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
+#pragma warning( disable : 4996 )	// warning: deprecated
+
+// level 4 warnings that we need to disable:
+#pragma warning (disable : 4100) // unreferenced formal parameter
+#pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) )
+#pragma warning (disable : 4244) // possible loss of data on conversions
+#pragma warning (disable : 4396) // the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
+#pragma warning (disable : 4512) // assignment operator could not be generated
+#pragma warning (disable : 4706) // assignment within conditional (even if((x = y)) )
+
+#pragma warning (disable : 4251) // member needs to have dll-interface to be used by clients of class
+#pragma warning (disable : 4275) // non dll-interface class used as base for dll-interface class
+#endif	//	LL_MSVC
+
+#if LL_WINDOWS
+#define LL_DLLEXPORT __declspec(dllexport)
+#define LL_DLLIMPORT __declspec(dllimport)
+#elif LL_LINUX
+#define LL_DLLEXPORT __attribute__ ((visibility("default")))
+#define LL_DLLIMPORT
+#else
+#define LL_DLLEXPORT
+#define LL_DLLIMPORT
+#endif // LL_WINDOWS
+
+#if LL_COMMON_LINK_SHARED
+// CMake automagically defines llcommon_EXPORTS only when building llcommon
+// sources, and only when llcommon is a shared library (i.e. when
+// LL_COMMON_LINK_SHARED). We must still test LL_COMMON_LINK_SHARED because
+// otherwise we can't distinguish between (non-llcommon source) and (llcommon
+// not shared).
+# if defined(llcommon_EXPORTS)
+#   define LL_COMMON_API LL_DLLEXPORT
+# else //llcommon_EXPORTS
+#   define LL_COMMON_API LL_DLLIMPORT
+# endif //llcommon_EXPORTS
+#else // LL_COMMON_LINK_SHARED
+# define LL_COMMON_API
+#endif // LL_COMMON_LINK_SHARED
+
+#endif	//	not LL_LINDEN_PREPROCESSOR_H
diff --git a/indra/llcommon/llstacktrace.cpp b/indra/llcommon/llstacktrace.cpp
index 3cb074257bc8927e6f05e53c1aa3161f18707a94..6558df70a42cc4d92098f6b77507756e96155cd5 100644
--- a/indra/llcommon/llstacktrace.cpp
+++ b/indra/llcommon/llstacktrace.cpp
@@ -1,142 +1,142 @@
-/** 
- * @file llstacktrace.cpp
- * @brief stack tracing functionality
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-#include "llstacktrace.h"
-
-#ifdef LL_WINDOWS
-
-#include <iostream>
-#include <sstream>
-
-#include "windows.h"
-#include "Dbghelp.h"
-
-typedef USHORT NTAPI RtlCaptureStackBackTrace_Function(
-    IN ULONG frames_to_skip,
-    IN ULONG frames_to_capture,
-    OUT PVOID *backtrace,
-    OUT PULONG backtrace_hash);
-
-static RtlCaptureStackBackTrace_Function* const RtlCaptureStackBackTrace_fn =
-   (RtlCaptureStackBackTrace_Function*)
-   GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlCaptureStackBackTrace");
-
-bool ll_get_stack_trace(std::vector<std::string>& lines)
-{
-	const S32 MAX_STACK_DEPTH = 32;
-	const S32 STRING_NAME_LENGTH = 200;
-	const S32 FRAME_SKIP = 2;
-	static BOOL symbolsLoaded = false;
-	static BOOL firstCall = true;
-
-	HANDLE hProc = GetCurrentProcess();
-
-	// load the symbols if they're not loaded
-	if(!symbolsLoaded && firstCall)
-	{
-		symbolsLoaded = SymInitialize(hProc, NULL, true);
-		firstCall = false;
-	}
-
-	// if loaded, get the call stack
-	if(symbolsLoaded)
-	{
-		// create the frames to hold the addresses
-		void* frames[MAX_STACK_DEPTH];
-		memset(frames, 0, sizeof(void*)*MAX_STACK_DEPTH);
-		S32 depth = 0;
-
-		// get the addresses
-		depth = RtlCaptureStackBackTrace_fn(FRAME_SKIP, MAX_STACK_DEPTH, frames, NULL);
-
-		IMAGEHLP_LINE64 line;
-		memset(&line, 0, sizeof(IMAGEHLP_LINE64));
-		line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
-
-		// create something to hold address info
-		PIMAGEHLP_SYMBOL64 pSym;
-		pSym = (PIMAGEHLP_SYMBOL64)malloc(sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
-		memset(pSym, 0, sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
-		pSym->MaxNameLength = STRING_NAME_LENGTH;
-		pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
-
-		// get address info for each address frame
-		// and store
-		for(S32 i=0; i < depth; i++)
-		{
-			std::stringstream stack_line;
-			BOOL ret;
-
-			DWORD64 addr = (DWORD64)frames[i];
-			ret = SymGetSymFromAddr64(hProc, addr, 0, pSym);
-			if(ret)
-			{
-				stack_line << pSym->Name << " ";
-			}
-
-			DWORD dummy;
-			ret = SymGetLineFromAddr64(hProc, addr, &dummy, &line);
-			if(ret)
-			{
-				std::string file_name = line.FileName;
-				std::string::size_type index = file_name.rfind("\\");
-				stack_line << file_name.substr(index + 1, file_name.size()) << ":" << line.LineNumber; 
-			}
-
-			lines.push_back(stack_line.str());
-		}
-		
-		free(pSym);
-
-		// TODO: figure out a way to cleanup symbol loading
-		// Not hugely necessary, however.
-		//SymCleanup(hProc);
-		return true;
-	}
-	else
-	{
-		lines.push_back("Stack Trace Failed.  PDB symbol info not loaded");
-	}
-
-	return false;
-}
-
-#else
-
-bool ll_get_stack_trace(std::vector<std::string>& lines)
-{
-	return false;
-}
-
-#endif
-
+/** 
+ * @file llstacktrace.cpp
+ * @brief stack tracing functionality
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llstacktrace.h"
+
+#ifdef LL_WINDOWS
+
+#include <iostream>
+#include <sstream>
+
+#include "windows.h"
+#include "Dbghelp.h"
+
+typedef USHORT NTAPI RtlCaptureStackBackTrace_Function(
+    IN ULONG frames_to_skip,
+    IN ULONG frames_to_capture,
+    OUT PVOID *backtrace,
+    OUT PULONG backtrace_hash);
+
+static RtlCaptureStackBackTrace_Function* const RtlCaptureStackBackTrace_fn =
+   (RtlCaptureStackBackTrace_Function*)
+   GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlCaptureStackBackTrace");
+
+bool ll_get_stack_trace(std::vector<std::string>& lines)
+{
+	const S32 MAX_STACK_DEPTH = 32;
+	const S32 STRING_NAME_LENGTH = 200;
+	const S32 FRAME_SKIP = 2;
+	static BOOL symbolsLoaded = false;
+	static BOOL firstCall = true;
+
+	HANDLE hProc = GetCurrentProcess();
+
+	// load the symbols if they're not loaded
+	if(!symbolsLoaded && firstCall)
+	{
+		symbolsLoaded = SymInitialize(hProc, NULL, true);
+		firstCall = false;
+	}
+
+	// if loaded, get the call stack
+	if(symbolsLoaded)
+	{
+		// create the frames to hold the addresses
+		void* frames[MAX_STACK_DEPTH];
+		memset(frames, 0, sizeof(void*)*MAX_STACK_DEPTH);
+		S32 depth = 0;
+
+		// get the addresses
+		depth = RtlCaptureStackBackTrace_fn(FRAME_SKIP, MAX_STACK_DEPTH, frames, NULL);
+
+		IMAGEHLP_LINE64 line;
+		memset(&line, 0, sizeof(IMAGEHLP_LINE64));
+		line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
+
+		// create something to hold address info
+		PIMAGEHLP_SYMBOL64 pSym;
+		pSym = (PIMAGEHLP_SYMBOL64)malloc(sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
+		memset(pSym, 0, sizeof(IMAGEHLP_SYMBOL64) + STRING_NAME_LENGTH);
+		pSym->MaxNameLength = STRING_NAME_LENGTH;
+		pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
+
+		// get address info for each address frame
+		// and store
+		for(S32 i=0; i < depth; i++)
+		{
+			std::stringstream stack_line;
+			BOOL ret;
+
+			DWORD64 addr = (DWORD64)frames[i];
+			ret = SymGetSymFromAddr64(hProc, addr, 0, pSym);
+			if(ret)
+			{
+				stack_line << pSym->Name << " ";
+			}
+
+			DWORD dummy;
+			ret = SymGetLineFromAddr64(hProc, addr, &dummy, &line);
+			if(ret)
+			{
+				std::string file_name = line.FileName;
+				std::string::size_type index = file_name.rfind("\\");
+				stack_line << file_name.substr(index + 1, file_name.size()) << ":" << line.LineNumber; 
+			}
+
+			lines.push_back(stack_line.str());
+		}
+		
+		free(pSym);
+
+		// TODO: figure out a way to cleanup symbol loading
+		// Not hugely necessary, however.
+		//SymCleanup(hProc);
+		return true;
+	}
+	else
+	{
+		lines.push_back("Stack Trace Failed.  PDB symbol info not loaded");
+	}
+
+	return false;
+}
+
+#else
+
+bool ll_get_stack_trace(std::vector<std::string>& lines)
+{
+	return false;
+}
+
+#endif
+
diff --git a/indra/llcommon/llstacktrace.h b/indra/llcommon/llstacktrace.h
index b84b1aa6ade73d81ad6fb642f37b46c7904fbadb..9f857f0fd3fc3bf4872340b19a28d311d0ee4af9 100644
--- a/indra/llcommon/llstacktrace.h
+++ b/indra/llcommon/llstacktrace.h
@@ -1,44 +1,44 @@
-/** 
- * @file llstacktrace.h
- * @brief stack trace functions
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-
-#ifndef LL_LLSTACKTRACE_H
-#define LL_LLSTACKTRACE_H
-
-#include "stdtypes.h"
-#include <vector>
-#include <string>
-
-LL_COMMON_API bool ll_get_stack_trace(std::vector<std::string>& lines);
-
-#endif
-
+/** 
+ * @file llstacktrace.h
+ * @brief stack trace functions
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLSTACKTRACE_H
+#define LL_LLSTACKTRACE_H
+
+#include "stdtypes.h"
+#include <vector>
+#include <string>
+
+LL_COMMON_API bool ll_get_stack_trace(std::vector<std::string>& lines);
+
+#endif
+
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index edbb007f61c852bb09154ae60241ee26b776d418..31e70e0fe4d950989d3de39ae10991f9cc5bdf38 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -1,1300 +1,1300 @@
-/** 
- * @file llstring.h
- * @brief String utility functions and std::string class.
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLSTRING_H
-#define LL_LLSTRING_H
-
-#include <string>
-#include <cstdio>
-#include <locale>
-#include <iomanip>
-#include "llsd.h"
-#include "llfasttimer.h"
-
-#if LL_LINUX || LL_SOLARIS
-#include <wctype.h>
-#include <wchar.h>
-#endif
-
-#include <string.h>
-
-#if LL_SOLARIS
-// stricmp and strnicmp do not exist on Solaris:
-#define stricmp strcasecmp
-#define strnicmp strncasecmp
-#endif
-
-const char LL_UNKNOWN_CHAR = '?';
-
-#if LL_DARWIN || LL_LINUX || LL_SOLARIS
-// Template specialization of char_traits for U16s. Only necessary on Mac and Linux (exists on Windows already)
-#include <cstring>
-
-namespace std
-{
-template<>
-struct char_traits<U16>
-{
-	typedef U16 		char_type;
-	typedef int 	    int_type;
-	typedef streampos 	pos_type;
-	typedef streamoff 	off_type;
-	typedef mbstate_t 	state_type;
-	
-	static void 
-		assign(char_type& __c1, const char_type& __c2)
-	{ __c1 = __c2; }
-	
-	static bool 
-		eq(const char_type& __c1, const char_type& __c2)
-	{ return __c1 == __c2; }
-	
-	static bool 
-		lt(const char_type& __c1, const char_type& __c2)
-	{ return __c1 < __c2; }
-	
-	static int 
-		compare(const char_type* __s1, const char_type* __s2, size_t __n)
-	{ return memcmp(__s1, __s2, __n * sizeof(char_type)); }
-	
-	static size_t
-		length(const char_type* __s)
-	{
-		const char_type *cur_char = __s;
-		while (*cur_char != 0)
-		{
-			++cur_char;
-		}
-		return cur_char - __s;
-	}
-	
-	static const char_type* 
-		find(const char_type* __s, size_t __n, const char_type& __a)
-	{ return static_cast<const char_type*>(memchr(__s, __a, __n * sizeof(char_type))); }
-	
-	static char_type* 
-		move(char_type* __s1, const char_type* __s2, size_t __n)
-	{ return static_cast<char_type*>(memmove(__s1, __s2, __n * sizeof(char_type))); }
-	
-	static char_type* 
-		copy(char_type* __s1, const char_type* __s2, size_t __n)
-	{  return static_cast<char_type*>(memcpy(__s1, __s2, __n * sizeof(char_type))); }	/* Flawfinder: ignore */
-	
-	static char_type* 
-		assign(char_type* __s, size_t __n, char_type __a)
-	{ 
-		// This isn't right.
-		//return static_cast<char_type*>(memset(__s, __a, __n * sizeof(char_type))); 
-		
-		// I don't think there's a standard 'memset' for 16-bit values.
-		// Do this the old-fashioned way.
-		
-		size_t __i;
-		for(__i = 0; __i < __n; __i++)
-		{
-			__s[__i] = __a;
-		}
-		return __s; 
-	}
-	
-	static char_type 
-		to_char_type(const int_type& __c)
-	{ return static_cast<char_type>(__c); }
-	
-	static int_type 
-		to_int_type(const char_type& __c)
-	{ return static_cast<int_type>(__c); }
-	
-	static bool 
-		eq_int_type(const int_type& __c1, const int_type& __c2)
-	{ return __c1 == __c2; }
-	
-	static int_type 
-		eof() { return static_cast<int_type>(EOF); }
-	
-	static int_type 
-		not_eof(const int_type& __c)
-      { return (__c == eof()) ? 0 : __c; }
-  };
-};
-#endif
-
-class LL_COMMON_API LLStringOps
-{
-private:
-	static long sPacificTimeOffset;
-	static long sLocalTimeOffset;
-	static bool sPacificDaylightTime;
-	static std::map<std::string, std::string> datetimeToCodes;
-
-public:
-	static char toUpper(char elem) { return toupper((unsigned char)elem); }
-	static llwchar toUpper(llwchar elem) { return towupper(elem); }
-	
-	static char toLower(char elem) { return tolower((unsigned char)elem); }
-	static llwchar toLower(llwchar elem) { return towlower(elem); }
-
-	static bool isSpace(char elem) { return isspace((unsigned char)elem) != 0; }
-	static bool isSpace(llwchar elem) { return iswspace(elem) != 0; }
-
-	static bool isUpper(char elem) { return isupper((unsigned char)elem) != 0; }
-	static bool isUpper(llwchar elem) { return iswupper(elem) != 0; }
-
-	static bool isLower(char elem) { return islower((unsigned char)elem) != 0; }
-	static bool isLower(llwchar elem) { return iswlower(elem) != 0; }
-
-	static bool isDigit(char a) { return isdigit((unsigned char)a) != 0; }
-	static bool isDigit(llwchar a) { return iswdigit(a) != 0; }
-
-	static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
-	static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
-
-	static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
-	static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
-
-	static S32	collate(const char* a, const char* b) { return strcoll(a, b); }
-	static S32	collate(const llwchar* a, const llwchar* b);
-
-	static void setupDatetimeInfo(bool pacific_daylight_time);
-	static long getPacificTimeOffset(void) { return sPacificTimeOffset;}
-	static long getLocalTimeOffset(void) { return sLocalTimeOffset;}
-	// Is the Pacific time zone (aka server time zone)
-	// currently in daylight savings time?
-	static bool getPacificDaylightTime(void) { return sPacificDaylightTime;}
-
-	static std::string getDatetimeCode (std::string key);
-};
-
-/**
- * @brief Return a string constructed from in without crashing if the
- * pointer is NULL.
- */
-LL_COMMON_API std::string ll_safe_string(const char* in);
-LL_COMMON_API std::string ll_safe_string(const char* in, S32 maxlen);
-
-
-// Allowing assignments from non-strings into format_map_t is apparently
-// *really* error-prone, so subclass std::string with just basic c'tors.
-class LLFormatMapString
-{
-public:
-	LLFormatMapString() {};
-	LLFormatMapString(const char* s) : mString(ll_safe_string(s)) {};
-	LLFormatMapString(const std::string& s) : mString(s) {};
-	operator std::string() const { return mString; }
-	bool operator<(const LLFormatMapString& rhs) const { return mString < rhs.mString; }
-	std::size_t length() const { return mString.length(); }
-	
-private:
-	std::string mString;
-};
-
-template <class T>
-class LLStringUtilBase
-{
-private:
-	static std::string sLocale;
-
-public:
-	typedef typename std::basic_string<T>::size_type size_type;
-	
-public:
-	/////////////////////////////////////////////////////////////////////////////////////////
-	// Static Utility functions that operate on std::strings
-
-	static std::basic_string<T> null;
-	
-	typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
-	LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims);
-	LL_COMMON_API static void formatNumber(std::basic_string<T>& numStr, std::basic_string<T> decimals);
-	LL_COMMON_API static bool formatDatetime(std::basic_string<T>& replacement, std::basic_string<T> token, std::basic_string<T> param, S32 secFromEpoch);
-	LL_COMMON_API static S32 format(std::basic_string<T>& s, const format_map_t& substitutions);
-	LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
-	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
-	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
-	static void setLocale (std::string inLocale) {sLocale = inLocale;};
-	static std::string getLocale (void) {return sLocale;};
-	
-	static bool isValidIndex(const std::basic_string<T>& string, size_type i)
-	{
-		return !string.empty() && (0 <= i) && (i <= string.size());
-	}
-
-	static void	trimHead(std::basic_string<T>& string);
-	static void	trimTail(std::basic_string<T>& string);
-	static void	trim(std::basic_string<T>& string)	{ trimHead(string); trimTail(string); }
-	static void truncate(std::basic_string<T>& string, size_type count);
-
-	static void	toUpper(std::basic_string<T>& string);
-	static void	toLower(std::basic_string<T>& string);
-	
-	// True if this is the head of s.
-	static BOOL	isHead( const std::basic_string<T>& string, const T* s ); 
-
-	/**
-	 * @brief Returns true if string starts with substr
-	 *
-	 * If etither string or substr are empty, this method returns false.
-	 */
-	static bool startsWith(
-		const std::basic_string<T>& string,
-		const std::basic_string<T>& substr);
-
-	/**
-	 * @brief Returns true if string ends in substr
-	 *
-	 * If etither string or substr are empty, this method returns false.
-	 */
-	static bool endsWith(
-		const std::basic_string<T>& string,
-		const std::basic_string<T>& substr);
-
-	static void	addCRLF(std::basic_string<T>& string);
-	static void	removeCRLF(std::basic_string<T>& string);
-
-	static void	replaceTabsWithSpaces( std::basic_string<T>& string, size_type spaces_per_tab );
-	static void	replaceNonstandardASCII( std::basic_string<T>& string, T replacement );
-	static void	replaceChar( std::basic_string<T>& string, T target, T replacement );
-	static void replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement );
-	
-	static BOOL	containsNonprintable(const std::basic_string<T>& string);
-	static void	stripNonprintable(std::basic_string<T>& string);
-
-	/**
-	 * @brief Unsafe way to make ascii characters. You should probably
-	 * only call this when interacting with the host operating system.
-	 * The 1 byte std::string does not work correctly.
-	 * The 2 and 4 byte std::string probably work, so LLWStringUtil::_makeASCII
-	 * should work.
-	 */
-	static void _makeASCII(std::basic_string<T>& string);
-
-	// Conversion to other data types
-	static BOOL	convertToBOOL(const std::basic_string<T>& string, BOOL& value);
-	static BOOL	convertToU8(const std::basic_string<T>& string, U8& value);
-	static BOOL	convertToS8(const std::basic_string<T>& string, S8& value);
-	static BOOL	convertToS16(const std::basic_string<T>& string, S16& value);
-	static BOOL	convertToU16(const std::basic_string<T>& string, U16& value);
-	static BOOL	convertToU32(const std::basic_string<T>& string, U32& value);
-	static BOOL	convertToS32(const std::basic_string<T>& string, S32& value);
-	static BOOL	convertToF32(const std::basic_string<T>& string, F32& value);
-	static BOOL	convertToF64(const std::basic_string<T>& string, F64& value);
-
-	/////////////////////////////////////////////////////////////////////////////////////////
-	// Utility functions for working with char*'s and strings
-
-	// Like strcmp but also handles empty strings. Uses
-	// current locale.
-	static S32		compareStrings(const T* lhs, const T* rhs);
-	static S32		compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
-	
-	// case insensitive version of above. Uses current locale on
-	// Win32, and falls back to a non-locale aware comparison on
-	// Linux.
-	static S32		compareInsensitive(const T* lhs, const T* rhs);
-	static S32		compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
-
-	// Case sensitive comparison with good handling of numbers.  Does not use current locale.
-	// a.k.a. strdictcmp()
-	static S32		compareDict(const std::basic_string<T>& a, const std::basic_string<T>& b);
-
-	// Case *in*sensitive comparison with good handling of numbers.  Does not use current locale.
-	// a.k.a. strdictcmp()
-	static S32		compareDictInsensitive(const std::basic_string<T>& a, const std::basic_string<T>& b);
-
-	// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
-	static BOOL		precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b );
-
-	// A replacement for strncpy.
-	// If the dst buffer is dst_size bytes long or more, ensures that dst is null terminated and holds
-	// up to dst_size-1 characters of src.
-	static void		copy(T* dst, const T* src, size_type dst_size);
-	
-	// Copies src into dst at a given offset.  
-	static void		copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset);
-	
-	static bool		isPartOfWord(T c) { return (c == (T)'_') || LLStringOps::isAlnum(c); }
-
-
-#ifdef _DEBUG	
-	LL_COMMON_API static void		testHarness();
-#endif
-
-private:
-	LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);
-};
-
-template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
-template<class T> std::string LLStringUtilBase<T>::sLocale;
-
-typedef LLStringUtilBase<char> LLStringUtil;
-typedef LLStringUtilBase<llwchar> LLWStringUtil;
-typedef std::basic_string<llwchar> LLWString;
-
-//@ Use this where we want to disallow input in the form of "foo"
-//  This is used to catch places where english text is embedded in the code
-//  instead of in a translatable XUI file.
-class LLStringExplicit : public std::string
-{
-public:
-	explicit LLStringExplicit(const char* s) : std::string(s) {}
-	LLStringExplicit(const std::string& s) : std::string(s) {}
-	LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : std::string(s, pos, n) {}
-};
-
-struct LLDictionaryLess
-{
-public:
-	bool operator()(const std::string& a, const std::string& b)
-	{
-		return (LLStringUtil::precedesDict(a, b) ? true : false);
-	}
-};
-
-
-/**
- * Simple support functions
- */
-
-/**
- * @brief chop off the trailing characters in a string.
- *
- * This function works on bytes rather than glyphs, so this will
- * incorrectly truncate non-single byte strings.
- * Use utf8str_truncate() for utf8 strings
- * @return a copy of in string minus the trailing count bytes.
- */
-inline std::string chop_tail_copy(
-	const std::string& in,
-	std::string::size_type count)
-{
-	return std::string(in, 0, in.length() - count);
-}
-
-/**
- * @brief This translates a nybble stored as a hex value from 0-f back
- * to a nybble in the low order bits of the return byte.
- */
-LL_COMMON_API U8 hex_as_nybble(char hex);
-
-/**
- * @brief read the contents of a file into a string.
- *
- * Since this function has no concept of character encoding, most
- * anything you do with this method ill-advised. Please avoid.
- * @param str [out] The string which will have.
- * @param filename The full name of the file to read.
- * @return Returns true on success. If false, str is unmodified.
- */
-LL_COMMON_API bool _read_file_into_string(std::string& str, const std::string& filename);
-LL_COMMON_API bool iswindividual(llwchar elem);
-
-/**
- * Unicode support
- */
-
-// Make the incoming string a utf8 string. Replaces any unknown glyph
-// with the UNKOWN_CHARACTER. Once any unknown glph is found, the rest
-// of the data may not be recovered.
-LL_COMMON_API std::string rawstr_to_utf8(const std::string& raw);
-
-//
-// We should never use UTF16 except when communicating with Win32!
-//
-typedef std::basic_string<U16> llutf16string;
-
-LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len);
-LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str);
-
-LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str, S32 len);
-LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str);
-
-LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str, S32 len);
-LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str );
-
-LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str, S32 len);
-LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str);
-// Same function, better name. JC
-inline LLWString utf8string_to_wstring(const std::string& utf8_string) { return utf8str_to_wstring(utf8_string); }
-
-//
-LL_COMMON_API S32 wchar_to_utf8chars(llwchar inchar, char* outchars);
-
-LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str, S32 len);
-LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str);
-
-LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str, S32 len);
-LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str);
-
-// Length of this UTF32 string in bytes when transformed to UTF8
-LL_COMMON_API S32 wstring_utf8_length(const LLWString& wstr); 
-
-// Length in bytes of this wide char in a UTF8 string
-LL_COMMON_API S32 wchar_utf8_length(const llwchar wc); 
-
-LL_COMMON_API std::string utf8str_tolower(const std::string& utf8str);
-
-// Length in llwchar (UTF-32) of the first len units (16 bits) of the given UTF-16 string.
-LL_COMMON_API S32 utf16str_wstring_length(const llutf16string &utf16str, S32 len);
-
-// Length in utf16string (UTF-16) of wlen wchars beginning at woffset.
-LL_COMMON_API S32 wstring_utf16_length(const LLWString & wstr, S32 woffset, S32 wlen);
-
-// Length in wstring (i.e., llwchar count) of a part of a wstring specified by utf16 length (i.e., utf16 units.)
-LL_COMMON_API S32 wstring_wstring_length_from_utf16_length(const LLWString & wstr, S32 woffset, S32 utf16_length, BOOL *unaligned = NULL);
-
-/**
- * @brief Properly truncate a utf8 string to a maximum byte count.
- * 
- * The returned string may be less than max_len if the truncation
- * happens in the middle of a glyph. If max_len is longer than the
- * string passed in, the return value == utf8str.
- * @param utf8str A valid utf8 string to truncate.
- * @param max_len The maximum number of bytes in the return value.
- * @return Returns a valid utf8 string with byte count <= max_len.
- */
-LL_COMMON_API std::string utf8str_truncate(const std::string& utf8str, const S32 max_len);
-
-LL_COMMON_API std::string utf8str_trim(const std::string& utf8str);
-
-LL_COMMON_API S32 utf8str_compare_insensitive(
-	const std::string& lhs,
-	const std::string& rhs);
-
-/**
- * @brief Replace all occurences of target_char with replace_char
- *
- * @param utf8str A utf8 string to process.
- * @param target_char The wchar to be replaced
- * @param replace_char The wchar which is written on replace
- */
-LL_COMMON_API std::string utf8str_substChar(
-	const std::string& utf8str,
-	const llwchar target_char,
-	const llwchar replace_char);
-
-LL_COMMON_API std::string utf8str_makeASCII(const std::string& utf8str);
-
-// Hack - used for evil notecards.
-LL_COMMON_API std::string mbcsstring_makeASCII(const std::string& str); 
-
-LL_COMMON_API std::string utf8str_removeCRLF(const std::string& utf8str);
-
-
-#if LL_WINDOWS
-/* @name Windows string helpers
- */
-//@{
-
-/**
- * @brief Implementation the expected snprintf interface.
- *
- * If the size of the passed in buffer is not large enough to hold the string,
- * two bad things happen:
- * 1. resulting formatted string is NOT null terminated
- * 2. Depending on the platform, the return value could be a) the required
- *    size of the buffer to copy the entire formatted string or b) -1.
- *    On Windows with VS.Net 2003, it returns -1 e.g. 
- *
- * safe_snprintf always adds a NULL terminator so that the caller does not
- * need to check for return value or need to add the NULL terminator.
- * It does not, however change the return value - to let the caller know
- * that the passed in buffer size was not large enough to hold the
- * formatted string.
- *
- */
-
-// Deal with the differeneces on Windows
-namespace snprintf_hack
-{
-	LL_COMMON_API int snprintf(char *str, size_t size, const char *format, ...);
-}
-
-using snprintf_hack::snprintf;
-
-/**
- * @brief Convert a wide string to std::string
- *
- * This replaces the unsafe W2A macro from ATL.
- */
-LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in);
-
-//@}
-#endif // LL_WINDOWS
-
-/**
- * Many of the 'strip' and 'replace' methods of LLStringUtilBase need
- * specialization to work with the signed char type.
- * Sadly, it is not possible (AFAIK) to specialize a single method of
- * a template class.
- * That stuff should go here.
- */
-namespace LLStringFn
-{
-	/**
-	 * @brief Replace all non-printable characters with replacement in
-	 * string.
-	 * NOTE - this will zap non-ascii
-	 *
-	 * @param [in,out] string the to modify. out value is the string
-	 * with zero non-printable characters.
-	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
-	 */
-	LL_COMMON_API void replace_nonprintable_in_ascii(
-		std::basic_string<char>& string,
-		char replacement);
-
-
-	/**
-	 * @brief Replace all non-printable characters and pipe characters
-	 * with replacement in a string.
-	 * NOTE - this will zap non-ascii
-	 *
-	 * @param [in,out] the string to modify. out value is the string
-	 * with zero non-printable characters and zero pipe characters.
-	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
-	 */
-	LL_COMMON_API void replace_nonprintable_and_pipe_in_ascii(std::basic_string<char>& str,
-									   char replacement);
-
-
-	/**
-	 * @brief Remove all characters that are not allowed in XML 1.0.
-	 * Returns a copy of the string with those characters removed.
-	 * Works with US ASCII and UTF-8 encoded strings.  JC
-	 */
-	LL_COMMON_API std::string strip_invalid_xml(const std::string& input);
-
-
-	/**
-	 * @brief Replace all control characters (0 <= c < 0x20) with replacement in
-	 * string.   This is safe for utf-8
-	 *
-	 * @param [in,out] string the to modify. out value is the string
-	 * with zero non-printable characters.
-	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
-	 */
-	LL_COMMON_API void replace_ascii_controlchars(
-		std::basic_string<char>& string,
-		char replacement);
-}
-
-////////////////////////////////////////////////////////////
-// NOTE: LLStringUtil::format, getTokens, and support functions moved to llstring.cpp.
-// There is no LLWStringUtil::format implementation currently.
-// Calling thse for anything other than LLStringUtil will produce link errors.
-
-////////////////////////////////////////////////////////////
-
-
-// static
-template<class T> 
-S32 LLStringUtilBase<T>::compareStrings(const T* lhs, const T* rhs)
-{	
-	S32 result;
-	if( lhs == rhs )
-	{
-		result = 0;
-	}
-	else
-	if ( !lhs || !lhs[0] )
-	{
-		result = ((!rhs || !rhs[0]) ? 0 : 1);
-	}
-	else
-	if ( !rhs || !rhs[0])
-	{
-		result = -1;
-	}
-	else
-	{
-		result = LLStringOps::collate(lhs, rhs);
-	}
-	return result;
-}
-
-//static 
-template<class T> 
-S32 LLStringUtilBase<T>::compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
-{
-	return LLStringOps::collate(lhs.c_str(), rhs.c_str());
-}
-
-// static
-template<class T> 
-S32 LLStringUtilBase<T>::compareInsensitive(const T* lhs, const T* rhs )
-{
-	S32 result;
-	if( lhs == rhs )
-	{
-		result = 0;
-	}
-	else
-	if ( !lhs || !lhs[0] )
-	{
-		result = ((!rhs || !rhs[0]) ? 0 : 1);
-	}
-	else
-	if ( !rhs || !rhs[0] )
-	{
-		result = -1;
-	}
-	else
-	{
-		std::basic_string<T> lhs_string(lhs);
-		std::basic_string<T> rhs_string(rhs);
-		LLStringUtilBase<T>::toUpper(lhs_string);
-		LLStringUtilBase<T>::toUpper(rhs_string);
-		result = LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
-	}
-	return result;
-}
-
-//static 
-template<class T> 
-S32 LLStringUtilBase<T>::compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
-{
-	std::basic_string<T> lhs_string(lhs);
-	std::basic_string<T> rhs_string(rhs);
-	LLStringUtilBase<T>::toUpper(lhs_string);
-	LLStringUtilBase<T>::toUpper(rhs_string);
-	return LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
-}
-
-// Case sensitive comparison with good handling of numbers.  Does not use current locale.
-// a.k.a. strdictcmp()
-
-//static 
-template<class T>
-S32 LLStringUtilBase<T>::compareDict(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
-{
-	const T* a = astr.c_str();
-	const T* b = bstr.c_str();
-	T ca, cb;
-	S32 ai, bi, cnt = 0;
-	S32 bias = 0;
-
-	ca = *(a++);
-	cb = *(b++);
-	while( ca && cb ){
-		if( bias==0 ){
-			if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); bias--; }
-			if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); bias++; }
-		}else{
-			if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
-			if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
-		}
-		if( LLStringOps::isDigit(ca) ){
-			if( cnt-->0 ){
-				if( cb!=ca ) break;
-			}else{
-				if( !LLStringOps::isDigit(cb) ) break;
-				for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
-				for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
-				if( ai<bi ){ ca=0; break; }
-				if( bi<ai ){ cb=0; break; }
-				if( ca!=cb ) break;
-				cnt = ai;
-			}
-		}else if( ca!=cb ){   break;
-		}
-		ca = *(a++);
-		cb = *(b++);
-	}
-	if( ca==cb ) ca += bias;
-	return ca-cb;
-}
-
-// static
-template<class T>
-S32 LLStringUtilBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
-{
-	const T* a = astr.c_str();
-	const T* b = bstr.c_str();
-	T ca, cb;
-	S32 ai, bi, cnt = 0;
-
-	ca = *(a++);
-	cb = *(b++);
-	while( ca && cb ){
-		if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
-		if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
-		if( LLStringOps::isDigit(ca) ){
-			if( cnt-->0 ){
-				if( cb!=ca ) break;
-			}else{
-				if( !LLStringOps::isDigit(cb) ) break;
-				for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
-				for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
-				if( ai<bi ){ ca=0; break; }
-				if( bi<ai ){ cb=0; break; }
-				if( ca!=cb ) break;
-				cnt = ai;
-			}
-		}else if( ca!=cb ){   break;
-		}
-		ca = *(a++);
-		cb = *(b++);
-	}
-	return ca-cb;
-}
-
-// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
-// static 
-template<class T> 
-BOOL LLStringUtilBase<T>::precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b )
-{
-	if( a.size() && b.size() )
-	{
-		return (LLStringUtilBase<T>::compareDict(a.c_str(), b.c_str()) < 0);
-	}
-	else
-	{
-		return (!b.empty());
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::toUpper(std::basic_string<T>& string)	
-{ 
-	if( !string.empty() )
-	{ 
-		std::transform(
-			string.begin(),
-			string.end(),
-			string.begin(),
-			(T(*)(T)) &LLStringOps::toUpper);
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::toLower(std::basic_string<T>& string)
-{ 
-	if( !string.empty() )
-	{ 
-		std::transform(
-			string.begin(),
-			string.end(),
-			string.begin(),
-			(T(*)(T)) &LLStringOps::toLower);
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::trimHead(std::basic_string<T>& string)
-{			
-	if( !string.empty() )
-	{
-		size_type i = 0;
-		while( i < string.length() && LLStringOps::isSpace( string[i] ) )
-		{
-			i++;
-		}
-		string.erase(0, i);
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::trimTail(std::basic_string<T>& string)
-{			
-	if( string.size() )
-	{
-		size_type len = string.length();
-		size_type i = len;
-		while( i > 0 && LLStringOps::isSpace( string[i-1] ) )
-		{
-			i--;
-		}
-
-		string.erase( i, len - i );
-	}
-}
-
-
-// Replace line feeds with carriage return-line feed pairs.
-//static
-template<class T>
-void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
-{
-	const T LF = 10;
-	const T CR = 13;
-
-	// Count the number of line feeds
-	size_type count = 0;
-	size_type len = string.size();
-	size_type i;
-	for( i = 0; i < len; i++ )
-	{
-		if( string[i] == LF )
-		{
-			count++;
-		}
-	}
-
-	// Insert a carriage return before each line feed
-	if( count )
-	{
-		size_type size = len + count;
-		T *t = new T[size];
-		size_type j = 0;
-		for( i = 0; i < len; ++i )
-		{
-			if( string[i] == LF )
-			{
-				t[j] = CR;
-				++j;
-			}
-			t[j] = string[i];
-			++j;
-		}
-
-		string.assign(t, size);
-	}
-}
-
-// Remove all carriage returns
-//static
-template<class T> 
-void LLStringUtilBase<T>::removeCRLF(std::basic_string<T>& string)
-{
-	const T CR = 13;
-
-	size_type cr_count = 0;
-	size_type len = string.size();
-	size_type i;
-	for( i = 0; i < len - cr_count; i++ )
-	{
-		if( string[i+cr_count] == CR )
-		{
-			cr_count++;
-		}
-
-		string[i] = string[i+cr_count];
-	}
-	string.erase(i, cr_count);
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::replaceChar( std::basic_string<T>& string, T target, T replacement )
-{
-	size_type found_pos = 0;
-	while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos ) 
-	{
-		string[found_pos] = replacement;
-		found_pos++; // avoid infinite defeat if target == replacement
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement )
-{
-	size_type found_pos = 0;
-	while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
-	{
-		string.replace( found_pos, target.length(), replacement );
-		found_pos += replacement.length(); // avoid infinite defeat if replacement contains target
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T replacement )
-{
-	const char LF = 10;
-	const S8 MIN = 32;
-//	const S8 MAX = 127;
-
-	size_type len = string.size();
-	for( size_type i = 0; i < len; i++ )
-	{
-		// No need to test MAX < mText[i] because we treat mText[i] as a signed char,
-		// which has a max value of 127.
-		if( ( S8(string[i]) < MIN ) && (string[i] != LF) )
-		{
-			string[i] = replacement;
-		}
-	}
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_type spaces_per_tab )
-{
-	const T TAB = '\t';
-	const T SPACE = ' ';
-
-	std::basic_string<T> out_str;
-	// Replace tabs with spaces
-	for (size_type i = 0; i < str.length(); i++)
-	{
-		if (str[i] == TAB)
-		{
-			for (size_type j = 0; j < spaces_per_tab; j++)
-				out_str += SPACE;
-		}
-		else
-		{
-			out_str += str[i];
-		}
-	}
-	str = out_str;
-}
-
-//static
-template<class T> 
-BOOL LLStringUtilBase<T>::containsNonprintable(const std::basic_string<T>& string)
-{
-	const char MIN = 32;
-	BOOL rv = FALSE;
-	for (size_type i = 0; i < string.size(); i++)
-	{
-		if(string[i] < MIN)
-		{
-			rv = TRUE;
-			break;
-		}
-	}
-	return rv;
-}
-
-//static
-template<class T> 
-void LLStringUtilBase<T>::stripNonprintable(std::basic_string<T>& string)
-{
-	const char MIN = 32;
-	size_type j = 0;
-	if (string.empty())
-	{
-		return;
-	}
-	size_t src_size = string.size();
-	char* c_string = new char[src_size + 1];
-	if(c_string == NULL)
-	{
-		return;
-	}
-	copy(c_string, string.c_str(), src_size+1);
-	char* write_head = &c_string[0];
-	for (size_type i = 0; i < src_size; i++)
-	{
-		char* read_head = &string[i];
-		write_head = &c_string[j];
-		if(!(*read_head < MIN))
-		{
-			*write_head = *read_head;
-			++j;
-		}
-	}
-	c_string[j]= '\0';
-	string = c_string;
-	delete []c_string;
-}
-
-template<class T> 
-void LLStringUtilBase<T>::_makeASCII(std::basic_string<T>& string)
-{
-	// Replace non-ASCII chars with LL_UNKNOWN_CHAR
-	for (size_type i = 0; i < string.length(); i++)
-	{
-		if (string[i] > 0x7f)
-		{
-			string[i] = LL_UNKNOWN_CHAR;
-		}
-	}
-}
-
-// static
-template<class T> 
-void LLStringUtilBase<T>::copy( T* dst, const T* src, size_type dst_size )
-{
-	if( dst_size > 0 )
-	{
-		size_type min_len = 0;
-		if( src )
-		{
-			min_len = llmin( dst_size - 1, strlen( src ) );  /* Flawfinder: ignore */
-			memcpy(dst, src, min_len * sizeof(T));		/* Flawfinder: ignore */
-		}
-		dst[min_len] = '\0';
-	}
-}
-
-// static
-template<class T> 
-void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset)
-{
-	if ( offset == dst.length() )
-	{
-		// special case - append to end of string and avoid expensive
-		// (when strings are large) string manipulations
-		dst += src;
-	}
-	else
-	{
-		std::basic_string<T> tail = dst.substr(offset);
-
-		dst = dst.substr(0, offset);
-		dst += src;
-		dst += tail;
-	};
-}
-
-// True if this is the head of s.
-//static
-template<class T> 
-BOOL LLStringUtilBase<T>::isHead( const std::basic_string<T>& string, const T* s ) 
-{ 
-	if( string.empty() )
-	{
-		// Early exit
-		return FALSE;
-	}
-	else
-	{
-		return (strncmp( s, string.c_str(), string.size() ) == 0);
-	}
-}
-
-// static
-template<class T> 
-bool LLStringUtilBase<T>::startsWith(
-	const std::basic_string<T>& string,
-	const std::basic_string<T>& substr)
-{
-	if(string.empty() || (substr.empty())) return false;
-	if(0 == string.find(substr)) return true;
-	return false;
-}
-
-// static
-template<class T> 
-bool LLStringUtilBase<T>::endsWith(
-	const std::basic_string<T>& string,
-	const std::basic_string<T>& substr)
-{
-	if(string.empty() || (substr.empty())) return false;
-	std::string::size_type idx = string.rfind(substr);
-	if(std::string::npos == idx) return false;
-	return (idx == (string.size() - substr.size()));
-}
-
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& value)
-{
-	if( string.empty() )
-	{
-		return FALSE;
-	}
-
-	std::basic_string<T> temp( string );
-	trim(temp);
-	if( 
-		(temp == "1") || 
-		(temp == "T") || 
-		(temp == "t") || 
-		(temp == "TRUE") || 
-		(temp == "true") || 
-		(temp == "True") )
-	{
-		value = TRUE;
-		return TRUE;
-	}
-	else
-	if( 
-		(temp == "0") || 
-		(temp == "F") || 
-		(temp == "f") || 
-		(temp == "FALSE") || 
-		(temp == "false") || 
-		(temp == "False") )
-	{
-		value = FALSE;
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToU8(const std::basic_string<T>& string, U8& value) 
-{
-	S32 value32 = 0;
-	BOOL success = convertToS32(string, value32);
-	if( success && (U8_MIN <= value32) && (value32 <= U8_MAX) )
-	{
-		value = (U8) value32;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToS8(const std::basic_string<T>& string, S8& value) 
-{
-	S32 value32 = 0;
-	BOOL success = convertToS32(string, value32);
-	if( success && (S8_MIN <= value32) && (value32 <= S8_MAX) )
-	{
-		value = (S8) value32;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToS16(const std::basic_string<T>& string, S16& value) 
-{
-	S32 value32 = 0;
-	BOOL success = convertToS32(string, value32);
-	if( success && (S16_MIN <= value32) && (value32 <= S16_MAX) )
-	{
-		value = (S16) value32;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToU16(const std::basic_string<T>& string, U16& value) 
-{
-	S32 value32 = 0;
-	BOOL success = convertToS32(string, value32);
-	if( success && (U16_MIN <= value32) && (value32 <= U16_MAX) )
-	{
-		value = (U16) value32;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32& value) 
-{
-	if( string.empty() )
-	{
-		return FALSE;
-	}
-
-	std::basic_string<T> temp( string );
-	trim(temp);
-	U32 v;
-	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
-	if(i_stream >> v)
-	{
-		value = v;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToS32(const std::basic_string<T>& string, S32& value) 
-{
-	if( string.empty() )
-	{
-		return FALSE;
-	}
-
-	std::basic_string<T> temp( string );
-	trim(temp);
-	S32 v;
-	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
-	if(i_stream >> v)
-	{
-		//TODO: figure out overflow and underflow reporting here
-		//if((LONG_MAX == v) || (LONG_MIN == v))
-		//{
-		//	// Underflow or overflow
-		//	return FALSE;
-		//}
-
-		value = v;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToF32(const std::basic_string<T>& string, F32& value) 
-{
-	F64 value64 = 0.0;
-	BOOL success = convertToF64(string, value64);
-	if( success && (-F32_MAX <= value64) && (value64 <= F32_MAX) )
-	{
-		value = (F32) value64;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-BOOL LLStringUtilBase<T>::convertToF64(const std::basic_string<T>& string, F64& value)
-{
-	if( string.empty() )
-	{
-		return FALSE;
-	}
-
-	std::basic_string<T> temp( string );
-	trim(temp);
-	F64 v;
-	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
-	if(i_stream >> v)
-	{
-		//TODO: figure out overflow and underflow reporting here
-		//if( ((-HUGE_VAL == v) || (HUGE_VAL == v))) )
-		//{
-		//	// Underflow or overflow
-		//	return FALSE;
-		//}
-
-		value = v;
-		return TRUE;
-	}
-	return FALSE;
-}
-
-template<class T> 
-void LLStringUtilBase<T>::truncate(std::basic_string<T>& string, size_type count)
-{
-	size_type cur_size = string.size();
-	string.resize(count < cur_size ? count : cur_size);
-}
-
-#endif  // LL_STRING_H
+/** 
+ * @file llstring.h
+ * @brief String utility functions and std::string class.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSTRING_H
+#define LL_LLSTRING_H
+
+#include <string>
+#include <cstdio>
+#include <locale>
+#include <iomanip>
+#include "llsd.h"
+#include "llfasttimer.h"
+
+#if LL_LINUX || LL_SOLARIS
+#include <wctype.h>
+#include <wchar.h>
+#endif
+
+#include <string.h>
+
+#if LL_SOLARIS
+// stricmp and strnicmp do not exist on Solaris:
+#define stricmp strcasecmp
+#define strnicmp strncasecmp
+#endif
+
+const char LL_UNKNOWN_CHAR = '?';
+
+#if LL_DARWIN || LL_LINUX || LL_SOLARIS
+// Template specialization of char_traits for U16s. Only necessary on Mac and Linux (exists on Windows already)
+#include <cstring>
+
+namespace std
+{
+template<>
+struct char_traits<U16>
+{
+	typedef U16 		char_type;
+	typedef int 	    int_type;
+	typedef streampos 	pos_type;
+	typedef streamoff 	off_type;
+	typedef mbstate_t 	state_type;
+	
+	static void 
+		assign(char_type& __c1, const char_type& __c2)
+	{ __c1 = __c2; }
+	
+	static bool 
+		eq(const char_type& __c1, const char_type& __c2)
+	{ return __c1 == __c2; }
+	
+	static bool 
+		lt(const char_type& __c1, const char_type& __c2)
+	{ return __c1 < __c2; }
+	
+	static int 
+		compare(const char_type* __s1, const char_type* __s2, size_t __n)
+	{ return memcmp(__s1, __s2, __n * sizeof(char_type)); }
+	
+	static size_t
+		length(const char_type* __s)
+	{
+		const char_type *cur_char = __s;
+		while (*cur_char != 0)
+		{
+			++cur_char;
+		}
+		return cur_char - __s;
+	}
+	
+	static const char_type* 
+		find(const char_type* __s, size_t __n, const char_type& __a)
+	{ return static_cast<const char_type*>(memchr(__s, __a, __n * sizeof(char_type))); }
+	
+	static char_type* 
+		move(char_type* __s1, const char_type* __s2, size_t __n)
+	{ return static_cast<char_type*>(memmove(__s1, __s2, __n * sizeof(char_type))); }
+	
+	static char_type* 
+		copy(char_type* __s1, const char_type* __s2, size_t __n)
+	{  return static_cast<char_type*>(memcpy(__s1, __s2, __n * sizeof(char_type))); }	/* Flawfinder: ignore */
+	
+	static char_type* 
+		assign(char_type* __s, size_t __n, char_type __a)
+	{ 
+		// This isn't right.
+		//return static_cast<char_type*>(memset(__s, __a, __n * sizeof(char_type))); 
+		
+		// I don't think there's a standard 'memset' for 16-bit values.
+		// Do this the old-fashioned way.
+		
+		size_t __i;
+		for(__i = 0; __i < __n; __i++)
+		{
+			__s[__i] = __a;
+		}
+		return __s; 
+	}
+	
+	static char_type 
+		to_char_type(const int_type& __c)
+	{ return static_cast<char_type>(__c); }
+	
+	static int_type 
+		to_int_type(const char_type& __c)
+	{ return static_cast<int_type>(__c); }
+	
+	static bool 
+		eq_int_type(const int_type& __c1, const int_type& __c2)
+	{ return __c1 == __c2; }
+	
+	static int_type 
+		eof() { return static_cast<int_type>(EOF); }
+	
+	static int_type 
+		not_eof(const int_type& __c)
+      { return (__c == eof()) ? 0 : __c; }
+  };
+};
+#endif
+
+class LL_COMMON_API LLStringOps
+{
+private:
+	static long sPacificTimeOffset;
+	static long sLocalTimeOffset;
+	static bool sPacificDaylightTime;
+	static std::map<std::string, std::string> datetimeToCodes;
+
+public:
+	static char toUpper(char elem) { return toupper((unsigned char)elem); }
+	static llwchar toUpper(llwchar elem) { return towupper(elem); }
+	
+	static char toLower(char elem) { return tolower((unsigned char)elem); }
+	static llwchar toLower(llwchar elem) { return towlower(elem); }
+
+	static bool isSpace(char elem) { return isspace((unsigned char)elem) != 0; }
+	static bool isSpace(llwchar elem) { return iswspace(elem) != 0; }
+
+	static bool isUpper(char elem) { return isupper((unsigned char)elem) != 0; }
+	static bool isUpper(llwchar elem) { return iswupper(elem) != 0; }
+
+	static bool isLower(char elem) { return islower((unsigned char)elem) != 0; }
+	static bool isLower(llwchar elem) { return iswlower(elem) != 0; }
+
+	static bool isDigit(char a) { return isdigit((unsigned char)a) != 0; }
+	static bool isDigit(llwchar a) { return iswdigit(a) != 0; }
+
+	static bool isPunct(char a) { return ispunct((unsigned char)a) != 0; }
+	static bool isPunct(llwchar a) { return iswpunct(a) != 0; }
+
+	static bool isAlnum(char a) { return isalnum((unsigned char)a) != 0; }
+	static bool isAlnum(llwchar a) { return iswalnum(a) != 0; }
+
+	static S32	collate(const char* a, const char* b) { return strcoll(a, b); }
+	static S32	collate(const llwchar* a, const llwchar* b);
+
+	static void setupDatetimeInfo(bool pacific_daylight_time);
+	static long getPacificTimeOffset(void) { return sPacificTimeOffset;}
+	static long getLocalTimeOffset(void) { return sLocalTimeOffset;}
+	// Is the Pacific time zone (aka server time zone)
+	// currently in daylight savings time?
+	static bool getPacificDaylightTime(void) { return sPacificDaylightTime;}
+
+	static std::string getDatetimeCode (std::string key);
+};
+
+/**
+ * @brief Return a string constructed from in without crashing if the
+ * pointer is NULL.
+ */
+LL_COMMON_API std::string ll_safe_string(const char* in);
+LL_COMMON_API std::string ll_safe_string(const char* in, S32 maxlen);
+
+
+// Allowing assignments from non-strings into format_map_t is apparently
+// *really* error-prone, so subclass std::string with just basic c'tors.
+class LLFormatMapString
+{
+public:
+	LLFormatMapString() {};
+	LLFormatMapString(const char* s) : mString(ll_safe_string(s)) {};
+	LLFormatMapString(const std::string& s) : mString(s) {};
+	operator std::string() const { return mString; }
+	bool operator<(const LLFormatMapString& rhs) const { return mString < rhs.mString; }
+	std::size_t length() const { return mString.length(); }
+	
+private:
+	std::string mString;
+};
+
+template <class T>
+class LLStringUtilBase
+{
+private:
+	static std::string sLocale;
+
+public:
+	typedef typename std::basic_string<T>::size_type size_type;
+	
+public:
+	/////////////////////////////////////////////////////////////////////////////////////////
+	// Static Utility functions that operate on std::strings
+
+	static std::basic_string<T> null;
+	
+	typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
+	LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims);
+	LL_COMMON_API static void formatNumber(std::basic_string<T>& numStr, std::basic_string<T> decimals);
+	LL_COMMON_API static bool formatDatetime(std::basic_string<T>& replacement, std::basic_string<T> token, std::basic_string<T> param, S32 secFromEpoch);
+	LL_COMMON_API static S32 format(std::basic_string<T>& s, const format_map_t& substitutions);
+	LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
+	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
+	LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
+	static void setLocale (std::string inLocale) {sLocale = inLocale;};
+	static std::string getLocale (void) {return sLocale;};
+	
+	static bool isValidIndex(const std::basic_string<T>& string, size_type i)
+	{
+		return !string.empty() && (0 <= i) && (i <= string.size());
+	}
+
+	static void	trimHead(std::basic_string<T>& string);
+	static void	trimTail(std::basic_string<T>& string);
+	static void	trim(std::basic_string<T>& string)	{ trimHead(string); trimTail(string); }
+	static void truncate(std::basic_string<T>& string, size_type count);
+
+	static void	toUpper(std::basic_string<T>& string);
+	static void	toLower(std::basic_string<T>& string);
+	
+	// True if this is the head of s.
+	static BOOL	isHead( const std::basic_string<T>& string, const T* s ); 
+
+	/**
+	 * @brief Returns true if string starts with substr
+	 *
+	 * If etither string or substr are empty, this method returns false.
+	 */
+	static bool startsWith(
+		const std::basic_string<T>& string,
+		const std::basic_string<T>& substr);
+
+	/**
+	 * @brief Returns true if string ends in substr
+	 *
+	 * If etither string or substr are empty, this method returns false.
+	 */
+	static bool endsWith(
+		const std::basic_string<T>& string,
+		const std::basic_string<T>& substr);
+
+	static void	addCRLF(std::basic_string<T>& string);
+	static void	removeCRLF(std::basic_string<T>& string);
+
+	static void	replaceTabsWithSpaces( std::basic_string<T>& string, size_type spaces_per_tab );
+	static void	replaceNonstandardASCII( std::basic_string<T>& string, T replacement );
+	static void	replaceChar( std::basic_string<T>& string, T target, T replacement );
+	static void replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement );
+	
+	static BOOL	containsNonprintable(const std::basic_string<T>& string);
+	static void	stripNonprintable(std::basic_string<T>& string);
+
+	/**
+	 * @brief Unsafe way to make ascii characters. You should probably
+	 * only call this when interacting with the host operating system.
+	 * The 1 byte std::string does not work correctly.
+	 * The 2 and 4 byte std::string probably work, so LLWStringUtil::_makeASCII
+	 * should work.
+	 */
+	static void _makeASCII(std::basic_string<T>& string);
+
+	// Conversion to other data types
+	static BOOL	convertToBOOL(const std::basic_string<T>& string, BOOL& value);
+	static BOOL	convertToU8(const std::basic_string<T>& string, U8& value);
+	static BOOL	convertToS8(const std::basic_string<T>& string, S8& value);
+	static BOOL	convertToS16(const std::basic_string<T>& string, S16& value);
+	static BOOL	convertToU16(const std::basic_string<T>& string, U16& value);
+	static BOOL	convertToU32(const std::basic_string<T>& string, U32& value);
+	static BOOL	convertToS32(const std::basic_string<T>& string, S32& value);
+	static BOOL	convertToF32(const std::basic_string<T>& string, F32& value);
+	static BOOL	convertToF64(const std::basic_string<T>& string, F64& value);
+
+	/////////////////////////////////////////////////////////////////////////////////////////
+	// Utility functions for working with char*'s and strings
+
+	// Like strcmp but also handles empty strings. Uses
+	// current locale.
+	static S32		compareStrings(const T* lhs, const T* rhs);
+	static S32		compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
+	
+	// case insensitive version of above. Uses current locale on
+	// Win32, and falls back to a non-locale aware comparison on
+	// Linux.
+	static S32		compareInsensitive(const T* lhs, const T* rhs);
+	static S32		compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs);
+
+	// Case sensitive comparison with good handling of numbers.  Does not use current locale.
+	// a.k.a. strdictcmp()
+	static S32		compareDict(const std::basic_string<T>& a, const std::basic_string<T>& b);
+
+	// Case *in*sensitive comparison with good handling of numbers.  Does not use current locale.
+	// a.k.a. strdictcmp()
+	static S32		compareDictInsensitive(const std::basic_string<T>& a, const std::basic_string<T>& b);
+
+	// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
+	static BOOL		precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b );
+
+	// A replacement for strncpy.
+	// If the dst buffer is dst_size bytes long or more, ensures that dst is null terminated and holds
+	// up to dst_size-1 characters of src.
+	static void		copy(T* dst, const T* src, size_type dst_size);
+	
+	// Copies src into dst at a given offset.  
+	static void		copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset);
+	
+	static bool		isPartOfWord(T c) { return (c == (T)'_') || LLStringOps::isAlnum(c); }
+
+
+#ifdef _DEBUG	
+	LL_COMMON_API static void		testHarness();
+#endif
+
+private:
+	LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);
+};
+
+template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
+template<class T> std::string LLStringUtilBase<T>::sLocale;
+
+typedef LLStringUtilBase<char> LLStringUtil;
+typedef LLStringUtilBase<llwchar> LLWStringUtil;
+typedef std::basic_string<llwchar> LLWString;
+
+//@ Use this where we want to disallow input in the form of "foo"
+//  This is used to catch places where english text is embedded in the code
+//  instead of in a translatable XUI file.
+class LLStringExplicit : public std::string
+{
+public:
+	explicit LLStringExplicit(const char* s) : std::string(s) {}
+	LLStringExplicit(const std::string& s) : std::string(s) {}
+	LLStringExplicit(const std::string& s, size_type pos, size_type n = std::string::npos) : std::string(s, pos, n) {}
+};
+
+struct LLDictionaryLess
+{
+public:
+	bool operator()(const std::string& a, const std::string& b)
+	{
+		return (LLStringUtil::precedesDict(a, b) ? true : false);
+	}
+};
+
+
+/**
+ * Simple support functions
+ */
+
+/**
+ * @brief chop off the trailing characters in a string.
+ *
+ * This function works on bytes rather than glyphs, so this will
+ * incorrectly truncate non-single byte strings.
+ * Use utf8str_truncate() for utf8 strings
+ * @return a copy of in string minus the trailing count bytes.
+ */
+inline std::string chop_tail_copy(
+	const std::string& in,
+	std::string::size_type count)
+{
+	return std::string(in, 0, in.length() - count);
+}
+
+/**
+ * @brief This translates a nybble stored as a hex value from 0-f back
+ * to a nybble in the low order bits of the return byte.
+ */
+LL_COMMON_API U8 hex_as_nybble(char hex);
+
+/**
+ * @brief read the contents of a file into a string.
+ *
+ * Since this function has no concept of character encoding, most
+ * anything you do with this method ill-advised. Please avoid.
+ * @param str [out] The string which will have.
+ * @param filename The full name of the file to read.
+ * @return Returns true on success. If false, str is unmodified.
+ */
+LL_COMMON_API bool _read_file_into_string(std::string& str, const std::string& filename);
+LL_COMMON_API bool iswindividual(llwchar elem);
+
+/**
+ * Unicode support
+ */
+
+// Make the incoming string a utf8 string. Replaces any unknown glyph
+// with the UNKOWN_CHARACTER. Once any unknown glph is found, the rest
+// of the data may not be recovered.
+LL_COMMON_API std::string rawstr_to_utf8(const std::string& raw);
+
+//
+// We should never use UTF16 except when communicating with Win32!
+//
+typedef std::basic_string<U16> llutf16string;
+
+LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len);
+LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str);
+
+LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str, S32 len);
+LL_COMMON_API llutf16string wstring_to_utf16str(const LLWString &utf32str);
+
+LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str, S32 len);
+LL_COMMON_API llutf16string utf8str_to_utf16str ( const std::string& utf8str );
+
+LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str, S32 len);
+LL_COMMON_API LLWString utf8str_to_wstring(const std::string &utf8str);
+// Same function, better name. JC
+inline LLWString utf8string_to_wstring(const std::string& utf8_string) { return utf8str_to_wstring(utf8_string); }
+
+//
+LL_COMMON_API S32 wchar_to_utf8chars(llwchar inchar, char* outchars);
+
+LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str, S32 len);
+LL_COMMON_API std::string wstring_to_utf8str(const LLWString &utf32str);
+
+LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str, S32 len);
+LL_COMMON_API std::string utf16str_to_utf8str(const llutf16string &utf16str);
+
+// Length of this UTF32 string in bytes when transformed to UTF8
+LL_COMMON_API S32 wstring_utf8_length(const LLWString& wstr); 
+
+// Length in bytes of this wide char in a UTF8 string
+LL_COMMON_API S32 wchar_utf8_length(const llwchar wc); 
+
+LL_COMMON_API std::string utf8str_tolower(const std::string& utf8str);
+
+// Length in llwchar (UTF-32) of the first len units (16 bits) of the given UTF-16 string.
+LL_COMMON_API S32 utf16str_wstring_length(const llutf16string &utf16str, S32 len);
+
+// Length in utf16string (UTF-16) of wlen wchars beginning at woffset.
+LL_COMMON_API S32 wstring_utf16_length(const LLWString & wstr, S32 woffset, S32 wlen);
+
+// Length in wstring (i.e., llwchar count) of a part of a wstring specified by utf16 length (i.e., utf16 units.)
+LL_COMMON_API S32 wstring_wstring_length_from_utf16_length(const LLWString & wstr, S32 woffset, S32 utf16_length, BOOL *unaligned = NULL);
+
+/**
+ * @brief Properly truncate a utf8 string to a maximum byte count.
+ * 
+ * The returned string may be less than max_len if the truncation
+ * happens in the middle of a glyph. If max_len is longer than the
+ * string passed in, the return value == utf8str.
+ * @param utf8str A valid utf8 string to truncate.
+ * @param max_len The maximum number of bytes in the return value.
+ * @return Returns a valid utf8 string with byte count <= max_len.
+ */
+LL_COMMON_API std::string utf8str_truncate(const std::string& utf8str, const S32 max_len);
+
+LL_COMMON_API std::string utf8str_trim(const std::string& utf8str);
+
+LL_COMMON_API S32 utf8str_compare_insensitive(
+	const std::string& lhs,
+	const std::string& rhs);
+
+/**
+ * @brief Replace all occurences of target_char with replace_char
+ *
+ * @param utf8str A utf8 string to process.
+ * @param target_char The wchar to be replaced
+ * @param replace_char The wchar which is written on replace
+ */
+LL_COMMON_API std::string utf8str_substChar(
+	const std::string& utf8str,
+	const llwchar target_char,
+	const llwchar replace_char);
+
+LL_COMMON_API std::string utf8str_makeASCII(const std::string& utf8str);
+
+// Hack - used for evil notecards.
+LL_COMMON_API std::string mbcsstring_makeASCII(const std::string& str); 
+
+LL_COMMON_API std::string utf8str_removeCRLF(const std::string& utf8str);
+
+
+#if LL_WINDOWS
+/* @name Windows string helpers
+ */
+//@{
+
+/**
+ * @brief Implementation the expected snprintf interface.
+ *
+ * If the size of the passed in buffer is not large enough to hold the string,
+ * two bad things happen:
+ * 1. resulting formatted string is NOT null terminated
+ * 2. Depending on the platform, the return value could be a) the required
+ *    size of the buffer to copy the entire formatted string or b) -1.
+ *    On Windows with VS.Net 2003, it returns -1 e.g. 
+ *
+ * safe_snprintf always adds a NULL terminator so that the caller does not
+ * need to check for return value or need to add the NULL terminator.
+ * It does not, however change the return value - to let the caller know
+ * that the passed in buffer size was not large enough to hold the
+ * formatted string.
+ *
+ */
+
+// Deal with the differeneces on Windows
+namespace snprintf_hack
+{
+	LL_COMMON_API int snprintf(char *str, size_t size, const char *format, ...);
+}
+
+using snprintf_hack::snprintf;
+
+/**
+ * @brief Convert a wide string to std::string
+ *
+ * This replaces the unsafe W2A macro from ATL.
+ */
+LL_COMMON_API std::string ll_convert_wide_to_string(const wchar_t* in);
+
+//@}
+#endif // LL_WINDOWS
+
+/**
+ * Many of the 'strip' and 'replace' methods of LLStringUtilBase need
+ * specialization to work with the signed char type.
+ * Sadly, it is not possible (AFAIK) to specialize a single method of
+ * a template class.
+ * That stuff should go here.
+ */
+namespace LLStringFn
+{
+	/**
+	 * @brief Replace all non-printable characters with replacement in
+	 * string.
+	 * NOTE - this will zap non-ascii
+	 *
+	 * @param [in,out] string the to modify. out value is the string
+	 * with zero non-printable characters.
+	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
+	 */
+	LL_COMMON_API void replace_nonprintable_in_ascii(
+		std::basic_string<char>& string,
+		char replacement);
+
+
+	/**
+	 * @brief Replace all non-printable characters and pipe characters
+	 * with replacement in a string.
+	 * NOTE - this will zap non-ascii
+	 *
+	 * @param [in,out] the string to modify. out value is the string
+	 * with zero non-printable characters and zero pipe characters.
+	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
+	 */
+	LL_COMMON_API void replace_nonprintable_and_pipe_in_ascii(std::basic_string<char>& str,
+									   char replacement);
+
+
+	/**
+	 * @brief Remove all characters that are not allowed in XML 1.0.
+	 * Returns a copy of the string with those characters removed.
+	 * Works with US ASCII and UTF-8 encoded strings.  JC
+	 */
+	LL_COMMON_API std::string strip_invalid_xml(const std::string& input);
+
+
+	/**
+	 * @brief Replace all control characters (0 <= c < 0x20) with replacement in
+	 * string.   This is safe for utf-8
+	 *
+	 * @param [in,out] string the to modify. out value is the string
+	 * with zero non-printable characters.
+	 * @param The replacement character. use LL_UNKNOWN_CHAR if unsure.
+	 */
+	LL_COMMON_API void replace_ascii_controlchars(
+		std::basic_string<char>& string,
+		char replacement);
+}
+
+////////////////////////////////////////////////////////////
+// NOTE: LLStringUtil::format, getTokens, and support functions moved to llstring.cpp.
+// There is no LLWStringUtil::format implementation currently.
+// Calling thse for anything other than LLStringUtil will produce link errors.
+
+////////////////////////////////////////////////////////////
+
+
+// static
+template<class T> 
+S32 LLStringUtilBase<T>::compareStrings(const T* lhs, const T* rhs)
+{	
+	S32 result;
+	if( lhs == rhs )
+	{
+		result = 0;
+	}
+	else
+	if ( !lhs || !lhs[0] )
+	{
+		result = ((!rhs || !rhs[0]) ? 0 : 1);
+	}
+	else
+	if ( !rhs || !rhs[0])
+	{
+		result = -1;
+	}
+	else
+	{
+		result = LLStringOps::collate(lhs, rhs);
+	}
+	return result;
+}
+
+//static 
+template<class T> 
+S32 LLStringUtilBase<T>::compareStrings(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+{
+	return LLStringOps::collate(lhs.c_str(), rhs.c_str());
+}
+
+// static
+template<class T> 
+S32 LLStringUtilBase<T>::compareInsensitive(const T* lhs, const T* rhs )
+{
+	S32 result;
+	if( lhs == rhs )
+	{
+		result = 0;
+	}
+	else
+	if ( !lhs || !lhs[0] )
+	{
+		result = ((!rhs || !rhs[0]) ? 0 : 1);
+	}
+	else
+	if ( !rhs || !rhs[0] )
+	{
+		result = -1;
+	}
+	else
+	{
+		std::basic_string<T> lhs_string(lhs);
+		std::basic_string<T> rhs_string(rhs);
+		LLStringUtilBase<T>::toUpper(lhs_string);
+		LLStringUtilBase<T>::toUpper(rhs_string);
+		result = LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
+	}
+	return result;
+}
+
+//static 
+template<class T> 
+S32 LLStringUtilBase<T>::compareInsensitive(const std::basic_string<T>& lhs, const std::basic_string<T>& rhs)
+{
+	std::basic_string<T> lhs_string(lhs);
+	std::basic_string<T> rhs_string(rhs);
+	LLStringUtilBase<T>::toUpper(lhs_string);
+	LLStringUtilBase<T>::toUpper(rhs_string);
+	return LLStringOps::collate(lhs_string.c_str(), rhs_string.c_str());
+}
+
+// Case sensitive comparison with good handling of numbers.  Does not use current locale.
+// a.k.a. strdictcmp()
+
+//static 
+template<class T>
+S32 LLStringUtilBase<T>::compareDict(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+{
+	const T* a = astr.c_str();
+	const T* b = bstr.c_str();
+	T ca, cb;
+	S32 ai, bi, cnt = 0;
+	S32 bias = 0;
+
+	ca = *(a++);
+	cb = *(b++);
+	while( ca && cb ){
+		if( bias==0 ){
+			if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); bias--; }
+			if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); bias++; }
+		}else{
+			if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
+			if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
+		}
+		if( LLStringOps::isDigit(ca) ){
+			if( cnt-->0 ){
+				if( cb!=ca ) break;
+			}else{
+				if( !LLStringOps::isDigit(cb) ) break;
+				for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
+				for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
+				if( ai<bi ){ ca=0; break; }
+				if( bi<ai ){ cb=0; break; }
+				if( ca!=cb ) break;
+				cnt = ai;
+			}
+		}else if( ca!=cb ){   break;
+		}
+		ca = *(a++);
+		cb = *(b++);
+	}
+	if( ca==cb ) ca += bias;
+	return ca-cb;
+}
+
+// static
+template<class T>
+S32 LLStringUtilBase<T>::compareDictInsensitive(const std::basic_string<T>& astr, const std::basic_string<T>& bstr)
+{
+	const T* a = astr.c_str();
+	const T* b = bstr.c_str();
+	T ca, cb;
+	S32 ai, bi, cnt = 0;
+
+	ca = *(a++);
+	cb = *(b++);
+	while( ca && cb ){
+		if( LLStringOps::isUpper(ca) ){ ca = LLStringOps::toLower(ca); }
+		if( LLStringOps::isUpper(cb) ){ cb = LLStringOps::toLower(cb); }
+		if( LLStringOps::isDigit(ca) ){
+			if( cnt-->0 ){
+				if( cb!=ca ) break;
+			}else{
+				if( !LLStringOps::isDigit(cb) ) break;
+				for(ai=0; LLStringOps::isDigit(a[ai]); ai++);
+				for(bi=0; LLStringOps::isDigit(b[bi]); bi++);
+				if( ai<bi ){ ca=0; break; }
+				if( bi<ai ){ cb=0; break; }
+				if( ca!=cb ) break;
+				cnt = ai;
+			}
+		}else if( ca!=cb ){   break;
+		}
+		ca = *(a++);
+		cb = *(b++);
+	}
+	return ca-cb;
+}
+
+// Puts compareDict() in a form appropriate for LL container classes to use for sorting.
+// static 
+template<class T> 
+BOOL LLStringUtilBase<T>::precedesDict( const std::basic_string<T>& a, const std::basic_string<T>& b )
+{
+	if( a.size() && b.size() )
+	{
+		return (LLStringUtilBase<T>::compareDict(a.c_str(), b.c_str()) < 0);
+	}
+	else
+	{
+		return (!b.empty());
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::toUpper(std::basic_string<T>& string)	
+{ 
+	if( !string.empty() )
+	{ 
+		std::transform(
+			string.begin(),
+			string.end(),
+			string.begin(),
+			(T(*)(T)) &LLStringOps::toUpper);
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::toLower(std::basic_string<T>& string)
+{ 
+	if( !string.empty() )
+	{ 
+		std::transform(
+			string.begin(),
+			string.end(),
+			string.begin(),
+			(T(*)(T)) &LLStringOps::toLower);
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::trimHead(std::basic_string<T>& string)
+{			
+	if( !string.empty() )
+	{
+		size_type i = 0;
+		while( i < string.length() && LLStringOps::isSpace( string[i] ) )
+		{
+			i++;
+		}
+		string.erase(0, i);
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::trimTail(std::basic_string<T>& string)
+{			
+	if( string.size() )
+	{
+		size_type len = string.length();
+		size_type i = len;
+		while( i > 0 && LLStringOps::isSpace( string[i-1] ) )
+		{
+			i--;
+		}
+
+		string.erase( i, len - i );
+	}
+}
+
+
+// Replace line feeds with carriage return-line feed pairs.
+//static
+template<class T>
+void LLStringUtilBase<T>::addCRLF(std::basic_string<T>& string)
+{
+	const T LF = 10;
+	const T CR = 13;
+
+	// Count the number of line feeds
+	size_type count = 0;
+	size_type len = string.size();
+	size_type i;
+	for( i = 0; i < len; i++ )
+	{
+		if( string[i] == LF )
+		{
+			count++;
+		}
+	}
+
+	// Insert a carriage return before each line feed
+	if( count )
+	{
+		size_type size = len + count;
+		T *t = new T[size];
+		size_type j = 0;
+		for( i = 0; i < len; ++i )
+		{
+			if( string[i] == LF )
+			{
+				t[j] = CR;
+				++j;
+			}
+			t[j] = string[i];
+			++j;
+		}
+
+		string.assign(t, size);
+	}
+}
+
+// Remove all carriage returns
+//static
+template<class T> 
+void LLStringUtilBase<T>::removeCRLF(std::basic_string<T>& string)
+{
+	const T CR = 13;
+
+	size_type cr_count = 0;
+	size_type len = string.size();
+	size_type i;
+	for( i = 0; i < len - cr_count; i++ )
+	{
+		if( string[i+cr_count] == CR )
+		{
+			cr_count++;
+		}
+
+		string[i] = string[i+cr_count];
+	}
+	string.erase(i, cr_count);
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::replaceChar( std::basic_string<T>& string, T target, T replacement )
+{
+	size_type found_pos = 0;
+	while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos ) 
+	{
+		string[found_pos] = replacement;
+		found_pos++; // avoid infinite defeat if target == replacement
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::replaceString( std::basic_string<T>& string, std::basic_string<T> target, std::basic_string<T> replacement )
+{
+	size_type found_pos = 0;
+	while( (found_pos = string.find(target, found_pos)) != std::basic_string<T>::npos )
+	{
+		string.replace( found_pos, target.length(), replacement );
+		found_pos += replacement.length(); // avoid infinite defeat if replacement contains target
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::replaceNonstandardASCII( std::basic_string<T>& string, T replacement )
+{
+	const char LF = 10;
+	const S8 MIN = 32;
+//	const S8 MAX = 127;
+
+	size_type len = string.size();
+	for( size_type i = 0; i < len; i++ )
+	{
+		// No need to test MAX < mText[i] because we treat mText[i] as a signed char,
+		// which has a max value of 127.
+		if( ( S8(string[i]) < MIN ) && (string[i] != LF) )
+		{
+			string[i] = replacement;
+		}
+	}
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::replaceTabsWithSpaces( std::basic_string<T>& str, size_type spaces_per_tab )
+{
+	const T TAB = '\t';
+	const T SPACE = ' ';
+
+	std::basic_string<T> out_str;
+	// Replace tabs with spaces
+	for (size_type i = 0; i < str.length(); i++)
+	{
+		if (str[i] == TAB)
+		{
+			for (size_type j = 0; j < spaces_per_tab; j++)
+				out_str += SPACE;
+		}
+		else
+		{
+			out_str += str[i];
+		}
+	}
+	str = out_str;
+}
+
+//static
+template<class T> 
+BOOL LLStringUtilBase<T>::containsNonprintable(const std::basic_string<T>& string)
+{
+	const char MIN = 32;
+	BOOL rv = FALSE;
+	for (size_type i = 0; i < string.size(); i++)
+	{
+		if(string[i] < MIN)
+		{
+			rv = TRUE;
+			break;
+		}
+	}
+	return rv;
+}
+
+//static
+template<class T> 
+void LLStringUtilBase<T>::stripNonprintable(std::basic_string<T>& string)
+{
+	const char MIN = 32;
+	size_type j = 0;
+	if (string.empty())
+	{
+		return;
+	}
+	size_t src_size = string.size();
+	char* c_string = new char[src_size + 1];
+	if(c_string == NULL)
+	{
+		return;
+	}
+	copy(c_string, string.c_str(), src_size+1);
+	char* write_head = &c_string[0];
+	for (size_type i = 0; i < src_size; i++)
+	{
+		char* read_head = &string[i];
+		write_head = &c_string[j];
+		if(!(*read_head < MIN))
+		{
+			*write_head = *read_head;
+			++j;
+		}
+	}
+	c_string[j]= '\0';
+	string = c_string;
+	delete []c_string;
+}
+
+template<class T> 
+void LLStringUtilBase<T>::_makeASCII(std::basic_string<T>& string)
+{
+	// Replace non-ASCII chars with LL_UNKNOWN_CHAR
+	for (size_type i = 0; i < string.length(); i++)
+	{
+		if (string[i] > 0x7f)
+		{
+			string[i] = LL_UNKNOWN_CHAR;
+		}
+	}
+}
+
+// static
+template<class T> 
+void LLStringUtilBase<T>::copy( T* dst, const T* src, size_type dst_size )
+{
+	if( dst_size > 0 )
+	{
+		size_type min_len = 0;
+		if( src )
+		{
+			min_len = llmin( dst_size - 1, strlen( src ) );  /* Flawfinder: ignore */
+			memcpy(dst, src, min_len * sizeof(T));		/* Flawfinder: ignore */
+		}
+		dst[min_len] = '\0';
+	}
+}
+
+// static
+template<class T> 
+void LLStringUtilBase<T>::copyInto(std::basic_string<T>& dst, const std::basic_string<T>& src, size_type offset)
+{
+	if ( offset == dst.length() )
+	{
+		// special case - append to end of string and avoid expensive
+		// (when strings are large) string manipulations
+		dst += src;
+	}
+	else
+	{
+		std::basic_string<T> tail = dst.substr(offset);
+
+		dst = dst.substr(0, offset);
+		dst += src;
+		dst += tail;
+	};
+}
+
+// True if this is the head of s.
+//static
+template<class T> 
+BOOL LLStringUtilBase<T>::isHead( const std::basic_string<T>& string, const T* s ) 
+{ 
+	if( string.empty() )
+	{
+		// Early exit
+		return FALSE;
+	}
+	else
+	{
+		return (strncmp( s, string.c_str(), string.size() ) == 0);
+	}
+}
+
+// static
+template<class T> 
+bool LLStringUtilBase<T>::startsWith(
+	const std::basic_string<T>& string,
+	const std::basic_string<T>& substr)
+{
+	if(string.empty() || (substr.empty())) return false;
+	if(0 == string.find(substr)) return true;
+	return false;
+}
+
+// static
+template<class T> 
+bool LLStringUtilBase<T>::endsWith(
+	const std::basic_string<T>& string,
+	const std::basic_string<T>& substr)
+{
+	if(string.empty() || (substr.empty())) return false;
+	std::string::size_type idx = string.rfind(substr);
+	if(std::string::npos == idx) return false;
+	return (idx == (string.size() - substr.size()));
+}
+
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToBOOL(const std::basic_string<T>& string, BOOL& value)
+{
+	if( string.empty() )
+	{
+		return FALSE;
+	}
+
+	std::basic_string<T> temp( string );
+	trim(temp);
+	if( 
+		(temp == "1") || 
+		(temp == "T") || 
+		(temp == "t") || 
+		(temp == "TRUE") || 
+		(temp == "true") || 
+		(temp == "True") )
+	{
+		value = TRUE;
+		return TRUE;
+	}
+	else
+	if( 
+		(temp == "0") || 
+		(temp == "F") || 
+		(temp == "f") || 
+		(temp == "FALSE") || 
+		(temp == "false") || 
+		(temp == "False") )
+	{
+		value = FALSE;
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToU8(const std::basic_string<T>& string, U8& value) 
+{
+	S32 value32 = 0;
+	BOOL success = convertToS32(string, value32);
+	if( success && (U8_MIN <= value32) && (value32 <= U8_MAX) )
+	{
+		value = (U8) value32;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToS8(const std::basic_string<T>& string, S8& value) 
+{
+	S32 value32 = 0;
+	BOOL success = convertToS32(string, value32);
+	if( success && (S8_MIN <= value32) && (value32 <= S8_MAX) )
+	{
+		value = (S8) value32;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToS16(const std::basic_string<T>& string, S16& value) 
+{
+	S32 value32 = 0;
+	BOOL success = convertToS32(string, value32);
+	if( success && (S16_MIN <= value32) && (value32 <= S16_MAX) )
+	{
+		value = (S16) value32;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToU16(const std::basic_string<T>& string, U16& value) 
+{
+	S32 value32 = 0;
+	BOOL success = convertToS32(string, value32);
+	if( success && (U16_MIN <= value32) && (value32 <= U16_MAX) )
+	{
+		value = (U16) value32;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToU32(const std::basic_string<T>& string, U32& value) 
+{
+	if( string.empty() )
+	{
+		return FALSE;
+	}
+
+	std::basic_string<T> temp( string );
+	trim(temp);
+	U32 v;
+	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+	if(i_stream >> v)
+	{
+		value = v;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToS32(const std::basic_string<T>& string, S32& value) 
+{
+	if( string.empty() )
+	{
+		return FALSE;
+	}
+
+	std::basic_string<T> temp( string );
+	trim(temp);
+	S32 v;
+	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+	if(i_stream >> v)
+	{
+		//TODO: figure out overflow and underflow reporting here
+		//if((LONG_MAX == v) || (LONG_MIN == v))
+		//{
+		//	// Underflow or overflow
+		//	return FALSE;
+		//}
+
+		value = v;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToF32(const std::basic_string<T>& string, F32& value) 
+{
+	F64 value64 = 0.0;
+	BOOL success = convertToF64(string, value64);
+	if( success && (-F32_MAX <= value64) && (value64 <= F32_MAX) )
+	{
+		value = (F32) value64;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+BOOL LLStringUtilBase<T>::convertToF64(const std::basic_string<T>& string, F64& value)
+{
+	if( string.empty() )
+	{
+		return FALSE;
+	}
+
+	std::basic_string<T> temp( string );
+	trim(temp);
+	F64 v;
+	std::basic_istringstream<T> i_stream((std::basic_string<T>)temp);
+	if(i_stream >> v)
+	{
+		//TODO: figure out overflow and underflow reporting here
+		//if( ((-HUGE_VAL == v) || (HUGE_VAL == v))) )
+		//{
+		//	// Underflow or overflow
+		//	return FALSE;
+		//}
+
+		value = v;
+		return TRUE;
+	}
+	return FALSE;
+}
+
+template<class T> 
+void LLStringUtilBase<T>::truncate(std::basic_string<T>& string, size_type count)
+{
+	size_type cur_size = string.size();
+	string.resize(count < cur_size ? count : cur_size);
+}
+
+#endif  // LL_STRING_H
diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp
index 5d3fbe51289192d1c33db39247376434fa9df1be..d665deb60507c2d6d3f6b9ed1a3365e1af1615a4 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -1324,7 +1324,7 @@ BOOL item_date_sort( LLInventoryItem* a, LLInventoryItem* b )
 LLInventoryCategory::LLInventoryCategory(
 	const LLUUID& uuid,
 	const LLUUID& parent_uuid,
-	LLAssetType::EType preferred_type,
+	LLFolderType::EType preferred_type,
 	const std::string& name) :
 	LLInventoryObject(uuid, parent_uuid, LLAssetType::AT_CATEGORY, name),
 	mPreferredType(preferred_type)
@@ -1332,7 +1332,7 @@ LLInventoryCategory::LLInventoryCategory(
 }
 
 LLInventoryCategory::LLInventoryCategory() :
-	mPreferredType(LLAssetType::AT_NONE)
+	mPreferredType(LLFolderType::FT_NONE)
 {
 	mType = LLAssetType::AT_CATEGORY;
 }
@@ -1354,12 +1354,12 @@ void LLInventoryCategory::copyCategory(const LLInventoryCategory* other)
 	mPreferredType = other->mPreferredType;
 }
 
-LLAssetType::EType LLInventoryCategory::getPreferredType() const
+LLFolderType::EType LLInventoryCategory::getPreferredType() const
 {
 	return mPreferredType;
 }
 
-void LLInventoryCategory::setPreferredType(LLAssetType::EType type)
+void LLInventoryCategory::setPreferredType(LLFolderType::EType type)
 {
 	mPreferredType = type;
 }
@@ -1405,13 +1405,13 @@ bool LLInventoryCategory::fromLLSD(const LLSD& sd)
     if (sd.has(w))
     {
         S8 type = (U8)sd[w].asInteger();
-        mPreferredType = static_cast<LLAssetType::EType>(type);
+        mPreferredType = static_cast<LLFolderType::EType>(type);
     }
 	w = INV_ASSET_TYPE_LABEL_WS;
 	if (sd.has(w))
 	{
 		S8 type = (U8)sd[w].asInteger();
-        mPreferredType = static_cast<LLAssetType::EType>(type);
+        mPreferredType = static_cast<LLFolderType::EType>(type);
 	}
 
     w = INV_NAME_LABEL;
@@ -1433,7 +1433,7 @@ void LLInventoryCategory::unpackMessage(LLMessageSystem* msg,
 	msg->getUUIDFast(block, _PREHASH_ParentID, mParentUUID, block_num);
 	S8 type;
 	msg->getS8Fast(block, _PREHASH_Type, type, block_num);
-	mPreferredType = static_cast<LLAssetType::EType>(type);
+	mPreferredType = static_cast<LLFolderType::EType>(type);
 	msg->getStringFast(block, _PREHASH_Name, mName, block_num);
 	LLStringUtil::replaceNonstandardASCII(mName, ' ');
 }
@@ -1482,7 +1482,7 @@ BOOL LLInventoryCategory::importFile(LLFILE* fp)
 		}
 		else if(0 == strcmp("pref_type", keyword))
 		{
-			mPreferredType = LLAssetType::lookup(valuestr);
+			mPreferredType = LLFolderType::lookup(valuestr);
 		}
 		else if(0 == strcmp("name", keyword))
 		{
@@ -1514,7 +1514,7 @@ BOOL LLInventoryCategory::exportFile(LLFILE* fp, BOOL) const
 	mParentUUID.toString(uuid_str);
 	fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str());
 	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType));
-	fprintf(fp, "\t\tpref_type\t%s\n", LLAssetType::lookup(mPreferredType));
+	fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str());
 	fprintf(fp, "\t\tname\t%s|\n", mName.c_str());
 	fprintf(fp,"\t}\n");
 	return TRUE;
@@ -1561,7 +1561,7 @@ BOOL LLInventoryCategory::importLegacyStream(std::istream& input_stream)
 		}
 		else if(0 == strcmp("pref_type", keyword))
 		{
-			mPreferredType = LLAssetType::lookup(valuestr);
+			mPreferredType = LLFolderType::lookup(valuestr);
 		}
 		else if(0 == strcmp("name", keyword))
 		{
@@ -1593,7 +1593,7 @@ BOOL LLInventoryCategory::exportLegacyStream(std::ostream& output_stream, BOOL)
 	mParentUUID.toString(uuid_str);
 	output_stream << "\t\tparent_id\t" << uuid_str << "\n";
 	output_stream << "\t\ttype\t" << LLAssetType::lookup(mType) << "\n";
-	output_stream << "\t\tpref_type\t" << LLAssetType::lookup(mPreferredType) << "\n";
+	output_stream << "\t\tpref_type\t" << LLFolderType::lookup(mPreferredType) << "\n";
 	output_stream << "\t\tname\t" << mName.c_str() << "|\n";
 	output_stream << "\t}\n";
 	return TRUE;
@@ -1629,38 +1629,6 @@ LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item)
 	return rv;
 }
 
-/* deprecated, use LLInventoryItem::fromLLSD() instead
-LLPointer<LLInventoryItem> ll_create_item_from_sd(const LLSD& sd_item)
-{
-	LLPointer<LLInventoryItem> rv = new LLInventoryItem;
-	rv->setUUID(sd_item[INV_ITEM_ID_LABEL].asUUID());
-	rv->setParent(sd_item[INV_PARENT_ID_LABEL].asUUID());
-	rv->rename(sd_item[INV_NAME_LABEL].asString());
-	rv->setType(
-		LLAssetType::lookup(sd_item[INV_ASSET_TYPE_LABEL].asString()));
-	if (sd_item.has("shadow_id"))
-	{
-		LLUUID asset_id = sd_item["shadow_id"];
-		LLXORCipher cipher(MAGIC_ID.mData, UUID_BYTES);
-		cipher.decrypt(asset_id.mData, UUID_BYTES);
-		rv->setAssetUUID(asset_id);
-	}
-	if (sd_item.has(INV_ASSET_ID_LABEL))
-	{
-		rv->setAssetUUID(sd_item[INV_ASSET_ID_LABEL].asUUID());
-	}
-	rv->setDescription(sd_item[INV_DESC_LABEL].asString());
-	rv->setSaleInfo(ll_sale_info_from_sd(sd_item[INV_SALE_INFO_LABEL]));
-	rv->setPermissions(ll_permissions_from_sd(sd_item[INV_PERMISSIONS_LABEL]));
-	rv->setInventoryType(
-		LLInventoryType::lookup(
-			sd_item[INV_INVENTORY_TYPE_LABEL].asString()));
-	rv->setFlags((U32)(sd_item[INV_FLAGS_LABEL].asInteger()));
-	rv->setCreationDate(sd_item[INV_CREATION_DATE_LABEL].asInteger());
-	return rv;
-}
-*/
-
 LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat)
 {
 	LLSD rv;
@@ -1675,10 +1643,10 @@ LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat)
 	rv[INV_PARENT_ID_LABEL] = cat->getParentUUID();
 	rv[INV_NAME_LABEL] = cat->getName();
 	rv[INV_ASSET_TYPE_LABEL] = LLAssetType::lookup(cat->getType());
-	if(LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()))
+	if(LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
 	{
 		rv[INV_PREFERRED_TYPE_LABEL] =
-			LLAssetType::lookup(cat->getPreferredType());
+			LLFolderType::lookup(cat->getPreferredType()).c_str();
 	}
 	return rv;
 }
@@ -1692,7 +1660,7 @@ LLPointer<LLInventoryCategory> ll_create_category_from_sd(const LLSD& sd_cat)
 	rv->setType(
 		LLAssetType::lookup(sd_cat[INV_ASSET_TYPE_LABEL].asString()));
 	rv->setPreferredType(
-		LLAssetType::lookup(
-			sd_cat[INV_PREFERRED_TYPE_LABEL].asString()));
+			LLFolderType::lookup(
+				sd_cat[INV_PREFERRED_TYPE_LABEL].asString()));
 	return rv;
 }
diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h
index bd581e860f3a230dd919f9836e3d402c3c8aaf0b..3de9d14f5424303cda07f3615b8d7ce1f46a6a0c 100644
--- a/indra/llinventory/llinventory.h
+++ b/indra/llinventory/llinventory.h
@@ -37,6 +37,7 @@
 
 #include "llassetstorage.h"
 #include "lldarray.h"
+#include "llfoldertype.h"
 #include "llinventorytype.h"
 #include "llmemtype.h"
 #include "llpermissions.h"
@@ -321,15 +322,15 @@ class LLInventoryCategory : public LLInventoryObject
 public:
 	MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
 	LLInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid,
-						LLAssetType::EType preferred_type,
+						LLFolderType::EType preferred_type,
 						const std::string& name);
 	LLInventoryCategory();
 	LLInventoryCategory(const LLInventoryCategory* other);
 	void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy
 
 	// accessors and mutators
-	LLAssetType::EType getPreferredType() const;
-	void setPreferredType(LLAssetType::EType type);
+	LLFolderType::EType getPreferredType() const;
+	void setPreferredType(LLFolderType::EType type);
 	// For messaging system support
 	virtual void packMessage(LLMessageSystem* msg) const;
 	virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);
@@ -345,10 +346,8 @@ class LLInventoryCategory : public LLInventoryObject
 	virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const;
 
 protected:
-	// The type of asset that this category was "meant" to hold
-	// (although it may in fact hold any type).
-	LLAssetType::EType	mPreferredType;		
-
+	// May be the type that this category was "meant" to hold (although it may hold any type).	
+	LLFolderType::EType	mPreferredType;		
 };
 
 
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index a445466b26aea80e3ced71b4eb9fe221008ba4b0..0e71c0d12d81227e5e2e272eba0e66c2a0ce65b1 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -79,24 +79,16 @@ LLInventoryDictionary::LLInventoryDictionary()
 	addEntry(LLInventoryType::IT_SOUND,               new InventoryEntry("sound",     "sound",         1, LLAssetType::AT_SOUND));
 	addEntry(LLInventoryType::IT_CALLINGCARD,         new InventoryEntry("callcard",  "calling card",  1, LLAssetType::AT_CALLINGCARD));
 	addEntry(LLInventoryType::IT_LANDMARK,            new InventoryEntry("landmark",  "landmark",      1, LLAssetType::AT_LANDMARK));
-	//addEntry(LLInventoryType::IT_SCRIPT,            new InventoryEntry(NULL,NULL));
-	//addEntry(LLInventoryType::IT_CLOTHING,          new InventoryEntry(NULL,NULL));
 	addEntry(LLInventoryType::IT_OBJECT,              new InventoryEntry("object",    "object",        1, LLAssetType::AT_OBJECT));
 	addEntry(LLInventoryType::IT_NOTECARD,            new InventoryEntry("notecard",  "note card",     1, LLAssetType::AT_NOTECARD));
 	addEntry(LLInventoryType::IT_CATEGORY,            new InventoryEntry("category",  "folder"         ));
 	addEntry(LLInventoryType::IT_ROOT_CATEGORY,       new InventoryEntry("root",      "root"           ));
 	addEntry(LLInventoryType::IT_LSL,                 new InventoryEntry("script",    "script",        2, LLAssetType::AT_LSL_TEXT, LLAssetType::AT_LSL_BYTECODE));
-	//addEntry(LLInventoryType::IT_LSL_BYTECODE,      new InventoryEntry(NULL,NULL));
-	//addEntry(LLInventoryType::IT_TEXTURE_TGA,       new InventoryEntry(NULL,NULL));
-	//addEntry(LLInventoryType::IT_BODYPART,          new InventoryEntry(NULL,NULL));
-	//addEntry(LLInventoryType::IT_TRASH,             new InventoryEntry(NULL,NULL));
 	addEntry(LLInventoryType::IT_SNAPSHOT,            new InventoryEntry("snapshot",  "snapshot",      1, LLAssetType::AT_TEXTURE));
-	//addEntry(LLInventoryType::IT_LOST_AND_FOUND,    new InventoryEntry(NULL,NULL, ));
 	addEntry(LLInventoryType::IT_ATTACHMENT,          new InventoryEntry("attach",    "attachment",    1, LLAssetType::AT_OBJECT));
 	addEntry(LLInventoryType::IT_WEARABLE,            new InventoryEntry("wearable",  "wearable",      2, LLAssetType::AT_CLOTHING, LLAssetType::AT_BODYPART));
 	addEntry(LLInventoryType::IT_ANIMATION,           new InventoryEntry("animation", "animation",     1, LLAssetType::AT_ANIMATION));  
 	addEntry(LLInventoryType::IT_GESTURE,             new InventoryEntry("gesture",   "gesture",       1, LLAssetType::AT_GESTURE)); 
-	addEntry(LLInventoryType::IT_FAVORITE,            new InventoryEntry("favorite",  "favorite",      1, LLAssetType::AT_FAVORITE)); 
 }
 
 
@@ -128,35 +120,9 @@ DEFAULT_ASSET_FOR_INV_TYPE[LLAssetType::AT_COUNT] =
 	LLInventoryType::IT_ANIMATION,		// AT_ANIMATION
 	LLInventoryType::IT_GESTURE,		// AT_GESTURE
 	LLInventoryType::IT_NONE,			// AT_SIMSTATE
-	LLInventoryType::IT_FAVORITE,		// AT_FAVORITE
 
 	LLInventoryType::IT_NONE,			// AT_LINK
 	LLInventoryType::IT_NONE,			// AT_LINK_FOLDER
-
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-	LLInventoryType::IT_CATEGORY,		// AT_ENSEMBLE
-
-	LLInventoryType::IT_CATEGORY,		// AT_CURRENT_OUTFIT
-	LLInventoryType::IT_CATEGORY,		// AT_OUTFIT
-	LLInventoryType::IT_CATEGORY,		// AT_MY_OUTFITS
 };
 
 // static
diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h
index 14b28bfe4b8ea583bd70531821fc03440f366904..e515b8a304b3396d4524c5f638e579181ec2f66b 100644
--- a/indra/llinventory/llinventorytype.h
+++ b/indra/llinventory/llinventorytype.h
@@ -67,8 +67,7 @@ class LLInventoryType
 		IT_WEARABLE = 18,
 		IT_ANIMATION = 19,
 		IT_GESTURE = 20,
-		IT_FAVORITE = 21,
-		IT_COUNT = 22,
+		IT_COUNT = 21,
 
 		IT_NONE = -1
 	};
diff --git a/indra/llinventory/tests/inventorymisc_test.cpp b/indra/llinventory/tests/inventorymisc_test.cpp
index 770594dc9df62a6f2dd5b41233bd724c29fc9250..c797a70c50662ad96176c23a5dde14695c455dc8 100644
--- a/indra/llinventory/tests/inventorymisc_test.cpp
+++ b/indra/llinventory/tests/inventorymisc_test.cpp
@@ -94,7 +94,7 @@ LLPointer<LLInventoryCategory> create_random_inventory_cat()
 	LLPointer<LLInventoryCategory> cat = new LLInventoryCategory(
 		item_id,
 		parent_id,
-		LLAssetType::AT_NONE,
+		LLFolderType::FT_NONE,
 		std::string("Sample category"));
 	return cat;
 }
@@ -452,7 +452,7 @@ namespace tut
 		ensure_equals("4.type::getType() failed", dst->getType(), src->getType());
 		ensure_equals("5.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType());
 
-		src->setPreferredType( LLAssetType::AT_TEXTURE);
+		src->setPreferredType( LLFolderType::FT_TEXTURE);
 		sd = ll_create_sd_from_inventory_category(src);
 		dst = ll_create_category_from_sd(sd);
 		ensure_equals("6.preferred type::getPreferredType() failed", dst->getPreferredType(), src->getPreferredType());
diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp
index 41f3f3f607d9fcae5fa610b871c7126f6efeccbd..7332f5c95408796f9c9948ea548d3c6a0a279498 100644
--- a/indra/llmessage/lltransfersourceasset.cpp
+++ b/indra/llmessage/lltransfersourceasset.cpp
@@ -292,7 +292,6 @@ bool is_asset_id_knowable(LLAssetType::EType type)
 		case LLAssetType::AT_BODYPART:
 		case LLAssetType::AT_ANIMATION:
 		case LLAssetType::AT_GESTURE:
-		case LLAssetType::AT_FAVORITE:
 		case LLAssetType::AT_LINK:
 		case LLAssetType::AT_LINK_FOLDER:
 			rv = true;
diff --git a/indra/llprimitive/llmediaentry.cpp b/indra/llprimitive/llmediaentry.cpp
index fa04bf80e7a2544817cb1dcd38c17db934f019d4..701300163a3eae1528f2c62052a1d415a199160b 100644
--- a/indra/llprimitive/llmediaentry.cpp
+++ b/indra/llprimitive/llmediaentry.cpp
@@ -164,6 +164,7 @@ void LLMediaEntry::asLLSD(LLSD& sd) const
 
     // "security" fields
     sd[WHITELIST_ENABLE_KEY] = mWhiteListEnable;
+	sd.erase(WHITELIST_KEY);
     for (U32 i=0; i<mWhiteList.size(); i++) 
 	{
         sd[WHITELIST_KEY].append(mWhiteList[i]);
diff --git a/indra/llprimitive/tests/llmediaentry_test.cpp b/indra/llprimitive/tests/llmediaentry_test.cpp
index 9ce65609237884ed5c888e6b172043b02c61ee51..cd9608d56b74a4b7270a08de1e8fcee0004dfdb3 100644
--- a/indra/llprimitive/tests/llmediaentry_test.cpp
+++ b/indra/llprimitive/tests/llmediaentry_test.cpp
@@ -223,8 +223,7 @@ namespace tut
 	{
 		set_test_name("Test LLMediaEntry Instantiation");
 		LLMediaEntry entry;
-        ensure_llsd_equals(get_test_name(), defaultMediaEntryLLSD, entry.asLLSD());
-
+        ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, entry.asLLSD());
 	}
 
 	template<> template<>
@@ -251,12 +250,27 @@ namespace tut
         ensure_llsd_equals(get_test_name() + " failed", golden, entry.asLLSD());
     }
 
+    template<> template<>
+    void object::test<4>()
+    {
+        set_test_name("Test LLMediaEntry::asLLSD()");
+        LLMediaEntry entry;
+        LLSD sd;
+		// Put some cruft in the LLSD
+        sd[LLMediaEntry::CURRENT_URL_KEY] = "http://www.example.com";
+		LLSD whitelist;
+		whitelist.append("*.example.com");
+        sd[LLMediaEntry::WHITELIST_KEY] = whitelist;
+        entry.asLLSD(sd);
+        ensure_llsd_equals(get_test_name() + " failed", defaultMediaEntryLLSD, sd);
+    }
+
     // limit tests
     const char *URL_OK = "http://www.example.com";
     const char *URL_TOO_BIG = "http://www.example.com.qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq";
 
     template<> template<>
-    void object::test<4>()
+    void object::test<5>()
     {
         set_test_name("Test Limits on setting current URL");
         LLMediaEntry entry;
@@ -267,7 +281,7 @@ namespace tut
     }    
 
     template<> template<>
-    void object::test<5>()
+    void object::test<6>()
     {
         set_test_name("Test Limits on setting home URL");
         LLMediaEntry entry;
@@ -278,7 +292,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<6>()
+    void object::test<7>()
     {
         set_test_name("Test Limits on setting whitelist");
         
@@ -292,7 +306,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<7>()
+    void object::test<8>()
     {
         set_test_name("Test Limits on setting whitelist too big");
         
@@ -307,7 +321,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<8>()
+    void object::test<9>()
     {
         set_test_name("Test Limits on setting whitelist too many");
         
@@ -323,7 +337,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<9>()
+    void object::test<10>()
     {
         set_test_name("Test to make sure both setWhiteList() functions behave the same");
         
@@ -341,7 +355,7 @@ namespace tut
     }
     
     template<> template<>
-    void object::test<10>()
+    void object::test<11>()
     {
         set_test_name("Test to make sure both setWhiteList() functions behave the same");
 
@@ -362,7 +376,7 @@ namespace tut
     }
 
     template<> template<>
-    void object::test<11>()
+    void object::test<12>()
     {
         set_test_name("Test to make sure both setWhiteList() functions behave the same");
 
@@ -386,99 +400,99 @@ namespace tut
     
     // Check the "empty whitelist" case
     template<> template<>
-    void object::test<12>() { whitelist_test("", "http://www.example.com", true); }
+    void object::test<13>() { whitelist_test("", "http://www.example.com", true); }
 
     // Check the "missing scheme" case
     template<> template<>
-    void object::test<13>() { whitelist_test("www.example.com", "http://www.example.com", true); }
+    void object::test<14>() { whitelist_test("www.example.com", "http://www.example.com", true); }
 
     // Check the "exactly the same" case
     template<> template<>
-    void object::test<14>() { whitelist_test("http://example.com", "http://example.com", true); }
+    void object::test<15>() { whitelist_test("http://example.com", "http://example.com", true); }
 
     // Check the enable flag
     template<> template<>
-    void object::test<15>() { whitelist_test(false, "www.example.com", "http://www.secondlife.com", true); }
+    void object::test<16>() { whitelist_test(false, "www.example.com", "http://www.secondlife.com", true); }
     template<> template<>
-    void object::test<16>() { whitelist_test(true, "www.example.com", "http://www.secondlife.com", false); }
+    void object::test<17>() { whitelist_test(true, "www.example.com", "http://www.secondlife.com", false); }
 
     // Check permutations of trailing slash:
     template<> template<>
-    void object::test<17>() { whitelist_test("http://www.example.com", "http://www.example.com/", true); }
+    void object::test<18>() { whitelist_test("http://www.example.com", "http://www.example.com/", true); }
     template<> template<>
-    void object::test<18>() { whitelist_test("http://www.example.com/", "http://www.example.com/", true); }
+    void object::test<19>() { whitelist_test("http://www.example.com/", "http://www.example.com/", true); }
     template<> template<>
-    void object::test<19>() { whitelist_test("http://www.example.com/", "http://www.example.com", false); }
+    void object::test<20>() { whitelist_test("http://www.example.com/", "http://www.example.com", false); }
     template<> template<>
-    void object::test<20>() { whitelist_test("http://www.example.com", "http://www.example.com/foobar", true); }
+    void object::test<21>() { whitelist_test("http://www.example.com", "http://www.example.com/foobar", true); }
     template<> template<>
-    void object::test<21>() { whitelist_test("http://www.example.com/", "http://www.example.com/foobar", false); }
+    void object::test<22>() { whitelist_test("http://www.example.com/", "http://www.example.com/foobar", false); }
 
     
     // More cases...
     template<> template<>
-    void object::test<22>() { whitelist_test("http://example.com", "http://example.com/wiki", true); }
+    void object::test<23>() { whitelist_test("http://example.com", "http://example.com/wiki", true); }
     template<> template<>
-    void object::test<23>() { whitelist_test("www.example.com", "http://www.example.com/help", true); }
+    void object::test<24>() { whitelist_test("www.example.com", "http://www.example.com/help", true); }
     template<> template<>
-    void object::test<24>() { whitelist_test("http://www.example.com", "http://wwwexample.com", false); }
+    void object::test<25>() { whitelist_test("http://www.example.com", "http://wwwexample.com", false); }
     template<> template<>
-    void object::test<25>() { whitelist_test("http://www.example.com", "http://www.example.com/wiki", true); }
+    void object::test<26>() { whitelist_test("http://www.example.com", "http://www.example.com/wiki", true); }
     template<> template<>
-    void object::test<26>() { whitelist_test("example.com", "http://wwwexample.com", false); }
+    void object::test<27>() { whitelist_test("example.com", "http://wwwexample.com", false); }
     template<> template<>
-    void object::test<27>() { whitelist_test("http://www.example.com/", "http://www.amazon.com/wiki", false); }
+    void object::test<28>() { whitelist_test("http://www.example.com/", "http://www.amazon.com/wiki", false); }
     template<> template<>
-    void object::test<28>() { whitelist_test("www.example.com", "http://www.amazon.com", false); }
+    void object::test<29>() { whitelist_test("www.example.com", "http://www.amazon.com", false); }
 
     // regexp cases
     template<> template<>
-    void object::test<29>() { whitelist_test("*.example.com", "http://www.example.com", true); }
+    void object::test<30>() { whitelist_test("*.example.com", "http://www.example.com", true); }
     template<> template<>
-    void object::test<30>() { whitelist_test("*.example.com", "http://www.amazon.com", false); }
+    void object::test<31>() { whitelist_test("*.example.com", "http://www.amazon.com", false); }
     template<> template<>
-    void object::test<31>() { whitelist_test("*.example.com", "http://www.example.com/foo/bar", true); }
+    void object::test<32>() { whitelist_test("*.example.com", "http://www.example.com/foo/bar", true); }
     template<> template<>
-    void object::test<32>() { whitelist_test("*.example.com", "http:/example.com/foo/bar", false); }
+    void object::test<33>() { whitelist_test("*.example.com", "http:/example.com/foo/bar", false); }
     template<> template<>
-    void object::test<33>() { whitelist_test("*example.com", "http://example.com/foo/bar", true); }
+    void object::test<34>() { whitelist_test("*example.com", "http://example.com/foo/bar", true); }
     template<> template<>
-    void object::test<34>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?example.com", false); }
+    void object::test<35>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?example.com", false); }
     template<> template<>
-    void object::test<35>() { whitelist_test("example.com", "http://my.virus.com/foo/bar?example.com", false); }
+    void object::test<36>() { whitelist_test("example.com", "http://my.virus.com/foo/bar?example.com", false); }
     template<> template<>
-    void object::test<36>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?*example.com", false); }
+    void object::test<37>() { whitelist_test("*example.com", "http://my.virus.com/foo/bar?*example.com", false); }
     template<> template<>
-    void object::test<37>() { whitelist_test("http://*example.com", "http://www.example.com", true); }
+    void object::test<38>() { whitelist_test("http://*example.com", "http://www.example.com", true); }
     template<> template<>
-    void object::test<38>() { whitelist_test("http://*.example.com", "http://www.example.com", true); }
+    void object::test<39>() { whitelist_test("http://*.example.com", "http://www.example.com", true); }
     template<> template<>
-    void object::test<39>() { whitelist_test("http://*.e$?^.com", "http://www.e$?^.com", true); }
+    void object::test<40>() { whitelist_test("http://*.e$?^.com", "http://www.e$?^.com", true); }
     template<> template<>
-    void object::test<40>() { whitelist_test("*.example.com/foo/bar", "http://www.example.com/", false); }
+    void object::test<41>() { whitelist_test("*.example.com/foo/bar", "http://www.example.com/", false); }
     template<> template<>
-    void object::test<41>() { whitelist_test("*.example.com/foo/bar", "http://example.com/foo/bar", false); }
+    void object::test<42>() { whitelist_test("*.example.com/foo/bar", "http://example.com/foo/bar", false); }
     template<> template<>
-    void object::test<42>() { whitelist_test("http://*.example.com/foo/bar", "http://www.example.com", false); }
+    void object::test<43>() { whitelist_test("http://*.example.com/foo/bar", "http://www.example.com", false); }
     template<> template<>
-    void object::test<43>() { whitelist_test("http://*.example.com", "https://www.example.com", false); }
+    void object::test<44>() { whitelist_test("http://*.example.com", "https://www.example.com", false); }
     template<> template<>
-    void object::test<44>() { whitelist_test("http*://*.example.com", "rtsp://www.example.com", false); }
+    void object::test<45>() { whitelist_test("http*://*.example.com", "rtsp://www.example.com", false); }
     template<> template<>
-    void object::test<45>() { whitelist_test("http*://*.example.com", "https://www.example.com", true); }
+    void object::test<46>() { whitelist_test("http*://*.example.com", "https://www.example.com", true); }
     template<> template<>
-    void object::test<46>() { whitelist_test("example.com", "http://www.example.com", false); }
+    void object::test<47>() { whitelist_test("example.com", "http://www.example.com", false); }
     template<> template<>
-    void object::test<47>() { whitelist_test("www.example.com", "http://www.example.com:80", false); }
+    void object::test<48>() { whitelist_test("www.example.com", "http://www.example.com:80", false); }
     template<> template<>
-    void object::test<48>() { whitelist_test("www.example.com", "http://www.example.com", true); }
+    void object::test<49>() { whitelist_test("www.example.com", "http://www.example.com", true); }
     template<> template<>
-    void object::test<49>() { whitelist_test("www.example.com/", "http://www.example.com", false); }
+    void object::test<50>() { whitelist_test("www.example.com/", "http://www.example.com", false); }
     template<> template<>
-    void object::test<50>() { whitelist_test("www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); }
+    void object::test<51>() { whitelist_test("www.example.com/foo/bar/*", "http://www.example.com/foo/bar/baz", true); }
     // Path only
     template<> template<>
-    void object::test<51>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/baz", true); }
+    void object::test<52>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/baz", true); }
     template<> template<>
-    void object::test<52>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/", false); }
+    void object::test<53>() { whitelist_test("/foo/*/baz", "http://www.example.com/foo/bar/", false); }
 }
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index a7946cacf54a06c285dd80ca05fa147a554ed9cb..bbaf908d2e50c13cdc5fcf50a913d6cd775ae45c 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -95,8 +95,7 @@ LLButton::Params::Params()
 	is_toggle("is_toggle", false),
 	scale_image("scale_image", true),
 	hover_glow_amount("hover_glow_amount"),
-	commit_on_return("commit_on_return", true),
-	picture_style("picture_style", false)
+	commit_on_return("commit_on_return", true)
 {
 	addSynonym(is_toggle, "toggle");
 	held_down_delay.seconds = 0.5f;
@@ -153,17 +152,9 @@ LLButton::LLButton(const LLButton::Params& p)
 	static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
 	static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
 
-	//if we aren't a picture_style button set label as name if not provided
-	if (!p.picture_style.isProvided() || !p.picture_style)
+	if (!p.label_selected.isProvided())
 	{
-		if (!p.label.isProvided()) 
-		{
-			mUnselectedLabel = p.name();
-		}
-		if (!p.label_selected.isProvided())	
-		{
-			mSelectedLabel = mUnselectedLabel.getString();
-		}
+		mSelectedLabel = mUnselectedLabel;
 	}
 
 	// Hack to make sure there is space for at least one character
@@ -1100,18 +1091,3 @@ void LLButton::resetMouseDownTimer()
 	mMouseDownTimer.stop();
 	mMouseDownTimer.reset();
 }
-
-
-// *TODO: Remove this function after the initial XUI XML re-export pass.
-// static
-void LLButton::setupParamsForExport(Params& p, LLView* parent)
-{
-	std::string label = p.label;
-	if (label.empty())
-	{
-		//if our label is empty this is a picture style button
-		p.picture_style = true;
-	}
-
-	LLUICtrl::setupParamsForExport(p, parent);
-}
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 85580a98bf25f3c781c66a718a4ff0438e181550..08f289092f2d75b1bc2487034e30243f5826be6f 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -115,8 +115,7 @@ class LLButton
 		// misc
 		Optional<bool>			is_toggle,
 								scale_image,
-								commit_on_return,
-								picture_style;      //if true, don't display label
+								commit_on_return;
 		
 		Optional<F32>				hover_glow_amount;
 		Optional<TimeIntervalParam>	held_down_delay;
@@ -247,8 +246,6 @@ class LLButton
 
 	LLFrameTimer	mMouseDownTimer;
 
-	// If the label is empty, set the picture_style attribute
-	static void setupParamsForExport(Params& p, LLView* parent);
 private:
 	void			drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size);
 	void			resetMouseDownTimer();
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 8c72b079eee4dc71222705579a9824dc972fcfec..aac27e65627af66829811997d8c8f7c429d67107 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -772,6 +772,12 @@ LLMultiFloater* LLFloater::getHost()
 	return (LLMultiFloater*)mHostHandle.get(); 
 }
 
+void    LLFloater::applySavedVariables()
+{
+	applyRectControl();
+	applyDockState();
+}
+
 void LLFloater::applyRectControl()
 {
 	if (mRectControl.size() > 1)
@@ -1826,7 +1832,6 @@ void LLFloater::buildButtons()
 		LLButton::Params p;
 		p.name(sButtonNames[i]);
 		p.rect(btn_rect);
-		p.label("");
 		p.image_unselected.name(sButtonActiveImageNames[i]);
 		// Selected, no matter if hovered or not, is "pressed"
 		p.image_selected.name(sButtonPressedImageNames[i]);
@@ -1839,6 +1844,7 @@ void LLFloater::buildButtons()
 		p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT);
 		p.tool_tip(sButtonToolTips[i]);
 		p.scale_image(true);
+		p.chrome(true);
 
 		LLButton* buttonp = LLUICtrlFactory::create<LLButton>(p);
 		addChild(buttonp);
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index ef0d06a58eaa347b3d9705ecbcf690b55771720a..95c8dd84f65e0dab667345516f772d77acf13879 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -280,6 +280,9 @@ friend class LLMultiFloater;
 protected:
 
 	void			setRectControl(const std::string& rectname) { mRectControl = rectname; };
+
+	virtual void    applySavedVariables();
+
 	void			applyRectControl();
 	void			applyDockState();
 	void			storeRectControl();
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index aca4dc56eed59bc9f53da99dd3b6e1a5ac23ec89..f8e07913fbf342a671ee53d6d84f1784948f660f 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -134,8 +134,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
 				// Note: key should eventually be a non optional LLFloater arg; for now, set mKey to be safe
 				res->mKey = key;
 				res->setInstanceName(name);
-				res->applyRectControl(); // Can't apply rect control until setting instance name
-				res->applyDockState();//same...
+				res->applySavedVariables(); // Can't apply rect and dock state until setting instance name
 				if (res->mAutoTile && !res->getHost() && index > 0)
 				{
 					const LLRect& cur_rect = res->getRect();
diff --git a/indra/llui/llflyoutbutton.cpp b/indra/llui/llflyoutbutton.cpp
index 3483bac782005d279c90995ee919cddba7220327..abb0b869eb8c8eff6303df25a183b87f676da942 100644
--- a/indra/llui/llflyoutbutton.cpp
+++ b/indra/llui/llflyoutbutton.cpp
@@ -48,6 +48,7 @@ LLFlyoutButton::LLFlyoutButton(const Params& p)
 	// Text label button
 	LLButton::Params bp(p.action_button);
 	bp.name(p.label);
+	bp.label(p.label);
 	bp.rect.left(0).bottom(0).width(getRect().getWidth() - FLYOUT_BUTTON_ARROW_WIDTH).height(getRect().getHeight());
 	bp.click_callback.function(boost::bind(&LLFlyoutButton::onActionButtonClick, this, _2));
 	bp.follows.flags(FOLLOWS_ALL);
diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp
index 1e2353b488d88e8cfca241a08ddd5b640ec04f85..b1bd2b89a95c4c57a22861e387c60f5132c692d3 100644
--- a/indra/llui/lliconctrl.cpp
+++ b/indra/llui/lliconctrl.cpp
@@ -125,4 +125,3 @@ void LLIconCtrl::setIconImageDrawSize()
 	}
 }
 
-
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 91e7e46195d5da1a2e6398b75ab230192faae97a..956e84398743ee97e896dc043aadc2d03ea51af7 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -459,12 +459,6 @@ void LLMenuItemGL::draw( void )
 
 	LLColor4 color;
 
-	LLFontGL::ShadowType shadow_style = LLFontGL::NO_SHADOW;
-	if (getEnabled() && !mDrawTextDisabled )
-	{
-		shadow_style = LLFontGL::DROP_SHADOW_SOFT;
-	}
-
 	if ( getEnabled() && getHighlight() )
 	{
 		color = mHighlightForeground.get();
@@ -482,26 +476,26 @@ void LLMenuItemGL::draw( void )
 	if (mBriefItem)
 	{
 		mFont->render( mLabel, 0, BRIEF_PAD_PIXELS / 2, 0, color,
-					   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style );
+					   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL);
 	}
 	else
 	{
 		if( !mDrawBoolLabel.empty() )
 		{
 			mFont->render( mDrawBoolLabel.getWString(), 0, (F32)LEFT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
-						   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE );
+						   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
 		}
 		mFont->render( mLabel.getWString(), 0, (F32)LEFT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
-					   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE );
+					   LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
 		if( !mDrawAccelLabel.empty() )
 		{
 			mFont->render( mDrawAccelLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PLAIN_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
-						   LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE );
+						   LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
 		}
 		if( !mDrawBranchLabel.empty() )
 		{
 			mFont->render( mDrawBranchLabel.getWString(), 0, (F32)getRect().mRight - (F32)RIGHT_PAD_PIXELS, ((F32)MENU_ITEM_PADDING / 2.f) + 1.f, color,
-						   LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style, S32_MAX, S32_MAX, NULL, FALSE );
+						   LLFontGL::RIGHT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
 		}
 	}
 
@@ -1460,12 +1454,6 @@ void LLMenuItemBranchDownGL::draw( void )
 		gl_rect_2d( 0, getRect().getHeight(), getRect().getWidth(), 0 );
 	}
 
-	LLFontGL::ShadowType shadow_style = LLFontGL::NO_SHADOW;
-	if (getEnabled() && !getDrawTextDisabled() )
-	{
-		shadow_style = LLFontGL::DROP_SHADOW_SOFT;
-	}
-
 	LLColor4 color;
 	if (getHighlight())
 	{
@@ -1480,7 +1468,7 @@ void LLMenuItemBranchDownGL::draw( void )
 		color = mDisabledColor.get();
 	}
 	getFont()->render( mLabel.getWString(), 0, (F32)getRect().getWidth() / 2.f, (F32)LABEL_BOTTOM_PAD_PIXELS, color,
-				   LLFontGL::HCENTER, LLFontGL::BOTTOM, LLFontGL::NORMAL, shadow_style );
+				   LLFontGL::HCENTER, LLFontGL::BOTTOM, LLFontGL::NORMAL);
 
 
 	// underline navigation key only when keyboard navigation has been initiated
@@ -1555,8 +1543,6 @@ LLMenuScrollItem::LLMenuScrollItem(const Params& p)
 	}
 
 	LLButton::Params bparams;
-	bparams.label("");
-	bparams.label_selected("");
 	bparams.mouse_opaque(true);
 	bparams.scale_image(false);
 	bparams.click_callback(p.scroll_callback);
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index cde4c755184d899c97053e8c069235f0a17c25ad..b67f753d39431e09fe47143bf2f7b3bf7121c3fe 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -155,7 +155,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
 	mTotalTabWidth(0),
 	mTabPosition(p.tab_position),
 	mFontHalign(p.font_halign),
-	mFont(p.font.isProvided() ? p.font() : (mIsVertical ? LLFontGL::getFontSansSerif() : LLFontGL::getFontSansSerifSmall())),
+	mFont(p.font),
 	mFirstTabParams(p.first_tab),
 	mMiddleTabParams(p.middle_tab),
 	mLastTabParams(p.last_tab)
@@ -927,7 +927,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 		textbox = LLUICtrlFactory::create<LLTextBox> (params);
 		
 		LLButton::Params p;
-		p.name("");
+		p.name("placeholder");
 		btn = LLUICtrlFactory::create<LLButton>(p);
 	}
 	else
@@ -946,6 +946,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 			p.scale_image(true);
 			p.font_halign = mFontHalign;
 			p.tab_stop(false);
+			p.label_shadow(false);
 			if (indent)
 			{
 				p.pad_left(indent);
@@ -965,6 +966,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 			p.image_unselected(tab_img);
 			p.image_selected(tab_selected_img);
 			p.tab_stop(false);
+			p.label_shadow(false);
 			// Try to squeeze in a bit more text
 			p.pad_left(4);
 			p.pad_right(2);
@@ -986,7 +988,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
 				p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM;
 			}
 
-			btn = LLUICtrlFactory::create<LLButton>(p);
+++			btn = LLUICtrlFactory::create<LLButton>(p);
 		}
 	}
 	
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 9a26f0b4726be0e54ebf089ac5ffd58b40bc9479..e5aac0d5e7e9907410f0ea18aa4e0d3c011132a8 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1419,6 +1419,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
 	registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
 	registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url));
 	registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
+	registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
 	registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));
 	registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url));
 
@@ -1450,9 +1451,7 @@ void LLTextBase::setText(const LLStringExplicit &utf8str)
 
 	appendText(text, false);
 
-	//resetDirty();
 	onValueChange(0, getLength());
-	needsReflow();
 }
 
 //virtual
@@ -1630,8 +1629,6 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen
 		insertStringNoUndo(getLength(), wide_text, &segments);
 	}
 
-	needsReflow();
-	
 	// Set the cursor and scroll position
 	if( selection_start != selection_end )
 	{
@@ -2115,7 +2112,7 @@ LLRect LLTextBase::getVisibleDocumentRect() const
 		LLRect doc_rect = mDocumentView->getLocalRect();
 		doc_rect.mLeft -= mDocumentView->getRect().mLeft;
 		// adjust for height of text above widget baseline
-		doc_rect.mBottom = llmin(0, doc_rect.getHeight() - mTextRect.getHeight());
+		doc_rect.mBottom = doc_rect.getHeight() - mTextRect.getHeight();
 		return doc_rect;
 	}
 }
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 20bceb46756833225780bdb12bd35629d3d2ab8d..00f1d833a30a4c264ca8f21269214cd3d462b69e 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -45,6 +45,9 @@ LLTextBox::LLTextBox(const LLTextBox::Params& p)
 	mClickedCallback(NULL)
 {}
 
+LLTextBox::~LLTextBox()
+{}
+
 BOOL LLTextBox::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	BOOL	handled = LLTextBase::handleMouseDown(x, y, mask);
@@ -97,6 +100,18 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask)
 	return handled;
 }
 
+BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask)
+{
+	BOOL handled = LLTextBase::handleHover(x, y, mask);
+	if (!handled && mClickedCallback)
+	{
+		// Clickable text boxes change the cursor to a hand
+		LLUI::getWindow()->setCursor(UI_CURSOR_HAND);
+		return TRUE;
+	}
+	return handled;
+}
+
 void LLTextBox::setText(const LLStringExplicit& text)
 {
 	// does string argument insertion
@@ -105,6 +120,11 @@ void LLTextBox::setText(const LLStringExplicit& text)
 	LLTextBase::setText(mText.getString());
 }
 
+void LLTextBox::setClickedCallback( boost::function<void (void*)> cb, void* userdata /*= NULL */ )
+{
+	mClickedCallback = boost::bind(cb, userdata);
+}
+
 S32 LLTextBox::getTextPixelWidth()
 {
 	return getContentsRect().getWidth();
@@ -115,6 +135,12 @@ S32 LLTextBox::getTextPixelHeight()
 	return getContentsRect().getHeight();
 }
 
+
+LLSD LLTextBox::getValue() const
+{
+	return LLSD(getText());
+}
+
 BOOL LLTextBox::setTextArg( const std::string& key, const LLStringExplicit& text )
 {
 	mText.setArg(key, text);
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index da0bcbe972d9abac8f4f41d2c6dfa1199e7cbd5f..73f8a7c299ed7cdbb3662923505a2adb79deacd3 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -33,8 +33,6 @@
 #ifndef LL_LLTEXTBOX_H
 #define LL_LLTEXTBOX_H
 
-#include "v4color.h"
-#include "llstring.h"
 #include "lluistring.h"
 #include "lltextbase.h"
 
@@ -54,28 +52,25 @@ class LLTextBox :
 	friend class LLUICtrlFactory;
 
 public:
-	virtual ~LLTextBox() {}
+	virtual ~LLTextBox();
 
-	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
-	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
+	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+	/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+	/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
 
-	/*virtual*/ void			setText( const LLStringExplicit& text );
+	/*virtual*/ void setText( const LLStringExplicit& text );
 	
 	void			setRightAlign()							{ mHAlign = LLFontGL::RIGHT; }
 	void			setHAlign( LLFontGL::HAlign align )		{ mHAlign = align; }
-	void			setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL ){ mClickedCallback = boost::bind(cb, userdata); }		// mouse down and up within button
-
-	//const LLFontGL* getFont() const							{ return mDefaultFont; }
-	//void			setFont(const LLFontGL* font)			{ mDefaultFont = font; }
+	void			setClickedCallback( boost::function<void (void*)> cb, void* userdata = NULL );
 
 	void			reshapeToFitText();
 
-	//const std::string&	getText() const							{ return mText.getString(); }
 	S32				getTextPixelWidth();
 	S32				getTextPixelHeight();
 
-	virtual LLSD	getValue() const						{ return LLSD(getText()); }
-	virtual BOOL	setTextArg( const std::string& key, const LLStringExplicit& text );
+	/*virtual*/ LLSD	getValue() const;
+	/*virtual*/ BOOL	setTextArg( const std::string& key, const LLStringExplicit& text );
 
 protected:
 	void            onUrlLabelUpdated(const std::string &url, const std::string &label);
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 23c87c7522cca89063c1fb3187d6dcb3065506fa..4bc9a9c042661c4924aa56810b27b5b2383e883b 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -198,6 +198,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 	{
 		LLButton::Params icon_params;
 		icon_params.name = "tooltip_info";
+		icon_params.label(""); // provid label but set to empty so name does not overwrite it -angela
 		LLRect icon_rect;
 		LLUIImage* imagep = p.image;
 		TOOLTIP_ICON_SIZE = (imagep ? imagep->getWidth() : 16);
@@ -206,6 +207,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 		//icon_params.follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM;
 		icon_params.image_unselected(imagep);
 		icon_params.image_selected(imagep);
+
 		icon_params.scale_image(true);
 		icon_params.flash_color(icon_params.highlight_color());
 		mInfoButton  = LLUICtrlFactory::create<LLButton>(icon_params);
@@ -223,6 +225,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 	{
 		LLButton::Params p_button;
 		p_button.name(std::string("play_media"));
+		p_button.label(""); // provid label but set to empty so name does not overwrite it -angela
 		TOOLTIP_PLAYBUTTON_SIZE = 16;
 		LLRect button_rect;
 		button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
@@ -247,6 +250,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 	{
 		LLButton::Params p_w_button;
 		p_w_button.name(std::string("home_page"));
+		p_w_button.label(""); // provid label but set to empty so name does not overwrite it -angela
 		TOOLTIP_PLAYBUTTON_SIZE = 16;
 		LLRect button_rect;
 		button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index f3401f91f7a5435ba518c4c6b79d3499cfa5e51f..679db5e39ba9a636c09c6a0b68b68b6bd3cf9ee8 100644
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -121,6 +121,18 @@ void LLUrlAction::teleportToLocation(std::string url)
 	}	
 }
 
+void LLUrlAction::showLocationOnMap(std::string url)
+{
+	LLUrlMatch match;
+	if (LLUrlRegistry::instance().findUrl(url, match))
+	{
+		if (! match.getLocation().empty())
+		{
+			executeSLURL("secondlife:///app/worldmap/" + match.getLocation());
+		}
+	}	
+}
+
 void LLUrlAction::copyURLToClipboard(std::string url)
 {
 	LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(url));
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index 6b9d565b44ca97e9aebd599576375fe9c77224a1..4830cf27ef9494cce412be39c39e6262dfcf6351 100644
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -67,6 +67,9 @@ class LLUrlAction
 	/// if the Url specifies an SL location, teleport there
 	static void teleportToLocation(std::string url);
 
+	/// if the Url specifies an SL location, show it on a map
+	static void showLocationOnMap(std::string url);
+
 	/// perform the appropriate action for left-clicking on a Url
 	static void clickAction(std::string url);
 
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 52e4229fb4da308f7aea904936b1da5bfa40c7c0..dae4b512d15ed2ed8f55d7a515c3a282d03169ea 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -145,6 +145,18 @@ void LLUrlEntryBase::callObservers(const std::string &id, const std::string &lab
 	}
 }
 
+static std::string getStringAfterToken(const std::string str, const std::string token)
+{
+	size_t pos = str.find(token);
+	if (pos == std::string::npos)
+	{
+		return "";
+	}
+
+	pos += token.size();
+	return str.substr(pos, str.size() - pos);
+}
+
 //
 // LLUrlEntryHTTP Describes generic http: and https: Urls
 //
@@ -154,7 +166,6 @@ LLUrlEntryHTTP::LLUrlEntryHTTP()
 							boost::regex::perl|boost::regex::icase);
 	mMenuName = "menu_url_http.xml";
 	mTooltip = LLTrans::getString("TooltipHttpUrl");
-	//mIcon = "gear.tga";
 }
 
 std::string LLUrlEntryHTTP::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
@@ -390,7 +401,7 @@ std::string LLUrlEntryParcel::getLabel(const std::string &url, const LLUrlLabelC
 }
 
 //
-// LLUrlEntryPlace Describes secondlife:///<location> URLs
+// LLUrlEntryPlace Describes secondlife://<location> URLs
 //
 LLUrlEntryPlace::LLUrlEntryPlace()
 {
@@ -433,15 +444,7 @@ std::string LLUrlEntryPlace::getLabel(const std::string &url, const LLUrlLabelCa
 std::string LLUrlEntryPlace::getLocation(const std::string &url) const
 {
 	// return the part of the Url after secondlife:// part
-	const std::string search_string = "://";
-	size_t pos = url.find(search_string);
-	if (pos == std::string::npos)
-	{
-		return "";
-	}
-
-	pos += search_string.size();
-	return url.substr(pos, url.size() - pos);
+	return ::getStringAfterToken(url, "://");
 }
 
 //
@@ -468,6 +471,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
 	LLURI uri(url);
 	LLSD path_array = uri.pathArray();
 	S32 path_parts = path_array.size();
+	const std::string label = LLTrans::getString("SLurlLabelTeleport");
 	if (path_parts == 6)
 	{
 		// handle teleport url with (X,Y,Z) coordinates
@@ -475,7 +479,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
 		std::string x = path_array[path_parts-3];
 		std::string y = path_array[path_parts-2];
 		std::string z = path_array[path_parts-1];
-		return "Teleport to " + location + " (" + x + "," + y + "," + z + ")";
+		return label + " " + location + " (" + x + "," + y + "," + z + ")";
 	}
 	else if (path_parts == 5)
 	{
@@ -483,20 +487,20 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
 		std::string location = unescapeUrl(path_array[path_parts-3]);
 		std::string x = path_array[path_parts-2];
 		std::string y = path_array[path_parts-1];
-		return "Teleport to " + location + " (" + x + "," + y + ")";
+		return label + " " + location + " (" + x + "," + y + ")";
 	}
 	else if (path_parts == 4)
 	{
 		// handle teleport url with (X) coordinate only
 		std::string location = unescapeUrl(path_array[path_parts-2]);
 		std::string x = path_array[path_parts-1];
-		return "Teleport to " + location + " (" + x + ")";
+		return label + " " + location + " (" + x + ")";
 	}
 	else if (path_parts == 3)
 	{
 		// handle teleport url with no coordinates
 		std::string location = unescapeUrl(path_array[path_parts-1]);
-		return "Teleport to " + location;
+		return label + " " + location;
 	}
 
 	return url;
@@ -505,15 +509,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
 std::string LLUrlEntryTeleport::getLocation(const std::string &url) const
 {
 	// return the part of the Url after ///app/teleport
-	const std::string search_string = "teleport";
-	size_t pos = url.find(search_string);
-	if (pos == std::string::npos)
-	{
-		return "";
-	}
-
-	pos += search_string.size() + 1;
-	return url.substr(pos, url.size() - pos);
+	return ::getStringAfterToken(url, "app/teleport/");
 }
 
 ///
@@ -599,3 +595,43 @@ std::string LLUrlEntrySLLabel::getUrl(const std::string &string)
 	return getUrlFromWikiLink(string);
 }
 
+//
+// LLUrlEntryWorldMap Describes secondlife:///<location> URLs
+//
+LLUrlEntryWorldMap::LLUrlEntryWorldMap()
+{
+	mPattern = boost::regex("secondlife:///app/worldmap/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
+							boost::regex::perl|boost::regex::icase);
+	mMenuName = "menu_url_map.xml";
+	mTooltip = LLTrans::getString("TooltipMapUrl");
+}
+
+std::string LLUrlEntryWorldMap::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+	//
+	// we handle SLURLs in the following formats:
+	//   - secondlife:///app/worldmap/PLACE/X/Y/Z
+	//   - secondlife:///app/worldmap/PLACE/X/Y
+	//   - secondlife:///app/worldmap/PLACE/X
+	//
+	LLURI uri(url);
+	LLSD path_array = uri.pathArray();
+	S32 path_parts = path_array.size();
+	if (path_parts < 3)
+	{
+		return url;
+	}
+
+	const std::string label = LLTrans::getString("SLurlLabelShowOnMap");
+	std::string location = path_array[2];
+	std::string x = (path_parts > 3) ? path_array[3] : "128";
+	std::string y = (path_parts > 4) ? path_array[4] : "128";
+	std::string z = (path_parts > 5) ? path_array[5] : "0";
+	return label + " " + location + " (" + x + "," + y + "," + z + ")";
+}
+
+std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const
+{
+	// return the part of the Url after secondlife:///app/worldmap/ part
+	return ::getStringAfterToken(url, "app/worldmap/");
+}
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index afb2fdcde9fe88c8ea17e011b539b9eae49bd619..4507572b1e1939d722eb6dbfd574d30534d9a08c 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -186,7 +186,7 @@ class LLUrlEntryParcel : public LLUrlEntryBase
 
 ///
 /// LLUrlEntryPlace Describes a Second Life location Url, e.g.,
-/// secondlife:///Ahern/50/50/50
+/// secondlife://Ahern/50/50/50
 ///
 class LLUrlEntryPlace : public LLUrlEntryBase
 {
@@ -243,4 +243,16 @@ class LLUrlEntrySLLabel : public LLUrlEntryBase
 	/*virtual*/ std::string getUrl(const std::string &string);
 };
 
+///
+/// LLUrlEntryWorldMap Describes a Second Life worldmap Url, e.g.,
+/// secondlife:///app/worldmap/Ahern/50/50/50
+///
+class LLUrlEntryWorldMap : public LLUrlEntryBase
+{
+public:
+	LLUrlEntryWorldMap();
+	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+	/*virtual*/ std::string getLocation(const std::string &url) const;
+};
+
 #endif
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index 249c7320d698988de818771e03849c37a116a38c..60275b60bc23d86a7cb6aac7625b898074adb210 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -51,6 +51,7 @@ LLUrlRegistry::LLUrlRegistry()
 	registerUrl(new LLUrlEntryGroup());
 	registerUrl(new LLUrlEntryParcel());
 	registerUrl(new LLUrlEntryTeleport());
+	registerUrl(new LLUrlEntryWorldMap());
 	registerUrl(new LLUrlEntryObjectIM());
 	registerUrl(new LLUrlEntryPlace());
 	registerUrl(new LLUrlEntrySL());
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index fb6d5b29054ce58dd61177322d236c9add308e69..de927de1cd6ef6c44f1805fa9a02c5bf9967ce65 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -1,1098 +1,1098 @@
-/**
- * @file media_plugin_quicktime.cpp
- * @brief QuickTime plugin for LLMedia API plugin system
- *
- * $LicenseInfo:firstyear=2008&license=viewergpl$
- *
- * Copyright (c) 2008, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlife.com/developers/opensource/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at http://secondlife.com/developers/opensource/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-
-#include "llgl.h"
-
-#include "llplugininstance.h"
-#include "llpluginmessage.h"
-#include "llpluginmessageclasses.h"
-#include "media_plugin_base.h"
-
-#if LL_QUICKTIME_ENABLED
-
-#if defined(LL_DARWIN)
-	#include <QuickTime/QuickTime.h>
-#elif defined(LL_WINDOWS)
-	#include "MacTypes.h"
-	#include "QTML.h"
-	#include "Movies.h"
-	#include "QDoffscreen.h"
-	#include "FixMath.h"
-	#include "QTLoadLibraryUtils.h"
-#endif
-
-// TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint
-////////////////////////////////////////////////////////////////////////////////
-//
-class MediaPluginQuickTime : public MediaPluginBase
-{
-public:
-	MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
-	~MediaPluginQuickTime();
-
-	/* virtual */ void receiveMessage(const char *message_string);
-
-private:
-
-	int mNaturalWidth;
-	int mNaturalHeight;
-	Movie mMovieHandle;
-	GWorldPtr mGWorldHandle;
-	ComponentInstance mMovieController;
-	int mCurVolume;
-	bool mMediaSizeChanging;
-	bool mIsLooping;
-	std::string mMovieTitle;
-	bool mReceivedTitle;
-	const int mMinWidth;
-	const int mMaxWidth;
-	const int mMinHeight;
-	const int mMaxHeight;
-	F64 mPlayRate;
-	std::string mNavigateURL;
-
-	enum ECommand {
-		COMMAND_NONE,
-		COMMAND_STOP,
-		COMMAND_PLAY,
-		COMMAND_FAST_FORWARD,
-		COMMAND_FAST_REWIND,
-		COMMAND_PAUSE,
-		COMMAND_SEEK,
-	};
-	ECommand mCommand;
-
-	// Override this to add current time and duration to the message
-	/*virtual*/ void setDirty(int left, int top, int right, int bottom)
-	{
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
-
-		message.setValueS32("left", left);
-		message.setValueS32("top", top);
-		message.setValueS32("right", right);
-		message.setValueS32("bottom", bottom);
-
-		if(mMovieHandle)
-		{
-			message.setValueReal("current_time", getCurrentTime());
-			message.setValueReal("duration", getDuration());
-			message.setValueReal("current_rate", Fix2X(GetMovieRate(mMovieHandle)));
-		}
-
-		sendMessage(message);
-	}
-
-
-	static Rect rectFromSize(int width, int height)
-	{
-		Rect result;
-
-
-		result.left = 0;
-		result.top = 0;
-		result.right = width;
-		result.bottom = height;
-
-		return result;
-	}
-
-	Fixed getPlayRate(void)
-	{
-		Fixed result;
-		if(mPlayRate == 0.0f)
-		{
-			// Default to the movie's preferred rate
-			result = GetMoviePreferredRate(mMovieHandle);
-			if(result == 0)
-			{
-				// Don't return a 0 play rate, ever.
-				std::cerr << "Movie's preferred rate is 0, forcing to 1.0." << std::endl;
-				result = X2Fix(1.0f);
-			}
-		}
-		else
-		{
-			result = X2Fix(mPlayRate);
-		}
-
-		return result;
-	}
-
-	void load( const std::string url )
-	{
-
-		if ( url.empty() )
-			return;
-
-		// Stop and unload any existing movie before starting another one.
-		unload();
-
-		setStatus(STATUS_LOADING);
-
-		//In case std::string::c_str() makes a copy of the url data,
-		//make sure there is memory to hold it before allocating memory for handle.
-		//if fails, NewHandleClear(...) should return NULL.
-		const char* url_string = url.c_str() ;
-		Handle handle = NewHandleClear( ( Size )( url.length() + 1 ) );
-
-		if ( NULL == handle || noErr != MemError() || NULL == *handle )
-		{
-			setStatus(STATUS_ERROR);
-			return;
-		}
-
-		BlockMove( url_string, *handle, ( Size )( url.length() + 1 ) );
-
-		OSErr err = NewMovieFromDataRef( &mMovieHandle, newMovieActive | newMovieDontInteractWithUser | newMovieAsyncOK | newMovieIdleImportOK, nil, handle, URLDataHandlerSubType );
-		DisposeHandle( handle );
-		if ( noErr != err )
-		{
-			setStatus(STATUS_ERROR);
-			return;
-		};
-		
-		mNavigateURL = url;
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
-		message.setValue("uri", mNavigateURL);
-		sendMessage(message);
-
-		// do pre-roll actions (typically fired for streaming movies but not always)
-		PrePrerollMovie( mMovieHandle, 0, getPlayRate(), moviePrePrerollCompleteCallback, ( void * )this );
-
-		Rect movie_rect = rectFromSize(mWidth, mHeight);
-
-		// make a new movie controller
-		mMovieController = NewMovieController( mMovieHandle, &movie_rect, mcNotVisible | mcTopLeftMovie );
-
-		// movie controller
-		MCSetActionFilterWithRefCon( mMovieController, mcActionFilterCallBack, ( long )this );
-
-		SetMoviePlayHints( mMovieHandle, hintsAllowDynamicResize, hintsAllowDynamicResize );
-
-		// function that gets called when a frame is drawn
-		SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, movieDrawingCompleteCallback, ( long )this );
-
-		setStatus(STATUS_LOADED);
-
-		sizeChanged();
-	};
-
-	bool unload()
-	{
-		// new movie and have to get title again
-		mReceivedTitle = false;
-
-		if ( mMovieHandle )
-		{
-			StopMovie( mMovieHandle );
-			if ( mMovieController )
-			{
-				MCMovieChanged( mMovieController, mMovieHandle );
-			};
-		};
-
-		if ( mMovieController )
-		{
-			MCSetActionFilterWithRefCon( mMovieController, NULL, (long)this );
-			DisposeMovieController( mMovieController );
-			mMovieController = NULL;
-		};
-
-		if ( mMovieHandle )
-		{
-			SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, nil, ( long )this );
-			DisposeMovie( mMovieHandle );
-			mMovieHandle = NULL;
-		};
-
-		if ( mGWorldHandle )
-		{
-			DisposeGWorld( mGWorldHandle );
-			mGWorldHandle = NULL;
-		};
-
-		setStatus(STATUS_NONE);
-
-		return true;
-	}
-
-	bool navigateTo( const std::string url )
-	{
-		unload();
-		load( url );
-
-		return true;
-	};
-
-	bool sizeChanged()
-	{
-		if ( ! mMovieHandle )
-			return false;
-
-		// Check to see whether the movie's natural size has updated
-		{
-			int width, height;
-			getMovieNaturalSize(&width, &height);
-			if((width != 0) && (height != 0) && ((width != mNaturalWidth) || (height != mNaturalHeight)))
-			{
-				mNaturalWidth = width;
-				mNaturalHeight = height;
-
-				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
-				message.setValue("name", mTextureSegmentName);
-				message.setValueS32("width", width);
-				message.setValueS32("height", height);
-				sendMessage(message);
-				//std::cerr << "<--- Sending size change request to application with name: " << mTextureSegmentName << " - size is " << width << " x " << height << std::endl;
-			}
-		}
-
-		// sanitize destination size
-		Rect dest_rect = rectFromSize(mWidth, mHeight);
-
-		// media depth won't change
-		int depth_bits = mDepth * 8;
-		long rowbytes = mDepth * mTextureWidth;
-
-		GWorldPtr old_gworld_handle = mGWorldHandle;
-
-		if(mPixels != NULL)
-		{
-			// We have pixels.  Set up a GWorld pointing at the texture.
-			OSErr result = NewGWorldFromPtr( &mGWorldHandle, depth_bits, &dest_rect, NULL, NULL, 0, (Ptr)mPixels, rowbytes);
-			if ( noErr != result )
-			{
-				// TODO: unrecoverable??  throw exception?  return something?
-				return false;
-			}
-		}
-		else
-		{
-			// We don't have pixels. Create a fake GWorld we can point the movie at when it's not safe to render normally.
-			Rect tempRect = rectFromSize(1, 1);
-			OSErr result = NewGWorld( &mGWorldHandle, depth_bits, &tempRect, NULL, NULL, 0);
-			if ( noErr != result )
-			{
-				// TODO: unrecoverable??  throw exception?  return something?
-				return false;
-			}
-		}
-
-		SetMovieGWorld( mMovieHandle, mGWorldHandle, GetGWorldDevice( mGWorldHandle ) );
-
-		// If the GWorld was already set up, delete it.
-		if(old_gworld_handle != NULL)
-		{
-			DisposeGWorld( old_gworld_handle );
-		}
-
-		// Set up the movie display matrix
-		{
-			// scale movie to fit rect and invert vertically to match opengl image format
-			MatrixRecord transform;
-			SetIdentityMatrix( &transform );	// transforms are additive so start from identify matrix
-			double scaleX = (double) mWidth / mNaturalWidth;
-			double scaleY = -1.0 * (double) mHeight / mNaturalHeight;
-			double centerX = mWidth / 2.0;
-			double centerY = mHeight / 2.0;
-			ScaleMatrix( &transform, X2Fix( scaleX ), X2Fix( scaleY ), X2Fix( centerX ), X2Fix( centerY ) );
-			SetMovieMatrix( mMovieHandle, &transform );
-		}
-
-		// update movie controller
-		if ( mMovieController )
-		{
-			MCSetControllerPort( mMovieController, mGWorldHandle );
-			MCPositionController( mMovieController, &dest_rect, &dest_rect,
-								  mcTopLeftMovie | mcPositionDontInvalidate );
-			MCMovieChanged( mMovieController, mMovieHandle );
-		}
-
-
-		// Emit event with size change so the calling app knows about it too
-		// TODO:
-		//LLMediaEvent event( this );
-		//mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
-
-		return true;
-	}
-	static Boolean mcActionFilterCallBack( MovieController mc, short action, void *params, long ref )
-	{
-		Boolean result = false;
-
-		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
-
-		switch( action )
-		{
-			// handle window resizing
-			case mcActionControllerSizeChanged:
-				// Ensure that the movie draws correctly at the new size
-				self->sizeChanged();
-				break;
-
-			// Block any movie controller actions that open URLs.
-			case mcActionLinkToURL:
-			case mcActionGetNextURL:
-			case mcActionLinkToURLExtended:
-				// Prevent the movie controller from handling the message
-				result = true;
-				break;
-
-			default:
-				break;
-		};
-
-		return result;
-	};
-
-	static OSErr movieDrawingCompleteCallback( Movie call_back_movie, long ref )
-	{
-		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
-
-		// IMPORTANT: typically, a consumer who is observing this event will set a flag
-		// when this event is fired then render later. Be aware that the media stream
-		// can change during this period - dimensions, depth, format etc.
-		//LLMediaEvent event( self );
-//		self->updateQuickTime();
-		// TODO ^^^
-
-
-		if ( self->mWidth > 0 && self->mHeight > 0 )
-			self->setDirty( 0, 0, self->mWidth, self->mHeight );
-
-		return noErr;
-	};
-
-	static void moviePrePrerollCompleteCallback( Movie movie, OSErr preroll_err, void *ref )
-	{
-		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
-
-		// TODO:
-		//LLMediaEvent event( self );
-		//self->mEventEmitter.update( &LLMediaObserver::onMediaPreroll, event );
-		
-		// Send a "navigate complete" event.
-		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
-		message.setValue("uri", self->mNavigateURL);
-		message.setValueS32("result_code", 200);
-		message.setValue("result_string", "OK");
-		self->sendMessage(message);
-	};
-
-
-	void rewind()
-	{
-		GoToBeginningOfMovie( mMovieHandle );
-		MCMovieChanged( mMovieController, mMovieHandle );
-	};
-
-	bool processState()
-	{
-		if ( mCommand == COMMAND_PLAY )
-		{
-			if ( mStatus == STATUS_LOADED || mStatus == STATUS_PAUSED || mStatus == STATUS_PLAYING || mStatus == STATUS_DONE )
-			{
-				long state = GetMovieLoadState( mMovieHandle );
-
-				if ( state >= kMovieLoadStatePlaythroughOK )
-				{
-					// if the movie is at the end (generally because it reached it naturally)
-					// and we play is requested, jump back to the start of the movie.
-					// note: this is different from having loop flag set.
-					if ( IsMovieDone( mMovieHandle ) )
-					{
-						Fixed rate = X2Fix( 0.0 );
-						MCDoAction( mMovieController, mcActionPlay, (void*)rate );
-						rewind();
-					};
-
-					MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
-					MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
-					setStatus(STATUS_PLAYING);
-					mCommand = COMMAND_NONE;
-				};
-			};
-		}
-		else
-		if ( mCommand == COMMAND_STOP )
-		{
-			if ( mStatus == STATUS_PLAYING || mStatus == STATUS_PAUSED || mStatus == STATUS_DONE )
-			{
-				if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
-				{
-					Fixed rate = X2Fix( 0.0 );
-					MCDoAction( mMovieController, mcActionPlay, (void*)rate );
-					rewind();
-
-					setStatus(STATUS_LOADED);
-					mCommand = COMMAND_NONE;
-				};
-			};
-		}
-		else
-		if ( mCommand == COMMAND_PAUSE )
-		{
-			if ( mStatus == STATUS_PLAYING )
-			{
-				if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
-				{
-					Fixed rate = X2Fix( 0.0 );
-					MCDoAction( mMovieController, mcActionPlay, (void*)rate );
-					setStatus(STATUS_PAUSED);
-					mCommand = COMMAND_NONE;
-				};
-			};
-		};
-
-		return true;
-	};
-
-	void play(F64 rate)
-	{
-		mPlayRate = rate;
-		mCommand = COMMAND_PLAY;
-	};
-
-	void stop()
-	{
-		mCommand = COMMAND_STOP;
-	};
-
-	void pause()
-	{
-		mCommand = COMMAND_PAUSE;
-	};
-
-	void getMovieNaturalSize(int *movie_width, int *movie_height)
-	{
-		Rect rect;
-
-		GetMovieNaturalBoundsRect( mMovieHandle, &rect );
-
-		int width  = ( rect.right - rect.left );
-		int height = ( rect.bottom - rect.top );
-
-		// make sure width and height fall in valid range
-		if ( width < mMinWidth )
-			width = mMinWidth;
-
-		if ( width > mMaxWidth )
-			width = mMaxWidth;
-
-		if ( height < mMinHeight )
-			height = mMinHeight;
-
-		if ( height > mMaxHeight )
-			height = mMaxHeight;
-
-		// return the new rect
-		*movie_width = width;
-		*movie_height = height;
-	}
-
-	void updateQuickTime(int milliseconds)
-	{
-		if ( ! mMovieHandle )
-			return;
-
-		if ( ! mMovieController )
-			return;
-
-		// service QuickTime
-		// Calling it this way doesn't have good behavior on Windows...
-//		MoviesTask( mMovieHandle, milliseconds );
-		// This was the original, but I think using both MoviesTask and MCIdle is redundant.  Trying with only MCIdle.
-//		MoviesTask( mMovieHandle, 0 );
-
-		MCIdle( mMovieController );
-
-		if ( ! mGWorldHandle )
-			return;
-
-		if ( mMediaSizeChanging )
-			return;
-
-		// update state machine
-		processState();
-
-		// see if title arrived and if so, update member variable with contents
-		checkTitle();
-		
-		// QT call to see if we are at the end - can't do with controller
-		if ( IsMovieDone( mMovieHandle ) )
-		{
-			// special code for looping - need to rewind at the end of the movie
-			if ( mIsLooping )
-			{
-				// go back to start
-				rewind();
-
-				if ( mMovieController )
-				{
-					// kick off new play
-					MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
-
-					// set the volume
-					MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
-				};
-			}
-			else
-			{
-				if(mStatus == STATUS_PLAYING)
-				{
-					setStatus(STATUS_DONE);
-				}
-			}
-		}
-
-	};
-
-	int getDataWidth() const
-	{
-		if ( mGWorldHandle )
-		{
-			int depth = mDepth;
-
-			if (depth < 1)
-				depth = 1;
-
-			// ALWAYS use the row bytes from the PixMap if we have a GWorld because
-			// sometimes it's not the same as mMediaDepth * mMediaWidth !
-			PixMapHandle pix_map_handle = GetGWorldPixMap( mGWorldHandle );
-			return QTGetPixMapHandleRowBytes( pix_map_handle ) / depth;
-		}
-		else
-		{
-			// TODO :   return LLMediaImplCommon::getaDataWidth();
-			return 0;
-		}
-	};
-
-	void seek( F64 time )
-	{
-		if ( mMovieController )
-		{
-			TimeRecord when;
-			when.scale = GetMovieTimeScale( mMovieHandle );
-			when.base = 0;
-
-			// 'time' is in (floating point) seconds.  The timebase time will be in 'units', where
-			// there are 'scale' units per second.
-			SInt64 raw_time = ( SInt64 )( time * (double)( when.scale ) );
-
-			when.value.hi = ( SInt32 )( raw_time >> 32 );
-			when.value.lo = ( SInt32 )( ( raw_time & 0x00000000FFFFFFFF ) );
-
-			MCDoAction( mMovieController, mcActionGoToTime, &when );
-		};
-	};
-
-	F64 getLoadedDuration() 	  	 
-	{ 	  	 
-		TimeValue duration; 	  	 
-		if(GetMaxLoadedTimeInMovie( mMovieHandle, &duration ) != noErr) 	  	 
-		{ 	  	 
-			// If GetMaxLoadedTimeInMovie returns an error, return the full duration of the movie. 	  	 
-			duration = GetMovieDuration( mMovieHandle ); 	  	 
-		} 	  	 
-		TimeValue scale = GetMovieTimeScale( mMovieHandle ); 	  	 
-
-		return (F64)duration / (F64)scale; 	  	 
-	}; 	  	 
-
-	F64 getDuration()
-	{
-		TimeValue duration = GetMovieDuration( mMovieHandle );
-		TimeValue scale = GetMovieTimeScale( mMovieHandle );
-
-		return (F64)duration / (F64)scale;
-	};
-
-	F64 getCurrentTime()
-	{
-		TimeValue curr_time = GetMovieTime( mMovieHandle, 0 );
-		TimeValue scale = GetMovieTimeScale( mMovieHandle );
-
-		return (F64)curr_time / (F64)scale;
-	};
-
-	void setVolume( F64 volume )
-	{
-		mCurVolume = (short)(volume * ( double ) 0x100 );
-
-		if ( mMovieController )
-		{
-			MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
-		};
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void update(int milliseconds = 0)
-	{
-		updateQuickTime(milliseconds);
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void mouseDown( int x, int y )
-	{
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void mouseUp( int x, int y )
-	{
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void mouseMove( int x, int y )
-	{
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	//
-	void keyPress( unsigned char key )
-	{
-	};
-
-	////////////////////////////////////////////////////////////////////////////////
-	// Grab movie title into mMovieTitle - should be called repeatedly
-	// until it returns true since movie title takes a while to become 
-	// available.
-	const bool getMovieTitle()
-	{
-		// grab meta data from movie
-		QTMetaDataRef media_data_ref;
-		OSErr result = QTCopyMovieMetaData( mMovieHandle, &media_data_ref );
-		if ( noErr != result ) 
-			return false;
-
-		// look up "Display Name" in meta data
-		OSType meta_data_key = kQTMetaDataCommonKeyDisplayName;
-		QTMetaDataItem item = kQTMetaDataItemUninitialized;
-		result = QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard, 
-										0, kQTMetaDataKeyFormatCommon, 
-										(const UInt8 *)&meta_data_key, 
-										sizeof( meta_data_key ), &item );
-		if ( noErr != result ) 
-			return false;
-
-		// find the size of the title
-		ByteCount size;
-		result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );
-		if ( noErr != result || size <= 0 ) 
-			return false;
-
-		// allocate some space and grab it
-		UInt8* item_data = new UInt8( size );
-		memset( item_data, 0, size * sizeof( UInt8* ) );
-		result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );
-		if ( noErr != result ) 
-			return false;
-
-		// save it
-		mMovieTitle = std::string( (char* )item_data );
-
-		// clean up
-		delete [] item_data;
-
-		return true;
-	};
-
-	// called regularly to see if title changed
-	void checkTitle()
-	{
-		// we did already receive title so keep checking
-		if ( ! mReceivedTitle )
-		{
-			// grab title from movie meta data
-			if ( getMovieTitle() )
-			{
-				// pass back to host application
-				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
-				message.setValue("name", mMovieTitle );
-				sendMessage( message );
-
-				// stop looking once we find a title for this movie.
-				// TODO: this may to be reset if movie title changes
-				// during playback but this is okay for now
-				mReceivedTitle = true;
-			};
-		};
-	};
-};
-
-MediaPluginQuickTime::MediaPluginQuickTime(
-	LLPluginInstance::sendMessageFunction host_send_func,
-	void *host_user_data ) :
-	MediaPluginBase(host_send_func, host_user_data),
-	mMinWidth( 0 ),
-	mMaxWidth( 2048 ),
-	mMinHeight( 0 ),
-	mMaxHeight( 2048 )
-{
-//	std::cerr << "MediaPluginQuickTime constructor" << std::endl;
-
-	mNaturalWidth = -1;
-	mNaturalHeight = -1;
-	mMovieHandle = 0;
-	mGWorldHandle = 0;
-	mMovieController = 0;
-	mCurVolume = 0x99;
-	mMediaSizeChanging = false;
-	mIsLooping = false;
-	mMovieTitle = std::string();
-	mReceivedTitle = false;
-	mCommand = COMMAND_NONE;
-	mPlayRate = 0.0f;
-	mStatus = STATUS_NONE;
-}
-
-MediaPluginQuickTime::~MediaPluginQuickTime()
-{
-//	std::cerr << "MediaPluginQuickTime destructor" << std::endl;
-
-	ExitMovies();
-
-#ifdef LL_WINDOWS
-	TerminateQTML();
-//		std::cerr << "QuickTime closing down" << std::endl;
-#endif
-}
-
-
-void MediaPluginQuickTime::receiveMessage(const char *message_string)
-{
-//	std::cerr << "MediaPluginQuickTime::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
-	LLPluginMessage message_in;
-
-	if(message_in.parse(message_string) >= 0)
-	{
-		std::string message_class = message_in.getClass();
-		std::string message_name = message_in.getName();
-		if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
-		{
-			if(message_name == "init")
-			{
-				LLPluginMessage message("base", "init_response");
-				LLSD versions = LLSD::emptyMap();
-				versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
-				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
-				// Normally a plugin would only specify one of these two subclasses, but this is a demo...
-				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION;
-				message.setValueLLSD("versions", versions);
-
-				#ifdef LL_WINDOWS
-
-				// QuickTime 7.6.4 has an issue (that was not present in 7.6.2) with initializing QuickTime
-				// according to this article: http://lists.apple.com/archives/QuickTime-API/2009/Sep/msg00097.html
-				// The solution presented there appears to work.
-				QTLoadLibrary("qtcf.dll");
-
-				// main initialization for QuickTime - only required on Windows
-				OSErr result = InitializeQTML( 0L );
-				if ( result != noErr )
-				{
-					//TODO: If no QT on Windows, this fails - respond accordingly.
-				}
-				else
-				{
-					//std::cerr << "QuickTime initialized" << std::endl;
-				};
-				#endif
-
-				// required for both Windows and Mac
-				EnterMovies();
-
-				std::string plugin_version = "QuickTime media plugin, QuickTime version ";
-
-				long version = 0;
-				Gestalt( gestaltQuickTimeVersion, &version );
-				std::ostringstream codec( "" );
-				codec << std::hex << version << std::dec;
-				plugin_version += codec.str();
-				message.setValue("plugin_version", plugin_version);
-				sendMessage(message);
-
-				// Plugin gets to decide the texture parameters to use.
-				message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
-				#if defined(LL_WINDOWS)
-					// Values for Windows
-					mDepth = 3;
-					message.setValueU32("format", GL_RGB);
-					message.setValueU32("type", GL_UNSIGNED_BYTE);
-
-					// We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even.
-					// Padding to a multiple of 3*32 guarantees it'll divide out properly.
-					message.setValueU32("padding", 32 * 3);
-				#else
-					// Values for Mac
-					mDepth = 4;
-					message.setValueU32("format", GL_BGRA_EXT);
-					#ifdef __BIG_ENDIAN__
-						message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV );
-					#else
-						message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8);
-					#endif
-
-					// Pad texture width to a multiple of 32 bytes, to line up with cache lines.
-					message.setValueU32("padding", 32);
-				#endif
-				message.setValueS32("depth", mDepth);
-				message.setValueU32("internalformat", GL_RGB);
-				message.setValueBoolean("coords_opengl", true);	// true == use OpenGL-style coordinates, false == (0,0) is upper left.
-				message.setValueBoolean("allow_downsample", true);
-				sendMessage(message);
-			}
-			else if(message_name == "idle")
-			{
-				// no response is necessary here.
-				F64 time = message_in.getValueReal("time");
-
-				// Convert time to milliseconds for update()
-				update((int)(time * 1000.0f));
-			}
-			else if(message_name == "cleanup")
-			{
-				// TODO: clean up here
-			}
-			else if(message_name == "shm_added")
-			{
-				SharedSegmentInfo info;
-				info.mAddress = message_in.getValuePointer("address");
-				info.mSize = (size_t)message_in.getValueS32("size");
-				std::string name = message_in.getValue("name");
-//				std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory added, name: " << name
-//					<< ", size: " << info.mSize
-//					<< ", address: " << info.mAddress
-//					<< std::endl;
-
-				mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
-
-			}
-			else if(message_name == "shm_remove")
-			{
-				std::string name = message_in.getValue("name");
-
-//				std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory remove, name = " << name << std::endl;
-
-				SharedSegmentMap::iterator iter = mSharedSegments.find(name);
-				if(iter != mSharedSegments.end())
-				{
-					if(mPixels == iter->second.mAddress)
-					{
-						// This is the currently active pixel buffer.  Make sure we stop drawing to it.
-						mPixels = NULL;
-						mTextureSegmentName.clear();
-
-						// Make sure the movie GWorld is no longer pointed at the shared segment.
-						sizeChanged();
-					}
-					mSharedSegments.erase(iter);
-				}
-				else
-				{
-//					std::cerr << "MediaPluginQuickTime::receiveMessage: unknown shared memory region!" << std::endl;
-				}
-
-				// Send the response so it can be cleaned up.
-				LLPluginMessage message("base", "shm_remove_response");
-				message.setValue("name", name);
-				sendMessage(message);
-			}
-			else
-			{
-//				std::cerr << "MediaPluginQuickTime::receiveMessage: unknown base message: " << message_name << std::endl;
-			}
-		}
-		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
-		{
-			if(message_name == "size_change")
-			{
-				std::string name = message_in.getValue("name");
-				S32 width = message_in.getValueS32("width");
-				S32 height = message_in.getValueS32("height");
-				S32 texture_width = message_in.getValueS32("texture_width");
-				S32 texture_height = message_in.getValueS32("texture_height");
-
-				//std::cerr << "---->Got size change instruction from application with name: " << name << " - size is " << width << " x " << height << std::endl;
-
-				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
-				message.setValue("name", name);
-				message.setValueS32("width", width);
-				message.setValueS32("height", height);
-				message.setValueS32("texture_width", texture_width);
-				message.setValueS32("texture_height", texture_height);
-				sendMessage(message);
-
-				if(!name.empty())
-				{
-					// Find the shared memory region with this name
-					SharedSegmentMap::iterator iter = mSharedSegments.find(name);
-					if(iter != mSharedSegments.end())
-					{
-//						std::cerr << "%%% Got size change, new size is " << width << " by " << height << std::endl;
-//						std::cerr << "%%%%  texture size is " << texture_width << " by " << texture_height << std::endl;
-
-						mPixels = (unsigned char*)iter->second.mAddress;
-						mTextureSegmentName = name;
-						mWidth = width;
-						mHeight = height;
-
-						mTextureWidth = texture_width;
-						mTextureHeight = texture_height;
-
-						mMediaSizeChanging = false;
-
-						sizeChanged();
-
-						update();
-					};
-				};
-			}
-			else if(message_name == "load_uri")
-			{
-				std::string uri = message_in.getValue("uri");
-				load( uri );
-				sendStatus();
-			}
-			else if(message_name == "mouse_event")
-			{
-				std::string event = message_in.getValue("event");
-				S32 x = message_in.getValueS32("x");
-				S32 y = message_in.getValueS32("y");
-
-				if(event == "down")
-				{
-					mouseDown(x, y);
-				}
-				else if(event == "up")
-				{
-					mouseUp(x, y);
-				}
-				else if(event == "move")
-				{
-					mouseMove(x, y);
-				};
-			};
-		}
-		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
-		{
-			if(message_name == "stop")
-			{
-				stop();
-			}
-			else if(message_name == "start")
-			{
-				F64 rate = 0.0;
-				if(message_in.hasValue("rate"))
-				{
-					rate = message_in.getValueReal("rate");
-				}
-				play(rate);
-			}
-			else if(message_name == "pause")
-			{
-				pause();
-			}
-			else if(message_name == "seek")
-			{
-				F64 time = message_in.getValueReal("time");
-				seek(time);
-			}
-			else if(message_name == "set_loop")
-			{
-				bool loop = message_in.getValueBoolean("loop");
-				mIsLooping = loop;
-			}
-			else if(message_name == "set_volume")
-			{
-				F64 volume = message_in.getValueReal("volume");
-				setVolume(volume);
-			}
-		}
-		else
-		{
-//			std::cerr << "MediaPluginQuickTime::receiveMessage: unknown message class: " << message_class << std::endl;
-		};
-	};
-}
-
-int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
-{
-	MediaPluginQuickTime *self = new MediaPluginQuickTime(host_send_func, host_user_data);
-	*plugin_send_func = MediaPluginQuickTime::staticReceiveMessage;
-	*plugin_user_data = (void*)self;
-
-	return 0;
-}
-
-#else // LL_QUICKTIME_ENABLED
-
-// Stubbed-out class with constructor/destructor (necessary or windows linker
-// will just think its dead code and optimize it all out)
-class MediaPluginQuickTime : public MediaPluginBase
-{
-public:
-	MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
-	~MediaPluginQuickTime();
-	/* virtual */ void receiveMessage(const char *message_string);
-};
-
-MediaPluginQuickTime::MediaPluginQuickTime(
-	LLPluginInstance::sendMessageFunction host_send_func,
-	void *host_user_data ) :
-	MediaPluginBase(host_send_func, host_user_data)
-{
-    // no-op
-}
-
-MediaPluginQuickTime::~MediaPluginQuickTime()
-{
-    // no-op
-}
-
-void MediaPluginQuickTime::receiveMessage(const char *message_string)
-{
-    // no-op
-}
-
-// We're building without quicktime enabled.  Just refuse to initialize.
-int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
-{
-    return -1;
-}
-
-#endif // LL_QUICKTIME_ENABLED
+/**
+ * @file media_plugin_quicktime.cpp
+ * @brief QuickTime plugin for LLMedia API plugin system
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ *
+ * Copyright (c) 2008, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llgl.h"
+
+#include "llplugininstance.h"
+#include "llpluginmessage.h"
+#include "llpluginmessageclasses.h"
+#include "media_plugin_base.h"
+
+#if LL_QUICKTIME_ENABLED
+
+#if defined(LL_DARWIN)
+	#include <QuickTime/QuickTime.h>
+#elif defined(LL_WINDOWS)
+	#include "MacTypes.h"
+	#include "QTML.h"
+	#include "Movies.h"
+	#include "QDoffscreen.h"
+	#include "FixMath.h"
+	#include "QTLoadLibraryUtils.h"
+#endif
+
+// TODO: Make sure that the only symbol exported from this library is LLPluginInitEntryPoint
+////////////////////////////////////////////////////////////////////////////////
+//
+class MediaPluginQuickTime : public MediaPluginBase
+{
+public:
+	MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+	~MediaPluginQuickTime();
+
+	/* virtual */ void receiveMessage(const char *message_string);
+
+private:
+
+	int mNaturalWidth;
+	int mNaturalHeight;
+	Movie mMovieHandle;
+	GWorldPtr mGWorldHandle;
+	ComponentInstance mMovieController;
+	int mCurVolume;
+	bool mMediaSizeChanging;
+	bool mIsLooping;
+	std::string mMovieTitle;
+	bool mReceivedTitle;
+	const int mMinWidth;
+	const int mMaxWidth;
+	const int mMinHeight;
+	const int mMaxHeight;
+	F64 mPlayRate;
+	std::string mNavigateURL;
+
+	enum ECommand {
+		COMMAND_NONE,
+		COMMAND_STOP,
+		COMMAND_PLAY,
+		COMMAND_FAST_FORWARD,
+		COMMAND_FAST_REWIND,
+		COMMAND_PAUSE,
+		COMMAND_SEEK,
+	};
+	ECommand mCommand;
+
+	// Override this to add current time and duration to the message
+	/*virtual*/ void setDirty(int left, int top, int right, int bottom)
+	{
+		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "updated");
+
+		message.setValueS32("left", left);
+		message.setValueS32("top", top);
+		message.setValueS32("right", right);
+		message.setValueS32("bottom", bottom);
+
+		if(mMovieHandle)
+		{
+			message.setValueReal("current_time", getCurrentTime());
+			message.setValueReal("duration", getDuration());
+			message.setValueReal("current_rate", Fix2X(GetMovieRate(mMovieHandle)));
+		}
+
+		sendMessage(message);
+	}
+
+
+	static Rect rectFromSize(int width, int height)
+	{
+		Rect result;
+
+
+		result.left = 0;
+		result.top = 0;
+		result.right = width;
+		result.bottom = height;
+
+		return result;
+	}
+
+	Fixed getPlayRate(void)
+	{
+		Fixed result;
+		if(mPlayRate == 0.0f)
+		{
+			// Default to the movie's preferred rate
+			result = GetMoviePreferredRate(mMovieHandle);
+			if(result == 0)
+			{
+				// Don't return a 0 play rate, ever.
+				std::cerr << "Movie's preferred rate is 0, forcing to 1.0." << std::endl;
+				result = X2Fix(1.0f);
+			}
+		}
+		else
+		{
+			result = X2Fix(mPlayRate);
+		}
+
+		return result;
+	}
+
+	void load( const std::string url )
+	{
+
+		if ( url.empty() )
+			return;
+
+		// Stop and unload any existing movie before starting another one.
+		unload();
+
+		setStatus(STATUS_LOADING);
+
+		//In case std::string::c_str() makes a copy of the url data,
+		//make sure there is memory to hold it before allocating memory for handle.
+		//if fails, NewHandleClear(...) should return NULL.
+		const char* url_string = url.c_str() ;
+		Handle handle = NewHandleClear( ( Size )( url.length() + 1 ) );
+
+		if ( NULL == handle || noErr != MemError() || NULL == *handle )
+		{
+			setStatus(STATUS_ERROR);
+			return;
+		}
+
+		BlockMove( url_string, *handle, ( Size )( url.length() + 1 ) );
+
+		OSErr err = NewMovieFromDataRef( &mMovieHandle, newMovieActive | newMovieDontInteractWithUser | newMovieAsyncOK | newMovieIdleImportOK, nil, handle, URLDataHandlerSubType );
+		DisposeHandle( handle );
+		if ( noErr != err )
+		{
+			setStatus(STATUS_ERROR);
+			return;
+		};
+		
+		mNavigateURL = url;
+		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_begin");
+		message.setValue("uri", mNavigateURL);
+		sendMessage(message);
+
+		// do pre-roll actions (typically fired for streaming movies but not always)
+		PrePrerollMovie( mMovieHandle, 0, getPlayRate(), moviePrePrerollCompleteCallback, ( void * )this );
+
+		Rect movie_rect = rectFromSize(mWidth, mHeight);
+
+		// make a new movie controller
+		mMovieController = NewMovieController( mMovieHandle, &movie_rect, mcNotVisible | mcTopLeftMovie );
+
+		// movie controller
+		MCSetActionFilterWithRefCon( mMovieController, mcActionFilterCallBack, ( long )this );
+
+		SetMoviePlayHints( mMovieHandle, hintsAllowDynamicResize, hintsAllowDynamicResize );
+
+		// function that gets called when a frame is drawn
+		SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, movieDrawingCompleteCallback, ( long )this );
+
+		setStatus(STATUS_LOADED);
+
+		sizeChanged();
+	};
+
+	bool unload()
+	{
+		// new movie and have to get title again
+		mReceivedTitle = false;
+
+		if ( mMovieHandle )
+		{
+			StopMovie( mMovieHandle );
+			if ( mMovieController )
+			{
+				MCMovieChanged( mMovieController, mMovieHandle );
+			};
+		};
+
+		if ( mMovieController )
+		{
+			MCSetActionFilterWithRefCon( mMovieController, NULL, (long)this );
+			DisposeMovieController( mMovieController );
+			mMovieController = NULL;
+		};
+
+		if ( mMovieHandle )
+		{
+			SetMovieDrawingCompleteProc( mMovieHandle, movieDrawingCallWhenChanged, nil, ( long )this );
+			DisposeMovie( mMovieHandle );
+			mMovieHandle = NULL;
+		};
+
+		if ( mGWorldHandle )
+		{
+			DisposeGWorld( mGWorldHandle );
+			mGWorldHandle = NULL;
+		};
+
+		setStatus(STATUS_NONE);
+
+		return true;
+	}
+
+	bool navigateTo( const std::string url )
+	{
+		unload();
+		load( url );
+
+		return true;
+	};
+
+	bool sizeChanged()
+	{
+		if ( ! mMovieHandle )
+			return false;
+
+		// Check to see whether the movie's natural size has updated
+		{
+			int width, height;
+			getMovieNaturalSize(&width, &height);
+			if((width != 0) && (height != 0) && ((width != mNaturalWidth) || (height != mNaturalHeight)))
+			{
+				mNaturalWidth = width;
+				mNaturalHeight = height;
+
+				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_request");
+				message.setValue("name", mTextureSegmentName);
+				message.setValueS32("width", width);
+				message.setValueS32("height", height);
+				sendMessage(message);
+				//std::cerr << "<--- Sending size change request to application with name: " << mTextureSegmentName << " - size is " << width << " x " << height << std::endl;
+			}
+		}
+
+		// sanitize destination size
+		Rect dest_rect = rectFromSize(mWidth, mHeight);
+
+		// media depth won't change
+		int depth_bits = mDepth * 8;
+		long rowbytes = mDepth * mTextureWidth;
+
+		GWorldPtr old_gworld_handle = mGWorldHandle;
+
+		if(mPixels != NULL)
+		{
+			// We have pixels.  Set up a GWorld pointing at the texture.
+			OSErr result = NewGWorldFromPtr( &mGWorldHandle, depth_bits, &dest_rect, NULL, NULL, 0, (Ptr)mPixels, rowbytes);
+			if ( noErr != result )
+			{
+				// TODO: unrecoverable??  throw exception?  return something?
+				return false;
+			}
+		}
+		else
+		{
+			// We don't have pixels. Create a fake GWorld we can point the movie at when it's not safe to render normally.
+			Rect tempRect = rectFromSize(1, 1);
+			OSErr result = NewGWorld( &mGWorldHandle, depth_bits, &tempRect, NULL, NULL, 0);
+			if ( noErr != result )
+			{
+				// TODO: unrecoverable??  throw exception?  return something?
+				return false;
+			}
+		}
+
+		SetMovieGWorld( mMovieHandle, mGWorldHandle, GetGWorldDevice( mGWorldHandle ) );
+
+		// If the GWorld was already set up, delete it.
+		if(old_gworld_handle != NULL)
+		{
+			DisposeGWorld( old_gworld_handle );
+		}
+
+		// Set up the movie display matrix
+		{
+			// scale movie to fit rect and invert vertically to match opengl image format
+			MatrixRecord transform;
+			SetIdentityMatrix( &transform );	// transforms are additive so start from identify matrix
+			double scaleX = (double) mWidth / mNaturalWidth;
+			double scaleY = -1.0 * (double) mHeight / mNaturalHeight;
+			double centerX = mWidth / 2.0;
+			double centerY = mHeight / 2.0;
+			ScaleMatrix( &transform, X2Fix( scaleX ), X2Fix( scaleY ), X2Fix( centerX ), X2Fix( centerY ) );
+			SetMovieMatrix( mMovieHandle, &transform );
+		}
+
+		// update movie controller
+		if ( mMovieController )
+		{
+			MCSetControllerPort( mMovieController, mGWorldHandle );
+			MCPositionController( mMovieController, &dest_rect, &dest_rect,
+								  mcTopLeftMovie | mcPositionDontInvalidate );
+			MCMovieChanged( mMovieController, mMovieHandle );
+		}
+
+
+		// Emit event with size change so the calling app knows about it too
+		// TODO:
+		//LLMediaEvent event( this );
+		//mEventEmitter.update( &LLMediaObserver::onMediaSizeChange, event );
+
+		return true;
+	}
+	static Boolean mcActionFilterCallBack( MovieController mc, short action, void *params, long ref )
+	{
+		Boolean result = false;
+
+		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
+
+		switch( action )
+		{
+			// handle window resizing
+			case mcActionControllerSizeChanged:
+				// Ensure that the movie draws correctly at the new size
+				self->sizeChanged();
+				break;
+
+			// Block any movie controller actions that open URLs.
+			case mcActionLinkToURL:
+			case mcActionGetNextURL:
+			case mcActionLinkToURLExtended:
+				// Prevent the movie controller from handling the message
+				result = true;
+				break;
+
+			default:
+				break;
+		};
+
+		return result;
+	};
+
+	static OSErr movieDrawingCompleteCallback( Movie call_back_movie, long ref )
+	{
+		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
+
+		// IMPORTANT: typically, a consumer who is observing this event will set a flag
+		// when this event is fired then render later. Be aware that the media stream
+		// can change during this period - dimensions, depth, format etc.
+		//LLMediaEvent event( self );
+//		self->updateQuickTime();
+		// TODO ^^^
+
+
+		if ( self->mWidth > 0 && self->mHeight > 0 )
+			self->setDirty( 0, 0, self->mWidth, self->mHeight );
+
+		return noErr;
+	};
+
+	static void moviePrePrerollCompleteCallback( Movie movie, OSErr preroll_err, void *ref )
+	{
+		MediaPluginQuickTime* self = ( MediaPluginQuickTime* )ref;
+
+		// TODO:
+		//LLMediaEvent event( self );
+		//self->mEventEmitter.update( &LLMediaObserver::onMediaPreroll, event );
+		
+		// Send a "navigate complete" event.
+		LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "navigate_complete");
+		message.setValue("uri", self->mNavigateURL);
+		message.setValueS32("result_code", 200);
+		message.setValue("result_string", "OK");
+		self->sendMessage(message);
+	};
+
+
+	void rewind()
+	{
+		GoToBeginningOfMovie( mMovieHandle );
+		MCMovieChanged( mMovieController, mMovieHandle );
+	};
+
+	bool processState()
+	{
+		if ( mCommand == COMMAND_PLAY )
+		{
+			if ( mStatus == STATUS_LOADED || mStatus == STATUS_PAUSED || mStatus == STATUS_PLAYING || mStatus == STATUS_DONE )
+			{
+				long state = GetMovieLoadState( mMovieHandle );
+
+				if ( state >= kMovieLoadStatePlaythroughOK )
+				{
+					// if the movie is at the end (generally because it reached it naturally)
+					// and we play is requested, jump back to the start of the movie.
+					// note: this is different from having loop flag set.
+					if ( IsMovieDone( mMovieHandle ) )
+					{
+						Fixed rate = X2Fix( 0.0 );
+						MCDoAction( mMovieController, mcActionPlay, (void*)rate );
+						rewind();
+					};
+
+					MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
+					MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
+					setStatus(STATUS_PLAYING);
+					mCommand = COMMAND_NONE;
+				};
+			};
+		}
+		else
+		if ( mCommand == COMMAND_STOP )
+		{
+			if ( mStatus == STATUS_PLAYING || mStatus == STATUS_PAUSED || mStatus == STATUS_DONE )
+			{
+				if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
+				{
+					Fixed rate = X2Fix( 0.0 );
+					MCDoAction( mMovieController, mcActionPlay, (void*)rate );
+					rewind();
+
+					setStatus(STATUS_LOADED);
+					mCommand = COMMAND_NONE;
+				};
+			};
+		}
+		else
+		if ( mCommand == COMMAND_PAUSE )
+		{
+			if ( mStatus == STATUS_PLAYING )
+			{
+				if ( GetMovieLoadState( mMovieHandle ) >= kMovieLoadStatePlaythroughOK )
+				{
+					Fixed rate = X2Fix( 0.0 );
+					MCDoAction( mMovieController, mcActionPlay, (void*)rate );
+					setStatus(STATUS_PAUSED);
+					mCommand = COMMAND_NONE;
+				};
+			};
+		};
+
+		return true;
+	};
+
+	void play(F64 rate)
+	{
+		mPlayRate = rate;
+		mCommand = COMMAND_PLAY;
+	};
+
+	void stop()
+	{
+		mCommand = COMMAND_STOP;
+	};
+
+	void pause()
+	{
+		mCommand = COMMAND_PAUSE;
+	};
+
+	void getMovieNaturalSize(int *movie_width, int *movie_height)
+	{
+		Rect rect;
+
+		GetMovieNaturalBoundsRect( mMovieHandle, &rect );
+
+		int width  = ( rect.right - rect.left );
+		int height = ( rect.bottom - rect.top );
+
+		// make sure width and height fall in valid range
+		if ( width < mMinWidth )
+			width = mMinWidth;
+
+		if ( width > mMaxWidth )
+			width = mMaxWidth;
+
+		if ( height < mMinHeight )
+			height = mMinHeight;
+
+		if ( height > mMaxHeight )
+			height = mMaxHeight;
+
+		// return the new rect
+		*movie_width = width;
+		*movie_height = height;
+	}
+
+	void updateQuickTime(int milliseconds)
+	{
+		if ( ! mMovieHandle )
+			return;
+
+		if ( ! mMovieController )
+			return;
+
+		// service QuickTime
+		// Calling it this way doesn't have good behavior on Windows...
+//		MoviesTask( mMovieHandle, milliseconds );
+		// This was the original, but I think using both MoviesTask and MCIdle is redundant.  Trying with only MCIdle.
+//		MoviesTask( mMovieHandle, 0 );
+
+		MCIdle( mMovieController );
+
+		if ( ! mGWorldHandle )
+			return;
+
+		if ( mMediaSizeChanging )
+			return;
+
+		// update state machine
+		processState();
+
+		// see if title arrived and if so, update member variable with contents
+		checkTitle();
+		
+		// QT call to see if we are at the end - can't do with controller
+		if ( IsMovieDone( mMovieHandle ) )
+		{
+			// special code for looping - need to rewind at the end of the movie
+			if ( mIsLooping )
+			{
+				// go back to start
+				rewind();
+
+				if ( mMovieController )
+				{
+					// kick off new play
+					MCDoAction( mMovieController, mcActionPrerollAndPlay, (void*)getPlayRate() );
+
+					// set the volume
+					MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
+				};
+			}
+			else
+			{
+				if(mStatus == STATUS_PLAYING)
+				{
+					setStatus(STATUS_DONE);
+				}
+			}
+		}
+
+	};
+
+	int getDataWidth() const
+	{
+		if ( mGWorldHandle )
+		{
+			int depth = mDepth;
+
+			if (depth < 1)
+				depth = 1;
+
+			// ALWAYS use the row bytes from the PixMap if we have a GWorld because
+			// sometimes it's not the same as mMediaDepth * mMediaWidth !
+			PixMapHandle pix_map_handle = GetGWorldPixMap( mGWorldHandle );
+			return QTGetPixMapHandleRowBytes( pix_map_handle ) / depth;
+		}
+		else
+		{
+			// TODO :   return LLMediaImplCommon::getaDataWidth();
+			return 0;
+		}
+	};
+
+	void seek( F64 time )
+	{
+		if ( mMovieController )
+		{
+			TimeRecord when;
+			when.scale = GetMovieTimeScale( mMovieHandle );
+			when.base = 0;
+
+			// 'time' is in (floating point) seconds.  The timebase time will be in 'units', where
+			// there are 'scale' units per second.
+			SInt64 raw_time = ( SInt64 )( time * (double)( when.scale ) );
+
+			when.value.hi = ( SInt32 )( raw_time >> 32 );
+			when.value.lo = ( SInt32 )( ( raw_time & 0x00000000FFFFFFFF ) );
+
+			MCDoAction( mMovieController, mcActionGoToTime, &when );
+		};
+	};
+
+	F64 getLoadedDuration() 	  	 
+	{ 	  	 
+		TimeValue duration; 	  	 
+		if(GetMaxLoadedTimeInMovie( mMovieHandle, &duration ) != noErr) 	  	 
+		{ 	  	 
+			// If GetMaxLoadedTimeInMovie returns an error, return the full duration of the movie. 	  	 
+			duration = GetMovieDuration( mMovieHandle ); 	  	 
+		} 	  	 
+		TimeValue scale = GetMovieTimeScale( mMovieHandle ); 	  	 
+
+		return (F64)duration / (F64)scale; 	  	 
+	}; 	  	 
+
+	F64 getDuration()
+	{
+		TimeValue duration = GetMovieDuration( mMovieHandle );
+		TimeValue scale = GetMovieTimeScale( mMovieHandle );
+
+		return (F64)duration / (F64)scale;
+	};
+
+	F64 getCurrentTime()
+	{
+		TimeValue curr_time = GetMovieTime( mMovieHandle, 0 );
+		TimeValue scale = GetMovieTimeScale( mMovieHandle );
+
+		return (F64)curr_time / (F64)scale;
+	};
+
+	void setVolume( F64 volume )
+	{
+		mCurVolume = (short)(volume * ( double ) 0x100 );
+
+		if ( mMovieController )
+		{
+			MCDoAction( mMovieController, mcActionSetVolume, (void*)mCurVolume );
+		};
+	};
+
+	////////////////////////////////////////////////////////////////////////////////
+	//
+	void update(int milliseconds = 0)
+	{
+		updateQuickTime(milliseconds);
+	};
+
+	////////////////////////////////////////////////////////////////////////////////
+	//
+	void mouseDown( int x, int y )
+	{
+	};
+
+	////////////////////////////////////////////////////////////////////////////////
+	//
+	void mouseUp( int x, int y )
+	{
+	};
+
+	////////////////////////////////////////////////////////////////////////////////
+	//
+	void mouseMove( int x, int y )
+	{
+	};
+
+	////////////////////////////////////////////////////////////////////////////////
+	//
+	void keyPress( unsigned char key )
+	{
+	};
+
+	////////////////////////////////////////////////////////////////////////////////
+	// Grab movie title into mMovieTitle - should be called repeatedly
+	// until it returns true since movie title takes a while to become 
+	// available.
+	const bool getMovieTitle()
+	{
+		// grab meta data from movie
+		QTMetaDataRef media_data_ref;
+		OSErr result = QTCopyMovieMetaData( mMovieHandle, &media_data_ref );
+		if ( noErr != result ) 
+			return false;
+
+		// look up "Display Name" in meta data
+		OSType meta_data_key = kQTMetaDataCommonKeyDisplayName;
+		QTMetaDataItem item = kQTMetaDataItemUninitialized;
+		result = QTMetaDataGetNextItem( media_data_ref, kQTMetaDataStorageFormatWildcard, 
+										0, kQTMetaDataKeyFormatCommon, 
+										(const UInt8 *)&meta_data_key, 
+										sizeof( meta_data_key ), &item );
+		if ( noErr != result ) 
+			return false;
+
+		// find the size of the title
+		ByteCount size;
+		result = QTMetaDataGetItemValue( media_data_ref, item, NULL, 0, &size );
+		if ( noErr != result || size <= 0 ) 
+			return false;
+
+		// allocate some space and grab it
+		UInt8* item_data = new UInt8( size );
+		memset( item_data, 0, size * sizeof( UInt8* ) );
+		result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );
+		if ( noErr != result ) 
+			return false;
+
+		// save it
+		mMovieTitle = std::string( (char* )item_data );
+
+		// clean up
+		delete [] item_data;
+
+		return true;
+	};
+
+	// called regularly to see if title changed
+	void checkTitle()
+	{
+		// we did already receive title so keep checking
+		if ( ! mReceivedTitle )
+		{
+			// grab title from movie meta data
+			if ( getMovieTitle() )
+			{
+				// pass back to host application
+				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "name_text");
+				message.setValue("name", mMovieTitle );
+				sendMessage( message );
+
+				// stop looking once we find a title for this movie.
+				// TODO: this may to be reset if movie title changes
+				// during playback but this is okay for now
+				mReceivedTitle = true;
+			};
+		};
+	};
+};
+
+MediaPluginQuickTime::MediaPluginQuickTime(
+	LLPluginInstance::sendMessageFunction host_send_func,
+	void *host_user_data ) :
+	MediaPluginBase(host_send_func, host_user_data),
+	mMinWidth( 0 ),
+	mMaxWidth( 2048 ),
+	mMinHeight( 0 ),
+	mMaxHeight( 2048 )
+{
+//	std::cerr << "MediaPluginQuickTime constructor" << std::endl;
+
+	mNaturalWidth = -1;
+	mNaturalHeight = -1;
+	mMovieHandle = 0;
+	mGWorldHandle = 0;
+	mMovieController = 0;
+	mCurVolume = 0x99;
+	mMediaSizeChanging = false;
+	mIsLooping = false;
+	mMovieTitle = std::string();
+	mReceivedTitle = false;
+	mCommand = COMMAND_NONE;
+	mPlayRate = 0.0f;
+	mStatus = STATUS_NONE;
+}
+
+MediaPluginQuickTime::~MediaPluginQuickTime()
+{
+//	std::cerr << "MediaPluginQuickTime destructor" << std::endl;
+
+	ExitMovies();
+
+#ifdef LL_WINDOWS
+	TerminateQTML();
+//		std::cerr << "QuickTime closing down" << std::endl;
+#endif
+}
+
+
+void MediaPluginQuickTime::receiveMessage(const char *message_string)
+{
+//	std::cerr << "MediaPluginQuickTime::receiveMessage: received message: \"" << message_string << "\"" << std::endl;
+	LLPluginMessage message_in;
+
+	if(message_in.parse(message_string) >= 0)
+	{
+		std::string message_class = message_in.getClass();
+		std::string message_name = message_in.getName();
+		if(message_class == LLPLUGIN_MESSAGE_CLASS_BASE)
+		{
+			if(message_name == "init")
+			{
+				LLPluginMessage message("base", "init_response");
+				LLSD versions = LLSD::emptyMap();
+				versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
+				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA] = LLPLUGIN_MESSAGE_CLASS_MEDIA_VERSION;
+				// Normally a plugin would only specify one of these two subclasses, but this is a demo...
+				versions[LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME] = LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME_VERSION;
+				message.setValueLLSD("versions", versions);
+
+				#ifdef LL_WINDOWS
+
+				// QuickTime 7.6.4 has an issue (that was not present in 7.6.2) with initializing QuickTime
+				// according to this article: http://lists.apple.com/archives/QuickTime-API/2009/Sep/msg00097.html
+				// The solution presented there appears to work.
+				QTLoadLibrary("qtcf.dll");
+
+				// main initialization for QuickTime - only required on Windows
+				OSErr result = InitializeQTML( 0L );
+				if ( result != noErr )
+				{
+					//TODO: If no QT on Windows, this fails - respond accordingly.
+				}
+				else
+				{
+					//std::cerr << "QuickTime initialized" << std::endl;
+				};
+				#endif
+
+				// required for both Windows and Mac
+				EnterMovies();
+
+				std::string plugin_version = "QuickTime media plugin, QuickTime version ";
+
+				long version = 0;
+				Gestalt( gestaltQuickTimeVersion, &version );
+				std::ostringstream codec( "" );
+				codec << std::hex << version << std::dec;
+				plugin_version += codec.str();
+				message.setValue("plugin_version", plugin_version);
+				sendMessage(message);
+
+				// Plugin gets to decide the texture parameters to use.
+				message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+				#if defined(LL_WINDOWS)
+					// Values for Windows
+					mDepth = 3;
+					message.setValueU32("format", GL_RGB);
+					message.setValueU32("type", GL_UNSIGNED_BYTE);
+
+					// We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even.
+					// Padding to a multiple of 3*32 guarantees it'll divide out properly.
+					message.setValueU32("padding", 32 * 3);
+				#else
+					// Values for Mac
+					mDepth = 4;
+					message.setValueU32("format", GL_BGRA_EXT);
+					#ifdef __BIG_ENDIAN__
+						message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV );
+					#else
+						message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8);
+					#endif
+
+					// Pad texture width to a multiple of 32 bytes, to line up with cache lines.
+					message.setValueU32("padding", 32);
+				#endif
+				message.setValueS32("depth", mDepth);
+				message.setValueU32("internalformat", GL_RGB);
+				message.setValueBoolean("coords_opengl", true);	// true == use OpenGL-style coordinates, false == (0,0) is upper left.
+				message.setValueBoolean("allow_downsample", true);
+				sendMessage(message);
+			}
+			else if(message_name == "idle")
+			{
+				// no response is necessary here.
+				F64 time = message_in.getValueReal("time");
+
+				// Convert time to milliseconds for update()
+				update((int)(time * 1000.0f));
+			}
+			else if(message_name == "cleanup")
+			{
+				// TODO: clean up here
+			}
+			else if(message_name == "shm_added")
+			{
+				SharedSegmentInfo info;
+				info.mAddress = message_in.getValuePointer("address");
+				info.mSize = (size_t)message_in.getValueS32("size");
+				std::string name = message_in.getValue("name");
+//				std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory added, name: " << name
+//					<< ", size: " << info.mSize
+//					<< ", address: " << info.mAddress
+//					<< std::endl;
+
+				mSharedSegments.insert(SharedSegmentMap::value_type(name, info));
+
+			}
+			else if(message_name == "shm_remove")
+			{
+				std::string name = message_in.getValue("name");
+
+//				std::cerr << "MediaPluginQuickTime::receiveMessage: shared memory remove, name = " << name << std::endl;
+
+				SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+				if(iter != mSharedSegments.end())
+				{
+					if(mPixels == iter->second.mAddress)
+					{
+						// This is the currently active pixel buffer.  Make sure we stop drawing to it.
+						mPixels = NULL;
+						mTextureSegmentName.clear();
+
+						// Make sure the movie GWorld is no longer pointed at the shared segment.
+						sizeChanged();
+					}
+					mSharedSegments.erase(iter);
+				}
+				else
+				{
+//					std::cerr << "MediaPluginQuickTime::receiveMessage: unknown shared memory region!" << std::endl;
+				}
+
+				// Send the response so it can be cleaned up.
+				LLPluginMessage message("base", "shm_remove_response");
+				message.setValue("name", name);
+				sendMessage(message);
+			}
+			else
+			{
+//				std::cerr << "MediaPluginQuickTime::receiveMessage: unknown base message: " << message_name << std::endl;
+			}
+		}
+		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
+		{
+			if(message_name == "size_change")
+			{
+				std::string name = message_in.getValue("name");
+				S32 width = message_in.getValueS32("width");
+				S32 height = message_in.getValueS32("height");
+				S32 texture_width = message_in.getValueS32("texture_width");
+				S32 texture_height = message_in.getValueS32("texture_height");
+
+				//std::cerr << "---->Got size change instruction from application with name: " << name << " - size is " << width << " x " << height << std::endl;
+
+				LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change_response");
+				message.setValue("name", name);
+				message.setValueS32("width", width);
+				message.setValueS32("height", height);
+				message.setValueS32("texture_width", texture_width);
+				message.setValueS32("texture_height", texture_height);
+				sendMessage(message);
+
+				if(!name.empty())
+				{
+					// Find the shared memory region with this name
+					SharedSegmentMap::iterator iter = mSharedSegments.find(name);
+					if(iter != mSharedSegments.end())
+					{
+//						std::cerr << "%%% Got size change, new size is " << width << " by " << height << std::endl;
+//						std::cerr << "%%%%  texture size is " << texture_width << " by " << texture_height << std::endl;
+
+						mPixels = (unsigned char*)iter->second.mAddress;
+						mTextureSegmentName = name;
+						mWidth = width;
+						mHeight = height;
+
+						mTextureWidth = texture_width;
+						mTextureHeight = texture_height;
+
+						mMediaSizeChanging = false;
+
+						sizeChanged();
+
+						update();
+					};
+				};
+			}
+			else if(message_name == "load_uri")
+			{
+				std::string uri = message_in.getValue("uri");
+				load( uri );
+				sendStatus();
+			}
+			else if(message_name == "mouse_event")
+			{
+				std::string event = message_in.getValue("event");
+				S32 x = message_in.getValueS32("x");
+				S32 y = message_in.getValueS32("y");
+
+				if(event == "down")
+				{
+					mouseDown(x, y);
+				}
+				else if(event == "up")
+				{
+					mouseUp(x, y);
+				}
+				else if(event == "move")
+				{
+					mouseMove(x, y);
+				};
+			};
+		}
+		else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
+		{
+			if(message_name == "stop")
+			{
+				stop();
+			}
+			else if(message_name == "start")
+			{
+				F64 rate = 0.0;
+				if(message_in.hasValue("rate"))
+				{
+					rate = message_in.getValueReal("rate");
+				}
+				play(rate);
+			}
+			else if(message_name == "pause")
+			{
+				pause();
+			}
+			else if(message_name == "seek")
+			{
+				F64 time = message_in.getValueReal("time");
+				seek(time);
+			}
+			else if(message_name == "set_loop")
+			{
+				bool loop = message_in.getValueBoolean("loop");
+				mIsLooping = loop;
+			}
+			else if(message_name == "set_volume")
+			{
+				F64 volume = message_in.getValueReal("volume");
+				setVolume(volume);
+			}
+		}
+		else
+		{
+//			std::cerr << "MediaPluginQuickTime::receiveMessage: unknown message class: " << message_class << std::endl;
+		};
+	};
+}
+
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+	MediaPluginQuickTime *self = new MediaPluginQuickTime(host_send_func, host_user_data);
+	*plugin_send_func = MediaPluginQuickTime::staticReceiveMessage;
+	*plugin_user_data = (void*)self;
+
+	return 0;
+}
+
+#else // LL_QUICKTIME_ENABLED
+
+// Stubbed-out class with constructor/destructor (necessary or windows linker
+// will just think its dead code and optimize it all out)
+class MediaPluginQuickTime : public MediaPluginBase
+{
+public:
+	MediaPluginQuickTime(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data);
+	~MediaPluginQuickTime();
+	/* virtual */ void receiveMessage(const char *message_string);
+};
+
+MediaPluginQuickTime::MediaPluginQuickTime(
+	LLPluginInstance::sendMessageFunction host_send_func,
+	void *host_user_data ) :
+	MediaPluginBase(host_send_func, host_user_data)
+{
+    // no-op
+}
+
+MediaPluginQuickTime::~MediaPluginQuickTime()
+{
+    // no-op
+}
+
+void MediaPluginQuickTime::receiveMessage(const char *message_string)
+{
+    // no-op
+}
+
+// We're building without quicktime enabled.  Just refuse to initialize.
+int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
+{
+    return -1;
+}
+
+#endif // LL_QUICKTIME_ENABLED
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 0133d2222d9ef7a9631dee468ed2a70112397bc5..643f89068f286ae8f7231e530f1eaec93d2d84a7 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -216,7 +216,6 @@ set(viewer_SOURCE_FILES
     llfloaterwhitelistentry.cpp
     llfloaterwindlight.cpp
     llfloaterworldmap.cpp
-    llfoldertype.cpp
     llfolderview.cpp
     llfolderviewitem.cpp
     llfollowcam.cpp
@@ -251,7 +250,9 @@ set(viewer_SOURCE_FILES
     llinventorybridge.cpp
     llinventoryclipboard.cpp
     llinventoryfilter.cpp
+    llinventoryfunctions.cpp
     llinventorymodel.cpp
+    llinventorypanel.cpp
     llinventorysubtreepanel.cpp
     lljoystickbutton.cpp
     lllandmarkactions.cpp
@@ -313,20 +314,22 @@ set(viewer_SOURCE_FILES
     llpanelgroupnotices.cpp
     llpanelgrouproles.cpp
     llpanelimcontrolpanel.cpp
-    llpanelinventory.cpp
     llpanelland.cpp
     llpanellandaudio.cpp
+    llpanellandmarkinfo.cpp
     llpanellandmarks.cpp
     llpanellandmedia.cpp
     llpanellogin.cpp
     llpanellookinfo.cpp
     llpanellooks.cpp
+    llpanelmaininventory.cpp
     llpanelmedia.cpp
     llpanelmediasettingsgeneral.cpp
     llpanelmediasettingspermissions.cpp
     llpanelmediasettingssecurity.cpp
     llpanelmeprofile.cpp
     llpanelobject.cpp
+    llpanelobjectinventory.cpp
     llpanelpeople.cpp
     llpanelpeoplemenus.cpp
     llpanelpermissions.cpp
@@ -334,6 +337,7 @@ set(viewer_SOURCE_FILES
     llpanelpicks.cpp
     llpanelplace.cpp
     llpanelplaceinfo.cpp
+    llpanelplaceprofile.cpp
     llpanelplaces.cpp
     llpanelplacestab.cpp
     llpanelprimmediacontrols.cpp
@@ -366,6 +370,8 @@ set(viewer_SOURCE_FILES
     llsearchcombobox.cpp
     llsearchhistory.cpp
     llselectmgr.cpp
+    llsidepanelinventory.cpp
+    llsidepanelobjectinfo.cpp
     llsidetray.cpp
     llsidetraypanelcontainer.cpp
     llsky.cpp
@@ -431,12 +437,14 @@ set(viewer_SOURCE_FILES
     llvectorperfoptions.cpp
     llviewchildren.cpp
     llviewerassetstorage.cpp
+    llviewerassettype.cpp
     llvieweraudio.cpp
     llviewercamera.cpp
     llviewercontrol.cpp
     llviewercontrollistener.cpp
     llviewerdisplay.cpp
     llviewerfloaterreg.cpp
+    llviewerfoldertype.cpp
     llviewergenericmessage.cpp
     llviewergesture.cpp    
     llviewerhelp.cpp
@@ -697,7 +705,6 @@ set(viewer_HEADER_FILES
     llfloaterwhitelistentry.h
     llfloaterwindlight.h
     llfloaterworldmap.h
-    llfoldertype.h
     llfolderview.h
     llfoldervieweventlistener.h
     llfolderviewitem.h
@@ -731,7 +738,9 @@ set(viewer_HEADER_FILES
     llinventorybridge.h
     llinventoryclipboard.h
     llinventoryfilter.h
+    llinventoryfunctions.h
     llinventorymodel.h
+    llinventorypanel.h
     llinventorysubtreepanel.h
     lljoystickbutton.h
     lllandmarkactions.h
@@ -791,20 +800,22 @@ set(viewer_HEADER_FILES
     llpanelgroupnotices.h
     llpanelgrouproles.h
     llpanelimcontrolpanel.h
-    llpanelinventory.h
     llpanelland.h
     llpanellandaudio.h
+    llpanellandmarkinfo.h
     llpanellandmarks.h
     llpanellandmedia.h
     llpanellogin.h
     llpanellookinfo.h
     llpanellooks.h
+    llpanelmaininventory.h
     llpanelmedia.h
     llpanelmediasettingsgeneral.h
     llpanelmediasettingspermissions.h
     llpanelmediasettingssecurity.h
     llpanelmeprofile.h
     llpanelobject.h
+    llpanelobjectinventory.h
     llpanelpeople.h
     llpanelpeoplemenus.h
     llpanelpermissions.h
@@ -812,6 +823,7 @@ set(viewer_HEADER_FILES
     llpanelpicks.h
     llpanelplace.h
     llpanelplaceinfo.h
+    llpanelplaceprofile.h
     llpanelplaces.h
     llpanelplacestab.h
     llpanelprimmediacontrols.h
@@ -846,6 +858,8 @@ set(viewer_HEADER_FILES
     llsearchcombobox.h
     llsearchhistory.h
     llselectmgr.h
+    llsidepanelinventory.h
+    llsidepanelobjectinfo.h
     llsidetray.h
     llsidetraypanelcontainer.h
     llsky.h
@@ -913,6 +927,7 @@ set(viewer_HEADER_FILES
     llvectorperfoptions.h
     llviewchildren.h
     llviewerassetstorage.h
+    llviewerassettype.h
     llvieweraudio.h
     llviewerbuild.h
     llviewercamera.h
@@ -920,6 +935,7 @@ set(viewer_HEADER_FILES
     llviewercontrollistener.h
     llviewerdisplay.h
     llviewerfloaterreg.h
+    llviewerfoldertype.h
     llviewergenericmessage.h
     llviewergesture.h    
     llviewerhelp.h
diff --git a/indra/newview/app_settings/foldertypes.xml b/indra/newview/app_settings/foldertypes.xml
index 2038779c4f569ba1304e1615a2954de6c8312ff6..0d539177f38d74217a606b790cffb44784d8e9ac 100644
--- a/indra/newview/app_settings/foldertypes.xml
+++ b/indra/newview/app_settings/foldertypes.xml
@@ -1,66 +1,61 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <ensemble_defs>
   <ensemble
-    asset_num="-1"
-    xui_name="default"
-    icon_name="inv_plain_closed.tga"
-     />
-  <ensemble
-    asset_num="27"
+    foldertype_num="27"
     xui_name="head"
     icon_name="inv_folder_outfit_head.tga"
 	allowed="hair,eyes"
      />
   <ensemble
-    asset_num="28"
+    foldertype_num="28"
     xui_name="gloves"
     icon_name="inv_folder_outfit_gloves.tga"
 	allowed="gloves"
      />
   <ensemble
-    asset_num="29"
+    foldertype_num="29"
     xui_name="jacket"
     icon_name="inv_folder_outfit_jacket.tga"
 	allowed="jacket"
      />
   <ensemble
-    asset_num="30"
+    foldertype_num="30"
     xui_name="pants"
     icon_name="inv_folder_outfit_pants.tga"
 	allowed="pants,underpants"
      />
   <ensemble
-    asset_num="31"
+    foldertype_num="31"
     xui_name="shape"
     icon_name="inv_folder_outfit_shape.tga"
 	allowed="shape,skin,hair,eyes"
      />
   <ensemble
-    asset_num="32"
+    foldertype_num="32"
     xui_name="shoes"
     icon_name="inv_folder_outfit_shoes.tga"
 	allowed="shoes,socks"
      />
   <ensemble
-    asset_num="33"
+    foldertype_num="33"
     xui_name="shirt"
     icon_name="inv_folder_outfit_shirt.tga"
 	allowed="shirt,undershirt"
      />
   <ensemble
-    asset_num="34"
+    foldertype_num="34"
     xui_name="skirt"
     icon_name="inv_folder_outfit_skirt.tga"
 	allowed=""
      />
   <ensemble
-    asset_num="35"
+    foldertype_num="35"
     xui_name="underpants"
     icon_name="inv_folder_outfit_underpants.tga"
 	allowed="underpants"
      />
   <ensemble
-    asset_num="36"
+    foldertype_num="36"
     xui_name="undershirt"
     icon_name="inv_folder_outfit_undershirt.tga"
 	allowed="undershirt"
diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml
index 669235af1bc0cb7620a6e2b88b3b172923a36798..ab18febcccc91213aa7902d8a0415c0504aaf585 100644
--- a/indra/newview/app_settings/ignorable_dialogs.xml
+++ b/indra/newview/app_settings/ignorable_dialogs.xml
@@ -1,291 +1,291 @@
-<?xml version="1.0" ?>
-<llsd>
-<map>
-    <key>FirstAppearance</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstAppearance warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstAttach</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstAttach warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstBalanceDecrease</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstBalanceDecrease warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstBalanceIncrease</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstBalanceIncrease warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstBuild</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstBuild warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstDebugMenus</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstDebugMenus warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstFlexible</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstFlexible warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstGoTo</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstGoTo warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstInventory</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstInventory warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstLeftClickNoHit</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstLeftClickNoHit warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstMap</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstMap warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstMedia</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstMedia warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstOverrideKeys</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstOverrideKeys warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstSandbox</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstSandbox warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstSculptedPrim</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstSculptedPrim warning dialog</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>
-      <string>Enables FirstSit warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstStreamingMusic</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstStreamingMusic warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstStreamingVideo</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstStreamingVideo warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstTeleport</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstTeleport warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>FirstVoice</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables FirstVoice warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>AboutDirectX9</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables AboutDirectX9 warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>BrowserLaunch</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables BrowserLaunch warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>DeedObject</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables DeedObject warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-  <key>NewClassified</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables NewClassified warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>QuickTimeInstalled</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables QuickTimeInstalled warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-    <key>ReturnToOwner</key>
-    <map>
-      <key>Comment</key>
-      <string>Enables ReturnToOwner warning dialog</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>Boolean</string>
-      <key>Value</key>
-      <integer>1</integer>
-    </map>
-  </map>
-</llsd>
+<?xml version="1.0" ?>
+<llsd>
+<map>
+    <key>FirstAppearance</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstAppearance warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstAttach</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstAttach warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstBalanceDecrease</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstBalanceDecrease warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstBalanceIncrease</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstBalanceIncrease warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstBuild</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstBuild warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstDebugMenus</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstDebugMenus warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstFlexible</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstFlexible warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstGoTo</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstGoTo warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstInventory</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstInventory warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstLeftClickNoHit</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstLeftClickNoHit warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstMap</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstMap warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstMedia</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstMedia warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstOverrideKeys</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstOverrideKeys warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstSandbox</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstSandbox warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstSculptedPrim</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstSculptedPrim warning dialog</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>
+      <string>Enables FirstSit warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstStreamingMusic</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstStreamingMusic warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstStreamingVideo</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstStreamingVideo warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstTeleport</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstTeleport warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>FirstVoice</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables FirstVoice warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>AboutDirectX9</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables AboutDirectX9 warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>BrowserLaunch</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables BrowserLaunch warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>DeedObject</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables DeedObject warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+  <key>NewClassified</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables NewClassified warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>QuickTimeInstalled</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables QuickTimeInstalled warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>ReturnToOwner</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables ReturnToOwner warning dialog</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+  </map>
+</llsd>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 544f1c598e9a57e06c9cde70251bd6eadc1f53ac..5f6fd6e4a735564967a27766decc543bd1f58a50 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -560,7 +560,8 @@ STATUS_WHITELIST_FAILED                URL failed to pass whitelist
 NULL_KEY			Indicates an empty key
 EOF					Indicates the last line of a notecard was read
 TEXTURE_BLANK			UUID for the "Blank" texture
-TEXTURE_DEFAULT			UUID for the "Default Media" texture
+TEXTURE_DEFAULT			Alias for TEXTURE_PLYWOOD
+TEXTURE_MEDIA			UUID for the "Default Media" texture
 TEXTURE_PLYWOOD			UUID for the default "Plywood" texture
 TEXTURE_TRANSPARENT		UUID for the "White - Transparent" texture
 
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c4722b772e183c9b37b85c4d3acabdedf7b167a2..7254fff664a6a0e64f2b15cca2cc55e04102b11d 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5294,7 +5294,6 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
-
     <key>PluginInstancesCPULimit</key>
     <map>
       <key>Comment</key>
@@ -5360,6 +5359,17 @@
       <string>U32</string>
       <key>Value</key>
 	  <integer>13</integer>
+    </map>
+	<key>PrimMediaControlsUseHoverControlSet</key>
+	<map>
+	  <key>Comment</key>
+      <string>Whether or not hovering over prim media uses minimal "hover" controls or the authored control set.</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
     </map>
     <key>PrimMediaMaxRetries</key>
     <map>
@@ -5548,6 +5558,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>RegInClient</key>
+    <map>
+      <key>Comment</key>
+      <string>Experimental: Embed registration in login screen</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>RegionTextureSize</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index c43ba27984697e50ea90a76c825c74b4603ef1c1..10c197d09eb71c6cf3303ee372802d6f78a661d2 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="US-ASCII" standalone="yes"?>
 <linden_avatar
- version="1.0" wearable_definition_version="23"> 
+ version="1.0" wearable_definition_version="24"> 
   <!-- The wearable_definition_version is checked during asset upload. -->
   <!-- If you increment it, check indra/lib/python/indra/assetutil.py.  -->
   <skeleton
@@ -8985,7 +8985,7 @@ render_pass="bump">
          id="1017" />
 
         <driven
-         id="1033" />
+         id="1035" />
 
         <driven
          id="914"
diff --git a/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt b/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt
index 185c0180fbb9c3468de11947bed9278f697d3720..30f9349111d117a99d4af183bfb11607286239b0 100644
--- a/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt
+++ b/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt
@@ -1,6 +1,6 @@
-The language files in this directory are Unicode (Little-Endian) format, also known as UTF-16 LE.
-
-This is the format required for NSIS Unicode.  See http://www.scratchpaper.com/ for details.
-
-James Cook
-September 2008
+The language files in this directory are Unicode (Little-Endian) format, also known as UTF-16 LE.
+
+This is the format required for NSIS Unicode.  See http://www.scratchpaper.com/ for details.
+
+James Cook
+September 2008
diff --git a/indra/newview/llagentpicksinfo.cpp b/indra/newview/llagentpicksinfo.cpp
index 6e5835bace2b12a8162ac9a93b7021a7a4b6036e..3c8d0dac42614f29aeba346014247fb50a1c1f81 100644
--- a/indra/newview/llagentpicksinfo.cpp
+++ b/indra/newview/llagentpicksinfo.cpp
@@ -47,7 +47,8 @@ class LLAgentPicksInfo::LLAgentPicksObserver : public LLAvatarPropertiesObserver
 
 	~LLAgentPicksObserver()
 	{
-		LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this);
+		if (LLAvatarPropertiesProcessor::instanceExists())
+			LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this);
 	}
 
 	void sendAgentPicksRequest()
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index 09f7c49f23dbbc91c571aeb77af63488a6af9868..2911a35581b86944901167a2e26bb4eeea0dbec5 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -92,7 +92,10 @@ std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/)
 //static
 BOOL LLAgentUI::checkAgentDistance(const LLVector3& pole, F32 radius)
 {
-	return  (gAgent.getPositionAgent() - pole).length() < radius;
+	F32 delta_x = gAgent.getPositionAgent().mV[VX] - pole.mV[VX];
+	F32 delta_y = gAgent.getPositionAgent().mV[VY] - pole.mV[VY];
+	
+	return  sqrt( delta_x* delta_x + delta_y* delta_y ) < radius;
 }
 BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const LLVector3& agent_pos_region)
 {
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 380469f5b361f2425315cb817bd9df4d30b61235..8c76a219a07cebfa81563364235489099a846eca 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -39,6 +39,7 @@
 #include "llfloaterinventory.h"
 #include "llinventorybridge.h"
 #include "llinventorymodel.h"
+#include "llinventorypanel.h"
 #include "llnotify.h"
 #include "llviewerregion.h"
 #include "llvoavatarself.h"
@@ -433,7 +434,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,
 	if (save_in_lost_and_found)
 	{
 		category_id = gInventory.findCategoryUUIDForType(
-			LLAssetType::AT_LOST_AND_FOUND);
+			LLFolderType::FT_LOST_AND_FOUND);
 	}
 	else
 	{
@@ -839,7 +840,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
 		}
 
 		// Get the UUID of the current outfit folder (will be created if it doesn't exist)
-		LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+		const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 		
 		LLInitialWearablesFetch* outfit = new LLInitialWearablesFetch();
 		
@@ -980,8 +981,7 @@ void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 inde
 	// Add a new one in the lost and found folder.
 	// (We used to overwrite the "not found" one, but that could potentially
 	// destory content.) JC
-	LLUUID lost_and_found_id = 
-		gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+	const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
 	LLPointer<LLInventoryCallback> cb =
 		new addWearableToAgentInventoryCallback(
 			LLPointer<LLRefCount>(NULL),
@@ -1122,8 +1122,8 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,
 
 	// First, make a folder in the Clothes directory.
 	LLUUID folder_id = gInventory.createNewCategory(
-		gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING),
-		LLAssetType::AT_NONE,
+		gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING),
+		LLFolderType::FT_NONE,
 		new_folder_name);
 
 	bool found_first_item = false;
@@ -1256,10 +1256,10 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
 	}
 
 	// First, make a folder in the My Outfits directory.
-	LLUUID parent_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_MY_OUTFITS);
+	const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
 	LLUUID folder_id = gInventory.createNewCategory(
 		parent_id,
-		LLAssetType::AT_OUTFIT,
+		LLFolderType::FT_OUTFIT,
 		new_folder_name);
 
 	LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL);
@@ -2014,7 +2014,8 @@ void LLInitialWearablesFetch::done()
 	LLFindWearables is_wearable;
 	gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array, 
 									LLInventoryModel::EXCLUDE_TRASH, is_wearable);
-	
+
+	LLAppearanceManager::setAttachmentInvLinkEnable(true);
 	if (wearable_array.count() > 0)
 	{
 		LLAppearanceManager::instance().updateAppearanceFromCOF();
@@ -2030,7 +2031,7 @@ void LLInitialWearablesFetch::processWearablesMessage()
 {
 	if (!mAgentInitialWearables.empty()) // We have an empty current outfit folder, use the message data instead.
 	{
-		LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+		const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 		for (U8 i = 0; i < mAgentInitialWearables.size(); ++i)
 		{
 			// Populate the current outfit folder with links to the wearables passed in the message
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 4e022aeb299f25df73cb14cc8032f28093cdf56b..a50b39c10db40942ce4abb5a69bb88518f2413ee 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -130,11 +130,11 @@ void LLOutfitObserver::done()
 			{
 				if(LLInventoryType::IT_GESTURE == item->getInventoryType())
 				{
-					pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE);
+					pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
 				}
 				else
 				{
-					pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+					pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 				}
 				break;
 			}
@@ -146,7 +146,7 @@ void LLOutfitObserver::done()
 		
 		LLUUID cat_id = gInventory.createNewCategory(
 			pid,
-			LLAssetType::AT_NONE,
+			LLFolderType::FT_NONE,
 			name);
 		mCatID = cat_id;
 		LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(mCatID, mAppend);
@@ -296,15 +296,39 @@ struct LLWearableHoldingPattern
 	bool append;
 };
 
+/* static */ void removeDuplicateItems(LLInventoryModel::item_array_t& items)
+{
+	LLInventoryModel::item_array_t new_items;
+	std::set<LLUUID> items_seen;
+	std::deque<LLViewerInventoryItem*> tmp_list;
+	// Traverse from the front and keep the first of each item
+	// encountered, so we actually keep the *last* of each duplicate
+	// item.  This is needed to give the right priority when adding
+	// duplicate items to an existing outfit.
+	for (S32 i=items.count()-1; i>=0; i--)
+	{
+		LLViewerInventoryItem *item = items.get(i);
+		LLUUID item_id = item->getLinkedUUID();
+		if (items_seen.find(item_id)!=items_seen.end())
+			continue;
+		items_seen.insert(item_id);
+		tmp_list.push_front(item);
+	}
+	for (std::deque<LLViewerInventoryItem*>::iterator it = tmp_list.begin();
+		 it != tmp_list.end();
+		 ++it)
+	{
+		new_items.put(*it);
+	}
+	items = new_items;
+}
 
 void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src)
 {
 	LLInventoryModel::item_array_t new_dst;
 	std::set<LLUUID> mark_inventory;
-	std::set<LLUUID> mark_asset;
 
 	S32 inventory_dups = 0;
-	S32 asset_dups = 0;
 	
 	for (LLInventoryModel::item_array_t::const_iterator src_pos = src.begin();
 		  src_pos != src.end();
@@ -312,8 +336,6 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
 	{
 		LLUUID src_item_id = (*src_pos)->getLinkedUUID();
 		mark_inventory.insert(src_item_id);
-		LLUUID src_asset_id = (*src_pos)->getAssetUUID();
-		mark_asset.insert(src_asset_id);
 	}
 
 	for (LLInventoryModel::item_array_t::const_iterator dst_pos = dst.begin();
@@ -323,37 +345,26 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory
 		LLUUID dst_item_id = (*dst_pos)->getLinkedUUID();
 
 		if (mark_inventory.find(dst_item_id) == mark_inventory.end())
-		{
-		}
-		else
-		{
-			inventory_dups++;
-		}
-
-		LLUUID dst_asset_id = (*dst_pos)->getAssetUUID();
-
-		if (mark_asset.find(dst_asset_id) == mark_asset.end())
 		{
 			// Item is not already present in COF.
 			new_dst.put(*dst_pos);
-			mark_asset.insert(dst_item_id);
+			mark_inventory.insert(dst_item_id);
 		}
 		else
 		{
-			asset_dups++;
+			inventory_dups++;
 		}
 	}
 	llinfos << "removeDups, original " << dst.count() << " final " << new_dst.count()
-			<< " inventory dups " << inventory_dups << " asset_dups " << asset_dups << llendl;
+			<< " inventory dups " << inventory_dups << llendl;
 	
 	dst = new_dst;
 }
 
-
 /* static */ 
 LLUUID LLAppearanceManager::getCOF()
 {
-	return gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 }
 
 // Update appearance from outfit folder.
@@ -363,6 +374,9 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo
 	if (!proceed)
 		return;
 
+#if 1 
+	updateCOF(category,append);
+#else
 	if (append)
 	{
 		updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF.
@@ -370,16 +384,17 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo
 	else
 	{
 		LLViewerInventoryCategory* catp = gInventory.getCategory(category);
-		if (catp->getPreferredType() == LLAssetType::AT_NONE ||
-			LLAssetType::lookupIsEnsembleCategoryType(catp->getPreferredType()))
+		if (catp->getPreferredType() == LLFolderType::FT_NONE ||
+			LLFolderType::lookupIsEnsembleType(catp->getPreferredType()))
 		{
 			updateCOFFromCategory(category, append);  // append is false - rebuild COF.
 		}
-		else if (catp->getPreferredType() == LLAssetType::AT_OUTFIT)
+		else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT)
 		{
 			rebuildCOFFromOutfit(category);
 		}
 	}
+#endif
 }
 
 // Append to current COF contents by recursively traversing a folder.
@@ -401,7 +416,7 @@ void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool app
 		return;
 	}
 		
-	const LLUUID &current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+	const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 	// Processes that take time should show the busy cursor
 	//inc_busy_count();
 		
@@ -499,7 +514,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
 		{
 			LLViewerInventoryCategory *catp = item->getLinkedCategory();
 			// Skip copying outfit links.
-			if (catp && catp->getPreferredType() != LLAssetType::AT_OUTFIT)
+			if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT)
 			{
 				link_inventory_item(gAgent.getID(),
 									item->getLinkedUUID(),
@@ -520,6 +535,130 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
 		}
 	}
 }
+/* static */ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)
+{
+	LLInventoryModel::cat_array_t cats;
+	LLInventoryModel::item_array_t items;
+	gInventory.collectDescendents(category, cats, items,
+								  LLInventoryModel::EXCLUDE_TRASH);
+	for (S32 i = 0; i < items.count(); ++i)
+	{
+		LLViewerInventoryItem *item = items.get(i);
+		if (keep_outfit_links && (item->getActualType() == LLAssetType::AT_LINK_FOLDER))
+			continue;
+		gInventory.purgeObject(item->getUUID());
+	}
+}
+
+// Keep the last N wearables of each type.  For viewer 2.0, N is 1 for
+// both body parts and clothing items.
+/* static */ void LLAppearanceManager::filterWearableItems(
+	LLInventoryModel::item_array_t& items, S32 max_per_type)
+{
+	// Divvy items into arrays by wearable type.
+	std::vector<LLInventoryModel::item_array_t> items_by_type(WT_COUNT);
+	for (S32 i=0; i<items.count(); i++)
+	{
+		LLViewerInventoryItem *item = items.get(i);
+		// Ignore non-wearables.
+		if (!item->isWearableType())
+			continue;
+		EWearableType type = item->getWearableType();
+		items_by_type[type].push_back(item);
+	}
+
+	// rebuild items list, retaining the last max_per_type of each array
+	items.clear();
+	for (S32 i=0; i<WT_COUNT; i++)
+	{
+		S32 size = items_by_type[i].size();
+		if (size <= 0)
+			continue;
+		S32 start_index = llmax(0,size-max_per_type);
+		for (S32 j = start_index; j<size; j++)
+		{
+			items.push_back(items_by_type[i][j]);
+		}
+	}
+}
+
+// Create links to all listed items.
+/* static */ void LLAppearanceManager::linkAll(const LLUUID& category,
+											   LLInventoryModel::item_array_t& items,
+											   LLPointer<LLInventoryCallback> cb)
+{
+	for (S32 i=0; i<items.count(); i++)
+	{
+		const LLInventoryItem* item = items.get(i).get();
+		link_inventory_item(gAgent.getID(),
+							item->getLinkedUUID(),
+							category,
+							item->getName(),
+							LLAssetType::AT_LINK,
+							cb);
+	}
+}
+
+/* static */ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
+{
+	const LLUUID cof = getCOF();
+
+	// Collect and filter descendents to determine new COF contents.
+
+	// - Body parts: always include COF contents as a fallback in case any
+	// required parts are missing.
+	LLInventoryModel::item_array_t body_items;
+	getDescendentsOfAssetType(cof, body_items, LLAssetType::AT_BODYPART, false);
+	getDescendentsOfAssetType(category, body_items, LLAssetType::AT_BODYPART, false);
+	// Reduce body items to max of one per type.
+	removeDuplicateItems(body_items);
+	filterWearableItems(body_items, 1);
+
+	// - Wearables: include COF contents only if appending.
+	LLInventoryModel::item_array_t wear_items;
+	if (append)
+		getDescendentsOfAssetType(cof, wear_items, LLAssetType::AT_CLOTHING, false);
+	getDescendentsOfAssetType(category, wear_items, LLAssetType::AT_CLOTHING, false);
+	// Reduce wearables to max of one per type.
+	removeDuplicateItems(wear_items);
+	filterWearableItems(wear_items, 1);
+
+	// - Attachments: include COF contents only if appending.
+	LLInventoryModel::item_array_t obj_items;
+	if (append)
+		getDescendentsOfAssetType(cof, obj_items, LLAssetType::AT_OBJECT, false);
+	getDescendentsOfAssetType(category, obj_items, LLAssetType::AT_OBJECT, false);
+	removeDuplicateItems(obj_items);
+
+	// - Gestures: include COF contents only if appending.
+	LLInventoryModel::item_array_t gest_items;
+	if (append)
+		getDescendentsOfAssetType(cof, gest_items, LLAssetType::AT_GESTURE, false);
+	getDescendentsOfAssetType(category, gest_items, LLAssetType::AT_GESTURE, false);
+	removeDuplicateItems(gest_items);
+	
+	// Remove current COF contents.
+	bool keep_outfit_links = append;
+	purgeCategory(cof, keep_outfit_links);
+	gInventory.notifyObservers();
+
+	// Create links to new COF contents.
+	LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
+
+	linkAll(cof, body_items, link_waiter);
+	linkAll(cof, wear_items, link_waiter);
+	linkAll(cof, obj_items, link_waiter);
+	linkAll(cof, gest_items, link_waiter);
+
+	// Add link to outfit if category is an outfit. 
+	LLViewerInventoryCategory* catp = gInventory.getCategory(category);
+	if (!append && catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
+	{
+		link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
+							LLAssetType::AT_LINK_FOLDER, link_waiter);
+	}
+							  
+}
 
 /* static */ 
 bool LLAppearanceManager::isMandatoryWearableType(EWearableType type)
@@ -604,7 +743,7 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)
 		LLNotifications::instance().add("CouldNotPutOnOutfit");
 		return;
 	}
-		
+
 	// Processes that take time should show the busy cursor
 	//inc_busy_count();
 
@@ -622,7 +761,7 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)
 
 	// Create a link to the outfit that we wore.
 	LLViewerInventoryCategory* catp = gInventory.getCategory(category);
-	if (catp && catp->getPreferredType() == LLAssetType::AT_OUTFIT)
+	if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
 	{
 		link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(),
 							LLAssetType::AT_LINK_FOLDER, link_waiter);
@@ -792,6 +931,22 @@ void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category,
 									follow_folder_links);
 }
 
+/* static */
+void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
+													LLInventoryModel::item_array_t& items,
+													LLAssetType::EType type,
+													bool follow_folder_links)
+{
+	LLInventoryModel::cat_array_t cats;
+	LLIsType is_of_type(type);
+	gInventory.collectDescendentsIf(category,
+									cats,
+									items,
+									LLInventoryModel::EXCLUDE_TRASH,
+									is_of_type,
+									follow_folder_links);
+}
+
 /* static */ 
 void LLAppearanceManager::getUserDescendents(const LLUUID& category, 
 											 LLInventoryModel::item_array_t& wear_items,
@@ -924,9 +1079,21 @@ void LLAppearanceManager::wearOutfitByName(const std::string& name)
 	//dec_busy_count();
 }
 
+bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventoryItem *b)
+{
+	return (a->isWearableType() && b->isWearableType() &&
+			(a->getWearableType() == b->getWearableType()));
+}
 /* static */
 void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
 {
+	LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);
+	if (!vitem)
+	{
+		llwarns << "not an llviewerinventoryitem, failed" << llendl;
+		return;
+	}
+		
 	LLInventoryModel::cat_array_t cat_array;
 	LLInventoryModel::item_array_t item_array;
 	gInventory.collectDescendents(LLAppearanceManager::getCOF(),
@@ -936,12 +1103,19 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
 	bool linked_already = false;
 	for (S32 i=0; i<item_array.count(); i++)
 	{
-		const LLInventoryItem* inv_item = item_array.get(i).get();
+		const LLViewerInventoryItem* inv_item = item_array.get(i).get();
 		if (inv_item->getLinkedUUID() == item->getLinkedUUID())
 		{
 			linked_already = true;
 			break;
 		}
+		// Are of same type but are not the same - new item will replace old.
+		if (areMatchingWearables(vitem,inv_item))
+		{
+			gAgentWearables.removeWearable(inv_item->getWearableType(),true,0);
+			gInventory.purgeObject(inv_item->getUUID());
+			gInventory.notifyObservers();
+		}
 	}
 	if (linked_already)
 	{
@@ -952,9 +1126,9 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
 	{
 		LLPointer<LLInventoryCallback> cb = do_update ? new ModifiedCOFCallback : 0;
 		link_inventory_item( gAgent.getID(),
-							 item->getLinkedUUID(),
+							 vitem->getLinkedUUID(),
 							 getCOF(),
-							 item->getName(),
+							 vitem->getName(),
 							 LLAssetType::AT_LINK,
 							 cb);
 	}
@@ -998,14 +1172,16 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
 	}
 }
 
+//#define DUMP_CAT_VERBOSE
+
 /* static */
-void LLAppearanceManager::dumpCat(const LLUUID& cat_id, std::string str)
+void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
 {
 	LLInventoryModel::cat_array_t cats;
 	LLInventoryModel::item_array_t items;
 	gInventory.collectDescendents(cat_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
 
-#if 0
+#ifdef DUMP_CAT_VERBOSE
 	llinfos << llendl;
 	llinfos << str << llendl;
 	S32 hitcount = 0;
@@ -1017,6 +1193,89 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, std::string str)
 		llinfos << i <<" "<< item->getName() <<llendl;
 	}
 #endif
-	llinfos << str << " count " << items.count() << llendl;
+	llinfos << msg << " count " << items.count() << llendl;
+}
+
+/* static */
+void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items,
+										const std::string& msg)
+{
+	llinfos << msg << llendl;
+	for (S32 i=0; i<items.count(); i++)
+	{
+		LLViewerInventoryItem *item = items.get(i);
+		llinfos << i <<" " << item->getName() << llendl;
+	}
+	llinfos << llendl;
+}
+
+
+std::set<LLUUID> LLAppearanceManager::sRegisteredAttachments;
+bool LLAppearanceManager::sAttachmentInvLinkEnabled(false);
+
+/* static */
+void LLAppearanceManager::setAttachmentInvLinkEnable(bool val)
+{
+	llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl;
+	sAttachmentInvLinkEnabled = val;
+}
+
+void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
+{
+       llinfos << msg << llendl;
+       for (std::set<LLUUID>::const_iterator it = atts.begin();
+               it != atts.end();
+               ++it)
+       {
+               LLUUID item_id = *it;
+               LLViewerInventoryItem *item = gInventory.getItem(item_id);
+               if (item)
+                       llinfos << "atts " << item->getName() << llendl;
+               else
+                       llinfos << "atts " << "UNKNOWN[" << item_id.asString() << "]" << llendl;
+       }
+       llinfos << llendl;
 }
 
+/* static */
+void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
+{
+       sRegisteredAttachments.insert(item_id);
+       dumpAttachmentSet(sRegisteredAttachments,"after register:");
+
+	   if (sAttachmentInvLinkEnabled)
+	   {
+		   LLViewerInventoryItem *item = gInventory.getItem(item_id);
+		   if (item)
+		   {
+			   LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:");
+			   LLAppearanceManager::wearItem(item,false);  // Add COF link for item.
+			   gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+			   gInventory.notifyObservers();
+		   }
+	   }
+	   else
+	   {
+		   llinfos << "no link changes, inv link not enabled" << llendl;
+	   }
+}
+
+/* static */
+void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
+{
+       sRegisteredAttachments.erase(item_id);
+       dumpAttachmentSet(sRegisteredAttachments,"after unregister:");
+
+	   if (sAttachmentInvLinkEnabled)
+	   {
+		   LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
+		   LLAppearanceManager::removeItemLinks(item_id, false);
+		   // BAP - needs to change for label to track link.
+		   gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+		   gInventory.notifyObservers();
+	   }
+	   else
+	   {
+		   llinfos << "no link changes, inv link not enabled" << llendl;
+	   }
+}
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 828af321013a86a904b1ce4824335be363c93c25..56f54dfc23d095119af9ebf65129f959ab533818 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -46,6 +46,7 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	static void updateAppearanceFromCOF();
 	static bool needToSaveCOF();
 	static void changeOutfit(bool proceed, const LLUUID& category, bool append);
+	static void updateCOF(const LLUUID& category, bool append = false);
 	static void updateCOFFromCategory(const LLUUID& category, bool append);
 	static void rebuildCOFFromOutfit(const LLUUID& category);
 	static void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
@@ -65,9 +66,23 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	static void removeItemLinks(const LLUUID& item_id, bool do_update = true);
 
 	// For debugging - could be moved elsewhere.
-	static void dumpCat(const LLUUID& cat_id, std::string str);
+	static void dumpCat(const LLUUID& cat_id, const std::string& msg);
+	static void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg);
+	static void unregisterAttachment(const LLUUID& item_id);
+	static void registerAttachment(const LLUUID& item_id);
+	static void setAttachmentInvLinkEnable(bool val);
 
 private:
+	static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
+	static void linkAll(const LLUUID& category,
+						LLInventoryModel::item_array_t& items,
+						LLPointer<LLInventoryCallback> cb);
+	
+	static void getDescendentsOfAssetType(const LLUUID& category, 
+										  LLInventoryModel::item_array_t& items,
+										  LLAssetType::EType type,
+										  bool follow_folder_links);
+
 	static void getCOFValidDescendents(const LLUUID& category, 
 									   LLInventoryModel::item_array_t& items);
 									   
@@ -81,6 +96,11 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	static bool isMandatoryWearableType(EWearableType type);
 	static void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found);
 	static void purgeCOFBeforeRebuild(const LLUUID& category);
+	static void purgeCategory(const LLUUID& category, bool keep_outfit_links);
+
+	static std::set<LLUUID> sRegisteredAttachments;
+	static bool sAttachmentInvLinkEnabled;
+
 };
 
 #define SUPPORT_ENSEMBLES 0
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index cd3963050f68c8ec87c98459debfce897ce14c4b..d4df6dfbe73855be94de867315991886dd4e035a 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -41,6 +41,7 @@
 #include "llfilepicker.h"
 #include "llnotify.h"
 #include "llinventorymodel.h"
+#include "llinventorypanel.h"
 #include "llfloaterinventory.h"
 #include "llpermissionsflags.h"
 #include "llpreviewnotecard.h"
@@ -333,7 +334,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
 		LLAssetStorage::LLStoreAssetCallback callback = NULL;
 		void *userdata = NULL;
 		upload_new_resource(next_file, asset_name, asset_name,
-				    0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE,
+				    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
 				    next_owner_perms, group_perms,
 				    everyone_perms, display_name,
 				    callback, expected_upload_cost, userdata);
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 2f6740130173d68a9dd019429f8b818fa1f28780..97e0aa5f4613fa2a646a87e8b9d38b26a3a3b628 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -343,7 +343,7 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re
 		// Servers older than 1.25 require the text of the message to be the
 		// calling card folder ID for the offering user. JC
 		LLUUID calling_card_folder_id = 
-			gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+			gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
 		std::string message = calling_card_folder_id.asString();
 		requestFriendship(notification["payload"]["id"].asUUID(), 
 		    notification["payload"]["name"].asString(),
@@ -355,7 +355,7 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re
 // static
 void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message)
 {
-	LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+	const LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
 	send_improved_im(target_id,
 					 target_name,
 					 message,
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 7b2dc02864f5a4a2e33b77fd1da9133d0cb6ddf1..8609ba8b1c6d4b9c0269350e0161852d19ad9f52 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -239,11 +239,46 @@ void LLAvatarList::refresh()
 	bool dirty = add_limit_exceeded || (have_filter && !have_names);
 	setDirty(dirty);
 
+	// Refreshed all items, lets send refresh_complete signal.
+	if(!dirty)
+	{
+		std::vector<LLSD> cur_values;
+		getValues(cur_values);
+		mRefreshCompleteSignal(this, LLSD((S32)cur_values.size()));
+	}
+
 	// Commit if we've added/removed items.
 	if (modified)
 		onCommit();
 }
 
+bool LLAvatarList::filterHasMatches()
+{
+	uuid_vector_t values = getIDs();
+
+	for (uuid_vector_t::const_iterator it=values.begin(); it != values.end(); it++)
+	{
+		std::string name;
+		const LLUUID& buddy_id = *it;
+		BOOL have_name = gCacheName->getFullName(buddy_id, name);
+
+		// If name has not been loaded yet we consider it as a match.
+		// When the name will be loaded the filter will be applied again(in refresh()).
+
+		if (have_name && !findInsensitive(name, mNameFilter))
+		{
+			continue;
+		}
+
+		return true;
+	}
+	return false;
+}
+
+boost::signals2::connection LLAvatarList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb)
+{
+	return mRefreshCompleteSignal.connect(cb);
+}
 
 void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
 {
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 51d3760d3937169ca6ed50e1c74644f65919a110..195d9e5b550135766a90379f0c9c3e44a5dc5ea3 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -82,6 +82,11 @@ class LLAvatarList : public LLFlatListView
 	const std::string getIconParamName() const{return mIconParamName;}
 	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
+	// Return true if filter has at least one match.
+	bool filterHasMatches();
+
+	boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb);
+
 protected:
 	void refresh();
 
@@ -107,6 +112,8 @@ class LLAvatarList : public LLFlatListView
 	uuid_vector_t			mIDs;
 
 	LLAvatarListItem::ContextMenu* mContextMenu;
+
+	commit_signal_t mRefreshCompleteSignal;
 };
 
 /** Abstract comparator for avatar items */
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index bad61101c1bceda1f056cc080ed7a64bb81a4e82..b9e8c5394dac61701957dbb826f8ba36c48a4fb9 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -51,7 +51,7 @@
 #include "lltransientfloatermgr.h"
 
 static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");
-static LLDefaultChildRegistry::Register<LLTalkButton> t2("chiclet_talk");
+static LLDefaultChildRegistry::Register<LLTalkButton> t2("talk_button");
 static LLDefaultChildRegistry::Register<LLNotificationChiclet> t3("chiclet_notification");
 static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t4("chiclet_im_p2p");
 static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t5("chiclet_im_group");
@@ -830,13 +830,21 @@ LLChicletPanel::~LLChicletPanel()
 void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
 	
 	LLUUID session_id = data["session_id"].asUUID();
+	S32 unread = data["num_unread"].asInteger();
+
+	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+	if (im_floater && im_floater->getVisible())
+	{
+		unread = 0;
+	}
+
 	std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id);
 	std::list<LLChiclet *>::iterator iter;
 	for (iter = chiclets.begin(); iter != chiclets.end(); iter++) {
 		LLChiclet* chiclet = *iter;
 		if (chiclet != NULL)
 		{
-			chiclet->setCounter(data["num_unread"].asInteger());
+			chiclet->setCounter(unread);
 		}
 	    else
 	    {
@@ -1257,30 +1265,7 @@ LLTalkButton::Params::Params()
  , show_button("show_button")
  , monitor("monitor")
 {
-	// *TODO Vadim: move hardcoded labels (!) and other params to XUI.
-	speak_button.name("left");
-	speak_button.label("Speak");
-	speak_button.label_selected("Speak");
-	speak_button.font(LLFontGL::getFontSansSerifSmall());
-	speak_button.tab_stop(false);
-	speak_button.is_toggle(true);
-	speak_button.picture_style(true);
-	// Use default button art. JC
-	//speak_button.image_selected(LLUI::getUIImage("SegmentedBtn_Left_Selected"));
-	//speak_button.image_unselected(LLUI::getUIImage("SegmentedBtn_Left_Off"));
-
-	show_button.name("right");
-	show_button.label(LLStringUtil::null);
-	show_button.rect(LLRect(0, 0, 20, 0));
-	show_button.tab_stop(false);
-	show_button.is_toggle(true);
-	show_button.picture_style(true);
-	show_button.image_selected(LLUI::getUIImage("ComboButton_Selected"));
-	show_button.image_unselected(LLUI::getUIImage("ComboButton_Off"));
-
-	monitor.name("monitor");
-	// *TODO: Make this data driven.
-	monitor.rect(LLRect(0, 18, 18, 0));
+	// See widgets/talk_button.xml
 }
 
 LLTalkButton::LLTalkButton(const Params& p)
@@ -1336,6 +1321,7 @@ LLTalkButton::LLTalkButton(const Params& p)
 
 	// never show "muted" because you can't mute yourself
 	mOutputMonitor->setIsMuted(false);
+	mOutputMonitor->setIsAgentControl(true);
 }
 
 LLTalkButton::~LLTalkButton()
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index 7b75c77a1e35577680c07e2641b34bcbea91edeb..ed304bdd34517d44a9e3cc454ca8923a57a0fe8d 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -228,7 +228,8 @@ void LLColorSwatchCtrl::draw()
 	{
 		if (!mFallbackImageName.empty())
 		{
-			LLPointer<LLViewerTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+			LLPointer<LLViewerTexture> fallback_image = LLViewerTextureManager::getFetchedTextureFromFile(mFallbackImageName, TRUE, 
+				LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 			if( fallback_image->getComponents() == 4 )
 			{	
 				gl_rect_2d_checkerboard( interior );
diff --git a/indra/newview/lldebugmessagebox.cpp b/indra/newview/lldebugmessagebox.cpp
index 29e375c9faf9dea85316bd793b60453fee6d1351..7814e94dfd64cbcc23a76533aa58c5bdf03cd4c9 100644
--- a/indra/newview/lldebugmessagebox.cpp
+++ b/indra/newview/lldebugmessagebox.cpp
@@ -124,6 +124,7 @@ LLDebugVarMessageBox::LLDebugVarMessageBox(const std::string& title, EDebugVarTy
 
 	LLButton::Params p;
 	p.name(std::string("Animate"));
+	p.label(std::string("Animate"));
 	p.rect(LLRect(20, 45, 180, 25));
 	p.click_callback.function(boost::bind(&LLDebugVarMessageBox::onAnimateClicked, this, _2));
 	mAnimateButton = LLUICtrlFactory::create<LLButton>(p);
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index e087feeaecf4c13ff55318b8604e968e4b351ec1..5f845c3721d7f52cbea78a7719496ffa016bcce7 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -144,7 +144,7 @@ void LLStandardBumpmap::restoreGL()
 		gStandardBumpmapList[LLStandardBumpmap::sStandardBumpmapCount].mImage = 
 			LLViewerTextureManager::getFetchedTexture(LLUUID(bump_image_id),
 										TRUE, 
-										FALSE, 
+										LLViewerTexture::BOOST_NONE, 
 										LLViewerTexture::LOD_TEXTURE,
 										0, 
 										0);																								
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index 790e75cfaae1ac76057786322793a48af55acdaa..9dc22cddcd2a0587dc157956c3b7181d88450e47 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -72,7 +72,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
 	sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
 	sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
 	mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga", 
-													TRUE, TRUE, 
+													TRUE, LLViewerTexture::BOOST_UI, 
 													LLViewerTexture::FETCHED_TEXTURE,
 													GL_ALPHA8, GL_ALPHA,
 													LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
@@ -81,7 +81,7 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
 	mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP);
 
 	m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c", 
-													TRUE, TRUE, 
+													TRUE, LLViewerTexture::BOOST_UI, 
 													LLViewerTexture::FETCHED_TEXTURE,
 													GL_ALPHA8, GL_ALPHA,
 													LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 21e17cc2074c23101341c0d0a0c2371484ec40e0..107de934dfc312e8f978d799278cfadec4d391da 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -69,11 +69,11 @@ LLVector3 LLDrawPoolWater::sLightDir;
 LLDrawPoolWater::LLDrawPoolWater() :
 	LLFacePool(POOL_WATER)
 {
-	mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, TRUE);
+	mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI);
 	gGL.getTexUnit(0)->bind(mHBTex[0]) ;
 	mHBTex[0]->setAddressMode(LLTexUnit::TAM_CLAMP);
 
-	mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, TRUE);
+	mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI);
 	gGL.getTexUnit(0)->bind(mHBTex[1]);
 	mHBTex[1]->setAddressMode(LLTexUnit::TAM_CLAMP);
 
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 527656ab6b87f36a88f691b8cf4138f6b78da8ea..45f4b4fbd04c47edd184a1e806cca80d86eadbe8 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -224,7 +224,6 @@ void LLDriverParam::setAvatar(LLVOAvatar *avatarp)
 		}
 	}
 	*new_param = *this;
-	new_param->setIsDummy(FALSE);
 	return new_param;
 }
 
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 09b3ce1e863b4acc51ddf94b35ec3845875d4b48..8ec448e281c2339ec28e2783235380a66fbdab92 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -515,8 +515,8 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
 /* removed in lieu of raycast uv detection
 void LLFace::renderSelectedUV()
 {
-	LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, TRUE);
-	LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, TRUE);
+	LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, LLViewerTexture::BOOST_UI);
+	LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, LLViewerTexture::BOOST_UI);
 
 	LLGLSUVSelect object_select;
 
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index a6afbc05bec83aca4861353577882e17b3042e38..18135fc5587e51a762c6c2745e683bbda45d6157 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -437,7 +437,7 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
 			}
 			else
 			{
-				LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+				const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
 				if (item->getParentUUID() == favorites_id)
 				{
 					llwarns << "Attemt to copy a favorite item into the same folder." << llendl;
@@ -539,7 +539,7 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con
 	LLToolDragAndDrop* tool_dad = LLToolDragAndDrop::getInstance();
 	if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD)
 	{
-		viewer_item->setType(LLAssetType::AT_FAVORITE);
+		viewer_item->setType(LLAssetType::AT_LANDMARK);
 		copy_inventory_from_notecard(tool_dad->getObjectID(), tool_dad->getSourceID(), viewer_item.get(), gInventoryCallbacks.registerCB(cb));
 	}
 	else
@@ -561,7 +561,7 @@ void LLFavoritesBarCtrl::changed(U32 mask)
 {
 	if (mFavoriteFolderId.isNull())
 	{
-		mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+		mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
 		
 		if (mFavoriteFolderId.notNull())
 		{
@@ -750,6 +750,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
 			bparams.tab_stop(false);
 			bparams.font(mFont);
 			bparams.name(">>");
+			bparams.label(">>");
 			bparams.tool_tip(mChevronButtonToolTip);
 			bparams.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
 
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 88658f7b9f635581ffeb9973987d00ab18daec42..b01293d17c73ada9fc880c0e8f3f2c5c7cfd8796 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -1,343 +1,343 @@
-/** 
- * @file llfloaterabout.cpp
- * @author James Cook
- * @brief The about box from Help->About
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- * 
- * Copyright (c) 2001-2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
- 
-#include "llviewerprecompiledheaders.h"
-
-#include "llfloaterabout.h"
-
-// Viewer includes
-#include "llagent.h"
-#include "llappviewer.h" 
-#include "llsecondlifeurls.h"
-#include "llvoiceclient.h"
-#include "lluictrlfactory.h"
-#include "llviewertexteditor.h"
-#include "llviewercontrol.h"
-#include "llviewerstats.h"
-#include "llviewerregion.h"
-#include "llversionviewer.h"
-#include "llviewerbuild.h"
-#include "llweb.h"
-
-// Linden library includes
-#include "llaudioengine.h"
-#include "llbutton.h"
-#include "llcurl.h"
-#include "llglheaders.h"
-#include "llfloater.h"
-#include "llfloaterreg.h"
-#include "llimagej2c.h"
-#include "llsys.h"
-#include "lltrans.h"
-#include "lluri.h"
-#include "v3dmath.h"
-#include "llwindow.h"
-#include "stringize.h"
-#include "llsdutil_math.h"
-#include "lleventdispatcher.h"
-
-#if LL_WINDOWS
-#include "lldxhardware.h"
-#endif
-
-extern LLMemoryInfo gSysMemory;
-extern U32 gPacketsIn;
-
-static std::string get_viewer_release_notes_url();
-
-
-///----------------------------------------------------------------------------
-/// Class LLFloaterAbout
-///----------------------------------------------------------------------------
-class LLFloaterAbout 
-	: public LLFloater
-{
-	friend class LLFloaterReg;
-private:
-	LLFloaterAbout(const LLSD& key);
-	virtual ~LLFloaterAbout();
-
-public:
-	/*virtual*/ BOOL postBuild();
-
-	/// Obtain the data used to fill out the contents string. This is
-	/// separated so that we can programmatically access the same info.
-	static LLSD getInfo();
-	void onClickCopyToClipboard();
-};
-
-
-// Default constructor
-LLFloaterAbout::LLFloaterAbout(const LLSD& key) 
-:	LLFloater(key)
-{
-	//LLUICtrlFactory::getInstance()->buildFloater(this, "floater_about.xml");
-	
-}
-
-// Destroys the object
-LLFloaterAbout::~LLFloaterAbout()
-{
-}
-
-BOOL LLFloaterAbout::postBuild()
-{
-	center();
-	LLViewerTextEditor *support_widget = 
-		getChild<LLViewerTextEditor>("support_editor", true);
-
-	LLViewerTextEditor *credits_widget = 
-		getChild<LLViewerTextEditor>("credits_editor", true);
-
-	getChild<LLUICtrl>("copy_btn")->setCommitCallback(
-		boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
-
-#if LL_WINDOWS
-	getWindow()->incBusyCount();
-	getWindow()->setCursor(UI_CURSOR_ARROW);
-#endif
-	LLSD info(getInfo());
-#if LL_WINDOWS
-	getWindow()->decBusyCount();
-	getWindow()->setCursor(UI_CURSOR_ARROW);
-#endif
-
-	std::ostringstream support;
-
-	// Render the LLSD from getInfo() as a format_map_t
-	LLStringUtil::format_map_t args;
-	// For reasons I don't yet understand, [ReleaseNotes] is not part of the
-	// default substitution strings whereas [APP_NAME] is. But it works to
-	// simply copy it into these specific args.
-	args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
-	for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
-		 ii != iend; ++ii)
-	{
-		if (! ii->second.isArray())
-		{
-			// Scalar value
-			if (ii->second.isUndefined())
-			{
-				args[ii->first] = getString("none");
-			}
-			else
-			{
-				// don't forget to render value asString()
-				args[ii->first] = ii->second.asString();
-			}
-		}
-		else
-		{
-			// array value: build KEY_0, KEY_1 etc. entries
-			for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
-			{
-				args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
-			}
-		}
-	}
-
-	// Now build the various pieces
-	support << getString("AboutHeader", args);
-	if (info.has("COMPILER"))
-	{
-		support << "\n\n" << getString("AboutCompiler", args);
-	}
-	if (info.has("REGION"))
-	{
-		support << "\n\n" << getString("AboutPosition", args);
-	}
-	support << "\n\n" << getString("AboutSystem", args);
-	if (info.has("GRAPHICS_DRIVER_VERSION"))
-	{
-		support << "\n\n" << getString("AboutDriver", args);
-	}
-	support << "\n\n" << getString("AboutLibs", args);
-	if (info.has("PACKETS_IN"))
-	{
-		support << '\n' << getString("AboutTraffic", args);
-	}
-
-	support_widget->appendText(support.str(), 
-								FALSE, 
-								LLStyle::Params()
-									.color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
-	support_widget->blockUndo();
-
-	// Fix views
-	support_widget->setCursorPos(0);
-	support_widget->setEnabled(FALSE);
-
-	credits_widget->setCursorPos(0);
-	credits_widget->setEnabled(FALSE);
-
-	return TRUE;
-}
-
-// static
-LLSD LLFloaterAbout::getInfo()
-{
-	// The point of having one method build an LLSD info block and the other
-	// construct the user-visible About string is to ensure that the same info
-	// is available to a getInfo() caller as to the user opening
-	// LLFloaterAbout.
-	LLSD info;
-	LLSD version;
-	version.append(LL_VERSION_MAJOR);
-	version.append(LL_VERSION_MINOR);
-	version.append(LL_VERSION_PATCH);
-	version.append(LL_VERSION_BUILD);
-	info["VIEWER_VERSION"] = version;
-	info["VIEWER_VERSION_STR"] = STRINGIZE(version[0].asInteger() << '.' <<
-										   version[1].asInteger() << '.' <<
-										   version[2].asInteger() << '.' <<
-										   version[3].asInteger());
-	info["BUILD_DATE"] = __DATE__;
-	info["BUILD_TIME"] = __TIME__;
-	info["CHANNEL"] = gSavedSettings.getString("VersionChannelName");
-
-	info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url();
-
-#if LL_MSVC
-	info["COMPILER"] = "MSVC";
-	info["COMPILER_VERSION"] = _MSC_VER;
-#elif LL_GNUC
-	info["COMPILER"] = "GCC";
-	info["COMPILER_VERSION"] = GCC_VERSION;
-#endif
-
-	// Position
-	LLViewerRegion* region = gAgent.getRegion();
-	if (region)
-	{
-		const LLVector3d &pos = gAgent.getPositionGlobal();
-		info["POSITION"] = ll_sd_from_vector3d(pos);
-		info["REGION"] = gAgent.getRegion()->getName();
-		info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
-		info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
-		info["SERVER_VERSION"] = gLastVersionChannel;
-		info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));
-	}
-
-	// CPU
-	info["CPU"] = gSysCPU.getCPUString();
-	info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024);
-	// Moved hack adjustment to Windows memory size into llsys.cpp
-	info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString();
-	info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR));
-	info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
-
-#if LL_WINDOWS
-    LLSD driver_info = gDXHardware.getDisplayInfo();
-    if (driver_info.has("DriverVersion"))
-    {
-        info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
-    }
-#endif
-
-	info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION));
-	info["LIBCURL_VERSION"] = LLCurl::getVersionString();
-	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
-	bool want_fullname = true;
-	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
-	info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : "Unknown";
-
-	// TODO: Implement media plugin version query
-	info["QT_WEBKIT_VERSION"] = "4.5.2";
-
-	if (gPacketsIn > 0)
-	{
-		info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent();
-		info["PACKETS_IN"] = F32(gPacketsIn);
-		info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal();
-	}
-
-    return info;
-}
-
-static std::string get_viewer_release_notes_url()
-{
-	std::ostringstream version;
-	version << LL_VERSION_MAJOR << "."
-		<< LL_VERSION_MINOR << "."
-		<< LL_VERSION_PATCH << "."
-		<< LL_VERSION_BUILD;
-
-	LLSD query;
-	query["channel"] = gSavedSettings.getString("VersionChannelName");
-	query["version"] = version.str();
-
-	std::ostringstream url;
-	url << LLTrans::getString("RELEASE_NOTES_BASE_URL") << LLURI::mapToQueryString(query);
-
-	return LLWeb::escapeURL(url.str());
-}
-
-class LLFloaterAboutListener: public LLDispatchListener
-{
-public:
-	LLFloaterAboutListener():
-		LLDispatchListener("LLFloaterAbout", "op")
-	{
-		add("getInfo", &LLFloaterAboutListener::getInfo, LLSD().insert("reply", LLSD()));
-	}
-
-private:
-	void getInfo(const LLSD& request) const
-	{
-		LLReqID reqid(request);
-		LLSD reply(LLFloaterAbout::getInfo());
-		reqid.stamp(reply);
-		LLEventPumps::instance().obtain(request["reply"]).post(reply);
-	}
-};
-
-static LLFloaterAboutListener floaterAboutListener;
-
-void LLFloaterAbout::onClickCopyToClipboard()
-{
-	LLViewerTextEditor *support_widget = 
-		getChild<LLViewerTextEditor>("support_editor", true);
-	support_widget->selectAll();
-	support_widget->copy();
-	support_widget->deselect();
-}
-
-///----------------------------------------------------------------------------
-/// LLFloaterAboutUtil
-///----------------------------------------------------------------------------
-void LLFloaterAboutUtil::registerFloater()
-{
-	LLFloaterReg::add("sl_about", "floater_about.xml",
-		&LLFloaterReg::build<LLFloaterAbout>);
-
-}
+/** 
+ * @file llfloaterabout.cpp
+ * @author James Cook
+ * @brief The about box from Help->About
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+ 
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterabout.h"
+
+// Viewer includes
+#include "llagent.h"
+#include "llappviewer.h" 
+#include "llsecondlifeurls.h"
+#include "llvoiceclient.h"
+#include "lluictrlfactory.h"
+#include "llviewertexteditor.h"
+#include "llviewercontrol.h"
+#include "llviewerstats.h"
+#include "llviewerregion.h"
+#include "llversionviewer.h"
+#include "llviewerbuild.h"
+#include "llweb.h"
+
+// Linden library includes
+#include "llaudioengine.h"
+#include "llbutton.h"
+#include "llcurl.h"
+#include "llglheaders.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "llimagej2c.h"
+#include "llsys.h"
+#include "lltrans.h"
+#include "lluri.h"
+#include "v3dmath.h"
+#include "llwindow.h"
+#include "stringize.h"
+#include "llsdutil_math.h"
+#include "lleventdispatcher.h"
+
+#if LL_WINDOWS
+#include "lldxhardware.h"
+#endif
+
+extern LLMemoryInfo gSysMemory;
+extern U32 gPacketsIn;
+
+static std::string get_viewer_release_notes_url();
+
+
+///----------------------------------------------------------------------------
+/// Class LLFloaterAbout
+///----------------------------------------------------------------------------
+class LLFloaterAbout 
+	: public LLFloater
+{
+	friend class LLFloaterReg;
+private:
+	LLFloaterAbout(const LLSD& key);
+	virtual ~LLFloaterAbout();
+
+public:
+	/*virtual*/ BOOL postBuild();
+
+	/// Obtain the data used to fill out the contents string. This is
+	/// separated so that we can programmatically access the same info.
+	static LLSD getInfo();
+	void onClickCopyToClipboard();
+};
+
+
+// Default constructor
+LLFloaterAbout::LLFloaterAbout(const LLSD& key) 
+:	LLFloater(key)
+{
+	//LLUICtrlFactory::getInstance()->buildFloater(this, "floater_about.xml");
+	
+}
+
+// Destroys the object
+LLFloaterAbout::~LLFloaterAbout()
+{
+}
+
+BOOL LLFloaterAbout::postBuild()
+{
+	center();
+	LLViewerTextEditor *support_widget = 
+		getChild<LLViewerTextEditor>("support_editor", true);
+
+	LLViewerTextEditor *credits_widget = 
+		getChild<LLViewerTextEditor>("credits_editor", true);
+
+	getChild<LLUICtrl>("copy_btn")->setCommitCallback(
+		boost::bind(&LLFloaterAbout::onClickCopyToClipboard, this));
+
+#if LL_WINDOWS
+	getWindow()->incBusyCount();
+	getWindow()->setCursor(UI_CURSOR_ARROW);
+#endif
+	LLSD info(getInfo());
+#if LL_WINDOWS
+	getWindow()->decBusyCount();
+	getWindow()->setCursor(UI_CURSOR_ARROW);
+#endif
+
+	std::ostringstream support;
+
+	// Render the LLSD from getInfo() as a format_map_t
+	LLStringUtil::format_map_t args;
+	// For reasons I don't yet understand, [ReleaseNotes] is not part of the
+	// default substitution strings whereas [APP_NAME] is. But it works to
+	// simply copy it into these specific args.
+	args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
+	for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
+		 ii != iend; ++ii)
+	{
+		if (! ii->second.isArray())
+		{
+			// Scalar value
+			if (ii->second.isUndefined())
+			{
+				args[ii->first] = getString("none");
+			}
+			else
+			{
+				// don't forget to render value asString()
+				args[ii->first] = ii->second.asString();
+			}
+		}
+		else
+		{
+			// array value: build KEY_0, KEY_1 etc. entries
+			for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n)
+			{
+				args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString();
+			}
+		}
+	}
+
+	// Now build the various pieces
+	support << getString("AboutHeader", args);
+	if (info.has("COMPILER"))
+	{
+		support << "\n\n" << getString("AboutCompiler", args);
+	}
+	if (info.has("REGION"))
+	{
+		support << "\n\n" << getString("AboutPosition", args);
+	}
+	support << "\n\n" << getString("AboutSystem", args);
+	if (info.has("GRAPHICS_DRIVER_VERSION"))
+	{
+		support << "\n\n" << getString("AboutDriver", args);
+	}
+	support << "\n\n" << getString("AboutLibs", args);
+	if (info.has("PACKETS_IN"))
+	{
+		support << '\n' << getString("AboutTraffic", args);
+	}
+
+	support_widget->appendText(support.str(), 
+								FALSE, 
+								LLStyle::Params()
+									.color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor")));
+	support_widget->blockUndo();
+
+	// Fix views
+	support_widget->setCursorPos(0);
+	support_widget->setEnabled(FALSE);
+
+	credits_widget->setCursorPos(0);
+	credits_widget->setEnabled(FALSE);
+
+	return TRUE;
+}
+
+// static
+LLSD LLFloaterAbout::getInfo()
+{
+	// The point of having one method build an LLSD info block and the other
+	// construct the user-visible About string is to ensure that the same info
+	// is available to a getInfo() caller as to the user opening
+	// LLFloaterAbout.
+	LLSD info;
+	LLSD version;
+	version.append(LL_VERSION_MAJOR);
+	version.append(LL_VERSION_MINOR);
+	version.append(LL_VERSION_PATCH);
+	version.append(LL_VERSION_BUILD);
+	info["VIEWER_VERSION"] = version;
+	info["VIEWER_VERSION_STR"] = STRINGIZE(version[0].asInteger() << '.' <<
+										   version[1].asInteger() << '.' <<
+										   version[2].asInteger() << '.' <<
+										   version[3].asInteger());
+	info["BUILD_DATE"] = __DATE__;
+	info["BUILD_TIME"] = __TIME__;
+	info["CHANNEL"] = gSavedSettings.getString("VersionChannelName");
+
+	info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url();
+
+#if LL_MSVC
+	info["COMPILER"] = "MSVC";
+	info["COMPILER_VERSION"] = _MSC_VER;
+#elif LL_GNUC
+	info["COMPILER"] = "GCC";
+	info["COMPILER_VERSION"] = GCC_VERSION;
+#endif
+
+	// Position
+	LLViewerRegion* region = gAgent.getRegion();
+	if (region)
+	{
+		const LLVector3d &pos = gAgent.getPositionGlobal();
+		info["POSITION"] = ll_sd_from_vector3d(pos);
+		info["REGION"] = gAgent.getRegion()->getName();
+		info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
+		info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
+		info["SERVER_VERSION"] = gLastVersionChannel;
+		info["SERVER_RELEASE_NOTES_URL"] = LLWeb::escapeURL(region->getCapability("ServerReleaseNotes"));
+	}
+
+	// CPU
+	info["CPU"] = gSysCPU.getCPUString();
+	info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024);
+	// Moved hack adjustment to Windows memory size into llsys.cpp
+	info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString();
+	info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR));
+	info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER));
+
+#if LL_WINDOWS
+    LLSD driver_info = gDXHardware.getDisplayInfo();
+    if (driver_info.has("DriverVersion"))
+    {
+        info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"];
+    }
+#endif
+
+	info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION));
+	info["LIBCURL_VERSION"] = LLCurl::getVersionString();
+	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
+	bool want_fullname = true;
+	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
+	info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : "Unknown";
+
+	// TODO: Implement media plugin version query
+	info["QT_WEBKIT_VERSION"] = "4.5.2";
+
+	if (gPacketsIn > 0)
+	{
+		info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent();
+		info["PACKETS_IN"] = F32(gPacketsIn);
+		info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal();
+	}
+
+    return info;
+}
+
+static std::string get_viewer_release_notes_url()
+{
+	std::ostringstream version;
+	version << LL_VERSION_MAJOR << "."
+		<< LL_VERSION_MINOR << "."
+		<< LL_VERSION_PATCH << "."
+		<< LL_VERSION_BUILD;
+
+	LLSD query;
+	query["channel"] = gSavedSettings.getString("VersionChannelName");
+	query["version"] = version.str();
+
+	std::ostringstream url;
+	url << LLTrans::getString("RELEASE_NOTES_BASE_URL") << LLURI::mapToQueryString(query);
+
+	return LLWeb::escapeURL(url.str());
+}
+
+class LLFloaterAboutListener: public LLDispatchListener
+{
+public:
+	LLFloaterAboutListener():
+		LLDispatchListener("LLFloaterAbout", "op")
+	{
+		add("getInfo", &LLFloaterAboutListener::getInfo, LLSD().insert("reply", LLSD()));
+	}
+
+private:
+	void getInfo(const LLSD& request) const
+	{
+		LLReqID reqid(request);
+		LLSD reply(LLFloaterAbout::getInfo());
+		reqid.stamp(reply);
+		LLEventPumps::instance().obtain(request["reply"]).post(reply);
+	}
+};
+
+static LLFloaterAboutListener floaterAboutListener;
+
+void LLFloaterAbout::onClickCopyToClipboard()
+{
+	LLViewerTextEditor *support_widget = 
+		getChild<LLViewerTextEditor>("support_editor", true);
+	support_widget->selectAll();
+	support_widget->copy();
+	support_widget->deselect();
+}
+
+///----------------------------------------------------------------------------
+/// LLFloaterAboutUtil
+///----------------------------------------------------------------------------
+void LLFloaterAboutUtil::registerFloater()
+{
+	LLFloaterReg::add("sl_about", "floater_about.xml",
+		&LLFloaterReg::build<LLFloaterAbout>);
+
+}
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 55b7ed0c99c5cbec20245f3c2e9285a54ab1208a..095fe0a220faa97437f3b0269994828f737b64ad 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -989,7 +989,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
 						    name,
 						    desc,
 						    0,
-						    LLAssetType::AT_NONE,
+						    LLFolderType::FT_NONE,
 						    LLInventoryType::IT_ANIMATION,
 						    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
 						    name,
diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp
index a73ebf4e06f9dc7a82c9773902e41ac024e70625..538b44c056553cbf7129391419f6ba101021cf1b 100644
--- a/indra/newview/llfloaterbulkpermission.cpp
+++ b/indra/newview/llfloaterbulkpermission.cpp
@@ -72,8 +72,6 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)
 
 BOOL LLFloaterBulkPermission::postBuild()
 {
-//	childSetAction("help", onHelpBtn, this);  // this is not in use
-
 	return TRUE;
 }
 
@@ -157,12 +155,6 @@ void LLFloaterBulkPermission::onApplyBtn()
 	doApply();
 }
 
-// angela -- this is not in use
-//void LLFloaterBulkPermission::onHelpBtn(void* user_data)
-//{
-//	LLNotifications::instance().add("HelpBulkPermission");
-//}
-
 void LLFloaterBulkPermission::onCloseBtn()
 {
 	closeFloater();
@@ -272,7 +264,6 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, Invent
 			( asstype == LLAssetType::AT_BODYPART  && gSavedSettings.getBOOL("BulkChangeIncludeBodyParts" )) ||
 			( asstype == LLAssetType::AT_CLOTHING  && gSavedSettings.getBOOL("BulkChangeIncludeClothing"  )) ||
 			( asstype == LLAssetType::AT_GESTURE   && gSavedSettings.getBOOL("BulkChangeIncludeGestures"  )) ||
-			( asstype == LLAssetType::AT_FAVORITE  && gSavedSettings.getBOOL("BulkChangeIncludeFavourite" )) ||
 			( asstype == LLAssetType::AT_NOTECARD  && gSavedSettings.getBOOL("BulkChangeIncludeNotecards" )) ||
 			( asstype == LLAssetType::AT_OBJECT    && gSavedSettings.getBOOL("BulkChangeIncludeObjects"   )) ||
 			( asstype == LLAssetType::AT_LSL_TEXT  && gSavedSettings.getBOOL("BulkChangeIncludeScripts"   )) ||
diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h
index c34e4413ccc94ed412f871be3de21f58b615af0c..31f4f5c3e169abf88556776b73872c523db13b82 100644
--- a/indra/newview/llfloaterbulkpermission.h
+++ b/indra/newview/llfloaterbulkpermission.h
@@ -79,7 +79,6 @@ class LLFloaterBulkPermission : public LLFloater, public LLVOInventoryListener
 								U8 key,
 								bool is_new);
 
-//	static void onHelpBtn(void* user_data);
 	void onCloseBtn();
 	void onApplyBtn();
 	void onCommitCopy();
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index 9d07362edc8a49b4abaa554ae02cdcf3ac433190..cefd7a38080814af9de090bdf3cd0a47ee46fd5f 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -45,6 +45,7 @@
 #include "llinventorymodel.h"	// for gInventory
 #include "llfloaterreg.h"
 #include "llfloaterinventory.h"	// for get_item_icon
+#include "llinventoryfunctions.h"
 #include "llselectmgr.h"
 #include "llscrolllistctrl.h"
 #include "llviewerobject.h"
@@ -292,7 +293,7 @@ void LLFloaterBuy::onClickBuy()
 {
 	// Put the items where we put new folders.
 	LLUUID category_id;
-	category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
+	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
 
 	// *NOTE: doesn't work for multiple object buy, which UI does not
 	// currently support sale info is used for verification only, if
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index 3a4171c6bee770113e002a9195f8db8305f9fb30..32802f6a20055309e97088ffdc246e1ff0f94f16 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -45,6 +45,7 @@
 #include "llagent.h"			// for agent id
 #include "llalertdialog.h"
 #include "llcheckboxctrl.h"
+#include "llinventoryfunctions.h"
 #include "llinventorymodel.h"	// for gInventory
 #include "llfloaterreg.h"
 #include "llfloaterinventory.h"	// for get_item_icon
@@ -280,12 +281,12 @@ void LLFloaterBuyContents::onClickBuy()
 	// We may want to wear this item
 	if (childGetValue("wear_check"))
 	{
-		LLFloaterInventory::sWearNewClothing = TRUE;
+		LLInventoryState::sWearNewClothing = TRUE;
 	}
 
 	// Put the items where we put new folders.
 	LLUUID category_id;
-	category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CATEGORY);
+	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CATEGORY);
 
 	// *NOTE: doesn't work for multiple object buy, which UI does not
 	// currently support sale info is used for verification only, if
diff --git a/indra/newview/llfloaterdaycycle.cpp b/indra/newview/llfloaterdaycycle.cpp
index 7f3b988dfe2cc0a540e02bf92cd1d752ef38bff7..48d552022f981e33f07e3e298163183a8e321cc7 100644
--- a/indra/newview/llfloaterdaycycle.cpp
+++ b/indra/newview/llfloaterdaycycle.cpp
@@ -105,20 +105,8 @@ LLFloaterDayCycle::~LLFloaterDayCycle()
 {
 }
 
-void LLFloaterDayCycle::onClickHelp(std::string xml_alert)
-{
-	LLNotifications::instance().add(contextualNotification(xml_alert));
-}
-
-void LLFloaterDayCycle::initHelpBtn(const std::string& name, const std::string& xml_alert)
-{
-	getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterDayCycle::onClickHelp, this, xml_alert));
-}
-
 void LLFloaterDayCycle::initCallbacks(void) 
 {
-	initHelpBtn("WLDayCycleHelp", "HelpDayCycle");
-
 	// WL Day Cycle
 	getChild<LLUICtrl>("WLTimeSlider")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onTimeSliderMoved, this, _1));
 	getChild<LLUICtrl>("WLDayCycleKeys")->setCommitCallback(boost::bind(&LLFloaterDayCycle::onKeyTimeMoved, this, _1));
diff --git a/indra/newview/llfloaterdaycycle.h b/indra/newview/llfloaterdaycycle.h
index 43c347d4f21d14bae9f8c4f2a4e2cb5093c8610a..c250902b6566487ad68048674013fa12f807b1c4 100644
--- a/indra/newview/llfloaterdaycycle.h
+++ b/indra/newview/llfloaterdaycycle.h
@@ -59,9 +59,6 @@ class LLFloaterDayCycle : public LLFloater
 	LLFloaterDayCycle(const LLSD& key);
 	virtual ~LLFloaterDayCycle();
 	/*virtual*/	BOOL	postBuild();
-	/// help button stuff
-	void onClickHelp(std::string xml_alert);
-	void initHelpBtn(const std::string& name, const std::string& xml_alert);
 
 	/// initialize all
 	void initCallbacks(void);
diff --git a/indra/newview/llfloaterenvsettings.cpp b/indra/newview/llfloaterenvsettings.cpp
index a520df36dec3e461e5f039f994fef903c0ec19b0..2fffa6eece2bd366576f432d28efcd5cc823a805 100644
--- a/indra/newview/llfloaterenvsettings.cpp
+++ b/indra/newview/llfloaterenvsettings.cpp
@@ -70,10 +70,6 @@ BOOL LLFloaterEnvSettings::postBuild()
 	syncMenu();
 	return TRUE;
 }
-void LLFloaterEnvSettings::onClickHelp()
-{
-	LLNotifications::instance().add(contextualNotification("EnvSettingsHelpButton"));
-}
 
 void LLFloaterEnvSettings::initCallbacks(void) 
 {
@@ -89,10 +85,8 @@ void LLFloaterEnvSettings::initCallbacks(void)
 	getChild<LLUICtrl>("EnvAdvancedSkyButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedSky, this));
  	getChild<LLUICtrl>("EnvAdvancedWaterButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onOpenAdvancedWater, this));
 	getChild<LLUICtrl>("EnvUseEstateTimeButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onUseEstateTime, this));
-	getChild<LLUICtrl>("EnvSettingsHelpButton")->setCommitCallback(boost::bind(&LLFloaterEnvSettings::onClickHelp, this));
 }
 
-
 // menu maintenance functions
 
 void LLFloaterEnvSettings::syncMenu()
diff --git a/indra/newview/llfloaterenvsettings.h b/indra/newview/llfloaterenvsettings.h
index 083e3636d1b6e3d8c6268cf5e4c7e246d820b12a..02bc5021207f0773380e4d475e1b527c4dcac830 100644
--- a/indra/newview/llfloaterenvsettings.h
+++ b/indra/newview/llfloaterenvsettings.h
@@ -53,9 +53,6 @@ class LLFloaterEnvSettings : public LLFloater
 	/// initialize all the callbacks for the menu
 	void initCallbacks(void);
 
-	/// callback for the menus help button
-	void onClickHelp();
-	
 	/// handle if time of day is changed
 	void onChangeDayTime(LLUICtrl* ctrl);
 
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 1300103423ce0a37613b4347f545cfc104ac72eb..c114eed4a2485f043893be704ecde429cb3bb16c 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -44,6 +44,7 @@
 #include "llcombobox.h"
 #include "llgesturemgr.h"
 #include "llinventorymodel.h"
+#include "llinventorypanel.h"
 #include "llfloaterinventory.h"
 #include "llkeyboard.h"
 #include "lllineeditor.h"
diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp
index 9947cdc2173c02f882d8f3ff00ce524a23c7940d..31b494b590d0c1581a4c4cbf233b694d64f9677a 100644
--- a/indra/newview/llfloaterhardwaresettings.cpp
+++ b/indra/newview/llfloaterhardwaresettings.cpp
@@ -59,12 +59,6 @@ LLFloaterHardwareSettings::~LLFloaterHardwareSettings()
 {
 }
 
-void LLFloaterHardwareSettings::onClickHelp(void* data)
-{
-	const char* xml_alert = "HardwareSettingsHelpButton";
-	LLNotifications::instance().add(xml_alert);
-}
-
 void LLFloaterHardwareSettings::initCallbacks(void) 
 {
 }
diff --git a/indra/newview/llfloaterhardwaresettings.h b/indra/newview/llfloaterhardwaresettings.h
index 3f19d89cbbbc7ed78965bf1410a5ec02642742db..ef0b0c905e027ed324d5c5e3b2a453a1aaf81b7e 100644
--- a/indra/newview/llfloaterhardwaresettings.h
+++ b/indra/newview/llfloaterhardwaresettings.h
@@ -50,9 +50,6 @@ class LLFloaterHardwareSettings : public LLFloater
 	/// initialize all the callbacks for the menu
 	void initCallbacks(void);
 
-	/// callback for the menus help button
-	static void onClickHelp(void* data);
-
 	/// OK button
 	static void onBtnOK( void* userdata );
 	
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index a47916b7d7b591905e48e1ef2d6dba68babefb07..92778510e70fb13fc47bcf49e8f566261ab88025 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -32,539 +32,35 @@
 
 #include "llviewerprecompiledheaders.h"
 
-#include <utility> // for std::pair<>
-
 #include "llfloaterinventory.h"
 
-// library includes
 #include "llagent.h"
-#include "llagentwearables.h"
-#include "llcallingcard.h"
-#include "llfloaterreg.h"
-#include "llsdserialize.h"
-#include "llfiltereditor.h"
-#include "llspinctrl.h"
-#include "llui.h"
-#include "message.h"
-
-// newview includes
-#include "llappearancemgr.h"
-#include "llappviewer.h"
 #include "llfirstuse.h"
-#include "llfloaterchat.h"
-#include "llfloatercustomize.h"
-#include "llfocusmgr.h"
-#include "llfolderview.h"
-#include "llgesturemgr.h"
-#include "lliconctrl.h"
-#include "llimview.h"
-#include "llinventorybridge.h"
-#include "llinventoryclipboard.h"
+#include "llfloaterreg.h"
 #include "llinventorymodel.h"
-#include "lllineeditor.h"
-#include "llmenugl.h"
-#include "llpreviewanim.h"
-#include "llpreviewgesture.h"
-#include "llpreviewnotecard.h"
-#include "llpreviewscript.h"
-#include "llpreviewsound.h"
-#include "llpreviewtexture.h"
+#include "llpanelmaininventory.h"
 #include "llresmgr.h"
-#include "llscrollbar.h"
-#include "llscrollcontainer.h"
-#include "llselectmgr.h"
-#include "lltabcontainer.h"
-#include "lltooldraganddrop.h"
-#include "lluictrlfactory.h"
-#include "llviewerinventory.h"
-#include "llviewermessage.h"
-#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
-#include "llviewerwindow.h"
-#include "llvoavatarself.h"
-#include "llwearablelist.h"
-
-static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
-
-//BOOL LLFloaterInventory::sOpenNextNewItem = FALSE;
-BOOL LLFloaterInventory::sWearNewClothing = FALSE;
-LLUUID LLFloaterInventory::sWearNewClothingTransactionID;
-
-///----------------------------------------------------------------------------
-/// LLFloaterInventoryFinder
-///----------------------------------------------------------------------------
-
-LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLFloaterInventory* inventory_view)
-:	LLFloater(LLSD()),
-	mFloaterInventory(inventory_view),
-	mFilter(inventory_view->mActivePanel->getFilter())
-{
-	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL);
-	updateElementsFromFilter();
-}
-
-
-void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data)
-{
-	LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
-	if (!self) return;
-
-	bool since_logoff= self->childGetValue("check_since_logoff");
-	
-	if (!since_logoff && 
-	    !(  self->mSpinSinceDays->get() ||  self->mSpinSinceHours->get() ) )
-	{
-		self->mSpinSinceHours->set(1.0f);
-	}	
-}
-BOOL LLFloaterInventoryFinder::postBuild()
-{
-	const LLRect& viewrect = mFloaterInventory->getRect();
-	setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight()));
-
-	childSetAction("All", selectAllTypes, this);
-	childSetAction("None", selectNoTypes, this);
-
-	mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago");
-	childSetCommitCallback("spin_hours_ago", onTimeAgo, this);
-
-	mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
-	childSetCommitCallback("spin_days_ago", onTimeAgo, this);
-
-	//	mCheckSinceLogoff   = getChild<LLSpinCtrl>("check_since_logoff");
-	childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this);
-
-	childSetAction("Close", onCloseBtn, this);
-
-	updateElementsFromFilter();
-	return TRUE;
-}
-void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
-{
-	LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
-	if (!self) return;
-	
-	bool since_logoff=true;
-	if ( self->mSpinSinceDays->get() ||  self->mSpinSinceHours->get() )
-	{
-		since_logoff = false;
-	}
-	self->childSetValue("check_since_logoff", since_logoff);
-}
-
-void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
-{
-	mFilter = filter;
-	updateElementsFromFilter();
-}
-
-void LLFloaterInventoryFinder::updateElementsFromFilter()
-{
-	if (!mFilter)
-		return;
-
-	// Get data needed for filter display
-	U32 filter_types = mFilter->getFilterTypes();
-	std::string filter_string = mFilter->getFilterSubString();
-	LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
-	U32 hours = mFilter->getHoursAgo();
-
-	// update the ui elements
-	LLFloater::setTitle(mFilter->getName());
-	childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
-
-	childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
-	childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
-	childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
-	childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
-	childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
-	childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
-	childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
-	childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
-	childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
-	childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
-	childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
-	childSetValue("check_since_logoff", mFilter->isSinceLogoff());
-	mSpinSinceHours->set((F32)(hours % 24));
-	mSpinSinceDays->set((F32)(hours / 24));
-}
-
-void LLFloaterInventoryFinder::draw()
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW);
-	U32 filter = 0xffffffff;
-	BOOL filtered_by_all_types = TRUE;
-
-	if (!childGetValue("check_animation"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_ANIMATION);
-		filtered_by_all_types = FALSE;
-	}
-
-
-	if (!childGetValue("check_calling_card"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_clothing"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_WEARABLE);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_gesture"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_GESTURE);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_landmark"))
-
-
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_notecard"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_object"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_OBJECT);
-		filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_script"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_LSL);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_sound"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_SOUND);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_texture"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_TEXTURE);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!childGetValue("check_snapshot"))
-	{
-		filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT);
-		filtered_by_all_types = FALSE;
-	}
-
-	if (!filtered_by_all_types)
-	{
-		// don't include folders in filter, unless I've selected everything
-		filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
-	}
-
-	// update the panel, panel will update the filter
-	mFloaterInventory->mActivePanel->setShowFolderState(getCheckShowEmpty() ?
-		LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-	mFloaterInventory->mActivePanel->setFilterTypes(filter);
-	if (getCheckSinceLogoff())
-	{
-		mSpinSinceDays->set(0);
-		mSpinSinceHours->set(0);
-	}
-	U32 days = (U32)mSpinSinceDays->get();
-	U32 hours = (U32)mSpinSinceHours->get();
-	if (hours > 24)
-	{
-		days += hours / 24;
-		hours = (U32)hours % 24;
-		mSpinSinceDays->set((F32)days);
-		mSpinSinceHours->set((F32)hours);
-	}
-	hours += days * 24;
-	mFloaterInventory->mActivePanel->setHoursAgo(hours);
-	mFloaterInventory->mActivePanel->setSinceLogoff(getCheckSinceLogoff());
-	mFloaterInventory->setFilterTextFromFilter();
-
-	LLFloater::draw();
-}
-
-BOOL LLFloaterInventoryFinder::getCheckShowEmpty()
-{
-	return childGetValue("check_show_empty");
-}
-
-BOOL LLFloaterInventoryFinder::getCheckSinceLogoff()
-{
-	return childGetValue("check_since_logoff");
-}
-
-void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
-{
-	LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;
-	finderp->closeFloater();
-}
-
-// static
-void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
-{
-	LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
-	if(!self) return;
-
-	self->childSetValue("check_animation", TRUE);
-	self->childSetValue("check_calling_card", TRUE);
-	self->childSetValue("check_clothing", TRUE);
-	self->childSetValue("check_gesture", TRUE);
-	self->childSetValue("check_landmark", TRUE);
-	self->childSetValue("check_notecard", TRUE);
-	self->childSetValue("check_object", TRUE);
-	self->childSetValue("check_script", TRUE);
-	self->childSetValue("check_sound", TRUE);
-	self->childSetValue("check_texture", TRUE);
-	self->childSetValue("check_snapshot", TRUE);
-
-/*
-	self->mCheckCallingCard->set(TRUE);
-	self->mCheckClothing->set(TRUE);
-	self->mCheckGesture->set(TRUE);
-	self->mCheckLandmark->set(TRUE);
-	self->mCheckNotecard->set(TRUE);
-	self->mCheckObject->set(TRUE);
-	self->mCheckScript->set(TRUE);
-	self->mCheckSound->set(TRUE);
-	self->mCheckTexture->set(TRUE);
-	self->mCheckSnapshot->set(TRUE);*/
-}
-
-//static
-void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
-{
-	LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
-	if(!self) return;
-
-	/*
-	self->childSetValue("check_animation", FALSE);
-	self->mCheckCallingCard->set(FALSE);
-	self->mCheckClothing->set(FALSE);
-	self->mCheckGesture->set(FALSE);
-	self->mCheckLandmark->set(FALSE);
-	self->mCheckNotecard->set(FALSE);
-	self->mCheckObject->set(FALSE);
-	self->mCheckScript->set(FALSE);
-	self->mCheckSound->set(FALSE);
-	self->mCheckTexture->set(FALSE);
-	self->mCheckSnapshot->set(FALSE);*/
-
-
-	self->childSetValue("check_animation", FALSE);
-	self->childSetValue("check_calling_card", FALSE);
-	self->childSetValue("check_clothing", FALSE);
-	self->childSetValue("check_gesture", FALSE);
-	self->childSetValue("check_landmark", FALSE);
-	self->childSetValue("check_notecard", FALSE);
-	self->childSetValue("check_object", FALSE);
-	self->childSetValue("check_script", FALSE);
-	self->childSetValue("check_sound", FALSE);
-	self->childSetValue("check_texture", FALSE);
-	self->childSetValue("check_snapshot", FALSE);
-}
-
+#include "llviewerfoldertype.h"
 
 ///----------------------------------------------------------------------------
 /// LLFloaterInventory
 ///----------------------------------------------------------------------------
-void LLSaveFolderState::setApply(BOOL apply)
-{
-	mApply = apply; 
-	// before generating new list of open folders, clear the old one
-	if(!apply) 
-	{
-		clearOpenFolders(); 
-	}
-}
-
-void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER);
-	if(mApply)
-	{
-		// we're applying the open state
-		LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
-		if(!bridge) return;
-		LLUUID id(bridge->getUUID());
-		if(mOpenFolders.find(id) != mOpenFolders.end())
-		{
-			folder->setOpen(TRUE);
-		}
-		else
-		{
-			// keep selected filter in its current state, this is less jarring to user
-			if (!folder->isSelected())
-			{
-				folder->setOpen(FALSE);
-			}
-		}
-	}
-	else
-	{
-		// we're recording state at this point
-		if(folder->isOpen())
-		{
-			LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
-			if(!bridge) return;
-			mOpenFolders.insert(bridge->getUUID());
-		}
-	}
-}
 
 LLFloaterInventory::LLFloaterInventory(const LLSD& key)
 	: LLFloater(key)
 {
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT);
-	// Menu Callbacks (non contex menus)
-	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLFloaterInventory::doToSelected, this, _2));
-	mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLFloaterInventory::closeAllFolders, this));
-	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH));
-	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND));
-	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLFloaterInventory::doCreate, this, _2));
-// 	mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::newWindow, this));
-	mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLFloaterInventory::toggleFindOptions, this));
-	mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLFloaterInventory::resetFilters, this));
-	mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLFloaterInventory::setSortBy, this, _2));
-
-	// Controls
-	// *TODO: Just use persistant settings for each of these
-	U32 sort_order = gSavedSettings.getU32("InventorySortOrder");
-	BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE );
-	BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME );
-	BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP );
-	
-	gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE);
-	gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE);
-	gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE);
-	gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE);
-	
-	mSavedFolderState = new LLSaveFolderState();
-	mSavedFolderState->setApply(FALSE);
+}
 
-	//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory.xml");
+LLFloaterInventory::~LLFloaterInventory()
+{
 }
 
 BOOL LLFloaterInventory::postBuild()
 {
-	gInventory.addObserver(this);
-	
-	mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");
-	mFilterTabs->setCommitCallback(boost::bind(&LLFloaterInventory::onFilterSelected, this));
-	
-	//panel->getFilter()->markDefault();
-
-	// Set up the default inv. panel/filter settings.
-	mActivePanel = getChild<LLInventoryPanel>("All Items");
-	if (mActivePanel)
-	{
-		// "All Items" is the previous only view, so it gets the InventorySortOrder
-		mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder"));
-		mActivePanel->getFilter()->markDefault();
-		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
-		mActivePanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mActivePanel, _1, _2));
-	}
-	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
-	if (recent_items_panel)
-	{
-		recent_items_panel->setSinceLogoff(TRUE);
-		recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
-		recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
-		recent_items_panel->getFilter()->markDefault();
-		recent_items_panel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, recent_items_panel, _1, _2));
-	}
-
-	// Now load the stored settings from disk, if available.
-	std::ostringstream filterSaveName;
-	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
-	llinfos << "LLFloaterInventory::init: reading from " << filterSaveName << llendl;
-	llifstream file(filterSaveName.str());
-	LLSD savedFilterState;
-	if (file.is_open())
-	{
-		LLSDSerialize::fromXML(savedFilterState, file);
-		file.close();
-
-		// Load the persistent "Recent Items" settings.
-		// Note that the "All Items" settings do not persist.
-		if(recent_items_panel)
-		{
-			if(savedFilterState.has(recent_items_panel->getFilter()->getName()))
-			{
-				LLSD recent_items = savedFilterState.get(
-					recent_items_panel->getFilter()->getName());
-				recent_items_panel->getFilter()->fromLLSD(recent_items);
-			}
-		}
-
-	}
-
-
-	mFilterEditor = getChild<LLFilterEditor>("inventory search editor");
-	if (mFilterEditor)
-	{
-		mFilterEditor->setCommitCallback(boost::bind(&LLFloaterInventory::onFilterEdit, this, _2));
-	}
-
-	// *TODO:Get the cost info from the server
-	const std::string upload_cost("10");
-	childSetLabelArg("Upload Image", "[COST]", upload_cost);
-	childSetLabelArg("Upload Sound", "[COST]", upload_cost);
-	childSetLabelArg("Upload Animation", "[COST]", upload_cost);
-	childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
-	
+	mPanelMainInventory = getChild<LLPanelMainInventory>("Inventory Panel");
 	return TRUE;
 }
 
-// Destroys the object
-LLFloaterInventory::~LLFloaterInventory( void )
-{
-	// Save the filters state.
-	LLSD filterRoot;
-	LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");
-	if (all_items_panel)
-	{
-		LLInventoryFilter* filter = all_items_panel->getFilter();
-		LLSD filterState;
-		filter->toLLSD(filterState);
-		filterRoot[filter->getName()] = filterState;
-	}
-
-	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
-	if (recent_items_panel)
-	{
-		LLInventoryFilter* filter = recent_items_panel->getFilter();
-		LLSD filterState;
-		filter->toLLSD(filterState);
-		filterRoot[filter->getName()] = filterState;
-	}
-
-	std::ostringstream filterSaveName;
-	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
-	llofstream filtersFile(filterSaveName.str());
-	if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile))
-	{
-		llwarns << "Could not write to filters save file " << filterSaveName << llendl;
-	}
-	else
-		filtersFile.close();
-
-	gInventory.removeObserver(this);
-	delete mSavedFolderState;
-}
 
 void LLFloaterInventory::draw()
 {
@@ -575,113 +71,6 @@ void LLFloaterInventory::draw()
 	LLFloater::draw();
 }
 
-void LLOpenFilteredFolders::doItem(LLFolderViewItem *item)
-{
-	if (item->getFiltered())
-	{
-		item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
-	}
-}
-
-void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder)
-{
-	if (folder->getFiltered() && folder->getParentFolder())
-	{
-		folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
-	}
-	// if this folder didn't pass the filter, and none of its descendants did
-	else if (!folder->getFiltered() && !folder->hasFilteredDescendants())
-	{
-		folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_NO);
-	}
-}
-
-void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
-{
-	if (item->getFiltered() && !mItemSelected)
-	{
-		item->getRoot()->setSelection(item, FALSE, FALSE);
-		if (item->getParentFolder())
-		{
-			item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
-		}
-		item->getRoot()->scrollToShowSelection();
-		mItemSelected = TRUE;
-	}
-}
-
-void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder)
-{
-	if (folder->getFiltered() && !mItemSelected)
-	{
-		folder->getRoot()->setSelection(folder, FALSE, FALSE);
-		if (folder->getParentFolder())
-		{
-			folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
-		}
-		folder->getRoot()->scrollToShowSelection();
-		mItemSelected = TRUE;
-	}
-}
-
-void LLOpenFoldersWithSelection::doItem(LLFolderViewItem *item)
-{
-	if (item->getParentFolder() && item->isSelected())
-	{
-		item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
-	}
-}
-
-void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
-{
-	if (folder->getParentFolder() && folder->isSelected())
-	{
-		folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
-	}
-}
-
-void LLFloaterInventory::startSearch()
-{
-	// this forces focus to line editor portion of search editor
-	if (mFilterEditor)
-	{
-		mFilterEditor->focusFirstItem(TRUE);
-	}
-}
-
-void LLFloaterInventory::onOpen(const LLSD& key)
-{
-	LLFirstUse::useInventory();
-}
-
-BOOL LLFloaterInventory::handleKeyHere(KEY key, MASK mask)
-{
-	LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL;
-	if (root_folder)
-	{
-		// first check for user accepting current search results
-		if (mFilterEditor 
-			&& mFilterEditor->hasFocus()
-		    && (key == KEY_RETURN 
-		    	|| key == KEY_DOWN)
-		    && mask == MASK_NONE)
-		{
-			// move focus to inventory proper
-			mActivePanel->setFocus(TRUE);
-			root_folder->scrollToShowSelection();
-			return TRUE;
-		}
-
-		if (mActivePanel->hasFocus() && key == KEY_UP)
-		{
-			startSearch();
-		}
-	}
-
-	return LLFloater::handleKeyHere(key, mask);
-
-}
-
 void LLFloaterInventory::updateTitle()
 {
 	LLLocale locale(LLLocale::USER_LOCALE);
@@ -690,7 +79,7 @@ void LLFloaterInventory::updateTitle()
 
 	LLStringUtil::format_map_t string_args;
 	string_args["[ITEM_COUNT]"] = item_count_string;
-	string_args["[FILTER]"] = mFilterText;
+	string_args["[FILTER]"] = mPanelMainInventory->getFilterText();
 
 	if (LLInventoryModel::backgroundFetchActive())
 	{
@@ -699,123 +88,42 @@ void LLFloaterInventory::updateTitle()
 	else
 	{
 		setTitle(getString("TitleCompleted", string_args));
-	}	
+	}
 }
 
-
 void LLFloaterInventory::changed(U32 mask)
 {
 	updateTitle();
 }
 
-//----------------------------------------------------------------------------
-// menu callbacks
-
-void LLFloaterInventory::doToSelected(const LLSD& userdata)
-{
-	getPanel()->getRootFolder()->doToSelected(&gInventory, userdata);
-}
-
-void LLFloaterInventory::closeAllFolders()
-{
-	getPanel()->getRootFolder()->closeAllFolders();
-}
-
-void LLFloaterInventory::doCreate(const LLSD& userdata)
+LLInventoryPanel* LLFloaterInventory::getPanel()
 {
-	menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata);
+	if (mPanelMainInventory)
+		return mPanelMainInventory->getPanel();
+	return NULL;
 }
 
-void LLFloaterInventory::resetFilters()
+// static
+LLFloaterInventory* LLFloaterInventory::showAgentInventory()
 {
-	LLFloaterInventoryFinder *finder = getFinder();
-	getActivePanel()->getFilter()->resetDefault();
-	if (finder)
+	LLFloaterInventory* iv = NULL;
+	if (!gAgent.cameraMouselook())
 	{
-		finder->updateElementsFromFilter();
+		iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD());
 	}
-
-	setFilterTextFromFilter();
+	return iv;
 }
 
-void LLFloaterInventory::setSortBy(const LLSD& userdata)
+// static
+LLFloaterInventory* LLFloaterInventory::getActiveInventory()
 {
-	std::string sort_field = userdata.asString();
-	if (sort_field == "name")
-	{
-		U32 order = getActivePanel()->getSortOrder();
-		getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE );
-			
-		gSavedSettings.setBOOL("Inventory.SortByName", TRUE );
-		gSavedSettings.setBOOL("Inventory.SortByDate", FALSE );
-	}
-	else if (sort_field == "date")
-	{
-		U32 order = getActivePanel()->getSortOrder();
-		getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE );
-
-		gSavedSettings.setBOOL("Inventory.SortByName", FALSE );
-		gSavedSettings.setBOOL("Inventory.SortByDate", TRUE );
-	}
-	else if (sort_field == "foldersalwaysbyname")
+	LLFloaterInventory* res = NULL;
+	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+	S32 z_min = S32_MAX;
+	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
 	{
-		U32 order = getActivePanel()->getSortOrder();
-		if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME )
-		{
-			order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
-
-			gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE );
-		}
-		else
-		{
-			order |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
-
-			gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE );
-		}
-		getActivePanel()->setSortOrder( order );
-	}
-	else if (sort_field == "systemfolderstotop")
-	{
-		U32 order = getActivePanel()->getSortOrder();
-		if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
-		{
-			order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
-
-			gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE );
-		}
-		else
-		{
-			order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
-
-			gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE );
-		}
-		getActivePanel()->setSortOrder( order );
-	}
-}
-
-//----------------------------------------------------------------------------
-
-// static
-LLFloaterInventory* LLFloaterInventory::showAgentInventory()
-{
-	LLFloaterInventory* iv = NULL;
-	if (!gAgent.cameraMouselook())
-	{
-		iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD());
-	}
-	return iv;
-}
-
-// static
-LLFloaterInventory* LLFloaterInventory::getActiveInventory()
-{
-	LLFloaterInventory* res = NULL;
-	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
-	S32 z_min = S32_MAX;
-	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
-	{
-		LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
-		if (iv)
+		LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
+		if (iv)
 		{
 			S32 z_order = gFloaterView->getZOrder(iv);
 			if (z_order < z_min)
@@ -842,1112 +150,7 @@ void LLFloaterInventory::cleanup()
 	}
 }
 
-void LLFloaterInventory::toggleFindOptions()
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE);
-	LLFloater *floater = getFinder();
-	if (!floater)
-	{
-		LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this);
-		mFinderHandle = finder->getHandle();
-		finder->openFloater();
-		addDependentFloater(mFinderHandle);
-
-		// start background fetch of folders
-		gInventory.startBackgroundFetch();
-	}
-	else
-	{
-		floater->closeFloater();
-	}
-}
-
-// static
-BOOL LLFloaterInventory::filtersVisible(void* user_data)
-{
-	LLFloaterInventory* self = (LLFloaterInventory*)user_data;
-	if(!self) return FALSE;
-
-	return self->getFinder() != NULL;
-}
-
-void LLFloaterInventory::onClearSearch()
-{
-	LLFloater *finder = getFinder();
-	if (mActivePanel)
-	{
-		mActivePanel->setFilterSubString(LLStringUtil::null);
-		mActivePanel->setFilterTypes(0xffffffff);
-	}
-
-	if (finder)
-	{
-		LLFloaterInventoryFinder::selectAllTypes(finder);
-	}
-
-	// re-open folders that were initially open
-	if (mActivePanel)
-	{
-		mSavedFolderState->setApply(TRUE);
-		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
-		LLOpenFoldersWithSelection opener;
-		mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
-		mActivePanel->getRootFolder()->scrollToShowSelection();
-	}
-}
-
-void LLFloaterInventory::onFilterEdit(const std::string& search_string )
-{
-	if (search_string == "")
-	{
-		onClearSearch();
-	}
-	if (!mActivePanel)
-	{
-		return;
-	}
-
-	gInventory.startBackgroundFetch();
-
-	std::string uppercase_search_string = search_string;
-	LLStringUtil::toUpper(uppercase_search_string);
-	if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
-	{
-			// current filter and new filter empty, do nothing
-			return;
-	}
-
-	// save current folder open state if no filter currently applied
-	if (!mActivePanel->getRootFolder()->isFilterModified())
-	{
-		mSavedFolderState->setApply(FALSE);
-		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
-	}
-
-	// set new filter string
-	mActivePanel->setFilterSubString(uppercase_search_string);
-}
-
-
- //static
- BOOL LLFloaterInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward)
- {
- 	LLFloaterInventory* active_view = NULL;
-	
-	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
-	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
-	{
-		LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
-		if (iv)
-		{
-			if (gFocusMgr.childHasKeyboardFocus(iv))
-			{
-				active_view = iv;
-				break;
-			}
- 		}
- 	}
-
- 	if (!active_view)
- 	{
- 		return FALSE;
- 	}
-
- 	std::string search_string(find_text);
-
- 	if (search_string.empty())
- 	{
- 		return FALSE;
- 	}
-
- 	if (active_view->mActivePanel &&
- 		active_view->mActivePanel->getRootFolder()->search(first_item, search_string, backward))
- 	{
- 		return TRUE;
- 	}
-
- 	return FALSE;
- }
-
-void LLFloaterInventory::onFilterSelected()
-{
-	// Find my index
-	mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs");
-
-	if (!mActivePanel)
-	{
-		return;
-	}
-	LLInventoryFilter* filter = mActivePanel->getFilter();
-	LLFloaterInventoryFinder *finder = getFinder();
-	if (finder)
-	{
-		finder->changeFilter(filter);
-	}
-	if (filter->isActive())
-	{
-		// If our filter is active we may be the first thing requiring a fetch so we better start it here.
-		gInventory.startBackgroundFetch();
-	}
-	setFilterTextFromFilter();
-}
-
-BOOL LLFloaterInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
-										 EDragAndDropType cargo_type,
-										 void* cargo_data,
-										 EAcceptance* accept,
-										 std::string& tooltip_msg)
-{
-	// Check to see if we are auto scrolling from the last frame
-	LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
-	BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y);
-	if(mFilterTabs)
-	{
-		if(needsToScroll)
-		{
-			mFilterTabs->startDragAndDropDelayTimer();
-		}
-	}
-	
-	BOOL handled = LLFloater::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-
-	return handled;
-}
-const std::string& get_item_icon_name(LLAssetType::EType asset_type,
-							 LLInventoryType::EType inventory_type,
-							 U32 attachment_point,
-							 BOOL item_is_multi )
-{
-	EInventoryIcon idx = OBJECT_ICON_NAME;
-	if ( item_is_multi )
-	{
-		idx = OBJECT_MULTI_ICON_NAME;
-	}
-	
-	switch(asset_type)
-	{
-	case LLAssetType::AT_TEXTURE:
-		if(LLInventoryType::IT_SNAPSHOT == inventory_type)
-		{
-			idx = SNAPSHOT_ICON_NAME;
-		}
-		else
-		{
-			idx = TEXTURE_ICON_NAME;
-		}
-		break;
-
-	case LLAssetType::AT_SOUND:
-		idx = SOUND_ICON_NAME;
-		break;
-	case LLAssetType::AT_CALLINGCARD:
-		if(attachment_point!= 0)
-		{
-			idx = CALLINGCARD_ONLINE_ICON_NAME;
-		}
-		else
-		{
-			idx = CALLINGCARD_OFFLINE_ICON_NAME;
-		}
-		break;
-	case LLAssetType::AT_LANDMARK:
-		if(attachment_point!= 0)
-		{
-			idx = LANDMARK_VISITED_ICON_NAME;
-		}
-		else
-		{
-			idx = LANDMARK_ICON_NAME;
-		}
-		break;
-	case LLAssetType::AT_SCRIPT:
-	case LLAssetType::AT_LSL_TEXT:
-	case LLAssetType::AT_LSL_BYTECODE:
-		idx = SCRIPT_ICON_NAME;
-		break;
-	case LLAssetType::AT_CLOTHING:
-		idx = CLOTHING_ICON_NAME;
-	case LLAssetType::AT_BODYPART :
-		if(LLAssetType::AT_BODYPART == asset_type)
-		{
-			idx = BODYPART_ICON_NAME;
-		}
-		switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point)
-		{
-		case WT_SHAPE:
-			idx = BODYPART_SHAPE_ICON_NAME;
-			break;
-		case WT_SKIN:
-			idx = BODYPART_SKIN_ICON_NAME;
-			break;
-		case WT_HAIR:
-			idx = BODYPART_HAIR_ICON_NAME;
-			break;
-		case WT_EYES:
-			idx = BODYPART_EYES_ICON_NAME;
-			break;
-		case WT_SHIRT:
-			idx = CLOTHING_SHIRT_ICON_NAME;
-			break;
-		case WT_PANTS:
-			idx = CLOTHING_PANTS_ICON_NAME;
-			break;
-		case WT_SHOES:
-			idx = CLOTHING_SHOES_ICON_NAME;
-			break;
-		case WT_SOCKS:
-			idx = CLOTHING_SOCKS_ICON_NAME;
-			break;
-		case WT_JACKET:
-			idx = CLOTHING_JACKET_ICON_NAME;
-			break;
-		case WT_GLOVES:
-			idx = CLOTHING_GLOVES_ICON_NAME;
-			break;
-		case WT_UNDERSHIRT:
-			idx = CLOTHING_UNDERSHIRT_ICON_NAME;
-			break;
-		case WT_UNDERPANTS:
-			idx = CLOTHING_UNDERPANTS_ICON_NAME;
-			break;
-		case WT_SKIRT:
-			idx = CLOTHING_SKIRT_ICON_NAME;
-			break;
-		case WT_ALPHA:
-			idx = CLOTHING_ALPHA_ICON_NAME;
-			break;
-		case WT_TATTOO:
-			idx = CLOTHING_TATTOO_ICON_NAME;
-			break;
-		default:
-			// no-op, go with choice above
-			break;
-		}
-		break;
-	case LLAssetType::AT_NOTECARD:
-		idx = NOTECARD_ICON_NAME;
-		break;
-	case LLAssetType::AT_ANIMATION:
-		idx = ANIMATION_ICON_NAME;
-		break;
-	case LLAssetType::AT_GESTURE:
-		idx = GESTURE_ICON_NAME;
-		break;
-	case LLAssetType::AT_FAVORITE:
-		//TODO - need bette idx
-		idx = LANDMARK_ICON_NAME;
-		break;
-	case LLAssetType::AT_LINK:
-		idx = LINKITEM_ICON_NAME;
-		break;
-	case LLAssetType::AT_LINK_FOLDER:
-		idx = LINKFOLDER_ICON_NAME;
-		break;
-	default:
-		break;
-	}
-	
-	return ICON_NAME[idx];
-}
-
-LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
-							 LLInventoryType::EType inventory_type,
-							 U32 attachment_point,
-							 BOOL item_is_multi)
-{
-	const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi );
-	return LLUI::getUIImage(icon_name);
-}
-
-const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
-const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");
-const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string("");
-static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;
-
-LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p)
-:	LLPanel(p),
-	mInventoryObserver(NULL),
-	mFolders(NULL),
-	mScroller(NULL),
-	mSortOrderSetting(p.sort_order_setting),
-	mInventory(p.inventory),
-	mAllowMultiSelect(p.allow_multi_select),
-	mHasInventoryConnection(false),
-	mStartFolderString(p.start_folder)
-,	mBuildDefaultHierarchy(true)
-,	mInvFVBridgeBuilder(NULL)
-{
-	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
-
-	// contex menu callbacks
-	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2));
-	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH));
-	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND));
-	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2));
-	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
-	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
-	
-	setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor"));
-	setBackgroundVisible(TRUE);
-	setBackgroundOpaque(TRUE);
-}
-
-BOOL LLInventoryPanel::postBuild()
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD);
-
-	mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
-	
-	// create root folder
-	{
-		LLRect folder_rect(0,
-						   0,
-						   getRect().getWidth(),
-						   0);
-		LLFolderView::Params p;
-		p.name = getName();
-		p.rect = folder_rect;
-		p.parent_panel = this;
-		mFolders = LLUICtrlFactory::create<LLFolderView>(p);
-		mFolders->setAllowMultiSelect(mAllowMultiSelect);
-	}
-
-	mCommitCallbackRegistrar.popScope();
-	
-	mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
-	
-	// scroller
-	{
-		LLRect scroller_view_rect = getRect();
-		scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
-		LLScrollContainer::Params p;
-		p.name("Inventory Scroller");
-		p.rect(scroller_view_rect);
-		p.follows.flags(FOLLOWS_ALL);
-		p.reserve_scroll_corner(true);
-		p.tab_stop(true);
-		mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
-	}
-	addChild(mScroller);
-	mScroller->addChild(mFolders);
-	
-	mFolders->setScrollContainer(mScroller);
-
-	// set up the callbacks from the inventory we're viewing, and then
-	// build everything.
-	mInventoryObserver = new LLInventoryPanelObserver(this);
-	mInventory->addObserver(mInventoryObserver);
-
-	// determine the root folder, if any, so inventory contents show just the children
-	// of that folder (i.e. not including the folder itself).
-	const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString);
-
-	if ("inventory" == mStartFolderString)
-	{
-		mStartFolderID = gInventory.getRootFolderID();
-	}
-	else if ("library" == mStartFolderString)
-	{
-		mStartFolderID = gInventory.getLibraryRootFolderID();
-	}
-	else
-	{
-		mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
-	}
-
-	// build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback
-	if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection)
-	{
-		rebuildViewsFor(mStartFolderID);
-		mHasInventoryConnection = true;
-	}
-
-	// bit of a hack to make sure the inventory is open.
-	mFolders->openFolder(preferred_type != LLAssetType::AT_NONE ? LLAssetType::lookupCategoryName(preferred_type) : "My Inventory");
-
-	if (mSortOrderSetting != INHERIT_SORT_ORDER)
-	{
-		setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
-	}
-	else
-	{
-		setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
-	}
-	mFolders->setSortOrder(mFolders->getFilter()->getSortOrder());
-
-	return TRUE;
-}
-
-LLInventoryPanel::~LLInventoryPanel()
-{
-	// should this be a global setting?
-	if (mFolders)
-	{
-		U32 sort_order = mFolders->getSortOrder();
-		if (mSortOrderSetting != INHERIT_SORT_ORDER)
-		{
-			gSavedSettings.setU32(mSortOrderSetting, sort_order);
-		}
-	}
-
-	// LLView destructor will take care of the sub-views.
-	mInventory->removeObserver(mInventoryObserver);
-	delete mInventoryObserver;
-	mScroller = NULL;
-}
-
-LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed?
-void LLInventoryPanel::draw()
-{
-	// select the desired item (in case it wasn't loaded when the selection was requested)
-	mFolders->updateSelection();
-	LLPanel::draw();
-}
-
-void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories)
-{
-	mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories);
-}	
-
-void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
-{
-	mFolders->getFilter()->setFilterPermissions(filter_perm_mask);
-}
-
-void LLInventoryPanel::setFilterSubString(const std::string& string)
-{
-	mFolders->getFilter()->setFilterSubString(string);
-}
-
-void LLInventoryPanel::setSortOrder(U32 order)
-{
-	mFolders->getFilter()->setSortOrder(order);
-	if (mFolders->getFilter()->isModified())
-	{
-		mFolders->setSortOrder(order);
-		// try to keep selection onscreen, even if it wasn't to start with
-		mFolders->scrollToShowSelection();
-	}
-}
-
-void LLInventoryPanel::setSinceLogoff(BOOL sl)
-{
-	mFolders->getFilter()->setDateRangeLastLogoff(sl);
-}
-
-void LLInventoryPanel::setHoursAgo(U32 hours)
-{
-	mFolders->getFilter()->setHoursAgo(hours);
-}
-
-void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
-{
-	mFolders->getFilter()->setShowFolderState(show);
-}
-
-LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
-{
-	return mFolders->getFilter()->getShowFolderState();
-}
-
-static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
-
-void LLInventoryPanel::modelChanged(U32 mask)
-{
-	LLFastTimer t2(FTM_REFRESH);
-
-	bool handled = false;
-
-	// inventory just initialized, do complete build
-	if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection)
-	{
-		rebuildViewsFor(mStartFolderID);
-		mHasInventoryConnection = true;
-		return;
-	}
-
-	if(mask & LLInventoryObserver::LABEL)
-	{
-		handled = true;
-		// label change - empty out the display name for each object
-		// in this change set.
-		const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
-		std::set<LLUUID>::const_iterator id_it = changed_items.begin();
-		std::set<LLUUID>::const_iterator id_end = changed_items.end();
-		LLFolderViewItem* view = NULL;
-		LLInvFVBridge* bridge = NULL;
-		for (;id_it != id_end; ++id_it)
-		{
-			view = mFolders->getItemByID(*id_it);
-			if(view)
-			{
-				// request refresh on this item (also flags for filtering)
-				bridge = (LLInvFVBridge*)view->getListener();
-				if(bridge)
-				{	// Clear the display name first, so it gets properly re-built during refresh()
-					bridge->clearDisplayName();
-				}
-				view->refresh();
-			}
-		}
-	}
-	if((mask & (LLInventoryObserver::STRUCTURE
-				| LLInventoryObserver::ADD
-				| LLInventoryObserver::REMOVE)) != 0)
-	{
-		handled = true;
-		// Record which folders are open by uuid.
-		LLInventoryModel* model = getModel();
-		if (model)
-		{
-			const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
-
-			std::set<LLUUID>::const_iterator id_it = changed_items.begin();
-			std::set<LLUUID>::const_iterator id_end = changed_items.end();
-			for (;id_it != id_end; ++id_it)
-			{
-				// sync view with model
-				LLInventoryObject* model_item = model->getObject(*id_it);
-				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
-
-				if (model_item)
-				{
-					if (!view_item)
-					{
-						// this object was just created, need to build a view for it
-						if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
-						{
-							llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl;
-						}
-						buildNewViews(*id_it);
-						
-						// select any newly created object
-						// that has the auto rename at top of folder
-						// root set
-						if(mFolders->getRoot()->needsAutoRename())
-						{
-							setSelection(*id_it, FALSE);
-						}
-					}
-					else
-					{
-						// this object was probably moved, check its parent
-						if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
-						{
-							llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << llendl;
-						}
-
-						LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
-
-						// added check against NULL for cases when Inventory panel contains startFolder.
-						// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
-						// this check is a fix for bug EXT-1859.
-						if (NULL != new_parent && view_item->getParentFolder() != new_parent)
-						{
-							view_item->getParentFolder()->extractItem(view_item);
-							view_item->addToFolder(new_parent, mFolders);
-						}
-					}
-				}
-				else
-				{
-					if (view_item)
-					{
-						if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
-						{
-							llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl;
-						}
-						// item in view but not model, need to delete view
-						view_item->destroyView();
-					}
-					else
-					{
-						llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
-					}
-				}
-			}
-		}
-	}
-
-	if (!handled)
-	{
-		// it's a small change that only requires a refresh.
-		// *TODO: figure out a more efficient way to do the refresh
-		// since it is expensive on large inventories
-		mFolders->refresh();
-	}
-}
-
-
-void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
-{
-	LLFolderViewItem* old_view = NULL;
-
-	// get old LLFolderViewItem
-	old_view = mFolders->getItemByID(id);
-	if (old_view && id.notNull())
-	{
-		old_view->destroyView();
-	}
-
-	buildNewViews(id);
-}
-
-void LLInventoryPanel::buildNewViews(const LLUUID& id)
-{
-	LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS);
-	LLFolderViewItem* itemp = NULL;
-	LLInventoryObject* objectp = NULL;
-
-	// Don't add the start folder (the inventory panel will show contents
-	// beginning with the children of the starting folder, excluding the starting folder itself).
-	if (id != mStartFolderID)
-	{
-		objectp = gInventory.getObject(id);
-		if (objectp)
-		{		
-			const LLUUID &parent_id = objectp->getParentUUID();
-			// If this item's parent is the starting folder, then just add it to the top level (recall that 
-			// the starting folder isn't actually represented in the view, parent_folder would be NULL in
-			// this case otherwise).
-			LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ?
-				mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id));
-
-			// This item exists outside the inventory's hierarchy, so don't add it.
-			if (!parent_folder)
-			{
-				return;
-			}
-
-			if (objectp->getType() <= LLAssetType::AT_NONE ||
-				objectp->getType() >= LLAssetType::AT_COUNT)
-			{
-				llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << 
-					((S32) objectp->getType()) << llendl;
-				return;
-			}
-			
-			if (objectp->getType() == LLAssetType::AT_CATEGORY &&
-					 objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) 
-			{
-				LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
-																				objectp->getType(),
-																				LLInventoryType::IT_CATEGORY,
-																				this,
-																				objectp->getUUID());
-
-				if (new_listener)
-				{
-					LLFolderViewFolder::Params p;
-					p.name = new_listener->getDisplayName();
-					p.icon = new_listener->getIcon();
-					p.root = mFolders;
-					p.listener = new_listener;
-					LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
-				
-					folderp->setItemSortOrder(mFolders->getSortOrder());
-					itemp = folderp;
-				}
-			}
-			else 
-			{
-				// Build new view for item
-				LLInventoryItem* item = (LLInventoryItem*)objectp;
-				LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
-																				item->getActualType(),
-																				item->getInventoryType(),
-																				this,
-																				item->getUUID(),
-																				item->getFlags());
-
-				if (new_listener)
-				{
-					LLFolderViewItem::Params params;
-					params.name(new_listener->getDisplayName());
-					params.icon(new_listener->getIcon());
-					params.creation_date(new_listener->getCreationDate());
-					params.root(mFolders);
-					params.listener(new_listener);
-					params.rect(LLRect (0, 0, 0, 0));
-					itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
-				}
-			}
-
-			if (itemp)
-			{
-				itemp->addToFolder(parent_folder, mFolders);
-			}
-		}
-	}
-
-	// If this is a folder, add the children of the folder and recursively add any 
-	// child folders.
-	if ((id == mStartFolderID) ||
-		(objectp && objectp->getType() == LLAssetType::AT_CATEGORY))
-	{
-		LLViewerInventoryCategory::cat_array_t* categories;
-		LLViewerInventoryItem::item_array_t* items;
-
-		mInventory->lockDirectDescendentArrays(id, categories, items);
-		if(categories)
-		{
-			S32 count = categories->count();
-			for(S32 i = 0; i < count; ++i)
-			{
-				LLInventoryCategory* cat = categories->get(i);
-				buildNewViews(cat->getUUID());
-			}
-		}
-		if(items)
-		{
-			S32 count = items->count();
-			for(S32 i = 0; i < count; ++i)
-			{
-				LLInventoryItem* item = items->get(i);
-				buildNewViews(item->getUUID());
-			}
-		}
-		mInventory->unlockDirectDescendentArrays(id);
-	}
-}
-
-struct LLConfirmPurgeData
-{
-	LLUUID mID;
-	LLInventoryModel* mModel;
-};
-
-class LLIsNotWorn : public LLInventoryCollectFunctor
-{
-public:
-	LLIsNotWorn() {}
-	virtual ~LLIsNotWorn() {}
-	virtual bool operator()(LLInventoryCategory* cat,
-							LLInventoryItem* item)
-	{
-		return !gAgentWearables.isWearingItem(item->getUUID());
-	}
-};
-
-class LLOpenFolderByID : public LLFolderViewFunctor
-{
-public:
-	LLOpenFolderByID(const LLUUID& id) : mID(id) {}
-	virtual ~LLOpenFolderByID() {}
-	virtual void doFolder(LLFolderViewFolder* folder)
-		{
-			if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
-		}
-	virtual void doItem(LLFolderViewItem* item) {}
-protected:
-	const LLUUID& mID;
-};
-
-
-void LLInventoryPanel::openSelected()
-{
-	LLFolderViewItem* folder_item = mFolders->getCurSelectedItem();
-	if(!folder_item) return;
-	LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
-	if(!bridge) return;
-	bridge->openItem();
-}
-
-BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
-{
-	BOOL handled = LLView::handleHover(x, y, mask);
-	if(handled)
-	{
-		ECursorType cursor = getWindow()->getCursor();
-		if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW)
-		{
-			// replace arrow cursor with arrow and hourglass cursor
-			getWindow()->setCursor(UI_CURSOR_WORKING);
-		}
-	}
-	else
-	{
-		getWindow()->setCursor(UI_CURSOR_ARROW);
-	}
-	return TRUE;
-}
-
-BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
-								   EDragAndDropType cargo_type,
-								   void* cargo_data,
-								   EAcceptance* accept,
-								   std::string& tooltip_msg)
-{
-
-	BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
-
-	if (handled)
-	{
-		mFolders->setDragAndDropThisFrame();
-	}
-
-	return handled;
-}
-
-void LLInventoryPanel::onFocusLost()
-{
-	// inventory no longer handles cut/copy/paste/delete
-	if (LLEditMenuHandler::gEditMenuHandler == mFolders)
-	{
-		LLEditMenuHandler::gEditMenuHandler = NULL;
-	}
-
-	LLPanel::onFocusLost();
-}
-
-void LLInventoryPanel::onFocusReceived()
-{
-	// inventory now handles cut/copy/paste/delete
-	LLEditMenuHandler::gEditMenuHandler = mFolders;
-
-	LLPanel::onFocusReceived();
-}
-
-
-void LLInventoryPanel::openAllFolders()
-{
-	mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
-	mFolders->arrangeAll();
-}
-
-void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type)
-{
-	LLUUID category_id = mInventory->findCategoryUUIDForType(type);
-	LLOpenFolderByID opener(category_id);
-	mFolders->applyFunctorRecursively(opener);
-}
-
-void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus)
-{
-	// Don't select objects in COF (e.g. to prevent refocus when items are worn).
-	const LLInventoryObject *obj = gInventory.getObject(obj_id);
-	if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF())
-	{
-		return;
-	}
-	mFolders->setSelectionByID(obj_id, take_keyboard_focus);
-}
-
-void LLInventoryPanel::clearSelection()
-{
-	mFolders->clearSelection();
-}
-
-void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
-{
-	LLFolderView* fv = getRootFolder();
-	if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename
-	{
-		fv->setNeedsAutoRename(FALSE);
-		if (items.size()) // new asset is visible and selected
-		{
-			fv->startRenamingSelectedItem();
-		}
-	}
-	// Seraph - Put determineFolderType in here for ensemble typing?
-}
-
-//----------------------------------------------------------------------------
-
-void LLInventoryPanel::doToSelected(const LLSD& userdata)
-{
-	mFolders->doToSelected(&gInventory, userdata);
-}
-
-void LLInventoryPanel::doCreate(const LLSD& userdata)
-{
-	menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata);
-}
-
-bool LLInventoryPanel::beginIMSession()
-{
-	std::set<LLUUID> selected_items;
-	mFolders->getSelectionList(selected_items);
-
-	std::string name;
-	static int session_num = 1;
-
-	LLDynamicArray<LLUUID> members;
-	EInstantMessage type = IM_SESSION_CONFERENCE_START;
-
-	std::set<LLUUID>::const_iterator iter;
-	for (iter = selected_items.begin(); iter != selected_items.end(); iter++)
-	{
-
-		LLUUID item = *iter;
-		LLFolderViewItem* folder_item = mFolders->getItemByID(item);
-			
-		if(folder_item) 
-		{
-			LLFolderViewEventListener* fve_listener = folder_item->getListener();
-			if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))
-			{
-
-				LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener();
-				if(!bridge) return true;
-				LLViewerInventoryCategory* cat = bridge->getCategory();
-				if(!cat) return true;
-				name = cat->getName();
-				LLUniqueBuddyCollector is_buddy;
-				LLInventoryModel::cat_array_t cat_array;
-				LLInventoryModel::item_array_t item_array;
-				gInventory.collectDescendentsIf(bridge->getUUID(),
-												cat_array,
-												item_array,
-												LLInventoryModel::EXCLUDE_TRASH,
-												is_buddy);
-				S32 count = item_array.count();
-				if(count > 0)
-				{
-					LLFloaterReg::showInstance("communicate");
-					// create the session
-					LLAvatarTracker& at = LLAvatarTracker::instance();
-					LLUUID id;
-					for(S32 i = 0; i < count; ++i)
-					{
-						id = item_array.get(i)->getCreatorUUID();
-						if(at.isBuddyOnline(id))
-						{
-							members.put(id);
-						}
-					}
-				}
-			}
-			else
-			{
-				LLFolderViewItem* folder_item = mFolders->getItemByID(item);
-				if(!folder_item) return true;
-				LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener();
-
-				if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
-				{
-					LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID());
-
-					if (inv_item)
-					{
-						LLAvatarTracker& at = LLAvatarTracker::instance();
-						LLUUID id = inv_item->getCreatorUUID();
-
-						if(at.isBuddyOnline(id))
-						{
-							members.put(id);
-						}
-					}
-				} //if IT_CALLINGCARD
-			} //if !IT_CATEGORY
-		}
-	} //for selected_items	
-
-	// the session_id is randomly generated UUID which will be replaced later
-	// with a server side generated number
-
-	if (name.empty())
-	{
-		name = llformat("Session %d", session_num++);
-	}
-
-	gIMMgr->addSession(name, type, members[0], members);
-		
-	return true;
-}
-
-bool LLInventoryPanel::attachObject(const LLSD& userdata)
-{
-	std::set<LLUUID> selected_items;
-	mFolders->getSelectionList(selected_items);
-
-	std::string joint_name = userdata.asString();
-	LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject());
-	LLViewerJointAttachment* attachmentp = NULL;
-	for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); 
-		 iter != avatarp->mAttachmentPoints.end(); )
-	{
-		LLVOAvatar::attachment_map_t::iterator curiter = iter++;
-		LLViewerJointAttachment* attachment = curiter->second;
-		if (attachment->getName() == joint_name)
-		{
-			attachmentp = attachment;
-			break;
-		}
-	}
-	if (attachmentp == NULL)
-	{
-		return true;
-	}
-
-	for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin(); 
-		 set_iter != selected_items.end(); 
-		 ++set_iter)
-	{
-		const LLUUID &id = *set_iter;
-		LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id);
-		if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()))
-		{
-			rez_attachment(item, attachmentp);
-		}
-		else if(item && item->isComplete())
-		{
-			// must be in library. copy it to our inventory and put it on.
-			LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp);
-			copy_inventory_item(gAgent.getID(),
-								item->getPermissions().getOwner(),
-								item->getUUID(),
-								LLUUID::null,
-								std::string(),
-								cb);
-		}
-	}
-	gFocusMgr.setKeyboardFocus(NULL);
-
-	return true;
-}
-
-
-//----------------------------------------------------------------------------
-
-// static DEBUG ONLY:
-void LLInventoryPanel::dumpSelectionInformation(void* user_data)
-{
-	LLInventoryPanel* iv = (LLInventoryPanel*)user_data;
-	iv->mFolders->dumpSelectionInformation();
-}
-
-BOOL LLInventoryPanel::getSinceLogoff()
-{
-	return mFolders->getFilter()->isSinceLogoff();
-}
-
-void example_param_block_usage()
+void LLFloaterInventory::onOpen(const LLSD& key)
 {
-	LLInventoryPanel::Params param_block;
-	param_block.name(std::string("inventory"));
-
-	param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER);
-	param_block.allow_multi_select(true);
-	param_block.filter(LLInventoryPanel::Filter()
-			.sort_order(1)
-			.types(0xffff0000));
-	param_block.inventory(&gInventory);
-	param_block.has_border(true);
-
-	LLUICtrlFactory::create<LLInventoryPanel>(param_block);
-
-	param_block = LLInventoryPanel::Params();
-	param_block.name(std::string("inventory"));
-
-	//LLSD param_block_sd;
-	//param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER;
-	//param_block_sd["allow_multi_select"] = true;
-	//param_block_sd["filter"]["sort_order"] = 1;
-	//param_block_sd["filter"]["types"] = (S32)0xffff0000;
-	//param_block_sd["has_border"] = true;
-
-	//LLInitParam::LLSDParser(param_block_sd).parse(param_block);
-
-	LLUICtrlFactory::create<LLInventoryPanel>(param_block);
+	LLFirstUse::useInventory();
 }
diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h
index 4c9ac5d4c682de1723e371d943447b46b5f64bb4..c0de89bff22389a3b40adb3fa1ae5a9ddae8e247 100644
--- a/indra/newview/llfloaterinventory.h
+++ b/indra/newview/llfloaterinventory.h
@@ -31,366 +31,55 @@
  * $/LicenseInfo$
  */
 
-#ifndef LL_LLINVENTORYVIEW_H
-#define LL_LLINVENTORYVIEW_H
+#ifndef LL_LLFLOATERINVENTORY_H
+#define LL_LLFLOATERINVENTORY_H
 
-#include "llassetstorage.h"
-#include "lldarray.h"
 #include "llfloater.h"
-#include "llinventory.h"
-#include "llinventoryfilter.h"
-#include "llfolderview.h"
-#include "llinventorymodel.h"
-#include "lluictrlfactory.h"
-#include <set>
+#include "llfoldertype.h"
 
+class LLInventoryPanel;
+class LLPanelMainInventory;
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLFloaterInventory
 //
-// This is the agent inventory _floater_.
-// It deals with the buttons and views used to navigate as
-// well as controls the behavior of the overall object.
+// This deals with the buttons and views used to navigate as
+// well as controlling the behavior of the overall object.
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-class LLFolderViewItem;
-class LLInventoryFilter;
-class LLInventoryModel;
-class LLInvFVBridge;
-class LLInventoryFVBridgeBuilder;
-class LLMenuBarGL;
-class LLCheckBoxCtrl;
-class LLSpinCtrl;
-class LLScrollContainer;
-class LLTextBox;
-class LLIconCtrl;
-class LLSaveFolderState;
-class LLFilterEditor;
-class LLTabContainer;
-
-class LLInventoryPanel : public LLPanel
+class LLFloaterInventory : public LLFloater
 {
-public:
-	static const std::string DEFAULT_SORT_ORDER;
-	static const std::string RECENTITEMS_SORT_ORDER;
-	static const std::string INHERIT_SORT_ORDER;
-
-	struct Filter : public LLInitParam::Block<Filter>
-	{
-		Optional<U32>			sort_order;
-		Optional<U32>			types;
-		Optional<std::string>	search_string;
-
-		Filter()
-		:	sort_order("sort_order"),
-			types("types", 0xffffffff),
-			search_string("search_string")
-		{}
-	};
-
-	struct Params 
-	:	public LLInitParam::Block<Params, LLPanel::Params>
-	{
-		Optional<std::string>				sort_order_setting;
-		Optional<LLInventoryModel*>			inventory;
-		Optional<bool>						allow_multi_select;
-		Optional<Filter>					filter;
-		Optional<std::string>               start_folder;
-
-		Params()
-		:	sort_order_setting("sort_order_setting"),
-			inventory("", &gInventory),
-			allow_multi_select("allow_multi_select", true),
-			filter("filter"),
-			start_folder("start_folder")
-		{}
-	};
-
-protected:
-	LLInventoryPanel(const Params&);
-	friend class LLUICtrlFactory;
-
-public:
-	virtual ~LLInventoryPanel();
-
-	LLInventoryModel* getModel() { return mInventory; }
-
-	BOOL postBuild();
-
-	// LLView methods
-	void draw();
-	BOOL handleHover(S32 x, S32 y, MASK mask);
-	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
-								   EDragAndDropType cargo_type,
-								   void* cargo_data,
-								   EAcceptance* accept,
-								   std::string& tooltip_msg);
-	// LLUICtrl methods
-	 /*virtual*/ void onFocusLost();
-	 /*virtual*/ void onFocusReceived();
-
-	// Call this method to set the selection.
-	void openAllFolders();
-	void openDefaultFolderForType(LLAssetType::EType);
-	void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);
-	void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); }
-	void clearSelection();
-	LLInventoryFilter* getFilter() { return mFolders->getFilter(); }
-	void setFilterTypes(U64 filter, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type
-	U32 getFilterTypes() const { return mFolders->getFilterTypes(); }
-	void setFilterPermMask(PermissionMask filter_perm_mask);
-	U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); }
-	void setFilterSubString(const std::string& string);
-	const std::string getFilterSubString() { return mFolders->getFilterSubString(); }
-	void setSortOrder(U32 order);
-	U32 getSortOrder() { return mFolders->getSortOrder(); }
-	void setSinceLogoff(BOOL sl);
-	void setHoursAgo(U32 hours);
-	BOOL getSinceLogoff();
-	
-	void setShowFolderState(LLInventoryFilter::EFolderShow show);
-	LLInventoryFilter::EFolderShow getShowFolderState();
-	void setAllowMultiSelect(BOOL allow) { mFolders->setAllowMultiSelect(allow); }
-	// This method is called when something has changed about the inventory.
-	void modelChanged(U32 mask);
-	LLFolderView* getRootFolder() { return mFolders; }
-	LLScrollContainer* getScrollableContainer() { return mScroller; }
-	
-	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
-	
-	// Callbacks
-	void doToSelected(const LLSD& userdata);
-	void doCreate(const LLSD& userdata);
-	bool beginIMSession();
-	bool attachObject(const LLSD& userdata);
-	
-	// DEBUG ONLY:
-	static void dumpSelectionInformation(void* user_data);
-
-	void openSelected();
-	void unSelectAll()	{ mFolders->setSelection(NULL, FALSE, FALSE); }
-	
-protected:
-	// Given the id and the parent, build all of the folder views.
-	void rebuildViewsFor(const LLUUID& id);
-	virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719
-
-protected:
-	LLInventoryModel*			mInventory;
-	LLInventoryObserver*		mInventoryObserver;
-	BOOL 						mAllowMultiSelect;
-	std::string					mSortOrderSetting;
-
-//private: // Can not make these private - needed by llinventorysubtreepanel
-	LLFolderView*				mFolders;
-	std::string                 mStartFolderString;
-
-	/**
-	 * Contains UUID of Inventory item from which hierarchy should be built.
-	 * Can be set with the "start_folder" xml property.
-	 * Default is LLUUID::null that means total Inventory hierarchy.
-	 */
-	LLUUID						mStartFolderID;
-	LLScrollContainer*			mScroller;
-	bool						mHasInventoryConnection;
-
-	/**
-	 * Flag specified if default inventory hierarchy should be created in postBuild()
-	 */
-	bool						mBuildDefaultHierarchy;
-
-	LLUUID						mRootInventoryItemUUID;
-
-	/**
-	 * Pointer to LLInventoryFVBridgeBuilder.
-	 *
-	 * It is set in LLInventoryPanel's constructor and can be overridden in derived classes with 
-	 * another implementation.
-	 * Take into account it will not be deleted by LLInventoryPanel itself.
-	 */
-	const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder;
-
-};
-
-class LLFloaterInventory;
-
-class LLFloaterInventoryFinder : public LLFloater
-{
-public:
-	LLFloaterInventoryFinder( LLFloaterInventory* inventory_view);
-	virtual void draw();
-	/*virtual*/	BOOL	postBuild();
-	void changeFilter(LLInventoryFilter* filter);
-	void updateElementsFromFilter();
-	BOOL getCheckShowEmpty();
-	BOOL getCheckSinceLogoff();
-
-	static void onTimeAgo(LLUICtrl*, void *);
-	static void onCheckSinceLogoff(LLUICtrl*, void *);
-	static void onCloseBtn(void* user_data);
-	static void selectAllTypes(void* user_data);
-	static void selectNoTypes(void* user_data);
-
-protected:
-	LLFloaterInventory*	mFloaterInventory;
-	LLSpinCtrl*			mSpinSinceDays;
-	LLSpinCtrl*			mSpinSinceHours;
-	LLInventoryFilter*	mFilter;
-};
-
-class LLFloaterInventory : public LLFloater, LLInventoryObserver
-{
-friend class LLFloaterInventoryFinder;
-
 public:
 	LLFloaterInventory(const LLSD& key);
 	~LLFloaterInventory();
 
-	/*virtual*/ void changed(U32 mask);
-
-	 BOOL postBuild();
-
-	//
-	// Misc functions
-	//
-	void setFilterTextFromFilter() { mFilterText = mActivePanel->getFilter()->getFilterText(); }
-	void startSearch();
-	
-	// This method makes sure that an inventory view exists, is
-	// visible, and has focus. The view chosen is returned.
-	static LLFloaterInventory* showAgentInventory();
+	BOOL postBuild();
 
 	// Return the active inventory view if there is one. Active is
 	// defined as the inventory that is the closest to the front, and
 	// is visible.
 	static LLFloaterInventory* getActiveInventory();
 
-	// This method calls showAgentInventory() if no views are visible,
-	// or hides/destroyes them all if any are visible.
-	static void toggleVisibility();
-	static void toggleVisibility(void*) { toggleVisibility(); }
+	// This method makes sure that an inventory view exists, is
+	// visible, and has focus. The view chosen is returned.
+	static LLFloaterInventory* showAgentInventory();
 
 	// Final cleanup, destroy all open inventory views.
 	static void cleanup();
 
-	// LLView & LLFloater functionality
-	virtual void onOpen(const LLSD& key);
-	virtual void draw();
-	virtual BOOL handleKeyHere(KEY key, MASK mask);
-
-	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
-		EDragAndDropType cargo_type,
-		void* cargo_data,
-		EAcceptance* accept,
-		std::string& tooltip_msg);
-
-
-	LLInventoryPanel* getPanel() { return mActivePanel; }
-	LLInventoryPanel* getActivePanel() { return mActivePanel; }
-
-	static BOOL filtersVisible(void* user_data);
-	void onClearSearch();
-	static void onFoldersByName(void *user_data);
-	static BOOL checkFoldersByName(void *user_data);
-	void onFilterEdit(const std::string& search_string );
-	static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward);
-	void onFilterSelected();
-
-	const std::string getFilterSubString() { return mActivePanel->getFilterSubString(); }
-	void setFilterSubString(const std::string& string) { mActivePanel->setFilterSubString(string); }
-	
-	// menu callbacks
-	void doToSelected(const LLSD& userdata);
-	void closeAllFolders();
-	void doCreate(const LLSD& userdata);
-	void resetFilters();
-	void setSortBy(const LLSD& userdata);
-	
-	// HACK: Until we can route this info through the instant message hierarchy
-	static BOOL sWearNewClothing;
-	static LLUUID sWearNewClothingTransactionID;	// wear all clothing in this transaction
-
-	void toggleFindOptions();
-
-	LLFloaterInventoryFinder* getFinder() { return (LLFloaterInventoryFinder*)mFinderHandle.get(); }
+	// Inherited functionality
+	/*virtual*/ void changed(U32 mask);
+	/*virtual*/ void draw();
+	/*virtual*/ void onOpen(const LLSD& key);
 
+	LLInventoryPanel* getPanel();
 protected:
-	LLFilterEditor*				mFilterEditor;
-	LLTabContainer*				mFilterTabs;
-	LLHandle<LLFloater>			mFinderHandle;
-	LLInventoryPanel*			mActivePanel;
-	LLSaveFolderState*			mSavedFolderState;
-
-	std::string					mFilterText;
-
-private:
 	void updateTitle();
+private:
+	LLPanelMainInventory* mPanelMainInventory;
 };
 
-class LLSelectFirstFilteredItem : public LLFolderViewFunctor
-{
-public:
-	LLSelectFirstFilteredItem() : mItemSelected(FALSE) {}
-	virtual ~LLSelectFirstFilteredItem() {}
-	virtual void doFolder(LLFolderViewFolder* folder);
-	virtual void doItem(LLFolderViewItem* item);
-	BOOL wasItemSelected() { return mItemSelected; }
-protected:
-	BOOL	mItemSelected;
-};
-
-class LLOpenFilteredFolders : public LLFolderViewFunctor
-{
-public:
-	LLOpenFilteredFolders()  {}
-	virtual ~LLOpenFilteredFolders() {}
-	virtual void doFolder(LLFolderViewFolder* folder);
-	virtual void doItem(LLFolderViewItem* item);
-};
-
-class LLSaveFolderState : public LLFolderViewFunctor
-{
-public:
-	LLSaveFolderState() : mApply(FALSE) {}
-	virtual ~LLSaveFolderState() {}
-	virtual void doFolder(LLFolderViewFolder* folder);
-	virtual void doItem(LLFolderViewItem* item) {}
-	void setApply(BOOL apply);
-	void clearOpenFolders() { mOpenFolders.clear(); }
-protected:
-	std::set<LLUUID> mOpenFolders;
-	BOOL mApply;
-};
-
-class LLOpenFoldersWithSelection : public LLFolderViewFunctor
-{
-public:
-	LLOpenFoldersWithSelection() {}
-	virtual ~LLOpenFoldersWithSelection() {}
-	virtual void doFolder(LLFolderViewFolder* folder);
-	virtual void doItem(LLFolderViewItem* item);
-};
-
-///----------------------------------------------------------------------------
-/// Function declarations, constants, enums, and typedefs
-///----------------------------------------------------------------------------
-
-// useful functions with the inventory view
-
-class LLInventoryCategory;
-class LLInventoryItem;
-
-const std::string& get_item_icon_name(LLAssetType::EType asset_type,
-							 LLInventoryType::EType inventory_type,
-							 U32 attachment_point, 
-							 BOOL item_is_multi );
-
-LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
-							 LLInventoryType::EType inventory_type,
-							 U32 attachment_point, 
-							 BOOL item_is_multi );
-
-#endif // LL_LLINVENTORYVIEW_H
+#endif // LL_LLFLOATERINVENTORY_H
 
 
 
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index bdf9842b015ec8288cf50389062d7476d5626533..015a947d9179a730f4b993a650c256e9907bbd14 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1519,7 +1519,9 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
 		}
 
 		// Placeholder for name.
-		item_params.columns.add().font(FONT).column("name");
+		std::string name;
+		gCacheName->getFullName(owner_id, name);		
+		item_params.columns.add().value(name).font(FONT).column("name");
 
 		object_count_str = llformat("%d", object_count);
 		item_params.columns.add().value(object_count_str).font(FONT).column("count");
@@ -1743,7 +1745,6 @@ LLPanelLandOptions::LLPanelLandOptions(LLParcelSelectionHandle& parcel)
 	mClearBtn(NULL),
 	mMatureCtrl(NULL),
 	mPushRestrictionCtrl(NULL),
-	mPublishHelpButton(NULL),
 	mParcel(parcel)
 {
 }
@@ -1812,14 +1813,9 @@ BOOL LLPanelLandOptions::postBuild()
 	mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck");
 	childSetCommitCallback("MatureCheck", onCommitAny, this);
 	
-	mPublishHelpButton = getChild<LLButton>("?");
-	mPublishHelpButton->setClickedCallback(onClickPublishHelp, this);
-
 	if (gAgent.wantsPGOnly())
 	{
 		// Disable these buttons if they are PG (Teen) users
-		mPublishHelpButton->setVisible(FALSE);
-		mPublishHelpButton->setEnabled(FALSE);
 		mMatureCtrl->setVisible(FALSE);
 		mMatureCtrl->setEnabled(FALSE);
 	}
@@ -1912,7 +1908,6 @@ void LLPanelLandOptions::refresh()
 		mClearBtn->setEnabled(FALSE);
 
 		mMatureCtrl->setEnabled(FALSE);
-		mPublishHelpButton->setEnabled(FALSE);
 	}
 	else
 	{
@@ -1988,13 +1983,9 @@ void LLPanelLandOptions::refresh()
 		mSetBtn->setEnabled( can_change_landing_point );
 		mClearBtn->setEnabled( can_change_landing_point );
 
-		mPublishHelpButton->setEnabled( can_change_identity );
-
 		if (gAgent.wantsPGOnly())
 		{
 			// Disable these buttons if they are PG (Teen) users
-			mPublishHelpButton->setVisible(FALSE);
-			mPublishHelpButton->setEnabled(FALSE);
 			mMatureCtrl->setVisible(FALSE);
 			mMatureCtrl->setEnabled(FALSE);
 		}
@@ -2247,28 +2238,6 @@ void LLPanelLandOptions::onClickClear(void* userdata)
 	self->refresh();
 }
 
-// static
-void LLPanelLandOptions::onClickPublishHelp(void*)
-{
-	LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
-	LLParcel *parcel = LLViewerParcelMgr::getInstance()->getFloatingParcelSelection()->getParcel();
-	llassert(region); // Region should never be null.
-
-	bool can_change_identity = region && parcel ? 
-		LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_CHANGE_IDENTITY) &&
-		! (region->getRegionFlags() & REGION_FLAGS_BLOCK_PARCEL_SEARCH) : false;
-
-	if(! can_change_identity)
-	{
-		LLNotifications::instance().add("ClickPublishHelpLandDisabled");
-	}
-	else
-	{
-		LLNotifications::instance().add("ClickPublishHelpLand");
-	}
-}
-
-
 
 //---------------------------------------------------------------------------
 // LLPanelLandAccess
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 749c3951477b7df1004884bf775f2f0e4df26e21..f7fb978c2a1d318c106e96e70092a121c635ec18 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -320,7 +320,6 @@ class LLPanelLandOptions
 	static void onCommitAny(LLUICtrl* ctrl, void *userdata);
 	static void onClickSet(void* userdata);
 	static void onClickClear(void* userdata);
-	static void onClickPublishHelp(void*);
 
 private:
 	LLCheckBoxCtrl*	mCheckEditObjects;
@@ -345,7 +344,6 @@ class LLPanelLandOptions
 
 	LLCheckBoxCtrl		*mMatureCtrl;
 	LLCheckBoxCtrl		*mPushRestrictionCtrl;
-	LLButton			*mPublishHelpButton;
 
 	LLSafeHandle<LLParcelSelection>&	mParcel;
 };
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index ed7d2c71eaab9c89e15130abbaf31ad4d6f5be00..b7296518d460dddc3066068cb8171b8c7ea908c1 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -176,7 +176,7 @@ void LLFloaterNameDesc::onBtnOK( )
 	upload_new_resource(mFilenameAndPath, // file
 			    childGetValue("name_form").asString(), 
 			    childGetValue("description_form").asString(), 
-			    0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE,
+			    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
 			    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
 			    display_name, callback, expected_upload_cost, nruserdata);
 	closeFloater(false);
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index aa82dc34b74a56965db27bfc9be6b4805b526843..e277aba493c67fc2739e00fd0671cca4dfba7eb9 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -32,7 +32,7 @@
 
 /*
  * Shows the contents of an object.
- * A floater wrapper for llpanelinventory
+ * A floater wrapper for LLPanelObjectInventory
  */
 
 #include "llviewerprecompiledheaders.h"
@@ -47,7 +47,8 @@
 #include "llinventorybridge.h"
 #include "llfloaterinventory.h"
 #include "llinventorymodel.h"
-#include "llpanelinventory.h"
+#include "llinventorypanel.h"
+#include "llpanelobjectinventory.h"
 #include "llfloaterreg.h"
 #include "llselectmgr.h"
 #include "lluiconstants.h"
@@ -58,7 +59,7 @@
 
 LLFloaterOpenObject::LLFloaterOpenObject(const LLSD& key)
 :	LLFloater(key),
-	mPanelInventory(NULL),
+	mPanelInventoryObject(NULL),
 	mDirty(TRUE)
 {
 //	LLUICtrlFactory::getInstance()->buildFloater(this,"floater_openobject.xml");
@@ -74,7 +75,7 @@ LLFloaterOpenObject::~LLFloaterOpenObject()
 BOOL LLFloaterOpenObject::postBuild()
 {
 	childSetTextArg("object_name", "[DESC]", std::string("Object") ); // *Note: probably do not want to translate this
-	mPanelInventory = getChild<LLPanelInventory>("object_contents");
+	mPanelInventoryObject = getChild<LLPanelObjectInventory>("object_contents");
 	return TRUE;
 }
 
@@ -96,7 +97,7 @@ void LLFloaterOpenObject::onOpen(const LLSD& key)
 }
 void LLFloaterOpenObject::refresh()
 {
-	mPanelInventory->refresh();
+	mPanelInventoryObject->refresh();
 
 	std::string name;
 	BOOL enabled;
@@ -157,14 +158,14 @@ void LLFloaterOpenObject::moveToInventory(bool wear)
 	if (wear)
 	{
 		parent_category_id = gInventory.findCategoryUUIDForType(
-			LLAssetType::AT_CLOTHING);
+			LLFolderType::FT_CLOTHING);
 	}
 	else
 	{
 		parent_category_id = gInventory.getRootFolderID();
 	}
 	LLUUID category_id = gInventory.createNewCategory(parent_category_id, 
-		LLAssetType::AT_NONE, 
+		LLFolderType::FT_NONE, 
 		name);
 
 	LLCatAndWear* data = new LLCatAndWear;
diff --git a/indra/newview/llfloateropenobject.h b/indra/newview/llfloateropenobject.h
index a61cc04941f5ffcbd9d25774f082edac9bac9d4f..10d96b7ea3ae87f1cf8b962b1f9868318988bed9 100644
--- a/indra/newview/llfloateropenobject.h
+++ b/indra/newview/llfloateropenobject.h
@@ -41,7 +41,7 @@
 #include "llfloater.h"
 
 class LLObjectSelection;
-class LLPanelInventory;
+class LLPanelObjectInventory;
 
 class LLFloaterOpenObject
 : public LLFloater
@@ -77,7 +77,7 @@ class LLFloaterOpenObject
 	
 protected:
 
-	LLPanelInventory*	mPanelInventory;
+	LLPanelObjectInventory*	mPanelInventoryObject;
 	LLSafeHandle<LLObjectSelection> mObjectSelection;
 	BOOL mDirty;
 };
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 8b3391726a7fab80e84b21a74ed38d2f7f666027..2af1313db45d15a3296ef715cdfb73a597deaf46 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -339,7 +339,6 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	mCommitCallbackRegistrar.add("Pref.ClickDisablePopup",		boost::bind(&LLFloaterPreference::onClickDisablePopup, this));	
 	mCommitCallbackRegistrar.add("Pref.LogPath",				boost::bind(&LLFloaterPreference::onClickLogPath, this));
 	mCommitCallbackRegistrar.add("Pref.Logging",				boost::bind(&LLFloaterPreference::onCommitLogging, this));
-	mCommitCallbackRegistrar.add("Pref.OpenHelp",				boost::bind(&LLFloaterPreference::onOpenHelp, this));	
 	mCommitCallbackRegistrar.add("Pref.UpdateMeterText",		boost::bind(&LLFloaterPreference::updateMeterText, this, _1));	
 	mCommitCallbackRegistrar.add("Pref.HardwareSettings",       boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));	
 	mCommitCallbackRegistrar.add("Pref.HardwareDefaults",       boost::bind(&LLFloaterPreference::setHardwareDefaults, this));	
@@ -608,12 +607,6 @@ void LLFloaterPreference::onBtnOK()
 	LLPanelLogin::refreshLocation( false );
 }
 
-void LLFloaterPreference::onOpenHelp()
-{
-	const char* xml_alert = "GraphicsPreferencesHelp";
-	LLNotifications::instance().add(this->contextualNotification(xml_alert));
-}
-
 // static 
 void LLFloaterPreference::onBtnApply( )
 {
@@ -1043,11 +1036,15 @@ void LLFloaterPreference::onClickSetKey()
 void LLFloaterPreference::setKey(KEY key)
 {
 	childSetValue("modifier_combo", LLKeyboard::stringFromKey(key));
+	// update the control right away since we no longer wait for apply
+	getChild<LLUICtrl>("modifier_combo")->onCommit();
 }
 
 void LLFloaterPreference::onClickSetMiddleMouse()
 {
 	childSetValue("modifier_combo", "MiddleMouse");
+	// update the control right away since we no longer wait for apply
+	getChild<LLUICtrl>("modifier_combo")->onCommit();
 }
 
 void LLFloaterPreference::onClickSkipDialogs()
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 34723b8c7e3c2e480f476d4d63eec0e8b3773f2d..b1ad0348c0de2b60c8ab16fa91923ff365271eaf 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -84,7 +84,6 @@ class LLFloaterPreference : public LLFloater
 	void		onBtnOK();
 	void		onBtnCancel();
 	void		onBtnApply();
-	void		onOpenHelp();
 
 //	void		onClickClearCache();
 	void		onClickBrowserClearCache();
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 11544f5b7b58780180ce9022df5bd14c7ac5c5cc..32229bd85045a5d58a099764c03be62ef5bb0427 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -179,6 +179,8 @@ BOOL LLFloaterRegionInfo::postBuild()
 	LLPanelRegionInfo* panel;
 	panel = new LLPanelRegionGeneralInfo;
 	mInfoPanels.push_back(panel);
+	panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub",	boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel));
+	
 	LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_general.xml");
 	mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true));
 
@@ -544,14 +546,10 @@ void LLPanelRegionInfo::initCtrl(const std::string& name)
 	getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onChangeAnything, this));
 }
 
-void LLPanelRegionInfo::initHelpBtn(const std::string& name, const std::string& xml_alert)
-{
-	getChild<LLUICtrl>(name)->setCommitCallback(boost::bind(&LLPanelRegionInfo::onClickHelp, this, xml_alert));
-}
-
-void LLPanelRegionInfo::onClickHelp(std::string xml_alert)
+void LLPanelRegionInfo::onClickManageTelehub()
 {
-	LLNotifications::instance().add(xml_alert);
+	LLFloaterReg::hideInstance("region_info");
+	LLFloaterReg::showInstance("telehubs");
 }
 
 /////////////////////////////////////////////////////////////////////////////
@@ -589,22 +587,10 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
 	initCtrl("restrict_pushobject");
 	initCtrl("block_parcel_search_check");
 
-	initHelpBtn("terraform_help",		"HelpRegionBlockTerraform");
-	initHelpBtn("fly_help",				"HelpRegionBlockFly");
-	initHelpBtn("damage_help",			"HelpRegionAllowDamage");
-	initHelpBtn("agent_limit_help",		"HelpRegionAgentLimit");
-	initHelpBtn("object_bonus_help",	"HelpRegionObjectBonus");
-	initHelpBtn("access_help",			"HelpRegionMaturity");
-	initHelpBtn("restrict_pushobject_help",		"HelpRegionRestrictPushObject");
-	initHelpBtn("land_resell_help",	"HelpRegionLandResell");
-	initHelpBtn("parcel_changes_help", "HelpParcelChanges");
-	initHelpBtn("parcel_search_help", "HelpRegionSearch");
-
 	childSetAction("kick_btn", onClickKick, this);
 	childSetAction("kick_all_btn", onClickKickAll, this);
 	childSetAction("im_btn", onClickMessage, this);
 //	childSetAction("manage_telehub_btn", onClickManageTelehub, this);
-	mCommitCallbackRegistrar.add("RegionInfo.Cancel",	boost::bind(&LLPanelRegionGeneralInfo::onClickManageTelehub, this));
 
 	return LLPanelRegionInfo::postBuild();
 }
@@ -712,11 +698,7 @@ bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const L
 	return false;
 }
 
-void LLPanelRegionGeneralInfo::onClickManageTelehub()
-{
-	LLFloaterReg::hideInstance("region_info");
-	LLFloaterReg::showInstance("telehubs");
-}
+
 
 // setregioninfo
 // strings[0] = 'Y' - block terraform, 'N' - not
@@ -809,13 +791,6 @@ BOOL LLPanelRegionDebugInfo::postBuild()
 	initCtrl("disable_collisions_check");
 	initCtrl("disable_physics_check");
 
-	initHelpBtn("disable_scripts_help",		"HelpRegionDisableScripts");
-	initHelpBtn("disable_collisions_help",	"HelpRegionDisableCollisions");
-	initHelpBtn("disable_physics_help",		"HelpRegionDisablePhysics");
-	initHelpBtn("top_colliders_help",		"HelpRegionTopColliders");
-	initHelpBtn("top_scripts_help",			"HelpRegionTopScripts");
-	initHelpBtn("restart_help",				"HelpRegionRestart");
-
 	childSetAction("choose_avatar_btn", onClickChooseAvatar, this);
 	childSetAction("return_btn", onClickReturn, this);
 	childSetAction("top_colliders_btn", onClickTopColliders, this);
@@ -1182,15 +1157,6 @@ BOOL LLPanelRegionTerrainInfo::postBuild()
 {
 	LLPanelRegionInfo::postBuild();
 
-	initHelpBtn("water_height_help",	"HelpRegionWaterHeight");
-	initHelpBtn("terrain_raise_help",	"HelpRegionTerrainRaise");
-	initHelpBtn("terrain_lower_help",	"HelpRegionTerrainLower");
-	initHelpBtn("upload_raw_help",		"HelpRegionUploadRaw");
-	initHelpBtn("download_raw_help",	"HelpRegionDownloadRaw");
-	initHelpBtn("use_estate_sun_help",	"HelpRegionUseEstateSun");
-	initHelpBtn("fixed_sun_help",		"HelpRegionFixedSun");
-	initHelpBtn("bake_terrain_help",	"HelpRegionBakeTerrain");
-
 	initCtrl("water_height_spin");
 	initCtrl("terrain_raise_spin");
 	initCtrl("terrain_lower_spin");
@@ -2103,20 +2069,6 @@ BOOL LLPanelEstateInfo::postBuild()
 	getChild<LLUICtrl>("abuse_email_address")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAnything, this));
 	getChild<LLLineEditor>("abuse_email_address")->setKeystrokeCallback(onChangeText, this);
 
-	initHelpBtn("estate_manager_help",			"HelpEstateEstateManager");
-	initHelpBtn("use_global_time_help",			"HelpEstateUseGlobalTime");
-	initHelpBtn("fixed_sun_help",				"HelpEstateFixedSun");
-	initHelpBtn("WLEditSkyHelp",				"HelpEditSky");
-	initHelpBtn("WLEditDayCycleHelp",			"HelpEditDayCycle");
-
-	initHelpBtn("externally_visible_help",		"HelpEstateExternallyVisible");
-	initHelpBtn("allow_direct_teleport_help",	"HelpEstateAllowDirectTeleport");
-	initHelpBtn("allow_resident_help",			"HelpEstateAllowResident");
-	initHelpBtn("allow_group_help",				"HelpEstateAllowGroup");
-	initHelpBtn("ban_resident_help",			"HelpEstateBanResident");
-	initHelpBtn("abuse_email_address_help",     "HelpEstateAbuseEmailAddress");
-	initHelpBtn("voice_chat_help",              "HelpEstateVoiceChat");
-
 	// set up the use global time checkbox
 	getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this));
 	getChild<LLUICtrl>("fixed_sun_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeFixedSun, this));
@@ -2694,7 +2646,6 @@ bool LLPanelEstateCovenant::estateUpdate(LLMessageSystem* msg)
 // virtual 
 BOOL LLPanelEstateCovenant::postBuild()
 {
-	initHelpBtn("covenant_help",		"HelpEstateCovenant");
 	mEstateNameText = getChild<LLTextBox>("estate_name_text");
 	mEstateOwnerText = getChild<LLTextBox>("estate_owner_text");
 	mLastModifiedText = getChild<LLTextBox>("covenant_timestamp_text");
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 95833af8a107f3bf9c7c8e4a5c6468a421260073..a3b91223b78bed0785923fcaf73af96104e99f8b 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -123,12 +123,10 @@ class LLPanelRegionInfo : public LLPanel
 	void enableButton(const std::string& btn_name, BOOL enable = TRUE);
 	void disableButton(const std::string& btn_name);
 	
+	void onClickManageTelehub();
+	
 protected:
 	void initCtrl(const std::string& name);
-	void initHelpBtn(const std::string& name, const std::string& xml_alert);
-
-	// Callback for all help buttons, data is name of XML alert to show.
-	void onClickHelp(std::string xml_alert);
 	
 	// Returns TRUE if update sent and apply button should be
 	// disabled.
@@ -152,6 +150,7 @@ class LLPanelRegionInfo : public LLPanel
 
 class LLPanelRegionGeneralInfo : public LLPanelRegionInfo
 {
+	
 public:
 	LLPanelRegionGeneralInfo()
 		:	LLPanelRegionInfo()	{}
@@ -161,16 +160,16 @@ class LLPanelRegionGeneralInfo : public LLPanelRegionInfo
 	
 	// LLPanel
 	virtual BOOL postBuild();
+	
 protected:
 	virtual BOOL sendUpdate();
-	
 	static void onClickKick(void* userdata);
 	static void onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
 	static void onClickKickAll(void* userdata);
 	bool onKickAllCommit(const LLSD& notification, const LLSD& response);
 	static void onClickMessage(void* userdata);
 	bool onMessageCommit(const LLSD& notification, const LLSD& response);
-	void onClickManageTelehub();
+
 };
 
 /////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 70a3ad5252d4fb926ceff3fd54c60aeacfdc3e1b..0f4d6e33a367f309708a3d0f94ae0c532fbf8e4c 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -770,7 +770,7 @@ void LLFloaterReporter::takeScreenshot()
 	if (COMPLAINT_REPORT == mReportType)
 	{
 		mResourceDatap->mAssetInfo.mType = LLAssetType::AT_TEXTURE;
-		mResourceDatap->mPreferredLocation = LLAssetType::EType(-2);
+		mResourceDatap->mPreferredLocation = LLFolderType::EType(LLResourceData::INVALID_LOCATION);
 	}
 	else
 	{
@@ -789,7 +789,7 @@ void LLFloaterReporter::takeScreenshot()
 
 	// store in the image list so it doesn't try to fetch from the server
 	LLPointer<LLViewerFetchedTexture> image_in_list = 
-		LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, FALSE, LLViewerTexture::FETCHED_TEXTURE);
+		LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::FETCHED_TEXTURE);
 	image_in_list->createGLTexture(0, raw);
 	
 	// the texture picker then uses that texture
@@ -838,7 +838,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,
 	}
 
 	EReportType report_type = UNKNOWN_REPORT;
-	if (data->mPreferredLocation == -2)
+	if (data->mPreferredLocation == LLResourceData::INVALID_LOCATION)
 	{
 		report_type = COMPLAINT_REPORT;
 	}
diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp
index 3bf1848efb7643c9459f929fa64e05e71cbaf953..eeea71cc4cdb481a3a9bbc67f6bab2a438911184 100644
--- a/indra/newview/llfloaterscriptdebug.cpp
+++ b/indra/newview/llfloaterscriptdebug.cpp
@@ -106,7 +106,7 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:
 
 	if (objectp)
 	{
-		objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, TRUE));
+		objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI));
 		floater_label = llformat("%s(%.2f, %.2f)", user_name.c_str(), objectp->getPositionRegion().mV[VX], objectp->getPositionRegion().mV[VY]);
 	}
 	else
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index bd9798c18e144c33fd037dd05c30951c2dbca779..97c573ddea516ecd6f3b777a8c2ffe9605965ccd 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -34,8 +34,8 @@
 #include "llviewerprecompiledheaders.h"
 #include "llfloatersearch.h"
 #include "llmediactrl.h"
-#include "llagent.h"
-
+#include "lllogininstance.h"
+#include "lluri.h"
 
 LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
 	LLFloater(key),
@@ -116,15 +116,11 @@ void LLFloaterSearch::search(const LLSD &key)
 
 	// append the search query string
 	std::string search_text = key.has("id") ? key["id"].asString() : "";
-	url += std::string("?q=") + search_text;
+	url += std::string("?q=") + LLURI::escape(search_text);
 
-	// append the maturity and teen capabilities for this agent
-	BOOL godlike = gAgent.isGodlike();
-	bool mature_enabled = gAgent.canAccessMature() || godlike;
-	bool adult_enabled = gAgent.canAccessAdult() || godlike;
-	std::string mature = (mature_enabled) ? "True" : "False";
-	std::string teen = (!adult_enabled) ? "True" : "False";
-	url += "&t=" + teen + "&m=" + mature;
+	// append the permissions token that login.cgi gave us
+	LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
+	url += "&p=" + search_token.asString();
 
 	// and load the URL in the web view
 	mBrowser->navigateTo(url);
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 235e8192186ee2097727a7dd8c7679d5d5647966..541e2a26648cd14904433a0805319ae5f5169d3b 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -980,7 +980,7 @@ void LLSnapshotLivePreview::saveTexture()
 				    "Snapshot : " + pos_string,
 				    "Taken by " + who_took_it + " at " + pos_string,
 				    0,
-				    LLAssetType::AT_SNAPSHOT_CATEGORY,
+				    LLFolderType::FT_SNAPSHOT_CATEGORY,
 				    LLInventoryType::IT_SNAPSHOT,
 				    PERM_ALL,  // Note: Snapshots to inventory is a special case of content upload
 				    PERM_NONE, // that ignores the user's premissions preferences and continues to
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 5fee84190b9b383402629167b54560fc0cfe95d5..3aef15a35c0848a0b87889147d2277aedef98be1 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -54,7 +54,7 @@
 #include "llpanelcontents.h"
 #include "llpanelface.h"
 #include "llpanelland.h"
-#include "llpanelinventory.h"
+#include "llpanelobjectinventory.h"
 #include "llpanelobject.h"
 #include "llpanelvolume.h"
 #include "llpanelpermissions.h"
diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp
index aca9198f59ac152d0536bfa4f2e52d44d5d14bfc..bbeb2871714c5b0834a514a0ed166a70145918e3 100644
--- a/indra/newview/llfloatervoicedevicesettings.cpp
+++ b/indra/newview/llfloatervoicedevicesettings.cpp
@@ -49,6 +49,9 @@
 #include "lluictrlfactory.h"
 
 
+static LLRegisterPanelClassWrapper<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings");
+
+
 LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
 	: LLPanel()
 {
@@ -82,8 +85,22 @@ BOOL LLPanelVoiceDeviceSettings::postBuild()
 	return TRUE;
 }
 
+// virtual
+void LLPanelVoiceDeviceSettings::handleVisibilityChange ( BOOL new_visibility )
+{
+	if (new_visibility)
+	{
+		initialize();	
+	}
+	else
+	{
+		cleanup();
+	}
+}
 void LLPanelVoiceDeviceSettings::draw()
 {
+	refresh();
+
 	// let user know that volume indicator is not yet available
 	bool is_in_tuning_mode = gVoiceClient->inTuningMode();
 	childSetVisible("wait_text", !is_in_tuning_mode);
diff --git a/indra/newview/llfloatervoicedevicesettings.h b/indra/newview/llfloatervoicedevicesettings.h
index f1603dc4144a6c656d2bbc1700445efd37af7645..d67283d0a224d5a4357bbeb4cb97c086998a3806 100644
--- a/indra/newview/llfloatervoicedevicesettings.h
+++ b/indra/newview/llfloatervoicedevicesettings.h
@@ -50,6 +50,8 @@ class LLPanelVoiceDeviceSettings : public LLPanel
 	void initialize();
 	void cleanup();
 
+	/*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
+	
 protected:
 	static void onCommitInputDevice(LLUICtrl* ctrl, void* user_data);
 	static void onCommitOutputDevice(LLUICtrl* ctrl, void* user_data);
diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp
index 72c82c178b6f6e0fb714775638b03044abb7ce75..a0fe42bf61763ed48f2c220c6bd64fdb94c8fa52 100644
--- a/indra/newview/llfloaterwater.cpp
+++ b/indra/newview/llfloaterwater.cpp
@@ -110,23 +110,6 @@ BOOL LLFloaterWater::postBuild()
 }
 void LLFloaterWater::initCallbacks(void) {
 
-	// help buttons
-	initHelpBtn("WaterFogColorHelp", "HelpWaterFogColor");
-	initHelpBtn("WaterFogDensityHelp", "HelpWaterFogDensity");
-	initHelpBtn("WaterUnderWaterFogModHelp", "HelpUnderWaterFogMod");
-	initHelpBtn("WaterGlowHelp", "HelpWaterGlow");	
-	initHelpBtn("WaterNormalScaleHelp", "HelpWaterNormalScale");
-	initHelpBtn("WaterFresnelScaleHelp", "HelpWaterFresnelScale");
-	initHelpBtn("WaterFresnelOffsetHelp", "HelpWaterFresnelOffset");
-
-	initHelpBtn("WaterBlurMultiplierHelp", "HelpWaterBlurMultiplier");
-	initHelpBtn("WaterScaleBelowHelp", "HelpWaterScaleBelow");
-	initHelpBtn("WaterScaleAboveHelp", "HelpWaterScaleAbove");
-
-	initHelpBtn("WaterNormalMapHelp", "HelpWaterNormalMap");
-	initHelpBtn("WaterWave1Help", "HelpWaterWave1");
-	initHelpBtn("WaterWave2Help", "HelpWaterWave2");
-
 	LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
 
 	getChild<LLUICtrl>("WaterFogColor")->setCommitCallback(boost::bind(&LLFloaterWater::onWaterFogColorMoved, this, _1, &param_mgr->mFogColor));
@@ -173,16 +156,6 @@ void LLFloaterWater::initCallbacks(void) {
 	getChild<LLUICtrl>("WaterNormalMap")->setCommitCallback(boost::bind(&LLFloaterWater::onNormalMapPicked, this, _1));
 }
 
-void LLFloaterWater::onClickHelp(std::string xml_alert)
-{
-	LLNotifications::instance().add(contextualNotification(xml_alert));
-}
-
-void LLFloaterWater::initHelpBtn(const std::string& name, const std::string& xml_alert)
-{
-	getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterWater::onClickHelp, this, xml_alert));
-}
-
 bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& response)
 {
 	std::string text = response["message"].asString();
diff --git a/indra/newview/llfloaterwater.h b/indra/newview/llfloaterwater.h
index 08c630c69e3e45bb27a6af27455a4120f2919bc5..0ea2436dbea4a5e1bfb8b41be5d7e082051cf6d7 100644
--- a/indra/newview/llfloaterwater.h
+++ b/indra/newview/llfloaterwater.h
@@ -59,10 +59,6 @@ class LLFloaterWater : public LLFloater
 	/// initialize all
 	void initCallbacks(void);
 
-	// help button stuff
-	void onClickHelp(std::string xml_alert);
-	void initHelpBtn(const std::string& name, const std::string& xml_alert);
-
 	bool newPromptCallback(const LLSD& notification, const LLSD& response);
 
 	/// general purpose callbacks for dealing with color controllers
diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp
index 02979acdd72a291a1f2b0c8b9ee02f0f56fae83e..60494f3cce4c88609ff22fd10db54dccc3023a78 100644
--- a/indra/newview/llfloaterwindlight.cpp
+++ b/indra/newview/llfloaterwindlight.cpp
@@ -119,36 +119,6 @@ BOOL LLFloaterWindLight::postBuild()
 }
 void LLFloaterWindLight::initCallbacks(void) {
 
-	// help buttons
-	initHelpBtn("WLBlueHorizonHelp", "HelpBlueHorizon");
-	initHelpBtn("WLHazeHorizonHelp", "HelpHazeHorizon");
-	initHelpBtn("WLBlueDensityHelp", "HelpBlueDensity");
-	initHelpBtn("WLHazeDensityHelp", "HelpHazeDensity");
-
-	initHelpBtn("WLDensityMultHelp", "HelpDensityMult");
-	initHelpBtn("WLDistanceMultHelp", "HelpDistanceMult");
-	initHelpBtn("WLMaxAltitudeHelp", "HelpMaxAltitude");
-
-	initHelpBtn("WLSunlightColorHelp", "HelpSunlightColor");
-	initHelpBtn("WLAmbientHelp", "HelpSunAmbient");
-	initHelpBtn("WLSunGlowHelp", "HelpSunGlow");
-	initHelpBtn("WLTimeOfDayHelp", "HelpTimeOfDay");
-	initHelpBtn("WLEastAngleHelp", "HelpEastAngle");
-
-	initHelpBtn("WLSceneGammaHelp", "HelpSceneGamma");
-	initHelpBtn("WLStarBrightnessHelp", "HelpStarBrightness");
-
-	initHelpBtn("WLCloudColorHelp", "HelpCloudColor");
-	initHelpBtn("WLCloudDetailHelp", "HelpCloudDetail");
-	initHelpBtn("WLCloudDensityHelp", "HelpCloudDensity");
-	initHelpBtn("WLCloudCoverageHelp", "HelpCloudCoverage");
-
-	initHelpBtn("WLCloudScaleHelp", "HelpCloudScale");
-	initHelpBtn("WLCloudScrollXHelp", "HelpCloudScrollX");
-	initHelpBtn("WLCloudScrollYHelp", "HelpCloudScrollY");
-
-	initHelpBtn("WLClassicCloudsHelp", "HelpClassicClouds");
-
 	LLWLParamManager * param_mgr = LLWLParamManager::instance();
 
 	// blue horizon
@@ -237,16 +207,6 @@ void LLFloaterWindLight::initCallbacks(void) {
 	getChild<LLUICtrl>("WLStarAlpha")->setCommitCallback(boost::bind(&LLFloaterWindLight::onStarAlphaMoved, this, _1));
 }
 
-void LLFloaterWindLight::onClickHelp(std::string xml_alert)
-{
-	LLNotifications::instance().add(contextualNotification(xml_alert));
-}
-
-void LLFloaterWindLight::initHelpBtn(const std::string& name, const std::string& xml_alert)
-{
-	getChild<LLButton>(name)->setClickedCallback(boost::bind(&LLFloaterWindLight::onClickHelp, this, xml_alert));
-}
-
 bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD& response)
 {
 	std::string text = response["message"].asString();
diff --git a/indra/newview/llfloaterwindlight.h b/indra/newview/llfloaterwindlight.h
index 56c2c6623b1e0d197416496b31c23cb28d196781..ed9322c4509eab5028b1d2c99de5937ecb3a919d 100644
--- a/indra/newview/llfloaterwindlight.h
+++ b/indra/newview/llfloaterwindlight.h
@@ -57,10 +57,6 @@ class LLFloaterWindLight : public LLFloater
 	/// initialize all
 	void initCallbacks(void);
 
-	// help button stuff
-	void onClickHelp(std::string alert);
-	void initHelpBtn(const std::string& name, const std::string& xml_alert);
-
 	bool newPromptCallback(const LLSD& notification, const LLSD& response);
 
 	/// general purpose callbacks for dealing with color controllers
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index b7e8835fb885b09ea506a196602932d1a0437f0d..6567c1a649f9e2865e3e4a244c3508534a22dfbf 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -45,6 +45,7 @@
 #include "llcallingcard.h"
 #include "llcombobox.h"
 #include "llviewercontrol.h"
+#include "llcommandhandler.h"
 #include "lldraghandle.h"
 #include "llfirstuse.h"
 #include "llfloaterreg.h"		// getTypedInstance()
@@ -96,6 +97,35 @@ static const F32 SIM_COORD_DEFAULT = 128.f;
 // Globals
 //---------------------------------------------------------------------------
 
+// handle secondlife:///app/worldmap/{NAME}/{COORDS} URLs
+class LLWorldMapHandler : public LLCommandHandler
+{
+public:
+	// requires trusted browser to trigger
+	LLWorldMapHandler() : LLCommandHandler("worldmap", UNTRUSTED_THROTTLE) { }
+
+	bool handle(const LLSD& params, const LLSD& query_map,
+				LLMediaCtrl* web)
+	{
+		if (params.size() == 0)
+		{
+			return false;
+		}
+
+		const std::string region_name = params[0].asString();
+		S32 x = (params.size() > 1) ? params[1].asInteger() : 128;
+		S32 y = (params.size() > 2) ? params[2].asInteger() : 128;
+		S32 z = (params.size() > 3) ? params[3].asInteger() : 0;
+
+		LLFloaterWorldMap::getInstance()->trackURL(region_name, x, y, z);
+		LLFloaterReg::showInstance("world_map", "center");
+
+		return true;
+	}
+};
+LLWorldMapHandler gWorldMapHandler;
+
+
 LLFloaterWorldMap* gFloaterWorldMap = NULL;
 
 class LLMapInventoryObserver : public LLInventoryObserver
@@ -297,7 +327,7 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)
 		LLFirstUse::useMap();
 
 		// Start speculative download of landmarks
-		LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+		const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
 		gInventory.startBackgroundFetch(landmark_folder_id);
 
 		childSetFocus("location", TRUE);
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index de18e7475288f1c9c0c8a8e11f5e1317fa3dd8cb..7863c373c62348b9d203083c8f33772a4a3f6496 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -38,6 +38,7 @@
 #include "llinventorybridge.h"
 #include "llinventoryclipboard.h" // *TODO: remove this once hack below gone.
 #include "llinventoryfilter.h"
+#include "llinventoryfunctions.h"
 #include "llfoldertype.h"
 #include "llfloaterinventory.h"// hacked in for the bonus context menu items.
 #include "llkeyboard.h"
@@ -54,6 +55,7 @@
 #include "llviewermenu.h"
 #include "lluictrlfactory.h"
 #include "llviewercontrol.h"
+#include "llviewerfoldertype.h"
 #include "llviewerwindow.h"
 #include "llvoavatar.h"
 #include "llfloaterproperties.h"
@@ -1107,7 +1109,7 @@ void LLFolderView::propertiesSelectedItems( void )
 	}
 }
 
-void LLFolderView::changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type)
+void LLFolderView::changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type)
 {
 	LLFolderBridge *folder_bridge = LLFolderBridge::sSelf;
 
@@ -1957,7 +1959,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
 	if (action.length() > change_folder_string.length() && 
 		(action.compare(0,change_folder_string.length(),"change_folder_type_") == 0))
 	{
-		LLAssetType::EType new_folder_type = LLFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length()));
+		LLFolderType::EType new_folder_type = LLViewerFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length()));
 		changeType(model, new_folder_type);
 		return true;
 	}
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index ebfb4efde2db06471cc2fec292cd4e8ec682bb32..0bd65b5f909474e183015cc4e747fd56b4150f43 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -192,7 +192,7 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
 	void propertiesSelectedItems( void );
 
 	// change the folder type
-	void changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type);
+	void changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type);
 
 	void autoOpenItem(LLFolderViewFolder* item);
 	void closeAutoOpenedFolders();
diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h
index ff38da279a52c3dfdb403c45d5918bcd5fa6f950..60ece75ceadd565485ab0f97dbe6263cadc336b6 100644
--- a/indra/newview/llfoldervieweventlistener.h
+++ b/indra/newview/llfoldervieweventlistener.h
@@ -32,6 +32,7 @@
 #define LLFOLDERVIEWEVENTLISTENER_H
 
 #include "lldarray.h"	// JAMESDEBUG convert to std::vector
+#include "llfoldertype.h"
 #include "llfontgl.h"	// just for StyleFlags enum
 #include "llpointer.h"
 
@@ -57,7 +58,7 @@ class LLFolderViewEventListener
 	virtual const LLUUID& getUUID() const = 0;
 	virtual time_t getCreationDate() const = 0;	// UTC seconds
 	virtual PermissionMask getPermissionMask() const = 0;
-	virtual LLAssetType::EType getPreferredType() const = 0;
+	virtual LLFolderType::EType getPreferredType() const = 0;
 	virtual LLPointer<LLUIImage> getIcon() const = 0;
 	virtual LLFontGL::StyleFlags getLabelStyle() const = 0;
 	virtual std::string getLabelSuffix() const = 0;
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index f83a426cdab91b6802c7f2ebc58a09e8252c4215..6fdaefd21ab9030eb3c1f3ec8463ec492de9c448 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -248,13 +248,13 @@ void LLFolderViewItem::refreshFromListener()
 	if(mListener)
 	{
 		mLabel = mListener->getDisplayName();
-		LLAssetType::EType preferred_type = mListener->getPreferredType();
+		LLFolderType::EType preferred_type = mListener->getPreferredType();
 
 		// *TODO: to be removed when database supports multi language. This is a
 		// temporary attempt to display the inventory folder in the user locale.
 		// mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID
 		//		it uses the same way to find localized string
-		if (LLAssetType::lookupIsProtectedCategoryType(preferred_type))
+		if (LLFolderType::lookupIsProtectedType(preferred_type))
 		{
 			LLTrans::findString(mLabel, "InvFolder " + mLabel);
 		};
@@ -1753,7 +1753,7 @@ bool LLFolderViewFolder::isTrash() const
 {
 	if (mAmTrash == LLFolderViewFolder::UNKNOWN)
 	{
-		mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH;
+		mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH;
 	}
 	return mAmTrash == LLFolderViewFolder::TRASH;
 }
@@ -2167,7 +2167,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )
 {
 	const LLUUID &cat_uuid = getListener()->getUUID();
 	const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid);
-	if (cat && cat->getPreferredType() == LLAssetType::AT_OUTFIT)
+	if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
 	{
 		getListener()->performAction(NULL, NULL,"replaceoutfit");
 		return TRUE;
@@ -2490,7 +2490,7 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde
 		&& b->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
 	{
 
-		static LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+		static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
 
 		LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID();
 		LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID();
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index fbcaeee01f224be9faecf2784c4a08f5ec58875c..5f79fe8b20189b2d1ea6bfc35b44bdbe4eedd692 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -135,14 +135,14 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID)
 // and this method must be called before any actions with friend list
 void LLFriendCardsManager::ensureFriendFoldersExist()
 {
-	LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
 
 	LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
 
 	if (friendFolderUUID.isNull())
 	{
 		friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID,
-			LLAssetType::AT_CALLINGCARD, get_friend_folder_name());
+			LLFolderType::FT_CALLINGCARD, get_friend_folder_name());
 	}
 
 	LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl();
@@ -150,7 +150,7 @@ void LLFriendCardsManager::ensureFriendFoldersExist()
 	if (friendAllSubfolderUUID.isNull())
 	{
 		friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID,
-			LLAssetType::AT_CALLINGCARD, get_friend_all_subfolder_name());
+			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
 	}
 }
 
@@ -351,7 +351,7 @@ void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBud
 /************************************************************************/
 const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const
 {
-	LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
 
 	std::string friendFolderName = get_friend_folder_name();
 
diff --git a/indra/newview/llhudview.cpp b/indra/newview/llhudview.cpp
index 027cd2ab077023b58173b402da2779dc4835a23e..261d9f1df7882dbd1943ce8909e4d8fee00419f1 100644
--- a/indra/newview/llhudview.cpp
+++ b/indra/newview/llhudview.cpp
@@ -71,20 +71,6 @@ void LLHUDView::draw()
 	LLView::draw();
 }
 
-
-// public
-const LLColor4& LLHUDView::colorFromType(S32 type)
-{
-	switch (type)
-	{
-	case 0:
-		return LLColor4::green;
-	default:
-		return LLColor4::black;
-	}
-}
-
-
 /*virtual*/
 BOOL LLHUDView::handleMouseDown(S32 x, S32 y, MASK mask)
 {
diff --git a/indra/newview/llhudview.h b/indra/newview/llhudview.h
index 05ff9c8596bbeaeecbd1b22fd438194c3ec8ee9f..0946e2c5c8314ba4e59d5adccd4505fb89fa8c02 100644
--- a/indra/newview/llhudview.h
+++ b/indra/newview/llhudview.h
@@ -47,8 +47,6 @@ class LLHUDView
 
 	virtual void draw();
 
-	const LLColor4& colorFromType(S32 type);
-
 protected:
 	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 };
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index dee86f4a222504ac1f0e6192de6ddea54bb0f4ce..19fa66fd0e44de1f6c81174ba2172035f898f981 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -106,6 +106,8 @@ void LLIMFloater::onFocusReceived()
 // virtual
 void LLIMFloater::onClose(bool app_quitting)
 {
+	if (!gIMMgr->hasSession(mSessionID)) return;
+	
 	setTyping(false);
 	gIMMgr->leaveSession(mSessionID);
 }
@@ -234,7 +236,10 @@ BOOL LLIMFloater::postBuild()
 	
 	mChatHistory = getChild<LLChatHistory>("chat_history");
 		
-	setTitle(LLIMModel::instance().getName(mSessionID));
+	std::string session_name(LLIMModel::instance().getName(mSessionID));
+	LLStringUtil::toUpper(session_name);
+	setTitle(session_name);
+
 	setDocked(true);
 
 	mTypingStart = LLTrans::getString("IM_typing_start_string");
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index c4beb666ea7241549f65a57597790387d5efdf27..7399f1e1b3a9d3d8e43c0ca78f9bbe02375ce8ed 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -70,6 +70,7 @@
 #include "llpanelimcontrolpanel.h"
 #include "llrecentpeople.h"
 #include "llresmgr.h"
+#include "lltooldraganddrop.h"
 #include "lltrans.h"
 #include "lltabcontainer.h"
 #include "llviewertexteditor.h"
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index bfad2b162480cde9fed16af1f8e932521dc55525..9989a3b47313f2676ca4c167e9d9cb24d2a208e3 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -188,7 +188,8 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
 {
 	mCommitCallbackRegistrar.add("InspectAvatar.ViewProfile",	boost::bind(&LLInspectAvatar::onClickViewProfile, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.AddFriend",	boost::bind(&LLInspectAvatar::onClickAddFriend, this));	
-	mCommitCallbackRegistrar.add("InspectAvatar.IM",	boost::bind(&LLInspectAvatar::onClickIM, this));	
+	mCommitCallbackRegistrar.add("InspectAvatar.IM",
+		boost::bind(&LLInspectAvatar::onClickIM, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.Teleport",	boost::bind(&LLInspectAvatar::onClickTeleport, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup",	boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));	
 	mCommitCallbackRegistrar.add("InspectAvatar.Pay",	boost::bind(&LLInspectAvatar::onClickPay, this));	
@@ -306,7 +307,21 @@ void LLInspectAvatar::requestUpdate()
 	// You can't re-add someone as a friend if they are already your friend
 	bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL;
 	bool is_self = (mAvatarID == gAgentID);
-	childSetEnabled("add_friend_btn", !is_friend && !is_self);
+	if (is_self)
+	{
+		getChild<LLUICtrl>("add_friend_btn")->setVisible(false);
+		getChild<LLUICtrl>("im_btn")->setVisible(false);
+	}
+	else if (is_friend)
+	{
+		getChild<LLUICtrl>("add_friend_btn")->setVisible(false);
+		getChild<LLUICtrl>("im_btn")->setVisible(true);
+	}
+	else
+	{
+		getChild<LLUICtrl>("add_friend_btn")->setVisible(true);
+		getChild<LLUICtrl>("im_btn")->setVisible(false);
+	}
 
 	// Use an avatar_icon even though the image id will come down with the
 	// avatar properties because the avatar_icon code maintains a cache of icons
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index 050a61c79b266f567f03f9cde619e865e52e7e0c..e3780f93ff69e4a709c353de64b7c46d2aa2b273 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -112,6 +112,7 @@ class LLInspectObject : public LLInspect
 	LLUUID				mObjectID;
 	S32					mObjectFace;
 	viewer_media_t		mMediaImpl;
+	LLMediaEntry*       mMediaEntry;
 	LLSafeHandle<LLObjectSelection> mObjectSelection;
 };
 
@@ -120,7 +121,8 @@ LLInspectObject::LLInspectObject(const LLSD& sd)
 	mObjectID(NULL),			// set in onOpen()
 	mObjectFace(0),
 	mObjectSelection(NULL),
-	mMediaImpl(NULL)
+	mMediaImpl(NULL),
+	mMediaEntry(NULL)
 {
 	// can't make the properties request until the widgets are constructed
 	// as it might return immediately, so do it in postBuild.
@@ -231,11 +233,11 @@ void LLInspectObject::onOpen(const LLSD& data)
 		if (!tep)
 			return;
 		
-		const LLMediaEntry* mep = tep->hasMedia() ? tep->getMediaData() : NULL;
-		if(!mep)
+		mMediaEntry = tep->hasMedia() ? tep->getMediaData() : NULL;
+		if(!mMediaEntry)
 			return;
 		
-		mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
+		mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mMediaEntry->getMediaID());
 	}
 }
 
@@ -282,11 +284,11 @@ void LLInspectObject::update()
 	if (!tep)
 		return;
 	
-	const LLMediaEntry* mep = tep->hasMedia() ? tep->getMediaData() : NULL;
-	if(!mep)
+	mMediaEntry = tep->hasMedia() ? tep->getMediaData() : NULL;
+	if(!mMediaEntry)
 		return;
 	
-	mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
+	mMediaImpl = LLViewerMedia::getMediaImplFromTextureID(mMediaEntry->getMediaID());
 	
 	updateMediaCurrentURL();
 	updateSecureBrowsing();
@@ -430,14 +432,17 @@ void LLInspectObject::updateDescription(LLSelectNode* nodep)
 
 void LLInspectObject::updateMediaCurrentURL()
 {	
+	if(!mMediaEntry)
+		return;
 	LLTextBox* textbox = getChild<LLTextBox>("object_media_url");
 	std::string media_url = "";
 	textbox->setValue(media_url);
 	textbox->setToolTip(media_url);
+	LLStringUtil::format_map_t args;
 	
 	if(mMediaImpl.notNull() && mMediaImpl->hasMedia())
 	{
-		LLStringUtil::format_map_t args;
+		
 		LLPluginClassMedia* media_plugin = NULL;
 		media_plugin = mMediaImpl->getMediaPlugin();
 		if(media_plugin)
@@ -451,15 +456,17 @@ void LLInspectObject::updateMediaCurrentURL()
 				args["[CurrentURL]"] =  media_plugin->getLocation();
 			}
 			media_url = LLTrans::getString("CurrentURL", args);
-			textbox->setText(media_url);
-			textbox->setToolTip(media_url);
+
 		}
 	}
-	else
+	else if(mMediaEntry->getCurrentURL() != "")
 	{
-		textbox->setText(media_url);
-		textbox->setToolTip(media_url);
+		args["[CurrentURL]"] = mMediaEntry->getCurrentURL();
+		media_url = LLTrans::getString("CurrentURL", args);
 	}
+
+	textbox->setText(media_url);
+	textbox->setToolTip(media_url);
 }
 
 void LLInspectObject::updateCreator(LLSelectNode* nodep)
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 59f70ea1bd546e9fcfd6268984ea86e55a2f7f9f..b9a25d5dc74a38ab1f14023434d9b1f7454a3032 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -62,7 +62,9 @@
 #include "llavataractions.h"
 #include "llgesturemgr.h"
 #include "lliconctrl.h"
+#include "llinventoryfunctions.h"
 #include "llinventorymodel.h"
+#include "llinventorypanel.h"
 #include "llinventoryclipboard.h"
 #include "lllineeditor.h"
 #include "llmenugl.h"
@@ -76,6 +78,7 @@
 #include "llscrollcontainer.h"
 #include "llimview.h"
 #include "lltooldraganddrop.h"
+#include "llviewerfoldertype.h"
 #include "llviewertexturelist.h"
 #include "llviewerinventory.h"
 #include "llviewerobjectlist.h"
@@ -83,6 +86,7 @@
 #include "llvoavatar.h"
 #include "llwearable.h"
 #include "llwearablelist.h"
+#include "llviewerassettype.h"
 #include "llviewermessage.h"
 #include "llviewerregion.h"
 #include "llvoavatarself.h"
@@ -200,9 +204,9 @@ PermissionMask LLInvFVBridge::getPermissionMask() const
 }
 
 // virtual
-LLAssetType::EType LLInvFVBridge::getPreferredType() const
+LLFolderType::EType LLInvFVBridge::getPreferredType() const
 {
-	return LLAssetType::AT_NONE;
+	return LLFolderType::FT_NONE;
 }
 
 
@@ -275,7 +279,11 @@ void LLInvFVBridge::cutToClipboard()
 // *TODO: make sure this does the right thing
 void LLInvFVBridge::showProperties()
 {
-	LLFloaterReg::showInstance("properties", mUUID);
+	LLSD key;
+	key["id"] = mUUID;
+	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+
+	// LLFloaterReg::showInstance("properties", mUUID);
 }
 
 void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch)
@@ -333,7 +341,7 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
 	LLInventoryModel* model = getInventoryModel();
 	if(!model) return;
 	LLMessageSystem* msg = gMessageSystem;
-	LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	LLViewerInventoryItem* item = NULL;
 	LLViewerInventoryCategory* cat = NULL;
 	std::vector<LLUUID> move_ids;
@@ -498,7 +506,7 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
 			}
 		}
 		const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i));
-		if (cat && !LLAssetType::lookupCanLink(cat->getPreferredType()))
+		if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
 		{
 			return FALSE;
 		}
@@ -506,7 +514,7 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
 	return TRUE;
 }
 
-void hideContextEntries(LLMenuGL& menu,
+void hide_context_entries(LLMenuGL& menu, 
 						const std::vector<std::string> &entries_to_show,
 						const std::vector<std::string> &disabled_entries)
 {
@@ -521,7 +529,7 @@ void hideContextEntries(LLMenuGL& menu,
 		LLMenuItemBranchGL* branchp = dynamic_cast<LLMenuItemBranchGL*>(*itor);
 		if ((name == "More") && branchp)
 		{
-			hideContextEntries(*branchp->getBranch(), entries_to_show, disabled_entries);
+			hide_context_entries(*branchp->getBranch(), entries_to_show, disabled_entries);
 		}
 
 
@@ -598,6 +606,12 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
 	{
 		disabled_items.push_back(std::string("Delete"));
 	}
+
+	// If multiple items are selected, disable properties (if it exists).
+	if ((flags & FIRST_SELECTED_ITEM) == 0)
+	{
+		disabled_items.push_back(std::string("Properties"));
+	}
 }
 
 void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
@@ -621,7 +635,7 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 
 		getClipboardEntries(true, items, disabled_items, flags);
 	}
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 // *TODO: remove this
@@ -633,7 +647,7 @@ BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
 
 	if(obj)
 	{
-		*type = LLAssetType::lookupDragAndDropType(obj->getActualType());
+		*type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType());
 		if(*type == DAD_NONE)
 		{
 			return FALSE;
@@ -674,7 +688,7 @@ BOOL LLInvFVBridge::isInTrash() const
 {
 	LLInventoryModel* model = getInventoryModel();
 	if(!model) return FALSE;
-	const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	return model->isObjectDescendentOf(mUUID, trash_id);
 }
 
@@ -687,7 +701,7 @@ BOOL LLInvFVBridge::isLinkedObjectInTrash() const
 	{
 		LLInventoryModel* model = getInventoryModel();
 		if(!model) return FALSE;
-		const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id);
 	}
 	return FALSE;
@@ -705,7 +719,7 @@ BOOL LLInvFVBridge::isCOFFolder() const
 {
 	const LLInventoryModel* model = getInventoryModel();
 	if(!model) return TRUE;
-	const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+	const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 	if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id))
 	{
 		return TRUE;
@@ -1032,7 +1046,7 @@ void LLItemBridge::restoreItem()
 	if(item)
 	{
 		LLInventoryModel* model = getInventoryModel();
-		const LLUUID new_parent = model->findCategoryUUIDForType(item->getType());
+		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));
 		// do not restamp on restore.
 		LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE);
 	}
@@ -1065,7 +1079,7 @@ void LLItemBridge::restoreToWorld()
 	}
 
 	// Check if it's in the trash. (again similar to the normal rez logic)
-	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
 	{
 		remove_from_inventory = TRUE;
@@ -1260,7 +1274,7 @@ BOOL LLItemBridge::removeItem()
 	LLPreview::hide(mUUID, TRUE);
 	LLInventoryModel* model = getInventoryModel();
 	if(!model) return FALSE;
-	LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	LLViewerInventoryItem* item = getItem();
 
 	// if item is not already in trash
@@ -1353,7 +1367,7 @@ BOOL LLFolderBridge::isItemMovable() const
 	LLInventoryObject* obj = getInventoryObject();
 	if(obj)
 	{
-		return (!LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)obj)->getPreferredType()));
+		return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()));
 	}
 	return FALSE;
 }
@@ -1389,7 +1403,7 @@ BOOL LLFolderBridge::isItemRemovable()
 		return FALSE;
 	}
 
-	if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType()))
+	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
 	{
 		return FALSE;
 	}
@@ -1402,7 +1416,7 @@ BOOL LLFolderBridge::isItemRemovable()
 	for( i = 0; i < descendent_categories.count(); i++ )
 	{
 		LLInventoryCategory* category = descendent_categories[i];
-		if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType()))
+		if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
 		{
 			return FALSE;
 		}
@@ -1579,20 +1593,20 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 		const LLUUID& cat_id = inv_cat->getUUID();
 
 		// Is the destination the trash?
-		const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		BOOL move_is_into_trash = (mUUID == trash_id)
 				|| model->isObjectDescendentOf(mUUID, trash_id);
-		BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType()));
-		LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+		BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()));
+		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
-		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT);
+		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
 		if (move_is_into_current_outfit || move_is_into_outfit)
 		{
 			// BAP - restrictions?
 			is_movable = true;
 		}
 
-		if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE))
+		if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))
 		{
 			is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604
 		}
@@ -1604,7 +1618,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
 			for( i = 0; i < descendent_categories.count(); i++ )
 			{
 				LLInventoryCategory* category = descendent_categories[i];
-				if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType()))
+				if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
 				{
 					// ...can't move "special folders" like Textures
 					is_movable = FALSE;
@@ -1837,8 +1851,8 @@ bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,
 		LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe?
 		// BAP remove AT_NONE support after ensembles are fully working?
 		return (linked_category &&
-				((linked_category->getPreferredType() == LLAssetType::AT_NONE) ||
-				 (LLAssetType::lookupIsEnsembleCategoryType(linked_category->getPreferredType()))));
+				((linked_category->getPreferredType() == LLFolderType::FT_NONE) ||
+				 (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType()))));
 	}
 }
 
@@ -2140,7 +2154,7 @@ void LLFolderBridge::determineFolderType()
 BOOL LLFolderBridge::isItemRenameable() const
 {
 	LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory();
-	if(cat && !LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())
+	if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())
 	   && (cat->getOwnerID() == gAgent.getID()))
 	{
 		return TRUE;
@@ -2155,15 +2169,15 @@ void LLFolderBridge::restoreItem()
 	if(cat)
 	{
 		LLInventoryModel* model = getInventoryModel();
-		LLUUID new_parent = model->findCategoryUUIDForType(cat->getType());
+		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType()));
 		// do not restamp children on restore
 		LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE);
 	}
 }
 
-LLAssetType::EType LLFolderBridge::getPreferredType() const
+LLFolderType::EType LLFolderBridge::getPreferredType() const
 {
-	LLAssetType::EType preferred_type = LLAssetType::AT_NONE;
+	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
 	LLViewerInventoryCategory* cat = getCategory();
 	if(cat)
 	{
@@ -2176,7 +2190,7 @@ LLAssetType::EType LLFolderBridge::getPreferredType() const
 // Icons for folders are based on the preferred type
 LLUIImagePtr LLFolderBridge::getIcon() const
 {
-	LLAssetType::EType preferred_type = LLAssetType::AT_NONE;
+	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
 	LLViewerInventoryCategory* cat = getCategory();
 	if(cat)
 	{
@@ -2185,7 +2199,7 @@ LLUIImagePtr LLFolderBridge::getIcon() const
 	return getIcon(preferred_type);
 }
 
-LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type)
+LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
 {
 	// we only have one folder image now
 	return LLUI::getUIImage("Inv_FolderClosed");
@@ -2224,7 +2238,7 @@ BOOL LLFolderBridge::removeItem()
 	LLInventoryModel* model = getInventoryModel();
 	if(!model) return FALSE;
 
-	LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 
 	// Look for any gestures and deactivate them
 	LLInventoryModel::cat_array_t	descendent_categories;
@@ -2342,11 +2356,11 @@ void LLFolderBridge::folderOptionsMenu()
 	if(!model) return;
 
 	const LLInventoryCategory* category = model->getCategory(mUUID);
-	LLAssetType::EType type = category->getPreferredType();
-	const bool is_default_folder = category && LLAssetType::lookupIsProtectedCategoryType(type);
+	LLFolderType::EType type = category->getPreferredType();
+	const bool is_default_folder = category && LLFolderType::lookupIsProtectedType(type);
 	// BAP change once we're no longer treating regular categories as ensembles.
-	const bool is_ensemble = category && (type == LLAssetType::AT_NONE ||
-										  LLAssetType::lookupIsEnsembleCategoryType(type));
+	const bool is_ensemble = category && (type == LLFolderType::FT_NONE ||
+										  LLFolderType::lookupIsEnsembleType(type));
 
 	// calling card related functionality for folders.
 
@@ -2387,7 +2401,7 @@ void LLFolderBridge::folderOptionsMenu()
 		}
 		mItems.push_back(std::string("Take Off Items"));
 	}
-	hideContextEntries(*mMenu, mItems, disabled_items);
+	hide_context_entries(*mMenu, mItems, disabled_items);
 }
 
 BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& is_type)
@@ -2412,8 +2426,8 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 //	std::vector<std::string> disabled_items;
 	LLInventoryModel* model = getInventoryModel();
 	if(!model) return;
-	LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
-	LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+	const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
 
 	mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point)
 	mDisabledItems.clear(); //adding code to clear out disabled members from previous
@@ -2443,7 +2457,6 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 	else if(isAgentInventory()) // do not allow creating in library
 	{
 		LLViewerInventoryCategory *cat =  getCategory();
-
 		// BAP removed protected check to re-enable standard ops in untyped folders.
 		// Not sure what the right thing is to do here.
 		if (!isCOFFolder() && cat /*&&
@@ -2460,7 +2473,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 			mItems.push_back(std::string("Change Type"));
 
 			LLViewerInventoryCategory *cat = getCategory();
-			if (cat && LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()))
+			if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
 			{
 				mDisabledItems.push_back(std::string("Change Type"));
 			}
@@ -2470,7 +2483,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 		else
 		{
 			// Want some but not all of the items from getClipboardEntries for outfits.
-			if (cat && cat->getPreferredType()==LLAssetType::AT_OUTFIT)
+			if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT)
 			{
 				mItems.push_back(std::string("Rename"));
 				mItems.push_back(std::string("Delete"));
@@ -2526,7 +2539,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 		mItems.push_back(std::string("--no options--"));
 		mDisabledItems.push_back(std::string("--no options--"));
 	}
-	hideContextEntries(menu, mItems, mDisabledItems);
+	hide_context_entries(menu, mItems, mDisabledItems);
 }
 
 BOOL LLFolderBridge::hasChildren() const
@@ -2606,7 +2619,7 @@ void LLFolderBridge::createNewCategory(void* user_data)
 	if(!model) return;
 	LLUUID id;
 	id = model->createNewCategory(bridge->getUUID(),
-								  LLAssetType::AT_NONE,
+								  LLFolderType::FT_NONE,
 								  LLStringUtil::null);
 	model->notifyObservers();
 
@@ -2691,7 +2704,7 @@ void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type)
 // Separate function so can be called by global menu as well as right-click
 // menu.
 // static
-void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type)
+void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type)
 {
 	LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
 	LLAssetType::EType asset_type = wearable->getAssetType();
@@ -2834,17 +2847,17 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 			break;
 
 		case LLAssetType::AT_CATEGORY:
-			is_movable = !LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)inv_item)->getPreferredType());
+			is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
 			break;
 		default:
 			break;
 		}
 
-		LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
-		LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT);
+		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
-		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT);
+		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
 
 		if(is_movable && move_is_into_trash)
 		{
@@ -2874,7 +2887,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 				.isObjDirectDescendentOfCategory (inv_item, getCategory());
 		}
 
-		LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
 
 		// we can move item inside a folder only if this folder is Favorites. See EXT-719
 		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id));
@@ -3147,7 +3160,7 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 	items.push_back(std::string("Sound Separator"));
 	items.push_back(std::string("Sound Play"));
 
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 // +=================================================+
@@ -3204,7 +3217,7 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 		disabled_items.push_back(std::string("About Landmark"));
 	}
 
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 // Convenience function for the two functions below.
@@ -3433,7 +3446,7 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 			disabled_items.push_back(std::string("Conference Chat"));
 		}
 	}
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
@@ -3662,7 +3675,7 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 		items.push_back(std::string("Activate"));
 		items.push_back(std::string("Deactivate"));
 	}
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 // +=================================================+
@@ -3702,7 +3715,7 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 	items.push_back(std::string("Animation Play"));
 	items.push_back(std::string("Animation Audition"));
 
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 
 }
 
@@ -3847,6 +3860,10 @@ void LLObjectBridge::openItem()
 		LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
 	}
 
+	LLSD key;
+	key["id"] = mUUID;
+	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+
 	/*
 	LLFloaterReg::showInstance("properties", mUUID);
 	*/
@@ -4058,7 +4075,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 			}
 		}
 	}
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 BOOL LLObjectBridge::renameItem(const std::string& new_name)
@@ -4471,7 +4488,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 			}
 		}
 	}
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 // Called from menus
@@ -4918,7 +4935,7 @@ void	LLLSLTextBridgeAction::doIt()
 BOOL LLWearableBridgeAction::isInTrash() const
 {
 	if(!mModel) return FALSE;
-	LLUUID trash_id = mModel->findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	return mModel->isObjectDescendentOf(mUUID, trash_id);
 }
 
@@ -5043,7 +5060,7 @@ void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 			disabled_items.push_back(std::string("Delete"));
 		}
 	}
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 
@@ -5057,7 +5074,7 @@ std::string LLLinkFolderBridge::sPrefix("Link: ");
 
 LLUIImagePtr LLLinkFolderBridge::getIcon() const
 {
-	LLAssetType::EType preferred_type = LLAssetType::AT_NONE;
+	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
 	if (LLViewerInventoryItem *item = getItem())
 	{
 		if (const LLViewerInventoryCategory* cat = item->getLinkedCategory())
@@ -5094,7 +5111,7 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 			disabled_items.push_back(std::string("Delete"));
 		}
 	}
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 6b2a2d32dec98a3e4113c7d36fab3c57b1c00f50..f95e8f93619f6018a423532c0c1237183030d46a 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -41,6 +41,7 @@
 #include "llfoldervieweventlistener.h"
 
 class LLInventoryPanel;
+class LLMenuGL;
 
 enum EInventoryIcon
 {
@@ -121,7 +122,7 @@ class LLInventoryPanelObserver : public LLInventoryObserver
 };
 
 const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type);
-void hideContextEntries(LLMenuGL& menu, 
+void hide_context_entries(LLMenuGL& menu, 
 						const std::vector<std::string> &entries_to_show,
 						const std::vector<std::string> &disabled_entries);
 
@@ -158,7 +159,7 @@ class LLInvFVBridge : public LLFolderViewEventListener
 	virtual const std::string& getName() const;
 	virtual const std::string& getDisplayName() const;
 	virtual PermissionMask getPermissionMask() const;
-	virtual LLAssetType::EType getPreferredType() const;
+	virtual LLFolderType::EType getPreferredType() const;
 	virtual time_t getCreationDate() const;
 	virtual LLFontGL::StyleFlags getLabelStyle() const
 	{
@@ -297,9 +298,9 @@ class LLFolderBridge : public LLInvFVBridge
 	virtual void selectItem();
 	virtual void restoreItem();
 
-	virtual LLAssetType::EType getPreferredType() const;
+	virtual LLFolderType::EType getPreferredType() const;
 	virtual LLUIImagePtr getIcon() const;
-	static LLUIImagePtr getIcon(LLAssetType::EType asset_type);
+	static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
 
 	virtual BOOL renameItem(const std::string& new_name);
 	virtual BOOL removeItem();
@@ -320,7 +321,7 @@ class LLFolderBridge : public LLInvFVBridge
 	virtual BOOL copyToClipboard() const;
 	
 	static void createWearable(LLFolderBridge* bridge, EWearableType type);
-	static void createWearable(LLUUID parent_folder_id, EWearableType type);
+	static void createWearable(const LLUUID &parent_folder_id, EWearableType type);
 
 	LLViewerInventoryCategory* getCategory() const;
 
@@ -807,5 +808,9 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
 
 void teleport_via_landmark(const LLUUID& asset_id);
 
+// Utility function to hide all entries except those in the list
+void hide_context_entries(LLMenuGL& menu, 
+		const std::vector<std::string> &entries_to_show, 
+		const std::vector<std::string> &disabled_entries);
 
 #endif // LL_LLINVENTORYBRIDGE_H
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..75218e98e0ae22c4a532d4b8223abef5140ad913
--- /dev/null
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -0,0 +1,340 @@
+/** 
+ * @file llfloaterinventory.cpp
+ * @brief Implementation of the inventory view and associated stuff.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include <utility> // for std::pair<>
+
+#include "llinventoryfunctions.h"
+
+// library includes
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llcallingcard.h"
+#include "llfloaterreg.h"
+#include "llsdserialize.h"
+#include "llfiltereditor.h"
+#include "llspinctrl.h"
+#include "llui.h"
+#include "message.h"
+
+// newview includes
+#include "llappearancemgr.h"
+#include "llappviewer.h"
+#include "llfirstuse.h"
+#include "llfloaterchat.h"
+#include "llfloatercustomize.h"
+#include "llfocusmgr.h"
+#include "llfolderview.h"
+#include "llgesturemgr.h"
+#include "lliconctrl.h"
+#include "llimview.h"
+#include "llinventorybridge.h"
+#include "llinventoryclipboard.h"
+#include "llinventorymodel.h"
+#include "llinventorypanel.h"
+#include "lllineeditor.h"
+#include "llmenugl.h"
+#include "llpreviewanim.h"
+#include "llpreviewgesture.h"
+#include "llpreviewnotecard.h"
+#include "llpreviewscript.h"
+#include "llpreviewsound.h"
+#include "llpreviewtexture.h"
+#include "llresmgr.h"
+#include "llscrollbar.h"
+#include "llscrollcontainer.h"
+#include "llselectmgr.h"
+#include "lltabcontainer.h"
+#include "lltooldraganddrop.h"
+#include "lluictrlfactory.h"
+#include "llviewerinventory.h"
+#include "llviewermessage.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+#include "llvoavatarself.h"
+#include "llwearablelist.h"
+
+BOOL LLInventoryState::sWearNewClothing = FALSE;
+LLUUID LLInventoryState::sWearNewClothingTransactionID;
+
+void LLSaveFolderState::setApply(BOOL apply)
+{
+	mApply = apply; 
+	// before generating new list of open folders, clear the old one
+	if(!apply) 
+	{
+		clearOpenFolders(); 
+	}
+}
+
+void LLSaveFolderState::doFolder(LLFolderViewFolder* folder)
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_DO_FOLDER);
+	if(mApply)
+	{
+		// we're applying the open state
+		LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
+		if(!bridge) return;
+		LLUUID id(bridge->getUUID());
+		if(mOpenFolders.find(id) != mOpenFolders.end())
+		{
+			folder->setOpen(TRUE);
+		}
+		else
+		{
+			// keep selected filter in its current state, this is less jarring to user
+			if (!folder->isSelected())
+			{
+				folder->setOpen(FALSE);
+			}
+		}
+	}
+	else
+	{
+		// we're recording state at this point
+		if(folder->isOpen())
+		{
+			LLInvFVBridge* bridge = (LLInvFVBridge*)folder->getListener();
+			if(!bridge) return;
+			mOpenFolders.insert(bridge->getUUID());
+		}
+	}
+}
+
+void LLOpenFilteredFolders::doItem(LLFolderViewItem *item)
+{
+	if (item->getFiltered())
+	{
+		item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+	}
+}
+
+void LLOpenFilteredFolders::doFolder(LLFolderViewFolder* folder)
+{
+	if (folder->getFiltered() && folder->getParentFolder())
+	{
+		folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+	}
+	// if this folder didn't pass the filter, and none of its descendants did
+	else if (!folder->getFiltered() && !folder->hasFilteredDescendants())
+	{
+		folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_NO);
+	}
+}
+
+void LLSelectFirstFilteredItem::doItem(LLFolderViewItem *item)
+{
+	if (item->getFiltered() && !mItemSelected)
+	{
+		item->getRoot()->setSelection(item, FALSE, FALSE);
+		if (item->getParentFolder())
+		{
+			item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+		}
+		item->getRoot()->scrollToShowSelection();
+		mItemSelected = TRUE;
+	}
+}
+
+void LLSelectFirstFilteredItem::doFolder(LLFolderViewFolder* folder)
+{
+	if (folder->getFiltered() && !mItemSelected)
+	{
+		folder->getRoot()->setSelection(folder, FALSE, FALSE);
+		if (folder->getParentFolder())
+		{
+			folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+		}
+		folder->getRoot()->scrollToShowSelection();
+		mItemSelected = TRUE;
+	}
+}
+
+void LLOpenFoldersWithSelection::doItem(LLFolderViewItem *item)
+{
+	if (item->getParentFolder() && item->isSelected())
+	{
+		item->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+	}
+}
+
+void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
+{
+	if (folder->getParentFolder() && folder->isSelected())
+	{
+		folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+	}
+}
+
+const std::string& get_item_icon_name(LLAssetType::EType asset_type,
+							 LLInventoryType::EType inventory_type,
+							 U32 attachment_point,
+							 BOOL item_is_multi )
+{
+	EInventoryIcon idx = OBJECT_ICON_NAME;
+	if ( item_is_multi )
+	{
+		idx = OBJECT_MULTI_ICON_NAME;
+	}
+	
+	switch(asset_type)
+	{
+	case LLAssetType::AT_TEXTURE:
+		if(LLInventoryType::IT_SNAPSHOT == inventory_type)
+		{
+			idx = SNAPSHOT_ICON_NAME;
+		}
+		else
+		{
+			idx = TEXTURE_ICON_NAME;
+		}
+		break;
+
+	case LLAssetType::AT_SOUND:
+		idx = SOUND_ICON_NAME;
+		break;
+	case LLAssetType::AT_CALLINGCARD:
+		if(attachment_point!= 0)
+		{
+			idx = CALLINGCARD_ONLINE_ICON_NAME;
+		}
+		else
+		{
+			idx = CALLINGCARD_OFFLINE_ICON_NAME;
+		}
+		break;
+	case LLAssetType::AT_LANDMARK:
+		if(attachment_point!= 0)
+		{
+			idx = LANDMARK_VISITED_ICON_NAME;
+		}
+		else
+		{
+			idx = LANDMARK_ICON_NAME;
+		}
+		break;
+	case LLAssetType::AT_SCRIPT:
+	case LLAssetType::AT_LSL_TEXT:
+	case LLAssetType::AT_LSL_BYTECODE:
+		idx = SCRIPT_ICON_NAME;
+		break;
+	case LLAssetType::AT_CLOTHING:
+		idx = CLOTHING_ICON_NAME;
+	case LLAssetType::AT_BODYPART :
+		if(LLAssetType::AT_BODYPART == asset_type)
+		{
+			idx = BODYPART_ICON_NAME;
+		}
+		switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point)
+		{
+		case WT_SHAPE:
+			idx = BODYPART_SHAPE_ICON_NAME;
+			break;
+		case WT_SKIN:
+			idx = BODYPART_SKIN_ICON_NAME;
+			break;
+		case WT_HAIR:
+			idx = BODYPART_HAIR_ICON_NAME;
+			break;
+		case WT_EYES:
+			idx = BODYPART_EYES_ICON_NAME;
+			break;
+		case WT_SHIRT:
+			idx = CLOTHING_SHIRT_ICON_NAME;
+			break;
+		case WT_PANTS:
+			idx = CLOTHING_PANTS_ICON_NAME;
+			break;
+		case WT_SHOES:
+			idx = CLOTHING_SHOES_ICON_NAME;
+			break;
+		case WT_SOCKS:
+			idx = CLOTHING_SOCKS_ICON_NAME;
+			break;
+		case WT_JACKET:
+			idx = CLOTHING_JACKET_ICON_NAME;
+			break;
+		case WT_GLOVES:
+			idx = CLOTHING_GLOVES_ICON_NAME;
+			break;
+		case WT_UNDERSHIRT:
+			idx = CLOTHING_UNDERSHIRT_ICON_NAME;
+			break;
+		case WT_UNDERPANTS:
+			idx = CLOTHING_UNDERPANTS_ICON_NAME;
+			break;
+		case WT_SKIRT:
+			idx = CLOTHING_SKIRT_ICON_NAME;
+			break;
+		case WT_ALPHA:
+			idx = CLOTHING_ALPHA_ICON_NAME;
+			break;
+		case WT_TATTOO:
+			idx = CLOTHING_TATTOO_ICON_NAME;
+			break;
+		default:
+			// no-op, go with choice above
+			break;
+		}
+		break;
+	case LLAssetType::AT_NOTECARD:
+		idx = NOTECARD_ICON_NAME;
+		break;
+	case LLAssetType::AT_ANIMATION:
+		idx = ANIMATION_ICON_NAME;
+		break;
+	case LLAssetType::AT_GESTURE:
+		idx = GESTURE_ICON_NAME;
+		break;
+	case LLAssetType::AT_LINK:
+		idx = LINKITEM_ICON_NAME;
+		break;
+	case LLAssetType::AT_LINK_FOLDER:
+		idx = LINKFOLDER_ICON_NAME;
+		break;
+	default:
+		break;
+	}
+	
+	return ICON_NAME[idx];
+}
+
+LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
+							 LLInventoryType::EType inventory_type,
+							 U32 attachment_point,
+							 BOOL item_is_multi)
+{
+	const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi );
+	return LLUI::getUIImage(icon_name);
+}
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
new file mode 100644
index 0000000000000000000000000000000000000000..95cc68ddbe1712a1220459391ba3a61adb9d4972
--- /dev/null
+++ b/indra/newview/llinventoryfunctions.h
@@ -0,0 +1,136 @@
+/** 
+ * @file llinventoryfunctions.h
+ * @brief Miscellaneous inventory-related functions and classes
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYFUNCTIONS_H
+#define LL_LLINVENTORYFUNCTIONS_H
+
+#include "llassetstorage.h"
+#include "lldarray.h"
+#include "llfloater.h"
+#include "llinventory.h"
+#include "llinventoryfilter.h"
+#include "llfolderview.h"
+#include "llinventorymodel.h"
+#include "lluictrlfactory.h"
+#include <set>
+
+
+class LLFolderViewItem;
+class LLInventoryFilter;
+class LLInventoryModel;
+class LLInventoryPanel;
+class LLInvFVBridge;
+class LLInventoryFVBridgeBuilder;
+class LLMenuBarGL;
+class LLCheckBoxCtrl;
+class LLSpinCtrl;
+class LLScrollContainer;
+class LLTextBox;
+class LLIconCtrl;
+class LLSaveFolderState;
+class LLFilterEditor;
+class LLTabContainer;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// This is a collection of miscellaneous functions and classes
+// that don't fit cleanly into any other class header.
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryState
+{
+public:
+	// HACK: Until we can route this info through the instant message hierarchy
+	static BOOL sWearNewClothing;
+	static LLUUID sWearNewClothingTransactionID;	// wear all clothing in this transaction	
+};
+
+class LLSelectFirstFilteredItem : public LLFolderViewFunctor
+{
+public:
+	LLSelectFirstFilteredItem() : mItemSelected(FALSE) {}
+	virtual ~LLSelectFirstFilteredItem() {}
+	virtual void doFolder(LLFolderViewFolder* folder);
+	virtual void doItem(LLFolderViewItem* item);
+	BOOL wasItemSelected() { return mItemSelected; }
+protected:
+	BOOL	mItemSelected;
+};
+
+class LLOpenFilteredFolders : public LLFolderViewFunctor
+{
+public:
+	LLOpenFilteredFolders()  {}
+	virtual ~LLOpenFilteredFolders() {}
+	virtual void doFolder(LLFolderViewFolder* folder);
+	virtual void doItem(LLFolderViewItem* item);
+};
+
+class LLSaveFolderState : public LLFolderViewFunctor
+{
+public:
+	LLSaveFolderState() : mApply(FALSE) {}
+	virtual ~LLSaveFolderState() {}
+	virtual void doFolder(LLFolderViewFolder* folder);
+	virtual void doItem(LLFolderViewItem* item) {}
+	void setApply(BOOL apply);
+	void clearOpenFolders() { mOpenFolders.clear(); }
+protected:
+	std::set<LLUUID> mOpenFolders;
+	BOOL mApply;
+};
+
+class LLOpenFoldersWithSelection : public LLFolderViewFunctor
+{
+public:
+	LLOpenFoldersWithSelection() {}
+	virtual ~LLOpenFoldersWithSelection() {}
+	virtual void doFolder(LLFolderViewFolder* folder);
+	virtual void doItem(LLFolderViewItem* item);
+};
+
+const std::string& get_item_icon_name(LLAssetType::EType asset_type,
+							 LLInventoryType::EType inventory_type,
+							 U32 attachment_point, 
+							 BOOL item_is_multi );
+
+LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
+							 LLInventoryType::EType inventory_type,
+							 U32 attachment_point, 
+							 BOOL item_is_multi );
+
+#endif // LL_LLINVENTORYFUNCTIONS_H
+
+
+
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 1d7cbde0d5655932477a1df6107a255fb4a2c956..baf34b42ff3851eeced747cbaca07cbfbea54722 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -46,7 +46,10 @@
 #include "llfloater.h"
 #include "llfocusmgr.h"
 #include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
 #include "llfloaterinventory.h"
+#include "llviewerfoldertype.h"
 #include "llviewerinventory.h"
 #include "llviewermessage.h"
 #include "llviewerwindow.h"
@@ -314,7 +317,7 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id)
 // specifies 'type' as what it defaults to containing. The category is
 // not necessarily only for that type. *NOTE: This will create a new
 // inventory category on the fly if one does not exist.
-LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool create_folder)
+const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder)
 {
 	const LLUUID &rv = findCatUUID(t);
 	if(rv.isNull() && isInventoryUsable() && create_folder)
@@ -330,10 +333,10 @@ LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool crea
 
 // Internal method which looks for a category with the specified
 // preferred type. Returns LLUUID::null if not found.
-const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) const
+const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type) const
 {
 	const LLUUID &root_id = gInventory.getRootFolderID();
-	if(LLAssetType::AT_CATEGORY == preferred_type)
+	if(LLFolderType::FT_CATEGORY == preferred_type)
 	{
 		return root_id;
 	}
@@ -361,7 +364,7 @@ const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) c
 // version will take care of details like what the name should be
 // based on preferred type. Returns the UUID of the new category.
 LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
-										   LLAssetType::EType preferred_type,
+										   LLFolderType::EType preferred_type,
 										   const std::string& pname)
 {
 	LLUUID id;
@@ -371,9 +374,9 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
 		return id;
 	}
 
-	if(preferred_type == LLAssetType::AT_SIMSTATE)
+	if(LLFolderType::lookup(preferred_type) == LLFolderType::badLookup())
 	{
-		lldebugs << "Attempt to create simstate category." << llendl;
+		lldebugs << "Attempt to create undefined category." << llendl;
 		return id;
 	}
 
@@ -385,7 +388,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,
 	}
 	else
 	{
-		name.assign(LLAssetType::lookupCategoryName(preferred_type));
+		name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type));
 	}
 
 	// Add the category to the internal representation
@@ -449,7 +452,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
 	// Start with categories
 	if(!include_trash)
 	{
-		const LLUUID trash_id = findCategoryUUIDForType(LLAssetType::AT_TRASH);
+		const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		if(trash_id.notNull() && (trash_id == id))
 			return;
 	}
@@ -483,7 +486,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,
 			if (item->getActualType() == LLAssetType::AT_LINK_FOLDER)
 			{
 				LLViewerInventoryCategory *linked_cat = item->getLinkedCategory();
-				if (linked_cat && linked_cat->getPreferredType() != LLAssetType::AT_OUTFIT)
+				if (linked_cat && linked_cat->getPreferredType() != LLFolderType::FT_OUTFIT)
 					// BAP - was 
 					// LLAssetType::lookupIsEnsembleCategoryType(linked_cat->getPreferredType()))
 					// Change back once ensemble typing is in place.
@@ -663,7 +666,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
 
 		if(item->getParentUUID().isNull())
 		{
-			LLUUID category_id = findCategoryUUIDForType(new_item->getType());
+			const LLUUID category_id = findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(new_item->getType()));
 			new_item->setParent(category_id);
 			item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, category_id);
 			if( item_array )
@@ -687,7 +690,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
 			LLUUID parent_id = item->getParentUUID();
 			if(parent_id == CATEGORIZE_LOST_AND_FOUND_ID)
 			{
-				parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+				parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
 				new_item->setParent(parent_id);
 			}
 			item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, parent_id);
@@ -700,7 +703,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
 				// Whoops! No such parent, make one.
 				llinfos << "Lost item: " << new_item->getUUID() << " - "
 						<< new_item->getName() << llendl;
-				parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+				parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
 				new_item->setParent(parent_id);
 				item_array = get_ptr_in_map(mParentChildItemTree, parent_id);
 				if(item_array)
@@ -1182,7 +1185,7 @@ void LLInventoryModel::mock(const LLUUID& root_id)
 		root_id,
 		LLUUID::null,
 		LLAssetType::AT_CATEGORY,
-		LLAssetType::lookupCategoryName(LLAssetType::AT_ROOT_CATEGORY),
+		LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_CATEGORY),
 		gAgent.getID());
 	addCategory(cat);
 	gInventory.buildParentChildMap();
@@ -1340,7 +1343,7 @@ void  fetchDescendentsResponder::result(const LLSD& content)
 				    item_it != folder_sd["items"].endArray();
 				    ++item_it)
 			    {	
-                    LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+                    const LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
                     if (lost_uuid.notNull())
                     {
 				        LLSD item = *item_it;
@@ -2047,11 +2050,11 @@ bool LLInventoryModel::loadSkeleton(
 			cat->setUUID(folder_id.asUUID());
 			cat->setParent(parent_id.asUUID());
 
-			LLAssetType::EType preferred_type = LLAssetType::AT_NONE;
+			LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
 			LLSD type_default = (*it)["type_default"];
 			if(type_default.isDefined())
             {
-				preferred_type = (LLAssetType::EType)type_default.asInteger();
+				preferred_type = (LLFolderType::EType)type_default.asInteger();
             }
             cat->setPreferredType(preferred_type);
 			cat->setVersion(version.asInteger());
@@ -2398,12 +2401,12 @@ void LLInventoryModel::buildParentChildMap()
 					<< cat->getName() << llendl;
 			++lost;
 			// plop it into the lost & found.
-			LLAssetType::EType pref = cat->getPreferredType();
-			if(LLAssetType::AT_NONE == pref)
+			LLFolderType::EType pref = cat->getPreferredType();
+			if(LLFolderType::FT_NONE == pref)
 			{
-				cat->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND));
+				cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
 			}
-			else if(LLAssetType::AT_CATEGORY == pref)
+			else if(LLFolderType::FT_CATEGORY == pref)
 			{
 				// it's the root
 				cat->setParent(LLUUID::null);
@@ -2462,7 +2465,7 @@ void LLInventoryModel::buildParentChildMap()
 			++lost;
 			// plop it into the lost & found.
 			//
-			item->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND));
+			item->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
 			// move it later using a special message to move items. If
 			// we update server here, the client might crash.
 			//item->updateServer();
@@ -2483,7 +2486,7 @@ void LLInventoryModel::buildParentChildMap()
 		llwarns << "Found " << lost << " lost items." << llendl;
 		LLMessageSystem* msg = gMessageSystem;
 		BOOL start_new_message = TRUE;
-		LLUUID lnf = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+		const LLUUID lnf = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
 		for(std::vector<LLUUID>::iterator it = lost_item_ids.begin() ; it < lost_item_ids.end(); ++it)
 		{
 			if(start_new_message)
@@ -2936,7 +2939,7 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg,
 		lastfolder = tfolder;
 		tfolder->unpackMessage(msg, _PREHASH_FolderData, i);
 		// make sure it's not a protected folder
-		tfolder->setPreferredType(LLAssetType::AT_NONE);
+		tfolder->setPreferredType(LLFolderType::FT_NONE);
 		folders.push_back(tfolder);
 		// examine update for changes.
 		LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID());
@@ -3174,13 +3177,13 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
 	// The incoming inventory could span more than one BulkInventoryUpdate packet,
 	// so record the transaction ID for this purchase, then wear all clothing
 	// that comes in as part of that transaction ID.  JC
-	if (LLFloaterInventory::sWearNewClothing)
+	if (LLInventoryState::sWearNewClothing)
 	{
-		LLFloaterInventory::sWearNewClothingTransactionID = tid;
-		LLFloaterInventory::sWearNewClothing = FALSE;
+		LLInventoryState::sWearNewClothingTransactionID = tid;
+		LLInventoryState::sWearNewClothing = FALSE;
 	}
 
-	if (tid == LLFloaterInventory::sWearNewClothingTransactionID)
+	if (tid == LLInventoryState::sWearNewClothingTransactionID)
 	{
 		count = wearable_ids.size();
 		for (i = 0; i < count; ++i)
@@ -3323,31 +3326,31 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**)
 
 //----------------------------------------------------------------------------
 
-// Trash: LLAssetType::AT_TRASH, "ConfirmEmptyTrash"
-// Lost&Found: LLAssetType::AT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound"
+// Trash: LLFolderType::FT_TRASH, "ConfirmEmptyTrash"
+// Lost&Found: LLFolderType::FT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound"
 
-bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type)
+bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type)
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
 	if (option == 0) // YES
 	{
-		LLUUID folder_id = findCategoryUUIDForType(folder_type);
+		const LLUUID folder_id = findCategoryUUIDForType(preferred_type);
 		purgeDescendentsOf(folder_id);
 		notifyObservers();
 	}
 	return false;
 }
 
-void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetType::EType folder_type)
+void LLInventoryModel::emptyFolderType(const std::string notification, LLFolderType::EType preferred_type)
 {
 	if (!notification.empty())
 	{
 		LLNotifications::instance().add(notification, LLSD(), LLSD(),
-										boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, folder_type));
+										boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, preferred_type));
 	}
 	else
 	{
-		LLUUID folder_id = findCategoryUUIDForType(folder_type);
+		const LLUUID folder_id = findCategoryUUIDForType(preferred_type);
 		purgeDescendentsOf(folder_id);
 		notifyObservers();
 	}
@@ -3358,7 +3361,7 @@ void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetTy
 void LLInventoryModel::removeItem(const LLUUID& item_id)
 {
 	LLViewerInventoryItem* item = getItem(item_id);
-	const LLUUID new_parent = findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID new_parent = findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	if (item && item->getParentUUID() != new_parent)
 	{
 		LLInventoryModel::update_list_t update;
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index d51460b374c67aea7144e8b287fa63c596189cc9..aba0a619dba03e91ca1b19ed114bac55e770b420 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -34,6 +34,7 @@
 #define LL_LLINVENTORYMODEL_H
 
 #include "llassettype.h"
+#include "llfoldertype.h"
 #include "lldarray.h"
 #include "llframetimer.h"
 #include "llhttpclient.h"
@@ -280,7 +281,7 @@ class LLInventoryModel
 
 	// SDK: Added flag to specify whether the folder should be created if not found.  This fixes the horrible
 	// multiple trash can bug.
-	LLUUID findCategoryUUIDForType(LLAssetType::EType preferred_type, bool create_folder = true);
+	const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true);
 
 	// Call this method when it's time to update everyone on a new
 	// state, by default, the inventory model will not update
@@ -329,7 +330,7 @@ class LLInventoryModel
 	// category. If you want to use the default name based on type,
 	// pass in a NULL to the 'name parameter.
 	LLUUID createNewCategory(const LLUUID& parent_id,
-							 LLAssetType::EType preferred_type,
+							 LLFolderType::EType preferred_type,
 							 const std::string& name);
 
 	// methods to load up inventory skeleton & meat. These are used
@@ -385,9 +386,9 @@ class LLInventoryModel
 	bool isCategoryComplete(const LLUUID& cat_id) const;
 	
 	// callbacks
-	// Trigger a notification and empty the folder type (AT_TRASH or AT_LOST_AND_FOUND) if confirmed
-	void emptyFolderType(const std::string notification, LLAssetType::EType folder_type);
-	bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type);
+	// Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed
+	void emptyFolderType(const std::string notification, LLFolderType::EType folder_type);
+	bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type);
 
 	// Utility Functions
 	void removeItem(const LLUUID& item_id);
@@ -431,7 +432,7 @@ class LLInventoryModel
 	// 
 	// Internal method which looks for a category with the specified
 	// preferred type. Returns LLUUID::null if not found
- 	const LLUUID &findCatUUID(LLAssetType::EType preferred_type) const;
+ 	const LLUUID &findCatUUID(LLFolderType::EType preferred_type) const;
 
 	// Empty the entire contents
 	void empty();
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..178e7d0823eb06a31621c9ca9775d880e19586ac
--- /dev/null
+++ b/indra/newview/llinventorypanel.cpp
@@ -0,0 +1,902 @@
+/** 
+ * @file llfloaterinventory.cpp
+ * @brief Implementation of the inventory view and associated stuff.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include <utility> // for std::pair<>
+
+#include "llinventorypanel.h"
+
+// Seraph TODO: Remove unnecessary headers
+
+// library includes
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llcallingcard.h"
+#include "llfloaterreg.h"
+#include "llsdserialize.h"
+#include "llfiltereditor.h"
+#include "llspinctrl.h"
+#include "llui.h"
+#include "message.h"
+
+// newview includes
+#include "llappearancemgr.h"
+#include "llappviewer.h"
+#include "llfirstuse.h"
+#include "llfloaterchat.h"
+#include "llfloatercustomize.h"
+#include "llfocusmgr.h"
+#include "llfolderview.h"
+#include "llgesturemgr.h"
+#include "lliconctrl.h"
+#include "llimview.h"
+#include "llinventorybridge.h"
+#include "llinventoryclipboard.h"
+#include "llinventorymodel.h"
+#include "lllineeditor.h"
+#include "llmenugl.h"
+#include "llpreviewanim.h"
+#include "llpreviewgesture.h"
+#include "llpreviewnotecard.h"
+#include "llpreviewscript.h"
+#include "llpreviewsound.h"
+#include "llpreviewtexture.h"
+#include "llresmgr.h"
+#include "llscrollbar.h"
+#include "llscrollcontainer.h"
+#include "llselectmgr.h"
+#include "lltabcontainer.h"
+#include "lltooldraganddrop.h"
+#include "lluictrlfactory.h"
+#include "llviewerfoldertype.h"
+#include "llviewerinventory.h"
+#include "llviewermessage.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+#include "llvoavatarself.h"
+#include "llwearablelist.h"
+
+static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
+
+const std::string LLInventoryPanel::DEFAULT_SORT_ORDER = std::string("InventorySortOrder");
+const std::string LLInventoryPanel::RECENTITEMS_SORT_ORDER = std::string("RecentItemsSortOrder");
+const std::string LLInventoryPanel::INHERIT_SORT_ORDER = std::string("");
+static const LLInventoryFVBridgeBuilder INVENTORY_BRIDGE_BUILDER;
+
+LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :	
+	LLPanel(p),
+	mInventoryObserver(NULL),
+	mFolders(NULL),
+	mScroller(NULL),
+	mSortOrderSetting(p.sort_order_setting),
+	mInventory(p.inventory),
+	mAllowMultiSelect(p.allow_multi_select),
+	mHasInventoryConnection(false),
+	mStartFolderString(p.start_folder),	
+	mBuildDefaultHierarchy(true),
+	mInvFVBridgeBuilder(NULL)
+{
+	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
+
+	// contex menu callbacks
+	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
+	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
+	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
+	
+	setBackgroundColor(LLUIColorTable::instance().getColor("InventoryBackgroundColor"));
+	setBackgroundVisible(TRUE);
+	setBackgroundOpaque(TRUE);
+}
+
+BOOL LLInventoryPanel::postBuild()
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD);
+
+	mCommitCallbackRegistrar.pushScope(); // registered as a widget; need to push callback scope ourselves
+	
+	// create root folder
+	{
+		LLRect folder_rect(0,
+						   0,
+						   getRect().getWidth(),
+						   0);
+		LLFolderView::Params p;
+		p.name = getName();
+		p.rect = folder_rect;
+		p.parent_panel = this;
+		mFolders = LLUICtrlFactory::create<LLFolderView>(p);
+		mFolders->setAllowMultiSelect(mAllowMultiSelect);
+	}
+
+	mCommitCallbackRegistrar.popScope();
+	
+	mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+	
+	// scroller
+	{
+		LLRect scroller_view_rect = getRect();
+		scroller_view_rect.translate(-scroller_view_rect.mLeft, -scroller_view_rect.mBottom);
+		LLScrollContainer::Params p;
+		p.name("Inventory Scroller");
+		p.rect(scroller_view_rect);
+		p.follows.flags(FOLLOWS_ALL);
+		p.reserve_scroll_corner(true);
+		p.tab_stop(true);
+		mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
+	}
+	addChild(mScroller);
+	mScroller->addChild(mFolders);
+	
+	mFolders->setScrollContainer(mScroller);
+
+	// set up the callbacks from the inventory we're viewing, and then
+	// build everything.
+	mInventoryObserver = new LLInventoryPanelObserver(this);
+	mInventory->addObserver(mInventoryObserver);
+
+	// determine the root folder, if any, so inventory contents show just the children
+	// of that folder (i.e. not including the folder itself).
+	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
+
+	if ("INVENTORY" == mStartFolderString)
+	{
+		mStartFolderID = gInventory.getRootFolderID();
+	}
+	else if ("LIBRARY" == mStartFolderString)
+	{
+		mStartFolderID = gInventory.getLibraryRootFolderID();
+	}
+	else
+	{
+		mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);
+	}
+
+	// build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback
+	if (mBuildDefaultHierarchy && mInventory->isInventoryUsable() && !mHasInventoryConnection)
+	{
+		rebuildViewsFor(mStartFolderID);
+		mHasInventoryConnection = true;
+	}
+
+	// bit of a hack to make sure the inventory is open.
+	mFolders->openFolder(preferred_type != LLFolderType::FT_NONE ? LLViewerFolderType::lookupNewCategoryName(preferred_type) : "My Inventory");
+
+	if (mSortOrderSetting != INHERIT_SORT_ORDER)
+	{
+		setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
+	}
+	else
+	{
+		setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
+	}
+	mFolders->setSortOrder(mFolders->getFilter()->getSortOrder());
+
+	return TRUE;
+}
+
+LLInventoryPanel::~LLInventoryPanel()
+{
+	// should this be a global setting?
+	if (mFolders)
+	{
+		U32 sort_order = mFolders->getSortOrder();
+		if (mSortOrderSetting != INHERIT_SORT_ORDER)
+		{
+			gSavedSettings.setU32(mSortOrderSetting, sort_order);
+		}
+	}
+
+	// LLView destructor will take care of the sub-views.
+	mInventory->removeObserver(mInventoryObserver);
+	delete mInventoryObserver;
+	mScroller = NULL;
+}
+
+LLMemType mt(LLMemType::MTYPE_INVENTORY_FROM_XML); // ! BUG ! Should this be removed?
+void LLInventoryPanel::draw()
+{
+	// select the desired item (in case it wasn't loaded when the selection was requested)
+	mFolders->updateSelection();
+	LLPanel::draw();
+}
+
+LLInventoryFilter* LLInventoryPanel::getFilter()
+{
+	if (mFolders) return mFolders->getFilter();
+	return NULL;
+}
+
+void LLInventoryPanel::setFilterTypes(U64 filter_types, BOOL filter_for_categories)
+{
+	mFolders->getFilter()->setFilterTypes(filter_types, filter_for_categories);
+}	
+
+void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
+{
+	mFolders->getFilter()->setFilterPermissions(filter_perm_mask);
+}
+
+void LLInventoryPanel::setFilterSubString(const std::string& string)
+{
+	mFolders->getFilter()->setFilterSubString(string);
+}
+
+void LLInventoryPanel::setSortOrder(U32 order)
+{
+	mFolders->getFilter()->setSortOrder(order);
+	if (mFolders->getFilter()->isModified())
+	{
+		mFolders->setSortOrder(order);
+		// try to keep selection onscreen, even if it wasn't to start with
+		mFolders->scrollToShowSelection();
+	}
+}
+
+void LLInventoryPanel::setSinceLogoff(BOOL sl)
+{
+	mFolders->getFilter()->setDateRangeLastLogoff(sl);
+}
+
+void LLInventoryPanel::setHoursAgo(U32 hours)
+{
+	mFolders->getFilter()->setHoursAgo(hours);
+}
+
+void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
+{
+	mFolders->getFilter()->setShowFolderState(show);
+}
+
+LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
+{
+	return mFolders->getFilter()->getShowFolderState();
+}
+
+static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
+
+void LLInventoryPanel::modelChanged(U32 mask)
+{
+	LLFastTimer t2(FTM_REFRESH);
+
+	bool handled = false;
+
+	// inventory just initialized, do complete build
+	if ((mask & LLInventoryObserver::ADD) && gInventory.getChangedIDs().empty() && !mHasInventoryConnection)
+	{
+		rebuildViewsFor(mStartFolderID);
+		mHasInventoryConnection = true;
+		return;
+	}
+
+	if(mask & LLInventoryObserver::LABEL)
+	{
+		handled = true;
+		// label change - empty out the display name for each object
+		// in this change set.
+		const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+		std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+		std::set<LLUUID>::const_iterator id_end = changed_items.end();
+		LLFolderViewItem* view = NULL;
+		LLInvFVBridge* bridge = NULL;
+		for (;id_it != id_end; ++id_it)
+		{
+			view = mFolders->getItemByID(*id_it);
+			if(view)
+			{
+				// request refresh on this item (also flags for filtering)
+				bridge = (LLInvFVBridge*)view->getListener();
+				if(bridge)
+				{	// Clear the display name first, so it gets properly re-built during refresh()
+					bridge->clearDisplayName();
+				}
+				view->refresh();
+			}
+		}
+	}
+	if((mask & (LLInventoryObserver::STRUCTURE
+				| LLInventoryObserver::ADD
+				| LLInventoryObserver::REMOVE)) != 0)
+	{
+		handled = true;
+		// Record which folders are open by uuid.
+		LLInventoryModel* model = getModel();
+		if (model)
+		{
+			const std::set<LLUUID>& changed_items = gInventory.getChangedIDs();
+
+			std::set<LLUUID>::const_iterator id_it = changed_items.begin();
+			std::set<LLUUID>::const_iterator id_end = changed_items.end();
+			for (;id_it != id_end; ++id_it)
+			{
+				// sync view with model
+				LLInventoryObject* model_item = model->getObject(*id_it);
+				LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
+
+				if (model_item)
+				{
+					if (!view_item)
+					{
+						// this object was just created, need to build a view for it
+						if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
+						{
+							llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl;
+						}
+						buildNewViews(*id_it);
+						
+						// select any newly created object
+						// that has the auto rename at top of folder
+						// root set
+						if(mFolders->getRoot()->needsAutoRename())
+						{
+							setSelection(*id_it, FALSE);
+						}
+					}
+					else
+					{
+						// this object was probably moved, check its parent
+						if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
+						{
+							llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << llendl;
+						}
+
+						LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
+
+						// added check against NULL for cases when Inventory panel contains startFolder.
+						// in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
+						// this check is a fix for bug EXT-1859.
+						if (NULL != new_parent && view_item->getParentFolder() != new_parent)
+						{
+							view_item->getParentFolder()->extractItem(view_item);
+							view_item->addToFolder(new_parent, mFolders);
+						}
+/*
+						 on the other side in case Inventory Panel has content of the any folder
+						 it is possible that item moved to some folder which is absent in current
+						 Panel. For ex. removing item (via moving to trash).
+						 In this case we need to check if new parent is other then inventory start folder
+						 and simply remove its View from the hierarchy.
+						 See details in EXT-2098.
+*/
+						// So, let check if item was moved into folder out of this Inventory Panel.
+						else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
+						{
+							view_item->getParentFolder()->extractItem(view_item);
+						}
+					}
+				}
+				else
+				{
+					if (view_item)
+					{
+						if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
+						{
+							llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl;
+						}
+						// item in view but not model, need to delete view
+						view_item->destroyView();
+					}
+					else
+					{
+						llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
+					}
+				}
+			}
+		}
+	}
+
+	if (!handled)
+	{
+		// it's a small change that only requires a refresh.
+		// *TODO: figure out a more efficient way to do the refresh
+		// since it is expensive on large inventories
+		mFolders->refresh();
+	}
+}
+
+
+void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
+{
+	LLFolderViewItem* old_view = NULL;
+
+	// get old LLFolderViewItem
+	old_view = mFolders->getItemByID(id);
+	if (old_view && id.notNull())
+	{
+		old_view->destroyView();
+	}
+
+	buildNewViews(id);
+}
+
+void LLInventoryPanel::buildNewViews(const LLUUID& id)
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_BUILD_NEW_VIEWS);
+	LLFolderViewItem* itemp = NULL;
+	LLInventoryObject* objectp = NULL;
+
+	// Don't add the start folder (the inventory panel will show contents
+	// beginning with the children of the starting folder, excluding the starting folder itself).
+	if (id != mStartFolderID)
+	{
+		objectp = gInventory.getObject(id);
+		if (objectp)
+		{		
+			const LLUUID &parent_id = objectp->getParentUUID();
+			// If this item's parent is the starting folder, then just add it to the top level (recall that 
+			// the starting folder isn't actually represented in the view, parent_folder would be NULL in
+			// this case otherwise).
+			LLFolderViewFolder* parent_folder = (parent_id == mStartFolderID ?
+				mFolders : (LLFolderViewFolder*)mFolders->getItemByID(parent_id));
+
+			// This item exists outside the inventory's hierarchy, so don't add it.
+			if (!parent_folder)
+			{
+				return;
+			}
+
+			if (objectp->getType() <= LLAssetType::AT_NONE ||
+				objectp->getType() >= LLAssetType::AT_COUNT)
+			{
+				llwarns << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : " << 
+					((S32) objectp->getType()) << llendl;
+				return;
+			}
+			
+			if (objectp->getType() == LLAssetType::AT_CATEGORY &&
+					 objectp->getActualType() != LLAssetType::AT_LINK_FOLDER) 
+			{
+				LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(objectp->getType(),
+																				objectp->getType(),
+																				LLInventoryType::IT_CATEGORY,
+																				this,
+																				objectp->getUUID());
+
+				if (new_listener)
+				{
+					LLFolderViewFolder::Params p;
+					p.name = new_listener->getDisplayName();
+					p.icon = new_listener->getIcon();
+					p.root = mFolders;
+					p.listener = new_listener;
+					LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+				
+					folderp->setItemSortOrder(mFolders->getSortOrder());
+					itemp = folderp;
+				}
+			}
+			else 
+			{
+				// Build new view for item
+				LLInventoryItem* item = (LLInventoryItem*)objectp;
+				LLInvFVBridge* new_listener = mInvFVBridgeBuilder->createBridge(item->getType(),
+																				item->getActualType(),
+																				item->getInventoryType(),
+																				this,
+																				item->getUUID(),
+																				item->getFlags());
+
+				if (new_listener)
+				{
+					LLFolderViewItem::Params params;
+					params.name(new_listener->getDisplayName());
+					params.icon(new_listener->getIcon());
+					params.creation_date(new_listener->getCreationDate());
+					params.root(mFolders);
+					params.listener(new_listener);
+					params.rect(LLRect (0, 0, 0, 0));
+					itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
+				}
+			}
+
+			if (itemp)
+			{
+				itemp->addToFolder(parent_folder, mFolders);
+			}
+		}
+	}
+
+	// If this is a folder, add the children of the folder and recursively add any 
+	// child folders.
+	if ((id == mStartFolderID) ||
+		(objectp && objectp->getType() == LLAssetType::AT_CATEGORY))
+	{
+		LLViewerInventoryCategory::cat_array_t* categories;
+		LLViewerInventoryItem::item_array_t* items;
+
+		mInventory->lockDirectDescendentArrays(id, categories, items);
+		if(categories)
+		{
+			S32 count = categories->count();
+			for(S32 i = 0; i < count; ++i)
+			{
+				LLInventoryCategory* cat = categories->get(i);
+				buildNewViews(cat->getUUID());
+			}
+		}
+		if(items)
+		{
+			S32 count = items->count();
+			for(S32 i = 0; i < count; ++i)
+			{
+				LLInventoryItem* item = items->get(i);
+				buildNewViews(item->getUUID());
+			}
+		}
+		mInventory->unlockDirectDescendentArrays(id);
+	}
+}
+
+struct LLConfirmPurgeData
+{
+	LLUUID mID;
+	LLInventoryModel* mModel;
+};
+
+class LLIsNotWorn : public LLInventoryCollectFunctor
+{
+public:
+	LLIsNotWorn() {}
+	virtual ~LLIsNotWorn() {}
+	virtual bool operator()(LLInventoryCategory* cat,
+							LLInventoryItem* item)
+	{
+		return !gAgentWearables.isWearingItem(item->getUUID());
+	}
+};
+
+class LLOpenFolderByID : public LLFolderViewFunctor
+{
+public:
+	LLOpenFolderByID(const LLUUID& id) : mID(id) {}
+	virtual ~LLOpenFolderByID() {}
+	virtual void doFolder(LLFolderViewFolder* folder)
+		{
+			if (folder->getListener() && folder->getListener()->getUUID() == mID) folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
+		}
+	virtual void doItem(LLFolderViewItem* item) {}
+protected:
+	const LLUUID& mID;
+};
+
+
+void LLInventoryPanel::openSelected()
+{
+	LLFolderViewItem* folder_item = mFolders->getCurSelectedItem();
+	if(!folder_item) return;
+	LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
+	if(!bridge) return;
+	bridge->openItem();
+}
+
+BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
+{
+	BOOL handled = LLView::handleHover(x, y, mask);
+	if(handled)
+	{
+		ECursorType cursor = getWindow()->getCursor();
+		if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW)
+		{
+			// replace arrow cursor with arrow and hourglass cursor
+			getWindow()->setCursor(UI_CURSOR_WORKING);
+		}
+	}
+	else
+	{
+		getWindow()->setCursor(UI_CURSOR_ARROW);
+	}
+	return TRUE;
+}
+
+BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+								   EDragAndDropType cargo_type,
+								   void* cargo_data,
+								   EAcceptance* accept,
+								   std::string& tooltip_msg)
+{
+
+	BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+
+	if (handled)
+	{
+		mFolders->setDragAndDropThisFrame();
+	}
+
+	return handled;
+}
+
+void LLInventoryPanel::onFocusLost()
+{
+	// inventory no longer handles cut/copy/paste/delete
+	if (LLEditMenuHandler::gEditMenuHandler == mFolders)
+	{
+		LLEditMenuHandler::gEditMenuHandler = NULL;
+	}
+
+	LLPanel::onFocusLost();
+}
+
+void LLInventoryPanel::onFocusReceived()
+{
+	// inventory now handles cut/copy/paste/delete
+	LLEditMenuHandler::gEditMenuHandler = mFolders;
+
+	LLPanel::onFocusReceived();
+}
+
+
+void LLInventoryPanel::openAllFolders()
+{
+	mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
+	mFolders->arrangeAll();
+}
+
+void LLInventoryPanel::openDefaultFolderForType(LLFolderType::EType type)
+{
+	LLUUID category_id = mInventory->findCategoryUUIDForType(type);
+	LLOpenFolderByID opener(category_id);
+	mFolders->applyFunctorRecursively(opener);
+}
+
+void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus)
+{
+	// Don't select objects in COF (e.g. to prevent refocus when items are worn).
+	const LLInventoryObject *obj = gInventory.getObject(obj_id);
+	if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF())
+	{
+		return;
+	}
+	mFolders->setSelectionByID(obj_id, take_keyboard_focus);
+}
+
+void LLInventoryPanel::clearSelection()
+{
+	mFolders->clearSelection();
+}
+
+void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
+{
+	LLFolderView* fv = getRootFolder();
+	if (fv->needsAutoRename()) // auto-selecting a new user-created asset and preparing to rename
+	{
+		fv->setNeedsAutoRename(FALSE);
+		if (items.size()) // new asset is visible and selected
+		{
+			fv->startRenamingSelectedItem();
+		}
+	}
+	// Seraph - Put determineFolderType in here for ensemble typing?
+}
+
+//----------------------------------------------------------------------------
+
+void LLInventoryPanel::doToSelected(const LLSD& userdata)
+{
+	mFolders->doToSelected(&gInventory, userdata);
+}
+
+void LLInventoryPanel::doCreate(const LLSD& userdata)
+{
+	menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata);
+}
+
+bool LLInventoryPanel::beginIMSession()
+{
+	std::set<LLUUID> selected_items;
+	mFolders->getSelectionList(selected_items);
+
+	std::string name;
+	static int session_num = 1;
+
+	LLDynamicArray<LLUUID> members;
+	EInstantMessage type = IM_SESSION_CONFERENCE_START;
+
+	std::set<LLUUID>::const_iterator iter;
+	for (iter = selected_items.begin(); iter != selected_items.end(); iter++)
+	{
+
+		LLUUID item = *iter;
+		LLFolderViewItem* folder_item = mFolders->getItemByID(item);
+			
+		if(folder_item) 
+		{
+			LLFolderViewEventListener* fve_listener = folder_item->getListener();
+			if (fve_listener && (fve_listener->getInventoryType() == LLInventoryType::IT_CATEGORY))
+			{
+
+				LLFolderBridge* bridge = (LLFolderBridge*)folder_item->getListener();
+				if(!bridge) return true;
+				LLViewerInventoryCategory* cat = bridge->getCategory();
+				if(!cat) return true;
+				name = cat->getName();
+				LLUniqueBuddyCollector is_buddy;
+				LLInventoryModel::cat_array_t cat_array;
+				LLInventoryModel::item_array_t item_array;
+				gInventory.collectDescendentsIf(bridge->getUUID(),
+												cat_array,
+												item_array,
+												LLInventoryModel::EXCLUDE_TRASH,
+												is_buddy);
+				S32 count = item_array.count();
+				if(count > 0)
+				{
+					LLFloaterReg::showInstance("communicate");
+					// create the session
+					LLAvatarTracker& at = LLAvatarTracker::instance();
+					LLUUID id;
+					for(S32 i = 0; i < count; ++i)
+					{
+						id = item_array.get(i)->getCreatorUUID();
+						if(at.isBuddyOnline(id))
+						{
+							members.put(id);
+						}
+					}
+				}
+			}
+			else
+			{
+				LLFolderViewItem* folder_item = mFolders->getItemByID(item);
+				if(!folder_item) return true;
+				LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener();
+
+				if (listenerp->getInventoryType() == LLInventoryType::IT_CALLINGCARD)
+				{
+					LLInventoryItem* inv_item = gInventory.getItem(listenerp->getUUID());
+
+					if (inv_item)
+					{
+						LLAvatarTracker& at = LLAvatarTracker::instance();
+						LLUUID id = inv_item->getCreatorUUID();
+
+						if(at.isBuddyOnline(id))
+						{
+							members.put(id);
+						}
+					}
+				} //if IT_CALLINGCARD
+			} //if !IT_CATEGORY
+		}
+	} //for selected_items	
+
+	// the session_id is randomly generated UUID which will be replaced later
+	// with a server side generated number
+
+	if (name.empty())
+	{
+		name = llformat("Session %d", session_num++);
+	}
+
+	gIMMgr->addSession(name, type, members[0], members);
+		
+	return true;
+}
+
+bool LLInventoryPanel::attachObject(const LLSD& userdata)
+{
+	std::set<LLUUID> selected_items;
+	mFolders->getSelectionList(selected_items);
+
+	std::string joint_name = userdata.asString();
+	LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject());
+	LLViewerJointAttachment* attachmentp = NULL;
+	for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); 
+		 iter != avatarp->mAttachmentPoints.end(); )
+	{
+		LLVOAvatar::attachment_map_t::iterator curiter = iter++;
+		LLViewerJointAttachment* attachment = curiter->second;
+		if (attachment->getName() == joint_name)
+		{
+			attachmentp = attachment;
+			break;
+		}
+	}
+	if (attachmentp == NULL)
+	{
+		return true;
+	}
+
+	for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin(); 
+		 set_iter != selected_items.end(); 
+		 ++set_iter)
+	{
+		const LLUUID &id = *set_iter;
+		LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id);
+		if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()))
+		{
+			rez_attachment(item, attachmentp);
+		}
+		else if(item && item->isComplete())
+		{
+			// must be in library. copy it to our inventory and put it on.
+			LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp);
+			copy_inventory_item(gAgent.getID(),
+								item->getPermissions().getOwner(),
+								item->getUUID(),
+								LLUUID::null,
+								std::string(),
+								cb);
+		}
+	}
+	gFocusMgr.setKeyboardFocus(NULL);
+
+	return true;
+}
+
+
+//----------------------------------------------------------------------------
+
+// static DEBUG ONLY:
+void LLInventoryPanel::dumpSelectionInformation(void* user_data)
+{
+	LLInventoryPanel* iv = (LLInventoryPanel*)user_data;
+	iv->mFolders->dumpSelectionInformation();
+}
+
+BOOL LLInventoryPanel::getSinceLogoff()
+{
+	return mFolders->getFilter()->isSinceLogoff();
+}
+
+void example_param_block_usage()
+{
+	LLInventoryPanel::Params param_block;
+	param_block.name(std::string("inventory"));
+
+	param_block.sort_order_setting(LLInventoryPanel::RECENTITEMS_SORT_ORDER);
+	param_block.allow_multi_select(true);
+	param_block.filter(LLInventoryPanel::Filter()
+			.sort_order(1)
+			.types(0xffff0000));
+	param_block.inventory(&gInventory);
+	param_block.has_border(true);
+
+	LLUICtrlFactory::create<LLInventoryPanel>(param_block);
+
+	param_block = LLInventoryPanel::Params();
+	param_block.name(std::string("inventory"));
+
+	//LLSD param_block_sd;
+	//param_block_sd["sort_order_setting"] = LLInventoryPanel::RECENTITEMS_SORT_ORDER;
+	//param_block_sd["allow_multi_select"] = true;
+	//param_block_sd["filter"]["sort_order"] = 1;
+	//param_block_sd["filter"]["types"] = (S32)0xffff0000;
+	//param_block_sd["has_border"] = true;
+
+	//LLInitParam::LLSDParser(param_block_sd).parse(param_block);
+
+	LLUICtrlFactory::create<LLInventoryPanel>(param_block);
+}
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
new file mode 100644
index 0000000000000000000000000000000000000000..9f74fad5c1c0acca15b4be0bff86b128602c7a58
--- /dev/null
+++ b/indra/newview/llinventorypanel.h
@@ -0,0 +1,206 @@
+/** 
+ * @file llinventorypanel.h
+ * @brief LLInventoryPanel
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYPANEL_H
+#define LL_LLINVENTORYPANEL_H
+
+#include "llassetstorage.h"
+#include "lldarray.h"
+#include "llfloater.h"
+#include "llinventory.h"
+#include "llinventoryfilter.h"
+#include "llfolderview.h"
+#include "llinventorymodel.h"
+#include "lluictrlfactory.h"
+#include <set>
+
+class LLFolderViewItem;
+class LLInventoryFilter;
+class LLInventoryModel;
+class LLInvFVBridge;
+class LLInventoryFVBridgeBuilder;
+class LLMenuBarGL;
+class LLCheckBoxCtrl;
+class LLSpinCtrl;
+class LLScrollContainer;
+class LLTextBox;
+class LLIconCtrl;
+class LLSaveFolderState;
+class LLFilterEditor;
+class LLTabContainer;
+
+class LLInventoryPanel : public LLPanel
+{
+public:
+	static const std::string DEFAULT_SORT_ORDER;
+	static const std::string RECENTITEMS_SORT_ORDER;
+	static const std::string INHERIT_SORT_ORDER;
+
+	struct Filter : public LLInitParam::Block<Filter>
+	{
+		Optional<U32>			sort_order;
+		Optional<U32>			types;
+		Optional<std::string>	search_string;
+
+		Filter()
+		:	sort_order("sort_order"),
+			types("types", 0xffffffff),
+			search_string("search_string")
+		{}
+	};
+
+	struct Params 
+	:	public LLInitParam::Block<Params, LLPanel::Params>
+	{
+		Optional<std::string>				sort_order_setting;
+		Optional<LLInventoryModel*>			inventory;
+		Optional<bool>						allow_multi_select;
+		Optional<Filter>					filter;
+		Optional<std::string>               start_folder;
+
+		Params()
+		:	sort_order_setting("sort_order_setting"),
+			inventory("", &gInventory),
+			allow_multi_select("allow_multi_select", true),
+			filter("filter"),
+			start_folder("start_folder")
+		{}
+	};
+
+protected:
+	LLInventoryPanel(const Params&);
+	friend class LLUICtrlFactory;
+
+public:
+	virtual ~LLInventoryPanel();
+
+	LLInventoryModel* getModel() { return mInventory; }
+
+	BOOL postBuild();
+
+	// LLView methods
+	void draw();
+	BOOL handleHover(S32 x, S32 y, MASK mask);
+	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+								   EDragAndDropType cargo_type,
+								   void* cargo_data,
+								   EAcceptance* accept,
+								   std::string& tooltip_msg);
+	// LLUICtrl methods
+	 /*virtual*/ void onFocusLost();
+	 /*virtual*/ void onFocusReceived();
+
+	// Call this method to set the selection.
+	void openAllFolders();
+	void openDefaultFolderForType(LLFolderType::EType);
+	void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);
+	void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); }
+	void clearSelection();
+	LLInventoryFilter* getFilter();
+	void setFilterTypes(U64 filter, BOOL filter_for_categories = FALSE); // if filter_for_categories is true, operate on folder preferred asset type
+	U32 getFilterTypes() const { return mFolders->getFilterTypes(); }
+	void setFilterPermMask(PermissionMask filter_perm_mask);
+	U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); }
+	void setFilterSubString(const std::string& string);
+	const std::string getFilterSubString() { return mFolders->getFilterSubString(); }
+	void setSortOrder(U32 order);
+	U32 getSortOrder() { return mFolders->getSortOrder(); }
+	void setSinceLogoff(BOOL sl);
+	void setHoursAgo(U32 hours);
+	BOOL getSinceLogoff();
+	
+	void setShowFolderState(LLInventoryFilter::EFolderShow show);
+	LLInventoryFilter::EFolderShow getShowFolderState();
+	void setAllowMultiSelect(BOOL allow) { mFolders->setAllowMultiSelect(allow); }
+	// This method is called when something has changed about the inventory.
+	void modelChanged(U32 mask);
+	LLFolderView* getRootFolder() { return mFolders; }
+	LLScrollContainer* getScrollableContainer() { return mScroller; }
+	
+	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+	
+	// Callbacks
+	void doToSelected(const LLSD& userdata);
+	void doCreate(const LLSD& userdata);
+	bool beginIMSession();
+	bool attachObject(const LLSD& userdata);
+	
+	// DEBUG ONLY:
+	static void dumpSelectionInformation(void* user_data);
+
+	void openSelected();
+	void unSelectAll()	{ mFolders->setSelection(NULL, FALSE, FALSE); }
+	
+protected:
+	// Given the id and the parent, build all of the folder views.
+	void rebuildViewsFor(const LLUUID& id);
+	virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719
+
+protected:
+	LLInventoryModel*			mInventory;
+	LLInventoryObserver*		mInventoryObserver;
+	BOOL 						mAllowMultiSelect;
+	std::string					mSortOrderSetting;
+
+//private: // Can not make these private - needed by llinventorysubtreepanel
+	LLFolderView*				mFolders;
+	std::string                 mStartFolderString;
+
+	/**
+	 * Contains UUID of Inventory item from which hierarchy should be built.
+	 * Can be set with the "start_folder" xml property.
+	 * Default is LLUUID::null that means total Inventory hierarchy.
+	 */
+	LLUUID						mStartFolderID;
+	LLScrollContainer*			mScroller;
+	bool						mHasInventoryConnection;
+
+	/**
+	 * Flag specified if default inventory hierarchy should be created in postBuild()
+	 */
+	bool						mBuildDefaultHierarchy;
+
+	LLUUID						mRootInventoryItemUUID;
+
+	/**
+	 * Pointer to LLInventoryFVBridgeBuilder.
+	 *
+	 * It is set in LLInventoryPanel's constructor and can be overridden in derived classes with 
+	 * another implementation.
+	 * Take into account it will not be deleted by LLInventoryPanel itself.
+	 */
+	const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder;
+
+};
+
+#endif // LL_LLINVENTORYPANEL_H
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index 0b07dd4f21212785ed9eac924705c957aa27b592..b1829b3945992ec8a51a091075b75c12985aa94d 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -135,13 +135,13 @@ use_substring(if_use_substring)
 
 // Returns true if the given inventory item is a landmark pointing to the current parcel.
 // Used to find out if there is at least one landmark from current parcel.
-class LLFistAgentParcelLandmark : public LLInventoryCollectFunctor
+class LLFirstAgentParcelLandmark : public LLInventoryCollectFunctor
 {
 private:	
 	bool mFounded;// to avoid unnecessary  check
 	
 public:
-	LLFistAgentParcelLandmark(): mFounded(false){}
+	LLFirstAgentParcelLandmark(): mFounded(false){}
 	
 	/*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
 	{
@@ -165,8 +165,7 @@ static void fetch_landmarks(LLInventoryModel::cat_array_t& cats,
 							LLInventoryCollectFunctor& add)
 {
 	// Look in "My Favorites"
-	LLUUID favorites_folder_id =
-		gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+	const LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
 	gInventory.collectDescendentsIf(favorites_folder_id,
 		cats,
 		items,
@@ -174,8 +173,7 @@ static void fetch_landmarks(LLInventoryModel::cat_array_t& cats,
 		add);
 
 	// Look in "Landmarks"
-	LLUUID landmarks_folder_id = 
-		gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+	const LLUUID landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
 	gInventory.collectDescendentsIf(landmarks_folder_id,
 		cats,
 		items,
@@ -202,7 +200,7 @@ bool LLLandmarkActions::landmarkAlreadyExists()
 //static
 bool LLLandmarkActions::hasParcelLandmark()
 {
-	LLFistAgentParcelLandmark get_first_agent_landmark;
+	LLFirstAgentParcelLandmark get_first_agent_landmark;
 	LLInventoryModel::cat_array_t cats;
 	LLInventoryModel::item_array_t items;
 	fetch_landmarks(cats, items, get_first_agent_landmark);
@@ -287,7 +285,7 @@ void LLLandmarkActions::createLandmarkHere()
 
 	LLAgentUI::buildLocationString(landmark_name, LLAgentUI::LOCATION_FORMAT_LANDMARK);
 	LLAgentUI::buildLocationString(landmark_desc, LLAgentUI::LOCATION_FORMAT_FULL);
-	LLUUID folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+	const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
 
 	createLandmarkHere(landmark_name, landmark_desc, folder_id);
 }
diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h
index 312426cab01c4d0632348cbe5e935dd4370b3df3..1c524c820c962b27abda5df1525babc96e64ffa4 100644
--- a/indra/newview/lllandmarkactions.h
+++ b/indra/newview/lllandmarkactions.h
@@ -55,7 +55,7 @@ class LLLandmarkActions
 	static bool landmarkAlreadyExists();
 	
 	/**
-	 * @brief Checks whether landmark exists for current parcel.
+	 * @brief Checks whether landmark exists for current agent parcel.
 	 */
 	static bool hasParcelLandmark();
 
diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp
index 6f0b8a3c1e6a0d25cf3128845b647159a6d28367..2a1f42c3c4bf2828ebe43a0514c68ba2b7478cfe 100644
--- a/indra/newview/llloginhandler.cpp
+++ b/indra/newview/llloginhandler.cpp
@@ -56,7 +56,7 @@ bool LLLoginHandler::parseDirectLogin(std::string url)
 	LLURI uri(url);
 	parse(uri.queryMap());
 
-	if (mWebLoginKey.isNull() ||
+	if (/*mWebLoginKey.isNull() ||*/
 		mFirstName.empty() ||
 		mLastName.empty())
 	{
@@ -71,7 +71,7 @@ bool LLLoginHandler::parseDirectLogin(std::string url)
 
 void LLLoginHandler::parse(const LLSD& queryMap)
 {
-	mWebLoginKey = queryMap["web_login_key"].asUUID();
+	//mWebLoginKey = queryMap["web_login_key"].asUUID();
 	mFirstName = queryMap["first_name"].asString();
 	mLastName = queryMap["last_name"].asString();
 	
@@ -165,7 +165,15 @@ void LLLoginHandler::parse(const LLSD& queryMap)
 bool LLLoginHandler::handle(const LLSD& tokens,
 							const LLSD& query_map,
 							LLMediaCtrl* web)
-{	
+{
+	if (tokens.size() == 1
+		&& tokens[0].asString() == "show")
+	{
+		// We're using reg-in-client, so show the XUI login widgets
+		LLPanelLogin::showLoginWidgets();
+		return true;
+	}
+
 	parse(query_map);
 	
 	//if we haven't initialized stuff yet, this is 
@@ -200,14 +208,15 @@ bool LLLoginHandler::handle(const LLSD& tokens,
 			LLPanelLogin::setFields(mFirstName, mLastName, password);
 		}
 
-		if (mWebLoginKey.isNull())
-		{
-			LLPanelLogin::loadLoginPage();
-		}
-		else
-		{
-			LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
-		}
+		//if (mWebLoginKey.isNull())
+		//{
+		//	LLPanelLogin::loadLoginPage();
+		//}
+		//else
+		//{
+		//	LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
+		//}
+		LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
 	}
 	return true;
 }
diff --git a/indra/newview/llloginhandler.h b/indra/newview/llloginhandler.h
index d36ceaf3cc05564cb88c913bb03ddbafb2d103cc..ac4648761b2a447c27bee3e142819059f8bd603e 100644
--- a/indra/newview/llloginhandler.h
+++ b/indra/newview/llloginhandler.h
@@ -48,7 +48,9 @@ class LLLoginHandler : public LLCommandHandler
 
 	std::string getFirstName() const { return mFirstName; }
 	std::string getLastName() const { return mLastName; }
-	LLUUID getWebLoginKey() const { return mWebLoginKey; }
+
+	// Web-based login unsupported
+	//LLUUID getWebLoginKey() const { return mWebLoginKey; }
 
 private:
 	void parse(const LLSD& queryMap);
@@ -56,7 +58,7 @@ class LLLoginHandler : public LLCommandHandler
 private:
 	std::string mFirstName;
 	std::string mLastName;
-	LLUUID mWebLoginKey;
+	//LLUUID mWebLoginKey;
 };
 
 extern LLLoginHandler gLoginHandler;
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 2153f77336e7b2084c8493b32ebf74107b5d447a..f1b3a37677a445fe9a680e902b4da572f30f40ea 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -163,7 +163,7 @@ void LLManipTranslate::restoreGL()
 
 	GLuint* d = new GLuint[rez*rez];	
 
-	gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex->getTexName());
+	gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, sGridTex->getTexName(), true);
 	gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR);
 
 	while (rez >= 1)
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index e63daac4afbff23efa2dedf7c59d47216eb0d1eb..b35fd6134b792f443d90459977f05de5d2ae1e2f 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -50,6 +50,7 @@
 #include "llslurl.h"
 #include "llurlsimstring.h"
 #include "llviewerinventory.h"
+#include "llviewermenu.h"
 #include "llviewerparcelmgr.h"
 #include "llworldmap.h"
 #include "llappviewer.h"
@@ -271,6 +272,12 @@ void LLNavigationBar::draw()
 	LLPanel::draw();
 }
 
+BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+	show_navbar_context_menu(this,x,y);
+	return TRUE;
+}
+
 void LLNavigationBar::onBackButtonClicked()
 {
 	LLTeleportHistory::getInstance()->goBack();
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 8b625e7fa62099b09e5c14477e7fda7025388fba..52f5a827e4b17bdc232cb72a710e8d771cce74cf 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -54,6 +54,7 @@ class LLNavigationBar
 	virtual ~LLNavigationBar();
 	
 	/*virtual*/ void	draw();
+	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL	postBuild();
 
 	void handleLoginComplete();
@@ -77,7 +78,6 @@ class LLNavigationBar
 	void onBackOrForwardButtonHeldDown(const LLSD& param);
 	void onForwardButtonClicked();
 	void onHomeButtonClicked();
-	void onHelpButtonClicked();
 	void onLocationSelection();
 	void onLocationPrearrange(const LLSD& data);
 	void onSearchCommit();
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 12638ab8551b6c252c8d3145c58b6eb956db3a3d..81d033d7f98da7ae1cfae2e8d53f53b259321308 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -97,14 +97,39 @@ BOOL LLNearbyChat::postBuild()
 	if (getDockControl() == NULL)
 	{
 		setDockControl(new LLDockControl(
-				LLBottomTray::getInstance()->getNearbyChatBar(), this,
-				getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
+			LLBottomTray::getInstance()->getNearbyChatBar(), this,
+			getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
 	}
 
 	return true;
 }
 
 
+void    LLNearbyChat::applySavedVariables()
+{
+
+	if (mRectControl.size() > 1)
+	{
+		const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl);
+		reshape(rect.getWidth(), rect.getHeight());
+		setRect(rect);
+	}
+
+
+	if(!LLUI::sSettingGroups["floater"]->controlExists(mDocStateControl))
+	{
+		setDocked(true);
+	}
+	else
+	{
+		if (mDocStateControl.size() > 1)
+		{
+			bool dockState = LLUI::sSettingGroups["floater"]->getBOOL(mDocStateControl);
+			setDocked(dockState);
+		}
+	}
+}
+
 LLColor4 nearbychat_get_text_color(const LLChat& chat)
 {
 	LLColor4 text_color;
@@ -265,11 +290,5 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)
 {
 	rect = gViewerWindow->getWorldViewRect();
 }
-void LLNearbyChat::setVisible	(BOOL visible)
-{
-	LLDockableFloater::setVisible(visible);
-}
-void LLNearbyChat::toggleWindow()
-{
-}
+
 
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 20cbf7537d64be511a39ff48a7868954d4108daa..cb4654654a952562b21b252153de284759ad3516 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -52,16 +52,15 @@ class LLNearbyChat: public LLDockableFloater
 	void	onNearbyChatContextMenuItemClicked(const LLSD& userdata);
 	bool	onNearbyChatCheckContextMenuItem(const LLSD& userdata);
 
-	void	setDocked			(bool docked, bool pop_on_undock);
-	void	toggleWindow		();
+	void	setDocked			(bool docked, bool pop_on_undock = true);
 
 	/*virtual*/ void	onOpen	(const LLSD& key);
 
-	virtual void setVisible		(BOOL visible);
-
 	virtual void setRect		(const LLRect &rect);
 
 private:
+	virtual void    applySavedVariables();
+
 	void	getAllowedRect		(LLRect& rect);
 
 	void	onNearbySpeakers	();
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index 32dc5e59278e740073fcd570f8f9ee4d3b8c02df..d7a5ff289c24198113c4dbdf24eb2d52af447ebc 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -77,6 +77,10 @@ LLGestureComboBox::LLGestureComboBox(const LLGestureComboBox::Params& p)
 
 	// refresh list from current active gestures
 	refreshGestures();
+
+	// This forces using of halign from xml, since LLComboBox
+	// sets it to LLFontGL::LEFT, if text entry is disabled
+	mButton->setHAlign(p.drop_down_button.font_halign);
 }
 
 LLGestureComboBox::~LLGestureComboBox()
@@ -207,6 +211,7 @@ LLNearbyChatBar::LLNearbyChatBar()
 	: LLPanel()
 	, mChatBox(NULL)
 {
+	mSpeakerMgr = LLLocalSpeakerMgr::getInstance();
 }
 
 //virtual
@@ -516,8 +521,8 @@ void LLNearbyChatBar::displaySpeakingIndicator()
 	LLUUID id;
 
 	id.setNull();
-	mSpeakerMgr.update(TRUE);
-	mSpeakerMgr.getSpeakerList(&speaker_list, FALSE);
+	mSpeakerMgr->update(TRUE);
+	mSpeakerMgr->getSpeakerList(&speaker_list, FALSE);
 
 	for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)
 	{
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index 06204e6367b4a43f5c80c03b088255e064df02a0..0307eee7bf001769b82cfc7b21065e56f6eeb0bf 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -127,7 +127,7 @@ class LLNearbyChatBar
 	LLLineEditor*		mChatBox;
 	LLTalkButton*		mTalkBtn;
 	LLOutputMonitorCtrl* mOutputMonitor;
-	LLActiveSpeakerMgr  mSpeakerMgr;
+	LLLocalSpeakerMgr*  mSpeakerMgr;
 };
 
 #endif
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index 8bac9937f0d47a8881ece5f9a8f52753c42b9aca..39381e3faaeeadc3bc6966a4eedee069fb635224 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -80,7 +80,8 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)
 	mImageLevel2(p.image_level_2),
 	mImageLevel3(p.image_level_3),
 	mAutoUpdate(p.auto_update),
-	mSpeakerId(p.speaker_id)
+	mSpeakerId(p.speaker_id),
+	mIsAgentControl(false)
 {
 	//static LLUIColor output_monitor_muted_color = LLUIColorTable::instance().getColor("OutputMonitorMutedColor", LLColor4::orange);
 	//static LLUIColor output_monitor_overdriven_color = LLUIColorTable::instance().getColor("OutputMonitorOverdrivenColor", LLColor4::red);
@@ -132,7 +133,14 @@ void LLOutputMonitorCtrl::draw()
 	if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull())
 	{
 		setPower(gVoiceClient->getCurrentPower(mSpeakerId));
-		setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId));
+		if(mIsAgentControl)
+		{
+			setIsTalking(gVoiceClient->getUserPTTState());
+		}
+		else
+		{
+			setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId));
+		}
 	}
 
 	LLPointer<LLUIImage> icon;
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 7a7b8bc3a18e5fcdf799fd67cb8c3b769334b676..85ea552a572b049fbf796b0f914fcabb9481f7d5 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -81,6 +81,8 @@ class LLOutputMonitorCtrl
 
 	// For the current user, need to know the PTT state to show
 	// correct button image.
+	void			setIsAgentControl(bool val) { mIsAgentControl = val; }
+
 	void			setIsTalking(bool val) { mIsTalking = val; }
 
 	void			setSpeakerId(const LLUUID& speaker_id);
@@ -100,6 +102,7 @@ class LLOutputMonitorCtrl
 	
 
 	F32				mPower;
+	bool			mIsAgentControl;
 	bool			mIsMuted;
 	bool			mIsTalking;
 	LLPointer<LLUIImage> mImageMute;
diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp
index ea528a1df89e38e8db18e233df02827a5ad9dcdd..9d591ef43d184175ca4012e981e3dbaf1543152b 100644
--- a/indra/newview/llpanelcontents.cpp
+++ b/indra/newview/llpanelcontents.cpp
@@ -51,7 +51,7 @@
 // project includes
 #include "llagent.h"
 #include "llfloaterbulkpermission.h"
-#include "llpanelinventory.h"
+#include "llpanelobjectinventory.h"
 #include "llpreviewscript.h"
 #include "llresmgr.h"
 #include "llselectmgr.h"
@@ -59,6 +59,7 @@
 #include "lltoolcomp.h"
 #include "lltoolmgr.h"
 #include "lltrans.h"
+#include "llviewerassettype.h"
 #include "llviewerobject.h"
 #include "llviewerregion.h"
 #include "llviewerwindow.h"
@@ -89,14 +90,14 @@ BOOL LLPanelContents::postBuild()
 	childSetAction("button new script",&LLPanelContents::onClickNewScript, this);
 	childSetAction("button permissions",&LLPanelContents::onClickPermissions, this);
 
-	mPanelInventory = getChild<LLPanelInventory>("contents_inventory");
+	mPanelInventoryObject = getChild<LLPanelObjectInventory>("contents_inventory");
 
 	return TRUE;
 }
 
 LLPanelContents::LLPanelContents()
 	:	LLPanel(),
-		mPanelInventory(NULL)
+		mPanelInventoryObject(NULL)
 {
 }
 
@@ -139,9 +140,9 @@ void LLPanelContents::refresh()
 	LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject(children_ok);
 
 	getState(object);
-	if (mPanelInventory)
+	if (mPanelInventoryObject)
 	{
-		mPanelInventory->refresh();
+		mPanelInventoryObject->refresh();
 	}	
 }
 
@@ -167,7 +168,7 @@ void LLPanelContents::onClickNewScript(void *userdata)
 			PERM_NONE,
 			PERM_MOVE | PERM_TRANSFER);
 		std::string desc;
-		LLAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc);
+		LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc);
 		LLPointer<LLViewerInventoryItem> new_item =
 			new LLViewerInventoryItem(
 				LLUUID::null,
diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h
index bab980b52461d0c0cb7b0d736ed3164d31ba13ea..14256845a6cd9d33dbb060f6cc38791c70379bf1 100644
--- a/indra/newview/llpanelcontents.h
+++ b/indra/newview/llpanelcontents.h
@@ -35,9 +35,14 @@
 
 #include "v3math.h"
 #include "llpanel.h"
+#include "llinventory.h"
+#include "lluuid.h"
+#include "llmap.h"
+#include "llviewerobject.h"
+#include "llvoinventorylistener.h"
 
 class LLButton;
-class LLPanelInventory;
+class LLPanelObjectInventory;
 class LLViewerObject;
 class LLCheckBoxCtrl;
 class LLSpinCtrl;
@@ -70,7 +75,7 @@ class LLPanelContents : public LLPanel
 	void				getState(LLViewerObject *object);
 
 public:
-	LLPanelInventory* mPanelInventory;
+	LLPanelObjectInventory* mPanelInventoryObject;
 };
 
-#endif
+#endif // LL_LLPANELCONTENTS_H
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 4708d7ba364622b4a2f8b7e5961087526156ccce..10f015774afdc471db00d00662292435020cb608 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -86,23 +86,6 @@ BOOL LLPanelGroupTab::postBuild()
 	return TRUE;
 }
 
-
-
-void LLPanelGroupTab::handleClickHelp()
-{
-	// Display the help text.
-	std::string help_text( getHelpText() );
-	if ( !help_text.empty() )
-	{
-		LLSD args;
-		args["MESSAGE"] = help_text;
-		LLFloater* parent_floater = gFloaterView->getParentFloater(this);
-		LLNotification::Params params(parent_floater->contextualNotification("GenericAlert"));
-		params.substitutions(args);
-		LLNotifications::instance().add(params);
-	}
-}
-
 LLPanelGroup::LLPanelGroup()
 :	LLPanel(),
 	LLGroupMgrObserver( LLUUID() ),
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 5c7b0ddd0603bdb162925b0c5b9a13e5df1de386..306e6575fc7122a3ecfec663f8c35b6bbe873d45 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -148,12 +148,6 @@ class LLPanelGroupTab : public LLPanel
 	// Triggered when group information changes in the group manager.
 	virtual void update(LLGroupChange gc) { }
 
-	// This is the text to be displayed when a help button is pressed.
-	virtual std::string getHelpText() const { return mHelpText; }
-
-	// Display anything returned by getHelpText
-	void handleClickHelp();
-
 	// This just connects the help button callback.
 	virtual BOOL postBuild();
 
@@ -171,11 +165,8 @@ class LLPanelGroupTab : public LLPanel
 
 protected:
 	LLUUID	mGroupID;
-	std::string	mHelpText;
-
 	BOOL mAllowEdit;
 	BOOL mHasModal;
-
 };
 
 #endif // LL_LLPANELGROUP_H
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 0ce85818dd61751b5083a985621383b56a02e79c..22138a81ecace0c160ba0c0a37c1fab89170f2e0 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -38,6 +38,7 @@
 
 #include "llinventory.h"
 #include "llviewerinventory.h"
+#include "llinventoryfunctions.h"
 #include "llinventorymodel.h"
 #include "llfloaterinventory.h"
 #include "llagent.h"
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 71486c908cc1b82ea66e5befca367e1b6c9e8341..88aad4923d67bced285108a9020c3b15cde5aab8 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -361,20 +361,6 @@ void LLPanelGroupRoles::cancel()
 	panelp->cancel();
 }
 
-// Pass all of these messages to the currently visible sub tab.
-std::string LLPanelGroupRoles::getHelpText() const
-{
-	LLPanelGroupTab* panelp = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
-	if (panelp)
-	{
-		return panelp->getHelpText();
-	}
-	else
-	{
-		return mHelpText;
-	}
-}
-
 void LLPanelGroupRoles::update(LLGroupChange gc)
 {
 	if (mGroupID.isNull()) return;
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index bd5fc1d2350f77bd0f4ce7244754d15ccde5a134..b6e2245e70d0fcb9e6b58f2355cbf8b4e01ff635 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -78,7 +78,6 @@ class LLPanelGroupRoles : public LLPanelGroupTab
 	bool onModalClose(const LLSD& notification, const LLSD& response);
 
 	// Most of these messages are just passed on to the current sub-tab.
-	virtual std::string getHelpText() const;
 	virtual void activate();
 	virtual void deactivate();
 	virtual bool needsApply(std::string& mesg);
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index b54975b76b6392ea9ae9818e00e44acd5d058249..21e88b6d07c1f81a616d75a4e2aaa8c4ddde3635 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -112,21 +112,32 @@ BOOL LLPanelIMControlPanel::postBuild()
 	childSetAction("add_friend_btn", boost::bind(&LLPanelIMControlPanel::onAddFriendButtonClicked, this));
 
 	childSetAction("share_btn", boost::bind(&LLPanelIMControlPanel::onShareButtonClicked, this));
+	childSetAction("teleport_btn", boost::bind(&LLPanelIMControlPanel::onTeleportButtonClicked, this));
+	childSetAction("pay_btn", boost::bind(&LLPanelIMControlPanel::onPayButtonClicked, this));
 	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()));
 	
 	return LLPanelChatControlPanel::postBuild();
 }
 
+void LLPanelIMControlPanel::onTeleportButtonClicked()
+{
+	LLAvatarActions::offerTeleport(mAvatarID);
+}
+void LLPanelIMControlPanel::onPayButtonClicked()
+{
+	LLAvatarActions::pay(mAvatarID);
+}
+
 void LLPanelIMControlPanel::onViewProfileButtonClicked()
 {
-	LLAvatarActions::showProfile(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId());
+	LLAvatarActions::showProfile(mAvatarID);
 }
 
 void LLPanelIMControlPanel::onAddFriendButtonClicked()
 {
 	LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 	std::string full_name = avatar_icon->getFirstName() + " " + avatar_icon->getLastName();
-	LLAvatarActions::requestFriendshipDialog(avatar_icon->getAvatarId(), full_name);
+	LLAvatarActions::requestFriendshipDialog(mAvatarID, full_name);
 }
 
 void LLPanelIMControlPanel::onShareButtonClicked()
@@ -140,12 +151,12 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 
 	LLIMModel& im_model = LLIMModel::instance();
 
-	LLUUID avatar_id = im_model.getOtherParticipantID(session_id);
+	mAvatarID = im_model.getOtherParticipantID(session_id);
 
 	// Disable "Add friend" button for friends.
-	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(avatar_id));
+	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID));
 
-	getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(avatar_id);
+	getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID);
 
 	// Disable profile button if participant is not realy SL avatar
 	LLIMModel::LLIMSession* im_session =
@@ -188,6 +199,20 @@ void LLPanelGroupControlPanel::onGroupInfoButtonClicked()
 	LLGroupActions::show(mGroupID);
 }
 
+void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata)
+{
+	// TODO: Check this code when when sort order menu will be added. (EM)
+	if (false && !mParticipantList)
+		return;
+
+	std::string chosen_item = userdata.asString();
+
+	if (chosen_item == "sort_name")
+	{
+		mParticipantList->setSortOrder(LLParticipantList::E_SORT_BY_NAME);
+	}
+
+}
 
 void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id)
 {
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index d25f33935a3f58305cfb2c5146669c4d4c0e1ff8..fa101f42803e636289f82dff9b5b21c6c5197222 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -73,6 +73,8 @@ class LLPanelIMControlPanel : public LLPanelChatControlPanel
 	void onViewProfileButtonClicked();
 	void onAddFriendButtonClicked();
 	void onShareButtonClicked();
+	void onTeleportButtonClicked();
+	void onPayButtonClicked();
 
 	LLUUID mAvatarID;
 };
@@ -97,6 +99,7 @@ class LLPanelGroupControlPanel : public LLPanelChatControlPanel
 
 private:
 	void onGroupInfoButtonClicked();
+	void onSortMenuItemClicked(const LLSD& userdata);
 };
 
 class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel
diff --git a/indra/newview/llpanelland.cpp b/indra/newview/llpanelland.cpp
index bce5525a4066618bedb854b092a5650e2515f5dc..417a8048347671d0e2884bfdd5b4bf9db621ec41 100644
--- a/indra/newview/llpanelland.cpp
+++ b/indra/newview/llpanelland.cpp
@@ -70,7 +70,6 @@ BOOL	LLPanelLandInfo::postBuild()
 	childSetAction("button subdivide land",onClickDivide,this);
 	childSetAction("button join land",onClickJoin,this);
 	childSetAction("button about land",onClickAbout,this);
-	childSetAction("button show owners help", onShowOwnersHelp, this);
 
 	mCheckShowOwners = getChild<LLCheckBoxCtrl>("checkbox show owners");
 	childSetValue("checkbox show owners", gSavedSettings.getBOOL("ShowParcelOwners"));
@@ -265,8 +264,3 @@ void LLPanelLandInfo::onClickAbout(void*)
 
 	LLFloaterReg::showInstance("about_land");
 }
-
-void LLPanelLandInfo::onShowOwnersHelp(void* user_data)
-{
-	LLNotifications::instance().add("ShowOwnersHelp");
-}
diff --git a/indra/newview/llpanelland.h b/indra/newview/llpanelland.h
index 92fe3134052984afeede523848294e571f5aae5b..02e7e7bf3856036c3578779a4429b76a851e27c4 100644
--- a/indra/newview/llpanelland.h
+++ b/indra/newview/llpanelland.h
@@ -60,7 +60,6 @@ class LLPanelLandInfo
 	static void onClickDivide(void*);
 	static void onClickJoin(void*);
 	static void onClickAbout(void*);
-	static void onShowOwnersHelp(void*);
 
 protected:
 	//LLTextBox*		mTextPriceLabel;
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6f3b0db498cc7262eef3b3b1efc8d6c436dbaa94
--- /dev/null
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -0,0 +1,437 @@
+/**
+ * @file llpanellandmarkinfo.cpp
+ * @brief Displays landmark info in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanellandmarkinfo.h"
+
+#include "llinventory.h"
+
+#include "llcombobox.h"
+#include "lllineeditor.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+#include "lltrans.h"
+
+#include "llagent.h"
+#include "llagentui.h"
+#include "llinventorymodel.h"
+#include "lllandmarkactions.h"
+#include "llviewerinventory.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+
+//----------------------------------------------------------------------------
+// Aux types and methods
+//----------------------------------------------------------------------------
+
+typedef std::pair<LLUUID, std::string> folder_pair_t;
+
+static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right);
+static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats);
+
+static LLRegisterPanelClassWrapper<LLPanelLandmarkInfo> t_landmark_info("panel_landmark_info");
+
+LLPanelLandmarkInfo::LLPanelLandmarkInfo()
+:	LLPanelPlaceInfo()
+{}
+
+// virtual
+LLPanelLandmarkInfo::~LLPanelLandmarkInfo()
+{}
+
+// virtual
+BOOL LLPanelLandmarkInfo::postBuild()
+{
+	LLPanelPlaceInfo::postBuild();
+
+	mOwner = getChild<LLTextBox>("owner");
+	mCreator = getChild<LLTextBox>("creator");
+	mCreated = getChild<LLTextBox>("created");
+
+	mTitleEditor = getChild<LLLineEditor>("title_editor");
+	mNotesEditor = getChild<LLTextEditor>("notes_editor");
+	mFolderCombo = getChild<LLComboBox>("folder_combo");
+
+	return TRUE;
+}
+
+// virtual
+void LLPanelLandmarkInfo::resetLocation()
+{
+	LLPanelPlaceInfo::resetLocation();
+
+	std::string not_available = getString("not_available");
+	mCreator->setText(not_available);
+	mOwner->setText(not_available);
+	mCreated->setText(not_available);
+	mTitleEditor->setText(LLStringUtil::null);
+	mNotesEditor->setText(LLStringUtil::null);
+}
+
+// virtual
+void LLPanelLandmarkInfo::setInfoType(INFO_TYPE type)
+{
+	LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel");
+
+	bool is_info_type_create_landmark = type == CREATE_LANDMARK;
+	bool is_info_type_landmark = type == LANDMARK;
+
+	landmark_info_panel->setVisible(is_info_type_landmark);
+
+	getChild<LLTextBox>("folder_label")->setVisible(is_info_type_create_landmark);
+	mFolderCombo->setVisible(is_info_type_create_landmark);
+
+	switch(type)
+	{
+		case CREATE_LANDMARK:
+			mCurrentTitle = getString("title_create_landmark");
+
+			mTitleEditor->setEnabled(TRUE);
+			mNotesEditor->setEnabled(TRUE);
+		break;
+
+		case LANDMARK:
+		default:
+			mCurrentTitle = getString("title_landmark");
+
+			mTitleEditor->setEnabled(FALSE);
+			mNotesEditor->setEnabled(FALSE);
+		break;
+	}
+
+	populateFoldersList();
+
+	LLPanelPlaceInfo::setInfoType(type);
+}
+
+// virtual
+void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data)
+{
+	LLPanelPlaceInfo::processParcelInfo(parcel_data);
+
+	// HACK: Flag 0x2 == adult region,
+	// Flag 0x1 == mature region, otherwise assume PG
+	std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);
+	if (parcel_data.flags & 0x2)
+	{
+		rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT);
+	}
+	else if (parcel_data.flags & 0x1)
+	{
+		rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);
+	}
+
+	mMaturityRatingText->setValue(rating);
+
+	S32 region_x;
+	S32 region_y;
+	S32 region_z;
+
+	// If the region position is zero, grab position from the global
+	if(mPosRegion.isExactlyZero())
+	{
+		region_x = llround(parcel_data.global_x) % REGION_WIDTH_UNITS;
+		region_y = llround(parcel_data.global_y) % REGION_WIDTH_UNITS;
+		region_z = llround(parcel_data.global_z);
+	}
+	else
+	{
+		region_x = llround(mPosRegion.mV[VX]);
+		region_y = llround(mPosRegion.mV[VY]);
+		region_z = llround(mPosRegion.mV[VZ]);
+	}
+
+	if (mInfoType == CREATE_LANDMARK)
+	{
+		if (parcel_data.name.empty())
+		{
+			mTitleEditor->setText(llformat("%s (%d, %d, %d)",
+								  parcel_data.sim_name.c_str(), region_x, region_y, region_z));
+		}
+		else
+		{
+			mTitleEditor->setText(parcel_data.name);
+		}
+
+		std::string desc;
+		LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent());
+		mNotesEditor->setText(desc);
+
+		if (!LLLandmarkActions::landmarkAlreadyExists())
+		{
+			createLandmark(mFolderCombo->getValue().asUUID());
+		}
+	}
+}
+
+void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem)
+{
+	if (!pItem)
+		return;
+
+	if(!gCacheName)
+		return;
+
+	const LLPermissions& perm = pItem->getPermissions();
+
+	//////////////////
+	// CREATOR NAME //
+	//////////////////
+	if (pItem->getCreatorUUID().notNull())
+	{
+		std::string name;
+		LLUUID creator_id = pItem->getCreatorUUID();
+		if (!gCacheName->getFullName(creator_id, name))
+		{
+			gCacheName->get(creator_id, FALSE,
+							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mCreator, _2, _3));
+		}
+		mCreator->setText(name);
+	}
+	else
+	{
+		mCreator->setText(getString("unknown"));
+	}
+
+	////////////////
+	// OWNER NAME //
+	////////////////
+	if(perm.isOwned())
+	{
+		std::string name;
+		if (perm.isGroupOwned())
+		{
+			LLUUID group_id = perm.getGroup();
+			if (!gCacheName->getGroupName(group_id, name))
+			{
+				gCacheName->get(group_id, TRUE,
+								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3));
+			}
+		}
+		else
+		{
+			LLUUID owner_id = perm.getOwner();
+			if (!gCacheName->getFullName(owner_id, name))
+			{
+				gCacheName->get(owner_id, FALSE,
+								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3));
+			}
+		}
+		mOwner->setText(name);
+	}
+	else
+	{
+		mOwner->setText(getString("public"));
+	}
+
+	//////////////////
+	// ACQUIRE DATE //
+	//////////////////
+	time_t time_utc = pItem->getCreationDate();
+	if (0 == time_utc)
+	{
+		mCreated->setText(getString("unknown"));
+	}
+	else
+	{
+		std::string timeStr = getString("acquired_date");
+		LLSD substitution;
+		substitution["datetime"] = (S32) time_utc;
+		LLStringUtil::format (timeStr, substitution);
+		mCreated->setText(timeStr);
+	}
+
+	mTitleEditor->setText(pItem->getName());
+	mNotesEditor->setText(pItem->getDescription());
+}
+
+void LLPanelLandmarkInfo::toggleLandmarkEditMode(BOOL enabled)
+{
+	// If switching to edit mode while creating landmark
+	// the "Create Landmark" title remains.
+	if (enabled && mInfoType != CREATE_LANDMARK)
+	{
+		mTitle->setText(getString("title_edit_landmark"));
+	}
+	else
+	{
+		mTitle->setText(mCurrentTitle);
+	}
+
+	if (mNotesEditor->getReadOnly() ==  (enabled == TRUE))
+	{
+		mTitleEditor->setEnabled(enabled);
+		mNotesEditor->setReadOnly(!enabled);
+		mFolderCombo->setVisible(enabled);
+		getChild<LLTextBox>("folder_label")->setVisible(enabled);
+
+		// HACK: To change the text color in a text editor
+		// when it was enabled/disabled we set the text once again.
+		mNotesEditor->setText(mNotesEditor->getText());
+	}
+}
+
+const std::string& LLPanelLandmarkInfo::getLandmarkTitle() const
+{
+	return mTitleEditor->getText();
+}
+
+const std::string LLPanelLandmarkInfo::getLandmarkNotes() const
+{
+	return mNotesEditor->getText();
+}
+
+const LLUUID LLPanelLandmarkInfo::getLandmarkFolder() const
+{
+	return mFolderCombo->getValue().asUUID();
+}
+
+BOOL LLPanelLandmarkInfo::setLandmarkFolder(const LLUUID& id)
+{
+	return mFolderCombo->setCurrentByID(id);
+}
+
+void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)
+{
+	std::string name = mTitleEditor->getText();
+	std::string desc = mNotesEditor->getText();
+
+	LLStringUtil::trim(name);
+	LLStringUtil::trim(desc);
+
+	// If typed name is empty use the parcel name instead.
+	if (name.empty())
+	{
+		name = mParcelName->getText();
+
+		// If no parcel exists use the region name instead.
+		if (name.empty())
+		{
+			name = mRegionName->getText();
+		}
+	}
+
+	LLStringUtil::replaceChar(desc, '\n', ' ');
+	// If no folder chosen use the "Landmarks" folder.
+	LLLandmarkActions::createLandmarkHere(name, desc,
+		folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK));
+}
+
+// static
+std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCategory* cat)
+{
+	std::string name = cat->getName();
+	LLUUID parent_id;
+
+	// translate category name, if it's right below the root
+	// FIXME: it can throw notification about non existent string in strings.xml
+	if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
+	{
+		LLTrans::findString(name, "InvFolder " + name);
+	}
+
+	// we don't want "My Inventory" to appear in the name
+	while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
+	{
+		cat = gInventory.getCategory(parent_id);
+		name = cat->getName() + "/" + name;
+	}
+
+	return name;
+}
+
+void LLPanelLandmarkInfo::populateFoldersList()
+{
+	// Collect all folders that can contain landmarks.
+	LLInventoryModel::cat_array_t cats;
+	collectLandmarkFolders(cats);
+
+	mFolderCombo->removeall();
+
+	// Put the "Landmarks" folder first in list.
+	LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+	const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id);
+	if (!cat)
+	{
+		llwarns << "Cannot find the landmarks folder" << llendl;
+	}
+	std::string cat_full_name = getFullFolderName(cat);
+	mFolderCombo->add(cat_full_name, cat->getUUID());
+
+	typedef std::vector<folder_pair_t> folder_vec_t;
+	folder_vec_t folders;
+	// Sort the folders by their full name.
+	for (S32 i = 0; i < cats.count(); i++)
+	{
+		cat = cats.get(i);
+		cat_full_name = getFullFolderName(cat);
+		folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
+	}
+	sort(folders.begin(), folders.end(), cmp_folders);
+
+	// Finally, populate the combobox.
+	for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++)
+		mFolderCombo->add(it->second, LLSD(it->first));
+}
+
+static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right)
+{
+	return left.second < right.second;
+}
+
+static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats)
+{
+	LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
+
+	// Add descendent folders of the "Landmarks" category.
+	LLInventoryModel::item_array_t items; // unused
+	LLIsType is_category(LLAssetType::AT_CATEGORY);
+	gInventory.collectDescendentsIf(
+		landmarks_id,
+		cats,
+		items,
+		LLInventoryModel::EXCLUDE_TRASH,
+		is_category);
+
+	// Add the "My Favorites" category.
+	LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+	LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
+	if (!favorites_cat)
+	{
+		llwarns << "Cannot find the favorites folder" << llendl;
+	}
+	else
+	{
+		cats.put(favorites_cat);
+	}
+}
diff --git a/indra/newview/llpanellandmarkinfo.h b/indra/newview/llpanellandmarkinfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..03377986b319cf50215bf679df0108f51037a877
--- /dev/null
+++ b/indra/newview/llpanellandmarkinfo.h
@@ -0,0 +1,85 @@
+/**
+ * @file llpanellandmarkinfo.h
+ * @brief Displays landmark info in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELLANDMARKINFO_H
+#define LL_LLPANELLANDMARKINFO_H
+
+#include "llpanelplaceinfo.h"
+
+class LLComboBox;
+class LLLineEditor;
+class LLTextEditor;
+
+class LLPanelLandmarkInfo : public LLPanelPlaceInfo
+{
+public:
+	LLPanelLandmarkInfo();
+	/*virtual*/ ~LLPanelLandmarkInfo();
+
+	/*virtual*/ BOOL postBuild();
+
+	/*virtual*/ void resetLocation();
+
+	/*virtual*/ void setInfoType(INFO_TYPE type);
+
+	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+
+	// Displays landmark owner, creator and creation date info.
+	void displayItemInfo(const LLInventoryItem* pItem);
+
+	void toggleLandmarkEditMode(BOOL enabled);
+
+	const std::string& getLandmarkTitle() const;
+	const std::string getLandmarkNotes() const;
+	const LLUUID getLandmarkFolder() const;
+
+	// Select current landmark folder in combobox.
+	BOOL setLandmarkFolder(const LLUUID& id);
+
+	// Create a landmark for the current location
+	// in a folder specified by folder_id.
+	void createLandmark(const LLUUID& folder_id);
+
+	static std::string getFullFolderName(const LLViewerInventoryCategory* cat);
+
+private:
+	void populateFoldersList();
+
+	LLTextBox*			mOwner;
+	LLTextBox*			mCreator;
+	LLTextBox*			mCreated;
+	LLLineEditor*		mTitleEditor;
+	LLTextEditor*		mNotesEditor;
+	LLComboBox*			mFolderCombo;
+};
+
+#endif // LL_LLPANELLANDMARKINFO_H
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index c9598a2576892f972a11802348289035b0e5b334..6d6fd38ccee6fa92cc827a8d4283d57b1dae9222 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -47,6 +47,7 @@
 #include "lldndbutton.h"
 #include "llfloaterworldmap.h"
 #include "llfolderviewitem.h"
+#include "llinventorypanel.h"
 #include "llinventorysubtreepanel.h"
 #include "lllandmarkactions.h"
 #include "llplacesinventorybridge.h"
@@ -552,14 +553,16 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
 	std::string command_name = userdata.asString();
 	if("add_landmark" == command_name)
 	{
-		if(LLLandmarkActions::landmarkAlreadyExists())
+		LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos();
+		if(landmark)
+		{
+			LLSideTray::getInstance()->showPanel("panel_places", 
+								LLSD().insert("type", "landmark").insert("id",landmark->getUUID()));
+		}
+		else
 		{
-			std::string location;
-			LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_FULL);
-			llwarns<<" Landmark already exists at location:  "<< location<<llendl;
-			return;
+			LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
 		}
-		LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));
 	} 
 	else if ("category" == command_name)
 	{
@@ -583,7 +586,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
 			menu_create_inventory_item(mCurrentSelectedList->getRootFolder(),
 					dynamic_cast<LLFolderBridge*> (folder_bridge), LLSD(
 							"category"), gInventory.findCategoryUUIDForType(
-							LLAssetType::AT_LANDMARK));
+							LLFolderType::FT_LANDMARK));
 		}
 	}
 }
@@ -615,19 +618,21 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const
 
 void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)
 {
-	if(!mCurrentSelectedList) return;
-
-	LLFolderView* root_folder = mCurrentSelectedList->getRootFolder();
+	LLFolderView* landmarks_folder = mLandmarksInventoryPanel->getRootFolder();
+	LLFolderView* fav_folder = mFavoritesInventoryPanel->getRootFolder();
 	std::string command_name = userdata.asString();
 
 	if ("expand_all" == command_name)
 	{
-		root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
-		root_folder->arrangeAll();
+		landmarks_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
+		fav_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
+		landmarks_folder->arrangeAll();
+		fav_folder->arrangeAll();
 	}
 	else if ("collapse_all" == command_name)
 	{
-		root_folder->closeAllFolders();
+		landmarks_folder->closeAllFolders();
+		fav_folder->closeAllFolders();
 	}
 	else if ( "sort_by_date" == command_name)
 	{
@@ -638,6 +643,9 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)
 	}
 	else
 	{
+		if(!mCurrentSelectedList) return;
+
+		LLFolderView* root_folder = mCurrentSelectedList->getRootFolder();
 		root_folder->doToSelected(&gInventory, userdata);
 	}
 }
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 24e76e2c6e0e64c8282e5e7d4bd842a0c5bb8ee6..5d826f0a561c895cc1c0e99ff12915c46db17266 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -198,7 +198,16 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	//leave room for the login menu bar
 	setRect(LLRect(0, rect.getHeight()-18, rect.getWidth(), 0)); 
 #endif
-	reshape(rect.getWidth(), rect.getHeight());
+	// 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());
+	}
 
 #if !USE_VIEWER_AUTH
 	childSetPrevalidate("first_name_edit", LLLineEditor::prevalidatePrintableNoSpace);
@@ -234,9 +243,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 
 	childSetAction("connect_btn", onClickConnect, this);
 
-	setDefaultBtn("connect_btn");
-
-	// childSetAction("quit_btn", onClickQuit, this);
+	getChild<LLPanel>("login_widgets")->setDefaultBtn("connect_btn");
 
 	std::string channel = gSavedSettings.getString("VersionChannelName");
 	std::string version = llformat("%d.%d.%d (%d)",
@@ -267,19 +274,20 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 	web_browser->setTabStop(FALSE);
 	// web_browser->navigateToLocalPage( "loading", "loading.html" );
 
-	// make links open in external browser
-	web_browser->setOpenInExternalBrowser( true );
+	if (gSavedSettings.getBOOL("RegInClient"))
+	{
+		// need to follow links in the internal browser
+		web_browser->setOpenInExternalBrowser( false );
 
-	// 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)
-	LLRect htmlRect = getRect();
-#if USE_VIEWER_AUTH
-	htmlRect.setCenterAndSize( getRect().getCenterX() - 2, getRect().getCenterY(), getRect().getWidth() + 6, getRect().getHeight());
-#else
-	htmlRect.setCenterAndSize( getRect().getCenterX() - 2, getRect().getCenterY() + 40, getRect().getWidth() + 6, getRect().getHeight() - 78 );
-#endif
-	web_browser->setRect( htmlRect );
-	web_browser->reshape( htmlRect.getWidth(), htmlRect.getHeight(), TRUE );
-	reshape( getRect().getWidth(), getRect().getHeight(), 1 );
+		getChild<LLView>("login_widgets")->setVisible(false);
+	}
+	else
+	{
+		// make links open in external browser
+		web_browser->setOpenInExternalBrowser( true );
+
+		reshapeBrowser();
+	}
 
 	// kick off a request to grab the url manually
 	gResponsePtr = LLIamHereLogin::build( this );
@@ -297,6 +305,27 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 
 }
 
+// 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->getVirtualWindowRect();
+	LLRect html_rect;
+#if USE_VIEWER_AUTH
+	html_rect.setCenterAndSize( 
+		rect.getCenterX() - 2, rect.getCenterY(), 
+		rect.getWidth() + 6, rect.getHeight());
+#else
+	html_rect.setCenterAndSize(
+		rect.getCenterX() - 2, rect.getCenterY() + 40,
+		rect.getWidth() + 6, rect.getHeight() - 78 );
+#endif
+	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");
@@ -384,10 +413,14 @@ void LLPanelLogin::draw()
 		if ( mHtmlAvailable )
 		{
 #if !USE_VIEWER_AUTH
-			// draw a background box in black
-			gl_rect_2d( 0, height - 264, width, 264, LLColor4( 0.0f, 0.0f, 0.0f, 1.f ) );
-			// 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());
+			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());
+			}
 #endif
 		}
 		else
@@ -418,12 +451,6 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask)
 		return TRUE;
 	}
 
-	if (KEY_RETURN == key && MASK_NONE == mask)
-	{
-		// let the panel handle UICtrl processing: calls onClickConnect()
-		return LLPanel::handleKeyHere(key, mask);
-	}
-
 	return LLPanel::handleKeyHere(key, mask);
 }
 
@@ -483,6 +510,19 @@ void LLPanelLogin::giveFocus()
 #endif
 }
 
+// static
+void LLPanelLogin::showLoginWidgets()
+{
+	sInstance->childSetVisible("login_widgets", true);
+	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
+	web_browser->setOpenInExternalBrowser( true );
+	sInstance->reshapeBrowser();
+	// *TODO: Append all the usual login parameters, like first_login=Y etc.
+	std::string splash_screen_url = sInstance->getString("real_url");
+	web_browser->navigateTo( splash_screen_url, "text/html" );
+	LLUICtrl* first_name_edit = sInstance->getChild<LLUICtrl>("first_name_edit");
+	first_name_edit->setFocus(TRUE);
+}
 
 // static
 void LLPanelLogin::show(const LLRect &rect,
@@ -797,8 +837,17 @@ void LLPanelLogin::loadLoginPage()
 	
 	LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
 	
-	// navigate to the "real" page 
-	web_browser->navigateTo( oStr.str(), "text/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)
@@ -883,22 +932,6 @@ void LLPanelLogin::onClickNewAccount(void*)
 }
 
 
-// *NOTE: This function is dead as of 2008 August.  I left it here in case
-// we suddenly decide to put the Quit button back. JC
-// static
-void LLPanelLogin::onClickQuit(void*)
-{
-	if (sInstance && sInstance->mCallback)
-	{
-		// tell the responder we're not here anymore
-		if ( gResponsePtr )
-			gResponsePtr->setParent( 0 );
-
-		sInstance->mCallback(1, sInstance->mCallbackData);
-	}
-}
-
-
 // static
 void LLPanelLogin::onClickVersion(void*)
 {
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 5692b8d345a392365c75deea1dc1e3364799c4a2..acb2001c22f186ede7afec2017c6b062cdbc45a0 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -56,6 +56,10 @@ class LLPanelLogin:
 	virtual void draw();
 	virtual void setFocus( BOOL b );
 
+	// Show the XUI first name, last name, and password widgets.  They are
+	// hidden on startup for reg-in-client
+	static void showLoginWidgets();
+
 	static void show(const LLRect &rect, BOOL show_server, 
 		void (*callback)(S32 option, void* user_data), 
 		void* callback_data);
@@ -86,10 +90,10 @@ class LLPanelLogin:
 	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
 
 private:
+	void reshapeBrowser();
 	static void onClickConnect(void*);
 	static void onClickNewAccount(void*);
 //	static bool newAccountAlertCallback(const LLSD& notification, const LLSD& response);
-	static void onClickQuit(void*);
 	static void onClickVersion(void*);
 	static void onClickForgotPassword(void*);
 	static void onPassKey(LLLineEditor* caller, void* user_data);
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..25be09fa24ac3c2221b92917172d33bb3823ff8d
--- /dev/null
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -0,0 +1,818 @@
+/** 
+ * @file llsidepanelmaininventory.cpp
+ * @brief Implementation of llsidepanelmaininventory.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llpanelmaininventory.h"
+
+#include "llfloaterinventory.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
+#include "llfiltereditor.h"
+#include "llfloaterreg.h"
+#include "llscrollcontainer.h"
+#include "llsdserialize.h"
+#include "llspinctrl.h"
+#include "lltooldraganddrop.h"
+
+static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor?
+
+///----------------------------------------------------------------------------
+/// LLFloaterInventoryFinder
+///----------------------------------------------------------------------------
+
+class LLFloaterInventoryFinder : public LLFloater
+{
+public:
+	LLFloaterInventoryFinder( LLPanelMainInventory* inventory_view);
+	virtual void draw();
+	/*virtual*/	BOOL	postBuild();
+	void changeFilter(LLInventoryFilter* filter);
+	void updateElementsFromFilter();
+	BOOL getCheckShowEmpty();
+	BOOL getCheckSinceLogoff();
+
+	static void onTimeAgo(LLUICtrl*, void *);
+	static void onCheckSinceLogoff(LLUICtrl*, void *);
+	static void onCloseBtn(void* user_data);
+	static void selectAllTypes(void* user_data);
+	static void selectNoTypes(void* user_data);
+private:
+	LLPanelMainInventory*	mPanelInventoryDecorated;
+	LLSpinCtrl*			mSpinSinceDays;
+	LLSpinCtrl*			mSpinSinceHours;
+	LLInventoryFilter*	mFilter;
+};
+
+///----------------------------------------------------------------------------
+/// LLPanelMainInventory
+///----------------------------------------------------------------------------
+
+LLPanelMainInventory::LLPanelMainInventory()
+	: LLPanel()
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_INIT);
+	// Menu Callbacks (non contex menus)
+	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this));
+	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
+	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
+	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2));
+ 	mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this));
+	mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
+	mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
+	mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
+
+	// Controls
+	// *TODO: Just use persistant settings for each of these
+	U32 sort_order = gSavedSettings.getU32("InventorySortOrder");
+	BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE );
+	BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME );
+	BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP );
+	
+	gSavedSettings.declareBOOL("Inventory.SortByName", sort_by_name, "Declared in code", FALSE);
+	gSavedSettings.declareBOOL("Inventory.SortByDate", !sort_by_name, "Declared in code", FALSE);
+	gSavedSettings.declareBOOL("Inventory.FoldersAlwaysByName", sort_folders_by_name, "Declared in code", FALSE);
+	gSavedSettings.declareBOOL("Inventory.SystemFoldersToTop", sort_system_folders_to_top, "Declared in code", FALSE);
+	
+	mSavedFolderState = new LLSaveFolderState();
+	mSavedFolderState->setApply(FALSE);
+}
+
+BOOL LLPanelMainInventory::postBuild()
+{
+	gInventory.addObserver(this);
+	
+	mFilterTabs = getChild<LLTabContainer>("inventory filter tabs");
+	mFilterTabs->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterSelected, this));
+	
+	//panel->getFilter()->markDefault();
+
+	// Set up the default inv. panel/filter settings.
+	mActivePanel = getChild<LLInventoryPanel>("All Items");
+	if (mActivePanel)
+	{
+		// "All Items" is the previous only view, so it gets the InventorySortOrder
+		mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder"));
+		mActivePanel->getFilter()->markDefault();
+		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+		mActivePanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mActivePanel, _1, _2));
+	}
+	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
+	if (recent_items_panel)
+	{
+		recent_items_panel->setSinceLogoff(TRUE);
+		recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
+		recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+		recent_items_panel->getFilter()->markDefault();
+		recent_items_panel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, recent_items_panel, _1, _2));
+	}
+
+	// Now load the stored settings from disk, if available.
+	std::ostringstream filterSaveName;
+	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
+	llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl;
+	llifstream file(filterSaveName.str());
+	LLSD savedFilterState;
+	if (file.is_open())
+	{
+		LLSDSerialize::fromXML(savedFilterState, file);
+		file.close();
+
+		// Load the persistent "Recent Items" settings.
+		// Note that the "All Items" settings do not persist.
+		if(recent_items_panel)
+		{
+			if(savedFilterState.has(recent_items_panel->getFilter()->getName()))
+			{
+				LLSD recent_items = savedFilterState.get(
+					recent_items_panel->getFilter()->getName());
+				recent_items_panel->getFilter()->fromLLSD(recent_items);
+			}
+		}
+
+	}
+
+
+	mFilterEditor = getChild<LLFilterEditor>("inventory search editor");
+	if (mFilterEditor)
+	{
+		mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2));
+	}
+
+	// *TODO:Get the cost info from the server
+	const std::string upload_cost("10");
+	childSetLabelArg("Upload Image", "[COST]", upload_cost);
+	childSetLabelArg("Upload Sound", "[COST]", upload_cost);
+	childSetLabelArg("Upload Animation", "[COST]", upload_cost);
+	childSetLabelArg("Bulk Upload", "[COST]", upload_cost);
+	
+	return TRUE;
+}
+
+// Destroys the object
+LLPanelMainInventory::~LLPanelMainInventory( void )
+{
+	// Save the filters state.
+	LLSD filterRoot;
+	LLInventoryPanel* all_items_panel = getChild<LLInventoryPanel>("All Items");
+	if (all_items_panel)
+	{
+		LLInventoryFilter* filter = all_items_panel->getFilter();
+		if (filter)
+		{
+			LLSD filterState;
+			filter->toLLSD(filterState);
+			filterRoot[filter->getName()] = filterState;
+		}
+	}
+
+	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
+	if (recent_items_panel)
+	{
+		LLInventoryFilter* filter = recent_items_panel->getFilter();
+		if (filter)
+		{
+			LLSD filterState;
+			filter->toLLSD(filterState);
+			filterRoot[filter->getName()] = filterState;
+		}
+	}
+
+	std::ostringstream filterSaveName;
+	filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "filters.xml");
+	llofstream filtersFile(filterSaveName.str());
+	if(!LLSDSerialize::toPrettyXML(filterRoot, filtersFile))
+	{
+		llwarns << "Could not write to filters save file " << filterSaveName << llendl;
+	}
+	else
+		filtersFile.close();
+
+	gInventory.removeObserver(this);
+	delete mSavedFolderState;
+}
+
+void LLPanelMainInventory::startSearch()
+{
+	// this forces focus to line editor portion of search editor
+	if (mFilterEditor)
+	{
+		mFilterEditor->focusFirstItem(TRUE);
+	}
+}
+
+BOOL LLPanelMainInventory::handleKeyHere(KEY key, MASK mask)
+{
+	LLFolderView* root_folder = mActivePanel ? mActivePanel->getRootFolder() : NULL;
+	if (root_folder)
+	{
+		// first check for user accepting current search results
+		if (mFilterEditor 
+			&& mFilterEditor->hasFocus()
+		    && (key == KEY_RETURN 
+		    	|| key == KEY_DOWN)
+		    && mask == MASK_NONE)
+		{
+			// move focus to inventory proper
+			mActivePanel->setFocus(TRUE);
+			root_folder->scrollToShowSelection();
+			return TRUE;
+		}
+
+		if (mActivePanel->hasFocus() && key == KEY_UP)
+		{
+			startSearch();
+		}
+	}
+
+	return LLPanel::handleKeyHere(key, mask);
+
+}
+
+//----------------------------------------------------------------------------
+// menu callbacks
+
+void LLPanelMainInventory::doToSelected(const LLSD& userdata)
+{
+	getPanel()->getRootFolder()->doToSelected(&gInventory, userdata);
+}
+
+void LLPanelMainInventory::closeAllFolders()
+{
+	getPanel()->getRootFolder()->closeAllFolders();
+}
+
+void LLPanelMainInventory::newWindow()
+{
+	LLFloaterInventory::showAgentInventory();
+}
+
+void LLPanelMainInventory::doCreate(const LLSD& userdata)
+{
+	menu_create_inventory_item(getPanel()->getRootFolder(), NULL, userdata);
+}
+
+void LLPanelMainInventory::resetFilters()
+{
+	LLFloaterInventoryFinder *finder = getFinder();
+	getActivePanel()->getFilter()->resetDefault();
+	if (finder)
+	{
+		finder->updateElementsFromFilter();
+	}
+
+	setFilterTextFromFilter();
+}
+
+void LLPanelMainInventory::setSortBy(const LLSD& userdata)
+{
+	std::string sort_field = userdata.asString();
+	if (sort_field == "name")
+	{
+		U32 order = getActivePanel()->getSortOrder();
+		getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE );
+			
+		gSavedSettings.setBOOL("Inventory.SortByName", TRUE );
+		gSavedSettings.setBOOL("Inventory.SortByDate", FALSE );
+	}
+	else if (sort_field == "date")
+	{
+		U32 order = getActivePanel()->getSortOrder();
+		getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE );
+
+		gSavedSettings.setBOOL("Inventory.SortByName", FALSE );
+		gSavedSettings.setBOOL("Inventory.SortByDate", TRUE );
+	}
+	else if (sort_field == "foldersalwaysbyname")
+	{
+		U32 order = getActivePanel()->getSortOrder();
+		if ( order & LLInventoryFilter::SO_FOLDERS_BY_NAME )
+		{
+			order &= ~LLInventoryFilter::SO_FOLDERS_BY_NAME;
+
+			gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", FALSE );
+		}
+		else
+		{
+			order |= LLInventoryFilter::SO_FOLDERS_BY_NAME;
+
+			gSavedSettings.setBOOL("Inventory.FoldersAlwaysByName", TRUE );
+		}
+		getActivePanel()->setSortOrder( order );
+	}
+	else if (sort_field == "systemfolderstotop")
+	{
+		U32 order = getActivePanel()->getSortOrder();
+		if ( order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP )
+		{
+			order &= ~LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+
+			gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", FALSE );
+		}
+		else
+		{
+			order |= LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP;
+
+			gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE );
+		}
+		getActivePanel()->setSortOrder( order );
+	}
+}
+
+// static
+BOOL LLPanelMainInventory::filtersVisible(void* user_data)
+{
+	LLPanelMainInventory* self = (LLPanelMainInventory*)user_data;
+	if(!self) return FALSE;
+
+	return self->getFinder() != NULL;
+}
+
+void LLPanelMainInventory::onClearSearch()
+{
+	LLFloater *finder = getFinder();
+	if (mActivePanel)
+	{
+		mActivePanel->setFilterSubString(LLStringUtil::null);
+		mActivePanel->setFilterTypes(0xffffffff);
+	}
+
+	if (finder)
+	{
+		LLFloaterInventoryFinder::selectAllTypes(finder);
+	}
+
+	// re-open folders that were initially open
+	if (mActivePanel)
+	{
+		mSavedFolderState->setApply(TRUE);
+		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+		LLOpenFoldersWithSelection opener;
+		mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
+		mActivePanel->getRootFolder()->scrollToShowSelection();
+	}
+}
+
+void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
+{
+	if (search_string == "")
+	{
+		onClearSearch();
+	}
+	if (!mActivePanel)
+	{
+		return;
+	}
+
+	gInventory.startBackgroundFetch();
+
+	std::string uppercase_search_string = search_string;
+	LLStringUtil::toUpper(uppercase_search_string);
+	if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
+	{
+			// current filter and new filter empty, do nothing
+			return;
+	}
+
+	// save current folder open state if no filter currently applied
+	if (!mActivePanel->getRootFolder()->isFilterModified())
+	{
+		mSavedFolderState->setApply(FALSE);
+		mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+	}
+
+	// set new filter string
+	mActivePanel->setFilterSubString(uppercase_search_string);
+}
+
+
+ //static
+ BOOL LLPanelMainInventory::incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward)
+ {
+ 	LLPanelMainInventory* active_view = NULL;
+	
+	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+	{
+		LLPanelMainInventory* iv = dynamic_cast<LLPanelMainInventory*>(*iter);
+		if (iv)
+		{
+			if (gFocusMgr.childHasKeyboardFocus(iv))
+			{
+				active_view = iv;
+				break;
+			}
+ 		}
+ 	}
+
+ 	if (!active_view)
+ 	{
+ 		return FALSE;
+ 	}
+
+ 	std::string search_string(find_text);
+
+ 	if (search_string.empty())
+ 	{
+ 		return FALSE;
+ 	}
+
+ 	if (active_view->getPanel() &&
+ 		active_view->getPanel()->getRootFolder()->search(first_item, search_string, backward))
+ 	{
+ 		return TRUE;
+ 	}
+
+ 	return FALSE;
+ }
+
+void LLPanelMainInventory::onFilterSelected()
+{
+	// Find my index
+	mActivePanel = (LLInventoryPanel*)childGetVisibleTab("inventory filter tabs");
+
+	if (!mActivePanel)
+	{
+		return;
+	}
+	LLInventoryFilter* filter = mActivePanel->getFilter();
+	LLFloaterInventoryFinder *finder = getFinder();
+	if (finder)
+	{
+		finder->changeFilter(filter);
+	}
+	if (filter->isActive())
+	{
+		// If our filter is active we may be the first thing requiring a fetch so we better start it here.
+		gInventory.startBackgroundFetch();
+	}
+	setFilterTextFromFilter();
+}
+
+const std::string LLPanelMainInventory::getFilterSubString() 
+{ 
+	return mActivePanel->getFilterSubString(); 
+}
+
+void LLPanelMainInventory::setFilterSubString(const std::string& string) 
+{ 
+	mActivePanel->setFilterSubString(string); 
+}
+
+BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+										 EDragAndDropType cargo_type,
+										 void* cargo_data,
+										 EAcceptance* accept,
+										 std::string& tooltip_msg)
+{
+	// Check to see if we are auto scrolling from the last frame
+	LLInventoryPanel* panel = (LLInventoryPanel*)this->getActivePanel();
+	BOOL needsToScroll = panel->getScrollableContainer()->autoScroll(x, y);
+	if(mFilterTabs)
+	{
+		if(needsToScroll)
+		{
+			mFilterTabs->startDragAndDropDelayTimer();
+		}
+	}
+	
+	BOOL handled = LLPanel::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+
+	return handled;
+}
+
+void LLPanelMainInventory::changed(U32 mask)
+{
+}
+
+
+void LLPanelMainInventory::setFilterTextFromFilter() 
+{ 
+	mFilterText = mActivePanel->getFilter()->getFilterText(); 
+}
+
+void LLPanelMainInventory::toggleFindOptions()
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_VIEW_TOGGLE);
+	LLFloater *floater = getFinder();
+	if (!floater)
+	{
+		LLFloaterInventoryFinder * finder = new LLFloaterInventoryFinder(this);
+		mFinderHandle = finder->getHandle();
+		finder->openFloater();
+
+		LLFloater* parent_floater = gFloaterView->getParentFloater(this);
+		if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel
+			parent_floater->addDependentFloater(mFinderHandle);
+		// start background fetch of folders
+		gInventory.startBackgroundFetch();
+	}
+	else
+	{
+		floater->closeFloater();
+	}
+}
+
+void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
+{
+	getChild<LLInventoryPanel>("All Items")->setSelectCallback(cb);
+	getChild<LLInventoryPanel>("Recent Items")->setSelectCallback(cb);
+}
+
+///----------------------------------------------------------------------------
+/// LLFloaterInventoryFinder
+///----------------------------------------------------------------------------
+
+LLFloaterInventoryFinder* LLPanelMainInventory::getFinder() 
+{ 
+	return (LLFloaterInventoryFinder*)mFinderHandle.get();
+}
+
+
+LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* inventory_view) :	
+	LLFloater(LLSD()),
+	mPanelInventoryDecorated(inventory_view),
+	mFilter(inventory_view->getPanel()->getFilter())
+{
+	LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL);
+	updateElementsFromFilter();
+}
+
+
+void LLFloaterInventoryFinder::onCheckSinceLogoff(LLUICtrl *ctrl, void *user_data)
+{
+	LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
+	if (!self) return;
+
+	bool since_logoff= self->childGetValue("check_since_logoff");
+	
+	if (!since_logoff && 
+	    !(  self->mSpinSinceDays->get() ||  self->mSpinSinceHours->get() ) )
+	{
+		self->mSpinSinceHours->set(1.0f);
+	}	
+}
+BOOL LLFloaterInventoryFinder::postBuild()
+{
+	const LLRect& viewrect = mPanelInventoryDecorated->getRect();
+	setRect(LLRect(viewrect.mLeft - getRect().getWidth(), viewrect.mTop, viewrect.mLeft, viewrect.mTop - getRect().getHeight()));
+
+	childSetAction("All", selectAllTypes, this);
+	childSetAction("None", selectNoTypes, this);
+
+	mSpinSinceHours = getChild<LLSpinCtrl>("spin_hours_ago");
+	childSetCommitCallback("spin_hours_ago", onTimeAgo, this);
+
+	mSpinSinceDays = getChild<LLSpinCtrl>("spin_days_ago");
+	childSetCommitCallback("spin_days_ago", onTimeAgo, this);
+
+	//	mCheckSinceLogoff   = getChild<LLSpinCtrl>("check_since_logoff");
+	childSetCommitCallback("check_since_logoff", onCheckSinceLogoff, this);
+
+	childSetAction("Close", onCloseBtn, this);
+
+	updateElementsFromFilter();
+	return TRUE;
+}
+void LLFloaterInventoryFinder::onTimeAgo(LLUICtrl *ctrl, void *user_data)
+{
+	LLFloaterInventoryFinder *self = (LLFloaterInventoryFinder *)user_data;
+	if (!self) return;
+	
+	bool since_logoff=true;
+	if ( self->mSpinSinceDays->get() ||  self->mSpinSinceHours->get() )
+	{
+		since_logoff = false;
+	}
+	self->childSetValue("check_since_logoff", since_logoff);
+}
+
+void LLFloaterInventoryFinder::changeFilter(LLInventoryFilter* filter)
+{
+	mFilter = filter;
+	updateElementsFromFilter();
+}
+
+void LLFloaterInventoryFinder::updateElementsFromFilter()
+{
+	if (!mFilter)
+		return;
+
+	// Get data needed for filter display
+	U32 filter_types = mFilter->getFilterTypes();
+	std::string filter_string = mFilter->getFilterSubString();
+	LLInventoryFilter::EFolderShow show_folders = mFilter->getShowFolderState();
+	U32 hours = mFilter->getHoursAgo();
+
+	// update the ui elements
+	setTitle(mFilter->getName());
+
+	childSetValue("check_animation", (S32) (filter_types & 0x1 << LLInventoryType::IT_ANIMATION));
+
+	childSetValue("check_calling_card", (S32) (filter_types & 0x1 << LLInventoryType::IT_CALLINGCARD));
+	childSetValue("check_clothing", (S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE));
+	childSetValue("check_gesture", (S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE));
+	childSetValue("check_landmark", (S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK));
+	childSetValue("check_notecard", (S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD));
+	childSetValue("check_object", (S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT));
+	childSetValue("check_script", (S32) (filter_types & 0x1 << LLInventoryType::IT_LSL));
+	childSetValue("check_sound", (S32) (filter_types & 0x1 << LLInventoryType::IT_SOUND));
+	childSetValue("check_texture", (S32) (filter_types & 0x1 << LLInventoryType::IT_TEXTURE));
+	childSetValue("check_snapshot", (S32) (filter_types & 0x1 << LLInventoryType::IT_SNAPSHOT));
+	childSetValue("check_show_empty", show_folders == LLInventoryFilter::SHOW_ALL_FOLDERS);
+	childSetValue("check_since_logoff", mFilter->isSinceLogoff());
+	mSpinSinceHours->set((F32)(hours % 24));
+	mSpinSinceDays->set((F32)(hours / 24));
+}
+
+void LLFloaterInventoryFinder::draw()
+{
+	LLMemType mt(LLMemType::MTYPE_INVENTORY_DRAW);
+	U32 filter = 0xffffffff;
+	BOOL filtered_by_all_types = TRUE;
+
+	if (!childGetValue("check_animation"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_ANIMATION);
+		filtered_by_all_types = FALSE;
+	}
+
+
+	if (!childGetValue("check_calling_card"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_CALLINGCARD);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_clothing"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_WEARABLE);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_gesture"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_GESTURE);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_landmark"))
+
+
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_LANDMARK);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_notecard"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_NOTECARD);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_object"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_OBJECT);
+		filter &= ~(0x1 << LLInventoryType::IT_ATTACHMENT);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_script"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_LSL);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_sound"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_SOUND);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_texture"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_TEXTURE);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!childGetValue("check_snapshot"))
+	{
+		filter &= ~(0x1 << LLInventoryType::IT_SNAPSHOT);
+		filtered_by_all_types = FALSE;
+	}
+
+	if (!filtered_by_all_types)
+	{
+		// don't include folders in filter, unless I've selected everything
+		filter &= ~(0x1 << LLInventoryType::IT_CATEGORY);
+	}
+
+	// update the panel, panel will update the filter
+	mPanelInventoryDecorated->getPanel()->setShowFolderState(getCheckShowEmpty() ?
+		LLInventoryFilter::SHOW_ALL_FOLDERS : LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+	mPanelInventoryDecorated->getPanel()->setFilterTypes(filter);
+	if (getCheckSinceLogoff())
+	{
+		mSpinSinceDays->set(0);
+		mSpinSinceHours->set(0);
+	}
+	U32 days = (U32)mSpinSinceDays->get();
+	U32 hours = (U32)mSpinSinceHours->get();
+	if (hours > 24)
+	{
+		days += hours / 24;
+		hours = (U32)hours % 24;
+		mSpinSinceDays->set((F32)days);
+		mSpinSinceHours->set((F32)hours);
+	}
+	hours += days * 24;
+	mPanelInventoryDecorated->getPanel()->setHoursAgo(hours);
+	mPanelInventoryDecorated->getPanel()->setSinceLogoff(getCheckSinceLogoff());
+	mPanelInventoryDecorated->setFilterTextFromFilter();
+
+	LLPanel::draw();
+}
+
+BOOL LLFloaterInventoryFinder::getCheckShowEmpty()
+{
+	return childGetValue("check_show_empty");
+}
+
+BOOL LLFloaterInventoryFinder::getCheckSinceLogoff()
+{
+	return childGetValue("check_since_logoff");
+}
+
+void LLFloaterInventoryFinder::onCloseBtn(void* user_data)
+{
+	LLFloaterInventoryFinder* finderp = (LLFloaterInventoryFinder*)user_data;
+	finderp->closeFloater();
+}
+
+// static
+void LLFloaterInventoryFinder::selectAllTypes(void* user_data)
+{
+	LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
+	if(!self) return;
+
+	self->childSetValue("check_animation", TRUE);
+	self->childSetValue("check_calling_card", TRUE);
+	self->childSetValue("check_clothing", TRUE);
+	self->childSetValue("check_gesture", TRUE);
+	self->childSetValue("check_landmark", TRUE);
+	self->childSetValue("check_notecard", TRUE);
+	self->childSetValue("check_object", TRUE);
+	self->childSetValue("check_script", TRUE);
+	self->childSetValue("check_sound", TRUE);
+	self->childSetValue("check_texture", TRUE);
+	self->childSetValue("check_snapshot", TRUE);
+}
+
+//static
+void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
+{
+	LLFloaterInventoryFinder* self = (LLFloaterInventoryFinder*)user_data;
+	if(!self) return;
+
+	self->childSetValue("check_animation", FALSE);
+	self->childSetValue("check_calling_card", FALSE);
+	self->childSetValue("check_clothing", FALSE);
+	self->childSetValue("check_gesture", FALSE);
+	self->childSetValue("check_landmark", FALSE);
+	self->childSetValue("check_notecard", FALSE);
+	self->childSetValue("check_object", FALSE);
+	self->childSetValue("check_script", FALSE);
+	self->childSetValue("check_sound", FALSE);
+	self->childSetValue("check_texture", FALSE);
+	self->childSetValue("check_snapshot", FALSE);
+}
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
new file mode 100644
index 0000000000000000000000000000000000000000..a2b988e80cb95204b6fab54b435a3e541576843b
--- /dev/null
+++ b/indra/newview/llpanelmaininventory.h
@@ -0,0 +1,125 @@
+/** 
+ * @file llpanelmaininventory.h
+ * @brief llpanelmaininventory.h
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELMAININVENTORY_H
+#define LL_LLPANELMAININVENTORY_H
+
+#include "llpanel.h"
+#include "llinventorymodel.h"
+#include "llfolderview.h"
+
+class LLFolderViewItem;
+class LLInventoryPanel;
+class LLSaveFolderState;
+class LLFilterEditor;
+class LLTabContainer;
+class LLFloaterInventoryFinder;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLPanelMainInventory
+//
+// This is a panel used to view and control an agent's inventory,
+// including all the fixin's (e.g. AllItems/RecentItems tabs, filter floaters).
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLPanelMainInventory : public LLPanel, LLInventoryObserver
+{
+public:
+	friend class LLFloaterInventoryFinder;
+
+	LLPanelMainInventory();
+	~LLPanelMainInventory();
+
+	BOOL postBuild();
+
+	virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+	// Inherited functionality
+	/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+									   EDragAndDropType cargo_type,
+									   void* cargo_data,
+									   EAcceptance* accept,
+									   std::string& tooltip_msg);
+	/*virtual*/ void changed(U32 mask);
+
+	LLInventoryPanel* getPanel() { return mActivePanel; }
+	LLInventoryPanel* getActivePanel() { return mActivePanel; }
+
+	const std::string& getFilterText() const { return mFilterText; }
+	
+	void setSelectCallback(const LLFolderView::signal_t::slot_type& cb);
+
+protected:
+	//
+	// Misc functions
+	//
+	void setFilterTextFromFilter();
+	void startSearch();
+	
+	void toggleFindOptions();
+
+	static BOOL filtersVisible(void* user_data);
+	void onClearSearch();
+	static void onFoldersByName(void *user_data);
+	static BOOL checkFoldersByName(void *user_data);
+	void onFilterEdit(const std::string& search_string );
+	static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward);
+	void onFilterSelected();
+
+	const std::string getFilterSubString();
+	void setFilterSubString(const std::string& string);
+	
+	// menu callbacks
+	void doToSelected(const LLSD& userdata);
+	void closeAllFolders();
+	void newWindow();
+	void doCreate(const LLSD& userdata);
+	void resetFilters();
+	void setSortBy(const LLSD& userdata);
+	
+private:
+	LLFloaterInventoryFinder* getFinder();
+
+	LLFilterEditor*				mFilterEditor;
+	LLTabContainer*				mFilterTabs;
+	LLHandle<LLFloater>			mFinderHandle;
+	LLInventoryPanel*			mActivePanel;
+	LLSaveFolderState*			mSavedFolderState;
+
+	std::string					mFilterText;
+};
+
+#endif // LL_LLPANELMAININVENTORY_H
+
+
+
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index a198499b47ede597beb9122cb7e7abfe2bd49392..85efe0f93e652509fecd05147cf62c15102a8b25 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -1,453 +1,453 @@
-/**
- * @file llpanelmediasettingsgeneral.cpp
- * @brief LLPanelMediaSettingsGeneral class implementation
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- * 
- * Copyright (c) 2009, Linden Research, Inc.
- * 
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab.  Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- * 
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- * 
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- * 
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llagent.h"
-#include "llpanelmediasettingsgeneral.h"
-#include "llcombobox.h"
-#include "llcheckboxctrl.h"
-#include "llspinctrl.h"
-#include "lluictrlfactory.h"
-#include "llviewerwindow.h"
-#include "llviewermedia.h"
-#include "llsdutil.h"
-#include "llselectmgr.h"
-#include "llbutton.h"
-#include "lltexturectrl.h"
-#include "llurl.h"
-#include "llwindow.h"
-#include "llmediaentry.h"
-#include "llmediactrl.h"
-#include "llpanelcontents.h"
-#include "llpermissions.h"
-#include "llpluginclassmedia.h"
-#include "llfloatermediasettings.h"
-#include "llfloatertools.h"
-#include "lltrans.h"
-
-////////////////////////////////////////////////////////////////////////////////
-//
-LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() :
-	mControls( NULL ),
-	mAutoLoop( NULL ),
-	mFirstClick( NULL ),
-	mAutoZoom( NULL ),
-	mAutoPlay( NULL ),
-	mAutoScale( NULL ),
-	mWidthPixels( NULL ),
-	mHeightPixels( NULL ),
-	mHomeURL( NULL ),
-	mCurrentURL( NULL ),
-	mParent( NULL ),
-	mMediaEditable(false)
-{
-	// build dialog from XML
-	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_general.xml");
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-BOOL LLPanelMediaSettingsGeneral::postBuild()
-{
-	// connect member vars with UI widgets
-	mAutoLoop = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_LOOP_KEY );
-	mAutoPlay = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_PLAY_KEY );
-	mAutoScale = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_SCALE_KEY );
-	mAutoZoom = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_ZOOM_KEY );
-	mControls = getChild< LLComboBox >( LLMediaEntry::CONTROLS_KEY );
-	mCurrentURL = getChild< LLLineEditor >( LLMediaEntry::CURRENT_URL_KEY );
-	mFirstClick = getChild< LLCheckBoxCtrl >( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
-	mHeightPixels = getChild< LLSpinCtrl >( LLMediaEntry::HEIGHT_PIXELS_KEY );
-	mHomeURL = getChild< LLLineEditor >( LLMediaEntry::HOME_URL_KEY );
-	mWidthPixels = getChild< LLSpinCtrl >( LLMediaEntry::WIDTH_PIXELS_KEY );
-	mPreviewMedia = getChild<LLMediaCtrl>("preview_media");
-
-	// watch commit action for HOME URL
-	childSetCommitCallback( LLMediaEntry::HOME_URL_KEY, onCommitHomeURL, this);
-	childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this);
-	// interrogates controls and updates widgets as required
-	updateMediaPreview();
-	updateCurrentURL();
-
-	return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// virtual
-LLPanelMediaSettingsGeneral::~LLPanelMediaSettingsGeneral()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::draw()
-{
-	// housekeeping
-	LLPanel::draw();
-
-	// enable/disable pixel values image entry based on auto scale checkbox 
-	if ( mAutoScale->getValue().asBoolean() == false )
-	{
-		childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, true );
-		childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, true );
-	}
-	else
-	{
-		childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, false );
-		childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, false );
-	};
-
-	// enable/disable UI based on type of media
-	bool reset_button_is_active = true;
-	if( mPreviewMedia )
-	{
-		LLPluginClassMedia* media_plugin = mPreviewMedia->getMediaPlugin();
-		if( media_plugin )
-		{
-			// turn off volume (if we can) for preview. Note: this really only
-			// works for QuickTime movies right now - no way to control the 
-			// volume of a flash app embedded in a page for example
-			media_plugin->setVolume( 0 );
-
-			// some controls are only appropriate for time or browser type plugins
-			// so we selectively enable/disable them - need to do it in draw
-			// because the information from plugins arrives assynchronously
-			bool show_time_controls = media_plugin->pluginSupportsMediaTime();
-			if ( show_time_controls )
-			{
-				childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, false );
-				reset_button_is_active = false;
-				childSetEnabled( "current_url_label", false );
-				childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, true );
-			}
-			else
-			{
-				childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, true );
-				reset_button_is_active = true;
-				childSetEnabled( "current_url_label", true );
-				childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, false );
-			};
-		};
-	};
-
-	// current URL can change over time.
-//	updateCurrentURL();
-
-	LLPermissions perm;
-	bool user_can_press_reset = mMediaEditable;
-
-	// several places modify this widget so we must collect states in one place
-	if ( reset_button_is_active )
-	{
-		// user has perms to press reset button and it is active
-		if ( user_can_press_reset )
-		{
-			childSetEnabled( "current_url_reset_btn", true );
-		}
-		// user does not has perms to press reset button and it is active
-		else
-		{
-			childSetEnabled( "current_url_reset_btn", false );
-		};
-	}
-	else
-	// reset button is inactive so we just slam it to off - other states don't matter
-	{
-		childSetEnabled( "current_url_reset_btn", false );
-	};
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static 
-void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
-{	
-	LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
-	self->mAutoLoop->clear();
-	self->mAutoPlay->clear();
-	self->mAutoScale->clear();
-	self->mAutoZoom ->clear();
-	self->mControls->clear();
-	self->mCurrentURL->clear();
-	self->mFirstClick->clear();
-	self->mHeightPixels->clear();
-	self->mHomeURL->clear();
-	self->mWidthPixels->clear();
-	self->mAutoLoop ->setEnabled(editable);
-	self->mAutoPlay ->setEnabled(editable);
-	self->mAutoScale ->setEnabled(editable);
-	self->mAutoZoom  ->setEnabled(editable);
-	self->mControls ->setEnabled(editable);
-	self->mCurrentURL ->setEnabled(editable);
-	self->mFirstClick ->setEnabled(editable);
-	self->mHeightPixels ->setEnabled(editable);
-	self->mHomeURL ->setEnabled(editable);
-	self->mWidthPixels ->setEnabled(editable);
-	self->updateMediaPreview();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static 
-void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_settings ,bool editable)
-{
-	LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
-	self->mMediaEditable = editable;
-
-	//llinfos << "---------------" << llendl;
-	//llinfos << ll_pretty_print_sd(media_settings) << llendl;
-	//llinfos << "---------------" << llendl;
-
-	// IF all the faces have media (or all dont have media)
-	if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
-	{
-		if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) 
-		{
-			self->clearValues(self, self->mMediaEditable);
-			// only show multiple 
-			self->mHomeURL ->setText(LLTrans::getString("Multiple Media"));
-			return;
-		}
-		
-	}
-	else
-	{
-		if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) 
-		{
-			self->clearValues(self, self->mMediaEditable);
-			// only show multiple 
-			self->mHomeURL ->setText(LLTrans::getString("Multiple Media"));
-			return;
-		}			
-		
-	}
-	std::string base_key( "" );
-	std::string tentative_key( "" );
-
-	struct 
-	{
-		std::string key_name;
-		LLUICtrl* ctrl_ptr;
-		std::string ctrl_type;
-
-	} data_set [] = 
-	{ 
-        { LLMediaEntry::AUTO_LOOP_KEY,				self->mAutoLoop,		"LLCheckBoxCtrl" },
-		{ LLMediaEntry::AUTO_PLAY_KEY,				self->mAutoPlay,		"LLCheckBoxCtrl" },
-		{ LLMediaEntry::AUTO_SCALE_KEY,				self->mAutoScale,		"LLCheckBoxCtrl" },
-		{ LLMediaEntry::AUTO_ZOOM_KEY,				self->mAutoZoom,		"LLCheckBoxCtrl" },
-		{ LLMediaEntry::CONTROLS_KEY,				self->mControls,		"LLComboBox" },
-		{ LLMediaEntry::CURRENT_URL_KEY,			self->mCurrentURL,		"LLLineEditor" },
-		{ LLMediaEntry::HEIGHT_PIXELS_KEY,			self->mHeightPixels,	"LLSpinCtrl" },
-		{ LLMediaEntry::HOME_URL_KEY,				self->mHomeURL,			"LLLineEditor" },
-		{ LLMediaEntry::FIRST_CLICK_INTERACT_KEY,	self->mFirstClick,		"LLCheckBoxCtrl" },
-		{ LLMediaEntry::WIDTH_PIXELS_KEY,			self->mWidthPixels,		"LLSpinCtrl" },
-		{ "", NULL , "" }
-	};
-
-	for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
-	{
-		base_key = std::string( data_set[ i ].key_name );
-		tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
-		// TODO: CP - I bet there is a better way to do this using Boost
-		if ( media_settings[ base_key ].isDefined() )
-		{
-			if ( data_set[ i ].ctrl_type == "LLLineEditor" )
-			{
-				static_cast< LLLineEditor* >( data_set[ i ].ctrl_ptr )->
-					setText( media_settings[ base_key ].asString() );
-			}
-			else
-			if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
-				static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
-					setValue( media_settings[ base_key ].asBoolean() );
-			else
-			if ( data_set[ i ].ctrl_type == "LLComboBox" )
-				static_cast< LLComboBox* >( data_set[ i ].ctrl_ptr )->
-					setCurrentByIndex( media_settings[ base_key ].asInteger() );
-			else
-			if ( data_set[ i ].ctrl_type == "LLSpinCtrl" )
-				static_cast< LLSpinCtrl* >( data_set[ i ].ctrl_ptr )->
-					setValue( media_settings[ base_key ].asInteger() );
-
-			data_set[ i ].ctrl_ptr->setEnabled(self->mMediaEditable);
-			data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
-		};
-	};
-	
-	// interrogates controls and updates widgets as required
-	self->updateMediaPreview();
-	self->updateCurrentURL();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Helper to set media control to media URL as required
-void LLPanelMediaSettingsGeneral::updateMediaPreview()
-{
-	if ( mHomeURL->getValue().asString().length() > 0 )
-	{
-		mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
-	}
-	else
-	// new home URL will be empty if media is deleted so display a 
-	// "preview goes here" data url page
-	{
-		mPreviewMedia->navigateTo( "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E" );
-	};
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Helper to set current URL
-void LLPanelMediaSettingsGeneral::updateCurrentURL()
-{
-	if( mCurrentURL->getText().empty() )
-	{
-		childSetText( "current_url", mHomeURL->getText() );
-	}
-	
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
-// virtual
-void LLPanelMediaSettingsGeneral::onClose(bool app_quitting)
-{
-	if(mPreviewMedia)
-	{
-		mPreviewMedia->unloadMediaSource();
-	}
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdata )
-{
-	LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
-
-	// check url user is trying to enter for home URL will pass whitelist 
-	// and decline to accept it if it doesn't.
-	std::string home_url = self->mHomeURL->getValue().asString();
-	if ( ! self->mParent->passesWhiteList( home_url ) )
-	{
-		LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");		
-		return;
-	};
-	
-	self->updateMediaPreview();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::onBtnResetCurrentUrl(LLUICtrl* ctrl, void *userdata)
-{
-	LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
-	self->navigateHomeSelectedFace();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLPanelMediaSettingsGeneral::apply( void* userdata )
-{
-	LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
-	self->mHomeURL->onCommit();
-	// build LLSD Fragment
-	LLSD media_data_general;
-	self->getValues(media_data_general);
-
-	// this merges contents of LLSD passed in with what's there so this is ok
-	LLSelectMgr::getInstance()->selectionSetMediaData( media_data_general );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )
-{
-    fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue();
-    fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue();
-    fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue();
-    fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue();
-    fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex();
-    fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
-    fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue();
-    fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue();
-    fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue();
-    fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLPanelMediaSettingsGeneral::setParent( LLFloaterMediaSettings* parent )
-{
-	mParent = parent;
-};
-
-bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace()
-{
-	// HACK: This is directly referencing an impl name.  BAD!
-	// This can be removed when we have a truly generic media browser that only 
-	// builds an impl based on the type of url it is passed.
-	struct functor_navigate_media : public LLSelectedTEGetFunctor< bool>
-	{
-		bool get( LLViewerObject* object, S32 face )
-		{
-			if ( object )
-				if ( object->getTE(face) )
-					if ( object->getTE(face)->getMediaData() )
-					{
-						if(object->permModify())
-						{
-							viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(object->getTE(face)->getMediaData()->getMediaID());
-							if(media_impl)
-							{
-								media_impl->navigateHome();
-								return true;
-							}
-						}	
-					}
-		   return false;
-		 };
-				
-	} functor_navigate_media;
-	
-	bool all_face_media_navigated = false;
-	LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
-	selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated );
-	
-	return all_face_media_navigated;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-const std::string LLPanelMediaSettingsGeneral::getHomeUrl()
-{
-	return mHomeURL->getValue().asString(); 
-}
-
+/**
+ * @file llpanelmediasettingsgeneral.cpp
+ * @brief LLPanelMediaSettingsGeneral class implementation
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llagent.h"
+#include "llpanelmediasettingsgeneral.h"
+#include "llcombobox.h"
+#include "llcheckboxctrl.h"
+#include "llspinctrl.h"
+#include "lluictrlfactory.h"
+#include "llviewerwindow.h"
+#include "llviewermedia.h"
+#include "llsdutil.h"
+#include "llselectmgr.h"
+#include "llbutton.h"
+#include "lltexturectrl.h"
+#include "llurl.h"
+#include "llwindow.h"
+#include "llmediaentry.h"
+#include "llmediactrl.h"
+#include "llpanelcontents.h"
+#include "llpermissions.h"
+#include "llpluginclassmedia.h"
+#include "llfloatermediasettings.h"
+#include "llfloatertools.h"
+#include "lltrans.h"
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() :
+	mControls( NULL ),
+	mAutoLoop( NULL ),
+	mFirstClick( NULL ),
+	mAutoZoom( NULL ),
+	mAutoPlay( NULL ),
+	mAutoScale( NULL ),
+	mWidthPixels( NULL ),
+	mHeightPixels( NULL ),
+	mHomeURL( NULL ),
+	mCurrentURL( NULL ),
+	mParent( NULL ),
+	mMediaEditable(false)
+{
+	// build dialog from XML
+	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_general.xml");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLPanelMediaSettingsGeneral::postBuild()
+{
+	// connect member vars with UI widgets
+	mAutoLoop = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_LOOP_KEY );
+	mAutoPlay = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_PLAY_KEY );
+	mAutoScale = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_SCALE_KEY );
+	mAutoZoom = getChild< LLCheckBoxCtrl >( LLMediaEntry::AUTO_ZOOM_KEY );
+	mControls = getChild< LLComboBox >( LLMediaEntry::CONTROLS_KEY );
+	mCurrentURL = getChild< LLLineEditor >( LLMediaEntry::CURRENT_URL_KEY );
+	mFirstClick = getChild< LLCheckBoxCtrl >( LLMediaEntry::FIRST_CLICK_INTERACT_KEY );
+	mHeightPixels = getChild< LLSpinCtrl >( LLMediaEntry::HEIGHT_PIXELS_KEY );
+	mHomeURL = getChild< LLLineEditor >( LLMediaEntry::HOME_URL_KEY );
+	mWidthPixels = getChild< LLSpinCtrl >( LLMediaEntry::WIDTH_PIXELS_KEY );
+	mPreviewMedia = getChild<LLMediaCtrl>("preview_media");
+
+	// watch commit action for HOME URL
+	childSetCommitCallback( LLMediaEntry::HOME_URL_KEY, onCommitHomeURL, this);
+	childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this);
+	// interrogates controls and updates widgets as required
+	updateMediaPreview();
+	updateCurrentURL();
+
+	return true;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
+LLPanelMediaSettingsGeneral::~LLPanelMediaSettingsGeneral()
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsGeneral::draw()
+{
+	// housekeeping
+	LLPanel::draw();
+
+	// enable/disable pixel values image entry based on auto scale checkbox 
+	if ( mAutoScale->getValue().asBoolean() == false )
+	{
+		childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, true );
+		childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, true );
+	}
+	else
+	{
+		childSetEnabled( LLMediaEntry::WIDTH_PIXELS_KEY, false );
+		childSetEnabled( LLMediaEntry::HEIGHT_PIXELS_KEY, false );
+	};
+
+	// enable/disable UI based on type of media
+	bool reset_button_is_active = true;
+	if( mPreviewMedia )
+	{
+		LLPluginClassMedia* media_plugin = mPreviewMedia->getMediaPlugin();
+		if( media_plugin )
+		{
+			// turn off volume (if we can) for preview. Note: this really only
+			// works for QuickTime movies right now - no way to control the 
+			// volume of a flash app embedded in a page for example
+			media_plugin->setVolume( 0 );
+
+			// some controls are only appropriate for time or browser type plugins
+			// so we selectively enable/disable them - need to do it in draw
+			// because the information from plugins arrives assynchronously
+			bool show_time_controls = media_plugin->pluginSupportsMediaTime();
+			if ( show_time_controls )
+			{
+				childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, false );
+				reset_button_is_active = false;
+				childSetEnabled( "current_url_label", false );
+				childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, true );
+			}
+			else
+			{
+				childSetEnabled( LLMediaEntry::CURRENT_URL_KEY, true );
+				reset_button_is_active = true;
+				childSetEnabled( "current_url_label", true );
+				childSetEnabled( LLMediaEntry::AUTO_LOOP_KEY, false );
+			};
+		};
+	};
+
+	// current URL can change over time.
+//	updateCurrentURL();
+
+	LLPermissions perm;
+	bool user_can_press_reset = mMediaEditable;
+
+	// several places modify this widget so we must collect states in one place
+	if ( reset_button_is_active )
+	{
+		// user has perms to press reset button and it is active
+		if ( user_can_press_reset )
+		{
+			childSetEnabled( "current_url_reset_btn", true );
+		}
+		// user does not has perms to press reset button and it is active
+		else
+		{
+			childSetEnabled( "current_url_reset_btn", false );
+		};
+	}
+	else
+	// reset button is inactive so we just slam it to off - other states don't matter
+	{
+		childSetEnabled( "current_url_reset_btn", false );
+	};
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static 
+void LLPanelMediaSettingsGeneral::clearValues( void* userdata, bool editable)
+{	
+	LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
+	self->mAutoLoop->clear();
+	self->mAutoPlay->clear();
+	self->mAutoScale->clear();
+	self->mAutoZoom ->clear();
+	self->mControls->clear();
+	self->mCurrentURL->clear();
+	self->mFirstClick->clear();
+	self->mHeightPixels->clear();
+	self->mHomeURL->clear();
+	self->mWidthPixels->clear();
+	self->mAutoLoop ->setEnabled(editable);
+	self->mAutoPlay ->setEnabled(editable);
+	self->mAutoScale ->setEnabled(editable);
+	self->mAutoZoom  ->setEnabled(editable);
+	self->mControls ->setEnabled(editable);
+	self->mCurrentURL ->setEnabled(editable);
+	self->mFirstClick ->setEnabled(editable);
+	self->mHeightPixels ->setEnabled(editable);
+	self->mHomeURL ->setEnabled(editable);
+	self->mWidthPixels ->setEnabled(editable);
+	self->updateMediaPreview();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static 
+void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_settings ,bool editable)
+{
+	LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
+	self->mMediaEditable = editable;
+
+	//llinfos << "---------------" << llendl;
+	//llinfos << ll_pretty_print_sd(media_settings) << llendl;
+	//llinfos << "---------------" << llendl;
+
+	// IF all the faces have media (or all dont have media)
+	if ( LLFloaterMediaSettings::getInstance()->mIdenticalHasMediaInfo )
+	{
+		if(LLFloaterMediaSettings::getInstance()->mMultipleMedia) 
+		{
+			self->clearValues(self, self->mMediaEditable);
+			// only show multiple 
+			self->mHomeURL ->setText(LLTrans::getString("Multiple Media"));
+			return;
+		}
+		
+	}
+	else
+	{
+		if(LLFloaterMediaSettings::getInstance()->mMultipleValidMedia) 
+		{
+			self->clearValues(self, self->mMediaEditable);
+			// only show multiple 
+			self->mHomeURL ->setText(LLTrans::getString("Multiple Media"));
+			return;
+		}			
+		
+	}
+	std::string base_key( "" );
+	std::string tentative_key( "" );
+
+	struct 
+	{
+		std::string key_name;
+		LLUICtrl* ctrl_ptr;
+		std::string ctrl_type;
+
+	} data_set [] = 
+	{ 
+        { LLMediaEntry::AUTO_LOOP_KEY,				self->mAutoLoop,		"LLCheckBoxCtrl" },
+		{ LLMediaEntry::AUTO_PLAY_KEY,				self->mAutoPlay,		"LLCheckBoxCtrl" },
+		{ LLMediaEntry::AUTO_SCALE_KEY,				self->mAutoScale,		"LLCheckBoxCtrl" },
+		{ LLMediaEntry::AUTO_ZOOM_KEY,				self->mAutoZoom,		"LLCheckBoxCtrl" },
+		{ LLMediaEntry::CONTROLS_KEY,				self->mControls,		"LLComboBox" },
+		{ LLMediaEntry::CURRENT_URL_KEY,			self->mCurrentURL,		"LLLineEditor" },
+		{ LLMediaEntry::HEIGHT_PIXELS_KEY,			self->mHeightPixels,	"LLSpinCtrl" },
+		{ LLMediaEntry::HOME_URL_KEY,				self->mHomeURL,			"LLLineEditor" },
+		{ LLMediaEntry::FIRST_CLICK_INTERACT_KEY,	self->mFirstClick,		"LLCheckBoxCtrl" },
+		{ LLMediaEntry::WIDTH_PIXELS_KEY,			self->mWidthPixels,		"LLSpinCtrl" },
+		{ "", NULL , "" }
+	};
+
+	for( int i = 0; data_set[ i ].key_name.length() > 0; ++i )
+	{
+		base_key = std::string( data_set[ i ].key_name );
+		tentative_key = base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX );
+		// TODO: CP - I bet there is a better way to do this using Boost
+		if ( media_settings[ base_key ].isDefined() )
+		{
+			if ( data_set[ i ].ctrl_type == "LLLineEditor" )
+			{
+				static_cast< LLLineEditor* >( data_set[ i ].ctrl_ptr )->
+					setText( media_settings[ base_key ].asString() );
+			}
+			else
+			if ( data_set[ i ].ctrl_type == "LLCheckBoxCtrl" )
+				static_cast< LLCheckBoxCtrl* >( data_set[ i ].ctrl_ptr )->
+					setValue( media_settings[ base_key ].asBoolean() );
+			else
+			if ( data_set[ i ].ctrl_type == "LLComboBox" )
+				static_cast< LLComboBox* >( data_set[ i ].ctrl_ptr )->
+					setCurrentByIndex( media_settings[ base_key ].asInteger() );
+			else
+			if ( data_set[ i ].ctrl_type == "LLSpinCtrl" )
+				static_cast< LLSpinCtrl* >( data_set[ i ].ctrl_ptr )->
+					setValue( media_settings[ base_key ].asInteger() );
+
+			data_set[ i ].ctrl_ptr->setEnabled(self->mMediaEditable);
+			data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
+		};
+	};
+	
+	// interrogates controls and updates widgets as required
+	self->updateMediaPreview();
+	self->updateCurrentURL();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Helper to set media control to media URL as required
+void LLPanelMediaSettingsGeneral::updateMediaPreview()
+{
+	if ( mHomeURL->getValue().asString().length() > 0 )
+	{
+		mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
+	}
+	else
+	// new home URL will be empty if media is deleted so display a 
+	// "preview goes here" data url page
+	{
+		mPreviewMedia->navigateTo( "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E" );
+	};
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Helper to set current URL
+void LLPanelMediaSettingsGeneral::updateCurrentURL()
+{
+	if( mCurrentURL->getText().empty() )
+	{
+		childSetText( "current_url", mHomeURL->getText() );
+	}
+	
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+// virtual
+void LLPanelMediaSettingsGeneral::onClose(bool app_quitting)
+{
+	if(mPreviewMedia)
+	{
+		mPreviewMedia->unloadMediaSource();
+	}
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdata )
+{
+	LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
+
+	// check url user is trying to enter for home URL will pass whitelist 
+	// and decline to accept it if it doesn't.
+	std::string home_url = self->mHomeURL->getValue().asString();
+	if ( ! self->mParent->passesWhiteList( home_url ) )
+	{
+		LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");		
+		return;
+	};
+	
+	self->updateMediaPreview();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsGeneral::onBtnResetCurrentUrl(LLUICtrl* ctrl, void *userdata)
+{
+	LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
+	self->navigateHomeSelectedFace();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLPanelMediaSettingsGeneral::apply( void* userdata )
+{
+	LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
+	self->mHomeURL->onCommit();
+	// build LLSD Fragment
+	LLSD media_data_general;
+	self->getValues(media_data_general);
+
+	// this merges contents of LLSD passed in with what's there so this is ok
+	LLSelectMgr::getInstance()->selectionSetMediaData( media_data_general );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )
+{
+    fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue();
+    fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue();
+    fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue();
+    fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue();
+    fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex();
+    fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
+    fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue();
+    fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue();
+    fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue();
+    fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsGeneral::setParent( LLFloaterMediaSettings* parent )
+{
+	mParent = parent;
+};
+
+bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace()
+{
+	// HACK: This is directly referencing an impl name.  BAD!
+	// This can be removed when we have a truly generic media browser that only 
+	// builds an impl based on the type of url it is passed.
+	struct functor_navigate_media : public LLSelectedTEGetFunctor< bool>
+	{
+		bool get( LLViewerObject* object, S32 face )
+		{
+			if ( object )
+				if ( object->getTE(face) )
+					if ( object->getTE(face)->getMediaData() )
+					{
+						if(object->permModify())
+						{
+							viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(object->getTE(face)->getMediaData()->getMediaID());
+							if(media_impl)
+							{
+								media_impl->navigateHome();
+								return true;
+							}
+						}	
+					}
+		   return false;
+		 };
+				
+	} functor_navigate_media;
+	
+	bool all_face_media_navigated = false;
+	LLObjectSelectionHandle selected_objects =LLSelectMgr::getInstance()->getSelection();
+	selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated );
+	
+	return all_face_media_navigated;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+const std::string LLPanelMediaSettingsGeneral::getHomeUrl()
+{
+	return mHomeURL->getValue().asString(); 
+}
+
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index f5607aa2874e03a6e21e62f84dfedfd907262792..3577f63340f267dc33a8eac84f5ee0115f5bd435 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -50,10 +50,11 @@
 LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
 	mParent( NULL )
 {
-	// build dialog from XML
-	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
 	mCommitCallbackRegistrar.add("Media.whitelistAdd",		boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this));
 	mCommitCallbackRegistrar.add("Media.whitelistDelete",	boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this));	
+	// build dialog from XML
+	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
+
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -62,10 +63,7 @@ BOOL LLPanelMediaSettingsSecurity::postBuild()
 {
 	mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY );
 	mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY );
-
-	childSetAction("whitelist_add", onBtnAdd, this);
-	childSetAction("whitelist_del", onBtnDel, this);
-
+	
 	setDefaultBtn("whitelist_add");
 
 	return true;
diff --git a/indra/newview/llpanelmediasettingssecurity.h b/indra/newview/llpanelmediasettingssecurity.h
index b78ee921937e9829eb4ded4a7a62c1bda0be8ba4..2555bb8dc8546904ee646367d12a42c38d5fc389 100644
--- a/indra/newview/llpanelmediasettingssecurity.h
+++ b/indra/newview/llpanelmediasettingssecurity.h
@@ -55,7 +55,7 @@ class LLPanelMediaSettingsSecurity : public LLPanel
 		void addWhiteListItem(const std::string& url);
 		void setParent( LLFloaterMediaSettings* parent );
 		const std::string makeValidUrl( const std::string& src_url );
-		bool passesWhiteList( const std::string& added_url, const std::string& test_url );
+		bool passesWhiteList( const std::string& added_url, const std::string& test_url );
 
 	protected:
 		LLFloaterMediaSettings* mParent;
diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h
index 1ab4ff581ee1bcf80457c2730fc4fd5721d77f4b..58d9fe9b76e6a82b719e7aeab63a1e3a84b6ffb4 100644
--- a/indra/newview/llpanelobject.h
+++ b/indra/newview/llpanelobject.h
@@ -45,7 +45,6 @@ class LLUICtrl;
 class LLButton;
 class LLViewerObject;
 class LLComboBox;
-class LLPanelInventory;
 class LLColorSwatchCtrl;
 class LLTextureCtrl;
 class LLInventoryItem;
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..79b33e29f52ae0bb2a55a1e6f904b0ec25557b14
--- /dev/null
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -0,0 +1,1927 @@
+/**
+ * @file llsidepanelinventory.cpp
+ * @brief LLPanelObjectInventory class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+//*****************************************************************************
+//
+// Implementation of the panel inventory - used to view and control a
+// task's inventory.
+//
+//*****************************************************************************
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelobjectinventory.h"
+
+#include "roles_constants.h"
+
+#include "llagent.h"
+#include "llcallbacklist.h"
+#include "llfloaterbuycurrency.h"
+#include "llfloaterreg.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llpreviewanim.h"
+#include "llpreviewgesture.h"
+#include "llpreviewnotecard.h"
+#include "llpreviewscript.h"
+#include "llpreviewsound.h"
+#include "llpreviewtexture.h"
+#include "llscrollcontainer.h"
+#include "llselectmgr.h"
+#include "llsidetray.h"
+#include "llstatusbar.h"
+#include "lltrans.h"
+#include "llviewerassettype.h"
+#include "llviewerregion.h"
+#include "llviewerobjectlist.h"
+#include "llviewermessage.h"
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskInvFVBridge
+///----------------------------------------------------------------------------
+
+class LLTaskInvFVBridge : public LLFolderViewEventListener
+{
+protected:
+	LLUUID mUUID;
+	std::string mName;
+	mutable std::string mDisplayName;
+	LLPanelObjectInventory* mPanel;
+	U32 mFlags;
+
+	LLInventoryItem* findItem() const;
+
+public:
+	LLTaskInvFVBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name,
+		U32 flags=0);
+	virtual ~LLTaskInvFVBridge( void ) {}
+
+	virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; }
+	virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
+
+	static LLTaskInvFVBridge* createObjectBridge(LLPanelObjectInventory* panel,
+												 LLInventoryObject* object);
+	void showProperties();
+	void buyItem();
+	S32 getPrice();
+	static bool commitBuyItem(const LLSD& notification, const LLSD& response);
+
+	// LLFolderViewEventListener functionality
+	virtual const std::string& getName() const;
+	virtual const std::string& getDisplayName() const;
+	virtual PermissionMask getPermissionMask() const { return PERM_NONE; }
+	/*virtual*/ LLFolderType::EType getPreferredType() const { return LLFolderType::FT_NONE; }
+	virtual const LLUUID& getUUID() const { return mUUID; }
+	virtual time_t getCreationDate() const;
+	virtual LLUIImagePtr getIcon() const;
+	virtual void openItem();
+	virtual void closeItem() {}
+	virtual void previewItem();
+	virtual void selectItem() {}
+	virtual BOOL isItemRenameable() const;
+	virtual BOOL renameItem(const std::string& new_name);
+	virtual BOOL isItemMovable() const;
+	virtual BOOL isItemRemovable();
+	virtual BOOL removeItem();
+	virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch);
+	virtual void move(LLFolderViewEventListener* parent_listener);
+	virtual BOOL isItemCopyable() const;
+	virtual BOOL copyToClipboard() const;
+	virtual void cutToClipboard();
+	virtual BOOL isClipboardPasteable() const;
+	virtual void pasteFromClipboard();
+	virtual void pasteLinkFromClipboard();
+	virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+	virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+	virtual BOOL isUpToDate() const { return TRUE; }
+	virtual BOOL hasChildren() const { return FALSE; }
+	virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; }
+	// LLDragAndDropBridge functionality
+	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
+	virtual BOOL dragOrDrop(MASK mask, BOOL drop,
+							EDragAndDropType cargo_type,
+							void* cargo_data);
+};
+
+LLTaskInvFVBridge::LLTaskInvFVBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name,
+	U32 flags):
+	mUUID(uuid),
+	mName(name),
+	mPanel(panel),
+	mFlags(flags)
+{
+
+}
+
+LLInventoryItem* LLTaskInvFVBridge::findItem() const
+{
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if(object)
+	{
+		return (LLInventoryItem*)(object->getInventoryObject(mUUID));
+	}
+	return NULL;
+}
+
+void LLTaskInvFVBridge::showProperties()
+{
+	LLSD key;
+	key["object"] = mPanel->getTaskUUID();
+	key["id"] = mUUID;
+	LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+	
+	/*
+	LLFloaterProperties* floater = LLFloaterReg::showTypedInstance<LLFloaterProperties>("properties", mUUID);
+	if (floater)
+	{
+		floater->setObjectID(mPanel->getTaskUUID());
+	}
+	*/
+}
+
+struct LLBuyInvItemData
+{
+	LLUUID mTaskID;
+	LLUUID mItemID;
+	LLAssetType::EType mType;
+
+	LLBuyInvItemData(const LLUUID& task,
+					 const LLUUID& item,
+					 LLAssetType::EType type) :
+		mTaskID(task), mItemID(item), mType(type)
+	{}
+};
+
+void LLTaskInvFVBridge::buyItem()
+{
+	llinfos << "LLTaskInvFVBridge::buyItem()" << llendl;
+	LLInventoryItem* item = findItem();
+	if(!item || !item->getSaleInfo().isForSale()) return;
+	LLBuyInvItemData* inv = new LLBuyInvItemData(mPanel->getTaskUUID(),
+												 mUUID,
+												 item->getType());
+
+	const LLSaleInfo& sale_info = item->getSaleInfo();
+	const LLPermissions& perm = item->getPermissions();
+	const std::string owner_name; // no owner name currently... FIXME?
+
+	LLViewerObject* obj;
+	if( ( obj = gObjectList.findObject( mPanel->getTaskUUID() ) ) && obj->isAttachment() )
+	{
+		LLNotifications::instance().add("Cannot_Purchase_an_Attachment");
+		llinfos << "Attempt to purchase an attachment" << llendl;
+		delete inv;
+	}
+	else
+	{
+        LLSD args;
+        args["PRICE"] = llformat("%d",sale_info.getSalePrice());
+        args["OWNER"] = owner_name;
+        if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS)
+        {
+        	U32 next_owner_mask = perm.getMaskNextOwner();
+        	args["MODIFYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo");
+        	args["COPYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo");
+        	args["RESELLPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo");
+        }
+
+		std::string alertdesc;
+       	switch(sale_info.getSaleType())
+       	{
+       	  case LLSaleInfo::FS_ORIGINAL:
+       		alertdesc = owner_name.empty() ? "BuyOriginalNoOwner" : "BuyOriginal";
+       		break;
+       	  case LLSaleInfo::FS_CONTENTS:
+       		alertdesc = owner_name.empty() ? "BuyContentsNoOwner" : "BuyContents";
+       		break;
+		  case LLSaleInfo::FS_COPY:
+       	  default:
+       		alertdesc = owner_name.empty() ? "BuyCopyNoOwner" : "BuyCopy";
+       		break;
+       	}
+
+		LLSD payload;
+		payload["task_id"] = inv->mTaskID;
+		payload["item_id"] = inv->mItemID;
+		payload["type"] = inv->mType;
+		LLNotifications::instance().add(alertdesc, args, payload, LLTaskInvFVBridge::commitBuyItem);
+	}
+}
+
+S32 LLTaskInvFVBridge::getPrice()
+{
+	LLInventoryItem* item = findItem();
+	if(item)
+	{
+		return item->getSaleInfo().getSalePrice();
+	}
+	else
+	{
+		return -1;
+	}
+}
+
+// static
+bool LLTaskInvFVBridge::commitBuyItem(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	if(0 == option)
+	{
+		LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID());
+		if(!object || !object->getRegion()) return false;
+
+
+		LLMessageSystem* msg = gMessageSystem;
+		msg->newMessageFast(_PREHASH_BuyObjectInventory);
+		msg->nextBlockFast(_PREHASH_AgentData);
+		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+		msg->nextBlockFast(_PREHASH_Data);
+		msg->addUUIDFast(_PREHASH_ObjectID, notification["payload"]["task_id"].asUUID());
+		msg->addUUIDFast(_PREHASH_ItemID, notification["payload"]["item_id"].asUUID());
+		msg->addUUIDFast(_PREHASH_FolderID,
+			gInventory.findCategoryUUIDForType((LLFolderType::EType)notification["payload"]["type"].asInteger()));
+		msg->sendReliable(object->getRegion()->getHost());
+	}
+	return false;
+}
+
+const std::string& LLTaskInvFVBridge::getName() const
+{
+	return mName;
+}
+
+const std::string& LLTaskInvFVBridge::getDisplayName() const
+{
+	LLInventoryItem* item = findItem();
+
+	if(item)
+	{
+		if(item->getParentUUID().isNull())
+		{
+			if(item->getName() == "Contents")
+			{
+				mDisplayName.assign(LLTrans::getString("ViewerObjectContents"));
+			}
+			else
+			{
+				mDisplayName.assign(item->getName());
+			}
+		}
+		else
+		{
+			mDisplayName.assign(item->getName());
+		}
+		const LLPermissions& perm(item->getPermissions());
+		BOOL copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);
+		BOOL mod  = gAgent.allowOperation(PERM_MODIFY, perm, GP_OBJECT_MANIPULATE);
+		BOOL xfer = gAgent.allowOperation(PERM_TRANSFER, perm, GP_OBJECT_MANIPULATE);
+
+		if(!copy)
+		{
+			mDisplayName.append(LLTrans::getString("no_copy"));
+		}
+		if(!mod)
+		{
+			mDisplayName.append(LLTrans::getString("no_modify"));
+		}
+		if(!xfer)
+		{
+			mDisplayName.append(LLTrans::getString("no_transfer"));
+		}
+	}
+
+	return mDisplayName;
+}
+
+// BUG: No creation dates for task inventory
+time_t LLTaskInvFVBridge::getCreationDate() const
+{
+	return 0;
+}
+
+LLUIImagePtr LLTaskInvFVBridge::getIcon() const
+{
+	BOOL item_is_multi = FALSE;
+	if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS )
+	{
+		item_is_multi = TRUE;
+	}
+
+	return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi );
+}
+
+void LLTaskInvFVBridge::openItem()
+{
+	// no-op.
+	lldebugs << "LLTaskInvFVBridge::openItem()" << llendl;
+}
+
+void LLTaskInvFVBridge::previewItem()
+{
+	openItem();
+}
+
+BOOL LLTaskInvFVBridge::isItemRenameable() const
+{
+	if(gAgent.isGodlike()) return TRUE;
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if(object)
+	{
+		LLInventoryItem* item;
+		item = (LLInventoryItem*)(object->getInventoryObject(mUUID));
+		if(item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(),
+										 GP_OBJECT_MANIPULATE, GOD_LIKE))
+		{
+			return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+BOOL LLTaskInvFVBridge::renameItem(const std::string& new_name)
+{
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if(object)
+	{
+		LLViewerInventoryItem* item = NULL;
+		item = (LLViewerInventoryItem*)object->getInventoryObject(mUUID);
+		if(item && (gAgent.allowOperation(PERM_MODIFY, item->getPermissions(),
+										GP_OBJECT_MANIPULATE, GOD_LIKE)))
+		{
+			LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+			new_item->rename(new_name);
+			object->updateInventory(
+				new_item,
+				TASK_INVENTORY_ITEM_KEY,
+				false);
+		}
+	}
+	return TRUE;
+}
+
+BOOL LLTaskInvFVBridge::isItemMovable() const
+{
+	//LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	//if(object && (object->permModify() || gAgent.isGodlike()))
+	//{
+	//	return TRUE;
+	//}
+	//return FALSE;
+	return TRUE;
+}
+
+BOOL LLTaskInvFVBridge::isItemRemovable()
+{
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if(object
+	   && (object->permModify() || object->permYouOwner()))
+	{
+		return TRUE;
+	}
+	return FALSE;
+}
+
+bool remove_task_inventory_callback(const LLSD& notification, const LLSD& response, LLPanelObjectInventory* panel)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID());
+	if(option == 0 && object)
+	{
+		// yes
+		LLSD::array_const_iterator list_end = notification["payload"]["inventory_ids"].endArray();
+		for (LLSD::array_const_iterator list_it = notification["payload"]["inventory_ids"].beginArray();
+			list_it != list_end; 
+			++list_it)
+		{
+			object->removeInventory(list_it->asUUID());
+		}
+
+		// refresh the UI.
+		panel->refresh();
+	}
+	return false;
+}
+
+// helper for remove
+// ! REFACTOR ! two_uuids_list_t is also defined in llinevntorybridge.h, but differently.
+typedef std::pair<LLUUID, std::list<LLUUID> > panel_two_uuids_list_t;
+typedef std::pair<LLPanelObjectInventory*, panel_two_uuids_list_t> remove_data_t;
+BOOL LLTaskInvFVBridge::removeItem()
+{
+	if(isItemRemovable() && mPanel)
+	{
+		LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+		if(object)
+		{
+			if(object->permModify())
+			{
+				// just do it.
+				object->removeInventory(mUUID);
+				return TRUE;
+			}
+			else
+			{
+				remove_data_t* data = new remove_data_t;
+				data->first = mPanel;
+				data->second.first = mPanel->getTaskUUID();
+				data->second.second.push_back(mUUID);
+				LLSD payload;
+				payload["task_id"] = mPanel->getTaskUUID();
+				payload["inventory_ids"].append(mUUID);
+				LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
+				return FALSE;
+			}
+		}
+	}
+	return FALSE;
+}
+
+void LLTaskInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch)
+{
+	if (!mPanel)
+	{
+		return;
+	}
+
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if (!object)
+	{
+		return;
+	}
+
+	if (!object->permModify())
+	{
+		LLSD payload;
+		payload["task_id"] = mPanel->getTaskUUID();
+		for (S32 i = 0; i < (S32)batch.size(); i++)
+		{
+			LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i];
+			payload["inventory_ids"].append(itemp->getUUID());
+		}
+		LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
+		
+	}
+	else
+	{
+		for (S32 i = 0; i < (S32)batch.size(); i++)
+		{
+			LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i];
+
+			if(itemp->isItemRemovable())
+			{
+				// just do it.
+				object->removeInventory(itemp->getUUID());
+			}
+		}
+	}
+}
+
+void LLTaskInvFVBridge::move(LLFolderViewEventListener* parent_listener)
+{
+}
+
+BOOL LLTaskInvFVBridge::isItemCopyable() const
+{
+	LLInventoryItem* item = findItem();
+	if(!item) return FALSE;
+	return gAgent.allowOperation(PERM_COPY, item->getPermissions(),
+								GP_OBJECT_MANIPULATE);
+}
+
+BOOL LLTaskInvFVBridge::copyToClipboard() const
+{
+	return FALSE;
+}
+
+void LLTaskInvFVBridge::cutToClipboard()
+{
+}
+
+BOOL LLTaskInvFVBridge::isClipboardPasteable() const
+{
+	return FALSE;
+}
+
+void LLTaskInvFVBridge::pasteFromClipboard()
+{
+}
+
+void LLTaskInvFVBridge::pasteLinkFromClipboard()
+{
+}
+
+BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
+{
+	//llinfos << "LLTaskInvFVBridge::startDrag()" << llendl;
+	if(mPanel)
+	{
+		LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+		if(object)
+		{
+			LLInventoryItem* inv = NULL;
+			if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID)))
+			{
+				const LLPermissions& perm = inv->getPermissions();
+				bool can_copy = gAgent.allowOperation(PERM_COPY, perm,
+														GP_OBJECT_MANIPULATE);
+				if (object->isAttachment() && !can_copy)
+				{
+                    //RN: no copy contents of attachments cannot be dragged out
+                    // due to a race condition and possible exploit where
+                    // attached objects do not update their inventory items
+                    // when their contents are manipulated
+                    return FALSE;
+				}
+				if((can_copy && perm.allowTransferTo(gAgent.getID()))
+				   || object->permYouOwner())
+//				   || gAgent.isGodlike())
+
+				{
+					*type = LLViewerAssetType::lookupDragAndDropType(inv->getType());
+
+					*id = inv->getUUID();
+					return TRUE;
+				}
+			}
+		}
+	}
+	return FALSE;
+}
+
+BOOL LLTaskInvFVBridge::dragOrDrop(MASK mask, BOOL drop,
+								   EDragAndDropType cargo_type,
+								   void* cargo_data)
+{
+	//llinfos << "LLTaskInvFVBridge::dragOrDrop()" << llendl;
+	return FALSE;
+}
+
+// virtual
+void LLTaskInvFVBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if (action == "task_buy")
+	{
+		// Check the price of the item.
+		S32 price = getPrice();
+		if (-1 == price)
+		{
+			llwarns << "label_buy_task_bridged_item: Invalid price" << llendl;
+		}
+		else
+		{
+			if (price > 0 && price > gStatusBar->getBalance())
+			{
+				LLFloaterBuyCurrency::buyCurrency("This costs", price);
+			}
+			else
+			{
+				buyItem();
+			}
+		}
+	}
+	else if (action == "task_open")
+	{
+		openItem();
+	}
+	else if (action == "task_properties")
+	{
+		showProperties();
+	}
+}
+
+void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	LLInventoryItem* item = findItem();
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+	
+	if (!item)
+	{
+		hide_context_entries(menu, items, disabled_items);
+		return;
+	}
+
+	if(gAgent.allowOperation(PERM_OWNER, item->getPermissions(),
+							 GP_OBJECT_MANIPULATE)
+	   && item->getSaleInfo().isForSale())
+	{
+		items.push_back(std::string("Task Buy"));
+
+		std::string label= LLTrans::getString("Buy");
+		// Check the price of the item.
+		S32 price = getPrice();
+		if (-1 == price)
+		{
+			llwarns << "label_buy_task_bridged_item: Invalid price" << llendl;
+		}
+		else
+		{
+			std::ostringstream info;
+			info << LLTrans::getString("BuyforL$") << price;
+			label.assign(info.str());
+		}
+
+		const LLView::child_list_t *list = menu.getChildList();
+		LLView::child_list_t::const_iterator itor;
+		for (itor = list->begin(); itor != list->end(); ++itor)
+		{
+			std::string name = (*itor)->getName();
+			LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor);
+			if (name == "Task Buy" && menu_itemp)
+			{
+				menu_itemp->setLabel(label);
+			}
+		}
+	}
+	else
+	{
+		items.push_back(std::string("Task Open"));
+		if (!isItemCopyable())
+		{
+			disabled_items.push_back(std::string("Task Open"));
+		}
+	}
+	items.push_back(std::string("Task Properties"));
+	if(isItemRenameable())
+	{
+		items.push_back(std::string("Task Rename"));
+	}
+	if(isItemRemovable())
+	{
+		items.push_back(std::string("Task Remove"));
+	}
+
+	hide_context_entries(menu, items, disabled_items);
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskFolderBridge
+///----------------------------------------------------------------------------
+
+class LLTaskCategoryBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskCategoryBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual LLUIImagePtr getIcon() const;
+	virtual const std::string& getDisplayName() const { return getName(); }
+	virtual BOOL isItemRenameable() const;
+	virtual BOOL renameItem(const std::string& new_name);
+	virtual BOOL isItemRemovable();
+	virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+	virtual BOOL hasChildren() const;
+	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
+	virtual BOOL dragOrDrop(MASK mask, BOOL drop,
+							EDragAndDropType cargo_type,
+							void* cargo_data);
+};
+
+LLTaskCategoryBridge::LLTaskCategoryBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskCategoryBridge::getIcon() const
+{
+	return LLUI::getUIImage("Inv_FolderClosed");
+}
+
+BOOL LLTaskCategoryBridge::isItemRenameable() const
+{
+	return FALSE;
+}
+
+BOOL LLTaskCategoryBridge::renameItem(const std::string& new_name)
+{
+	return FALSE;
+}
+
+BOOL LLTaskCategoryBridge::isItemRemovable()
+{
+	return FALSE;
+}
+
+void LLTaskCategoryBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+	items.push_back(std::string("Task Open"));
+	hide_context_entries(menu, items, disabled_items);
+}
+
+BOOL LLTaskCategoryBridge::hasChildren() const
+{
+	// return TRUE if we have or do know know if we have children.
+	// *FIX: For now, return FALSE - we will know for sure soon enough.
+	return FALSE;
+}
+
+BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
+{
+	//llinfos << "LLTaskInvFVBridge::startDrag()" << llendl;
+	if(mPanel)
+	{
+		LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+		if(object)
+		{
+			LLInventoryItem* inv = NULL;
+			if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID)))
+			{
+				const LLPermissions& perm = inv->getPermissions();
+				bool can_copy = gAgent.allowOperation(PERM_COPY, perm,
+														GP_OBJECT_MANIPULATE);
+				if((can_copy && perm.allowTransferTo(gAgent.getID()))
+				   || object->permYouOwner())
+//				   || gAgent.isGodlike())
+
+				{
+					*type = LLViewerAssetType::lookupDragAndDropType(inv->getType());
+
+					*id = inv->getUUID();
+					return TRUE;
+				}
+			}
+		}
+	}
+	return FALSE;
+}
+
+BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,
+									  EDragAndDropType cargo_type,
+									  void* cargo_data)
+{
+	//llinfos << "LLTaskCategoryBridge::dragOrDrop()" << llendl;
+	BOOL accept = FALSE;
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if(object)
+	{
+		switch(cargo_type)
+		{
+		case DAD_CATEGORY:
+			accept = LLToolDragAndDrop::getInstance()->dadUpdateInventoryCategory(object,drop);
+			break;
+		case DAD_TEXTURE:
+		case DAD_SOUND:
+		case DAD_LANDMARK:
+		case DAD_OBJECT:
+		case DAD_NOTECARD:
+		case DAD_CLOTHING:
+		case DAD_BODYPART:
+		case DAD_ANIMATION:
+		case DAD_GESTURE:
+		case DAD_CALLINGCARD:
+			accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data);
+			if(accept && drop)
+			{
+				LLToolDragAndDrop::dropInventory(object,
+												 (LLViewerInventoryItem*)cargo_data,
+												 LLToolDragAndDrop::getInstance()->getSource(),
+												 LLToolDragAndDrop::getInstance()->getSourceID());
+			}
+			break;
+		case DAD_SCRIPT:
+			// *HACK: In order to resolve SL-22177, we need to block
+			// drags from notecards and objects onto other
+			// objects. uncomment the simpler version when we have
+			// that right.
+			//accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data);
+			if(LLToolDragAndDrop::isInventoryDropAcceptable(
+				   object, (LLViewerInventoryItem*)cargo_data)
+			   && (LLToolDragAndDrop::SOURCE_WORLD != LLToolDragAndDrop::getInstance()->getSource())
+			   && (LLToolDragAndDrop::SOURCE_NOTECARD != LLToolDragAndDrop::getInstance()->getSource()))
+			{
+				accept = TRUE;
+			}
+			if(accept && drop)
+			{
+				LLViewerInventoryItem* item = (LLViewerInventoryItem*)cargo_data;
+				// rez in the script active by default, rez in
+				// inactive if the control key is being held down.
+				BOOL active = ((mask & MASK_CONTROL) == 0);
+				LLToolDragAndDrop::dropScript(object, item, active,
+											  LLToolDragAndDrop::getInstance()->getSource(),
+											  LLToolDragAndDrop::getInstance()->getSourceID());
+			}
+			break;
+		default:
+			break;
+		}
+	}
+	return accept;
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskTextureBridge
+///----------------------------------------------------------------------------
+
+class LLTaskTextureBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskTextureBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name,
+		LLInventoryType::EType it);
+
+	virtual LLUIImagePtr getIcon() const;
+	virtual void openItem();
+protected:
+	LLInventoryType::EType mInventoryType;
+};
+
+LLTaskTextureBridge::LLTaskTextureBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name,
+	LLInventoryType::EType it) :
+	LLTaskInvFVBridge(panel, uuid, name),
+	mInventoryType(it)
+{
+}
+
+LLUIImagePtr LLTaskTextureBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_TEXTURE, mInventoryType, 0, FALSE);
+}
+
+void LLTaskTextureBridge::openItem()
+{
+	llinfos << "LLTaskTextureBridge::openItem()" << llendl;
+	LLPreviewTexture* preview = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
+	if(preview)
+	{
+		preview->setObjectID(mPanel->getTaskUUID());
+	}
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskSoundBridge
+///----------------------------------------------------------------------------
+
+class LLTaskSoundBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskSoundBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual LLUIImagePtr getIcon() const;
+	virtual void openItem();
+	virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+	virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
+	static void openSoundPreview(void* data);
+};
+
+LLTaskSoundBridge::LLTaskSoundBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskSoundBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE);
+}
+
+void LLTaskSoundBridge::openItem()
+{
+	openSoundPreview((void*)this);
+}
+
+void LLTaskSoundBridge::openSoundPreview(void* data)
+{
+	LLTaskSoundBridge* self = (LLTaskSoundBridge*)data;
+	if(!self)
+		return;
+
+	LLPreviewSound* preview = LLFloaterReg::showTypedInstance<LLPreviewSound>("preview_sound", LLSD(self->mUUID), TAKE_FOCUS_YES);
+	if (preview)
+	{
+		preview->setObjectID(self->mPanel->getTaskUUID());
+	}
+}
+
+// virtual
+void LLTaskSoundBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+{
+	if (action == "task_play")
+	{
+		LLInventoryItem* item = findItem();
+		if(item)
+		{
+			send_sound_trigger(item->getAssetUUID(), 1.0);
+		}
+	}
+	LLTaskInvFVBridge::performAction(folder, model, action);
+}
+
+void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+	LLInventoryItem* item = findItem();
+	if(!item) return;
+	std::vector<std::string> items;
+	std::vector<std::string> disabled_items;
+
+	if(item->getPermissions().getOwner() != gAgent.getID()
+	   && item->getSaleInfo().isForSale())
+	{
+		items.push_back(std::string("Task Buy"));
+
+		std::string label= LLTrans::getString("Buy");
+		// Check the price of the item.
+		S32 price = getPrice();
+		if (-1 == price)
+		{
+			llwarns << "label_buy_task_bridged_item: Invalid price" << llendl;
+		}
+		else
+		{
+			std::ostringstream info;
+			info <<  LLTrans::getString("BuyforL$") << price;
+			label.assign(info.str());
+		}
+
+		const LLView::child_list_t *list = menu.getChildList();
+		LLView::child_list_t::const_iterator itor;
+		for (itor = list->begin(); itor != list->end(); ++itor)
+		{
+			std::string name = (*itor)->getName();
+			LLMenuItemCallGL* menu_itemp = dynamic_cast<LLMenuItemCallGL*>(*itor);
+			if (name == "Task Buy" && menu_itemp)
+			{
+				menu_itemp->setLabel(label);
+			}
+		}
+	}
+	else
+	{
+		items.push_back(std::string("Task Open")); 
+		if (!isItemCopyable())
+		{
+			disabled_items.push_back(std::string("Task Open"));
+		}
+	}
+	items.push_back(std::string("Task Properties"));
+	if(isItemRenameable())
+	{
+		items.push_back(std::string("Task Rename"));
+	}
+	if(isItemRemovable())
+	{
+		items.push_back(std::string("Task Remove"));
+	}
+
+	items.push_back(std::string("Task Play"));
+
+
+	hide_context_entries(menu, items, disabled_items);
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskLandmarkBridge
+///----------------------------------------------------------------------------
+
+class LLTaskLandmarkBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskLandmarkBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual LLUIImagePtr getIcon() const;
+};
+
+LLTaskLandmarkBridge::LLTaskLandmarkBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskLandmarkBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE);
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskCallingCardBridge
+///----------------------------------------------------------------------------
+
+class LLTaskCallingCardBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskCallingCardBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual LLUIImagePtr getIcon() const;
+	virtual BOOL isItemRenameable() const;
+	virtual BOOL renameItem(const std::string& new_name);
+};
+
+LLTaskCallingCardBridge::LLTaskCallingCardBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskCallingCardBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE);
+}
+
+BOOL LLTaskCallingCardBridge::isItemRenameable() const
+{
+	return FALSE;
+}
+
+BOOL LLTaskCallingCardBridge::renameItem(const std::string& new_name)
+{
+	return FALSE;
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLTaskScriptBridge
+///----------------------------------------------------------------------------
+
+class LLTaskScriptBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskScriptBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual LLUIImagePtr getIcon() const;
+	//static BOOL enableIfCopyable( void* userdata );
+};
+
+LLTaskScriptBridge::LLTaskScriptBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskScriptBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
+}
+
+
+class LLTaskLSLBridge : public LLTaskScriptBridge
+{
+public:
+	LLTaskLSLBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual void openItem();
+	virtual BOOL removeItem();
+	//virtual void buildContextMenu(LLMenuGL& menu);
+
+	//static void copyToInventory(void* userdata);
+};
+
+LLTaskLSLBridge::LLTaskLSLBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskScriptBridge(panel, uuid, name)
+{
+}
+
+void LLTaskLSLBridge::openItem()
+{
+	llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl;
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if(!object || object->isInventoryPending())
+	{
+		return;
+	}
+	LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES);
+	if (preview && (object->permModify() || gAgent.isGodlike()))
+	{
+		preview->setObjectID(mPanel->getTaskUUID());
+	}
+}
+
+BOOL LLTaskLSLBridge::removeItem()
+{
+	LLFloaterReg::hideInstance("preview_scriptedit", LLSD(mUUID));
+	return LLTaskInvFVBridge::removeItem();
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskObjectBridge
+///----------------------------------------------------------------------------
+
+class LLTaskObjectBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskObjectBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual LLUIImagePtr getIcon() const;
+};
+
+LLTaskObjectBridge::LLTaskObjectBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskObjectBridge::getIcon() const
+{
+	BOOL item_is_multi = FALSE;
+	if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS )
+	{
+		item_is_multi = TRUE;
+	}
+
+	return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi);
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskNotecardBridge
+///----------------------------------------------------------------------------
+
+class LLTaskNotecardBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskNotecardBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual LLUIImagePtr getIcon() const;
+	virtual void openItem();
+	virtual BOOL removeItem();
+};
+
+LLTaskNotecardBridge::LLTaskNotecardBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskNotecardBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
+}
+
+void LLTaskNotecardBridge::openItem()
+{
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if(!object || object->isInventoryPending())
+	{
+		return;
+	}
+	if(object->permModify() || gAgent.isGodlike())
+	{
+		LLPreviewNotecard* preview = LLFloaterReg::showTypedInstance<LLPreviewNotecard>("preview_notecard", LLSD(mUUID), TAKE_FOCUS_YES);
+		if (preview)
+		{
+			preview->setObjectID(mPanel->getTaskUUID());
+		}
+	}
+}
+
+BOOL LLTaskNotecardBridge::removeItem()
+{
+	LLFloaterReg::hideInstance("preview_notecard", LLSD(mUUID));
+	return LLTaskInvFVBridge::removeItem();
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskGestureBridge
+///----------------------------------------------------------------------------
+
+class LLTaskGestureBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskGestureBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual LLUIImagePtr getIcon() const;
+	virtual void openItem();
+	virtual BOOL removeItem();
+};
+
+LLTaskGestureBridge::LLTaskGestureBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskGestureBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE);
+}
+
+void LLTaskGestureBridge::openItem()
+{
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if(!object || object->isInventoryPending())
+	{
+		return;
+	}
+	LLPreviewGesture::show(mUUID, mPanel->getTaskUUID());
+}
+
+BOOL LLTaskGestureBridge::removeItem()
+{
+	// Don't need to deactivate gesture because gestures inside objects can never be active.
+	LLFloaterReg::hideInstance("preview_gesture", LLSD(mUUID));
+	return LLTaskInvFVBridge::removeItem();
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskAnimationBridge
+///----------------------------------------------------------------------------
+
+class LLTaskAnimationBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskAnimationBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name);
+
+	virtual LLUIImagePtr getIcon() const;
+	virtual void openItem();
+	virtual BOOL removeItem();
+};
+
+LLTaskAnimationBridge::LLTaskAnimationBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name) :
+	LLTaskInvFVBridge(panel, uuid, name)
+{
+}
+
+LLUIImagePtr LLTaskAnimationBridge::getIcon() const
+{
+	return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE);
+}
+
+void LLTaskAnimationBridge::openItem()
+{
+	LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
+	if(!object || object->isInventoryPending())
+	{
+		return;
+	}
+
+	LLPreviewAnim* preview = LLFloaterReg::showTypedInstance<LLPreviewAnim>("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
+	if (preview && (object->permModify() || gAgent.isGodlike()))
+	{
+		preview->setObjectID(mPanel->getTaskUUID());
+	}
+}
+
+BOOL LLTaskAnimationBridge::removeItem()
+{
+	LLFloaterReg::hideInstance("preview_anim", LLSD(mUUID));
+	return LLTaskInvFVBridge::removeItem();
+}
+
+///----------------------------------------------------------------------------
+/// Class LLTaskWearableBridge
+///----------------------------------------------------------------------------
+
+class LLTaskWearableBridge : public LLTaskInvFVBridge
+{
+public:
+	LLTaskWearableBridge(
+		LLPanelObjectInventory* panel,
+		const LLUUID& uuid,
+		const std::string& name,
+		LLAssetType::EType asset_type,
+		U32 flags);
+
+	virtual LLUIImagePtr getIcon() const;
+
+protected:
+	LLAssetType::EType		mAssetType;
+};
+
+LLTaskWearableBridge::LLTaskWearableBridge(
+	LLPanelObjectInventory* panel,
+	const LLUUID& uuid,
+	const std::string& name,
+	LLAssetType::EType asset_type,
+	U32 flags) :
+	LLTaskInvFVBridge(panel, uuid, name, flags),
+	mAssetType( asset_type )
+{
+}
+
+LLUIImagePtr LLTaskWearableBridge::getIcon() const
+{
+	return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE );
+}
+
+
+///----------------------------------------------------------------------------
+/// LLTaskInvFVBridge impl
+//----------------------------------------------------------------------------
+
+LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory* panel,
+														 LLInventoryObject* object)
+{
+	LLTaskInvFVBridge* new_bridge = NULL;
+	LLAssetType::EType type = object->getType();
+	LLInventoryItem* item = NULL;
+	switch(type)
+	{
+	case LLAssetType::AT_TEXTURE:
+		item = (LLInventoryItem*)object;
+		new_bridge = new LLTaskTextureBridge(panel,
+											 object->getUUID(),
+											 object->getName(),
+											 item->getInventoryType());
+		break;
+	case LLAssetType::AT_SOUND:
+		new_bridge = new LLTaskSoundBridge(panel,
+										   object->getUUID(),
+										   object->getName());
+		break;
+	case LLAssetType::AT_LANDMARK:
+		new_bridge = new LLTaskLandmarkBridge(panel,
+											  object->getUUID(),
+											  object->getName());
+		break;
+	case LLAssetType::AT_CALLINGCARD:
+		new_bridge = new LLTaskCallingCardBridge(panel,
+												 object->getUUID(),
+												 object->getName());
+		break;
+	case LLAssetType::AT_SCRIPT:
+		// OLD SCRIPTS DEPRECATED - JC
+		llwarns << "Old script" << llendl;
+		//new_bridge = new LLTaskOldScriptBridge(panel,
+		//									   object->getUUID(),
+		//									   object->getName());
+		break;
+	case LLAssetType::AT_OBJECT:
+		new_bridge = new LLTaskObjectBridge(panel,
+											object->getUUID(),
+											object->getName());
+		break;
+	case LLAssetType::AT_NOTECARD:
+		new_bridge = new LLTaskNotecardBridge(panel,
+											  object->getUUID(),
+											  object->getName());
+		break;
+	case LLAssetType::AT_ANIMATION:
+		new_bridge = new LLTaskAnimationBridge(panel,
+											  object->getUUID(),
+											  object->getName());
+		break;
+	case LLAssetType::AT_GESTURE:
+		new_bridge = new LLTaskGestureBridge(panel,
+											  object->getUUID(),
+											  object->getName());
+		break;
+	case LLAssetType::AT_CLOTHING:
+	case LLAssetType::AT_BODYPART:
+		item = (LLInventoryItem*)object;
+		new_bridge = new LLTaskWearableBridge(panel,
+											  object->getUUID(),
+											  object->getName(),
+											  type,
+											  item->getFlags());
+		break;
+	case LLAssetType::AT_CATEGORY:
+		new_bridge = new LLTaskCategoryBridge(panel,
+											  object->getUUID(),
+											  object->getName());
+		break;
+	case LLAssetType::AT_LSL_TEXT:
+		new_bridge = new LLTaskLSLBridge(panel,
+										 object->getUUID(),
+										 object->getName());
+		break;
+	
+		break;
+	default:
+		llinfos << "Unhandled inventory type (llassetstorage.h): "
+				<< (S32)type << llendl;
+		break;
+	}
+	return new_bridge;
+}
+
+
+///----------------------------------------------------------------------------
+/// Class LLPanelObjectInventory
+///----------------------------------------------------------------------------
+
+static LLDefaultChildRegistry::Register<LLPanelObjectInventory> r("panel_inventory_object");
+
+void do_nothing()
+{
+}
+
+// Default constructor
+LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Params& p) :
+	LLPanel(p),
+	mScroller(NULL),
+	mFolders(NULL),
+	mHaveInventory(FALSE),
+	mIsInventoryEmpty(TRUE),
+	mInventoryNeedsUpdate(FALSE)
+{
+	// Setup context menu callbacks
+	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2));
+	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));
+	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));
+	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing));
+	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing));
+	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing));
+}
+
+// Destroys the object
+LLPanelObjectInventory::~LLPanelObjectInventory()
+{
+	if (!gIdleCallbacks.deleteFunction(idle, this))
+	{
+		llwarns << "LLPanelObjectInventory::~LLPanelObjectInventory() failed to delete callback" << llendl;
+	}
+}
+
+BOOL LLPanelObjectInventory::postBuild()
+{
+	// clear contents and initialize menus, sets up mFolders
+	reset();
+
+	// Register an idle update callback
+	gIdleCallbacks.addFunction(idle, this);
+
+	return TRUE;
+}
+
+void LLPanelObjectInventory::doToSelected(const LLSD& userdata)
+{
+	mFolders->doToSelected(&gInventory, userdata);
+}
+
+void LLPanelObjectInventory::clearContents()
+{
+	mHaveInventory = FALSE;
+	mIsInventoryEmpty = TRUE;
+	if (LLToolDragAndDrop::getInstance() && LLToolDragAndDrop::getInstance()->getSource() == LLToolDragAndDrop::SOURCE_WORLD)
+	{
+		LLToolDragAndDrop::getInstance()->endDrag();
+	}
+
+	if( mScroller )
+	{
+		// removes mFolders
+		removeChild( mScroller ); //*TODO: Really shouldn't do this during draw()/refresh()
+		mScroller->die();
+		mScroller = NULL;
+		mFolders = NULL;
+	}
+}
+
+
+void LLPanelObjectInventory::reset()
+{
+	clearContents();
+
+	setBorderVisible(FALSE);
+	
+	mCommitCallbackRegistrar.pushScope(); // push local callbacks
+	
+	LLRect dummy_rect(0, 1, 1, 0);
+	LLFolderView::Params p;
+	p.name = "task inventory";
+	p.task_id = getTaskUUID();
+	p.parent_panel = this;
+	mFolders = LLUICtrlFactory::create<LLFolderView>(p);
+	// this ensures that we never say "searching..." or "no items found"
+	mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
+	mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+
+	LLRect scroller_rect(0, getRect().getHeight(), getRect().getWidth(), 0);
+	LLScrollContainer::Params scroll_p;
+	scroll_p.name("task inventory scroller");
+	scroll_p.rect(scroller_rect);
+	scroll_p.follows.flags(FOLLOWS_ALL);
+	mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroll_p);
+	addChild(mScroller);
+	mScroller->addChild(mFolders);
+	
+	mFolders->setScrollContainer( mScroller );
+	
+	mCommitCallbackRegistrar.popScope();
+}
+
+void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object,
+										InventoryObjectList* inventory,
+										S32 serial_num,
+										void* data)
+{
+	if(!object) return;
+
+	//llinfos << "invetnory arrived: \n"
+	//		<< " panel UUID: " << panel->mTaskUUID << "\n"
+	//		<< " task  UUID: " << object->mID << llendl;
+	if(mTaskUUID == object->mID)
+	{
+		mInventoryNeedsUpdate = TRUE;
+	}
+
+	// refresh any properties floaters that are hanging around.
+	if(inventory)
+	{
+		for (InventoryObjectList::const_iterator iter = inventory->begin();
+			 iter != inventory->end(); )
+		{
+			LLInventoryObject* item = *iter++;
+			LLFloaterProperties* floater = LLFloaterReg::findTypedInstance<LLFloaterProperties>("properites", item->getUUID());
+			if(floater)
+			{
+				floater->refresh();
+			}
+		}
+	}
+}
+
+void LLPanelObjectInventory::updateInventory()
+{
+	//llinfos << "inventory arrived: \n"
+	//		<< " panel UUID: " << panel->mTaskUUID << "\n"
+	//		<< " task  UUID: " << object->mID << llendl;
+	// We're still interested in this task's inventory.
+	std::set<LLUUID> selected_items;
+	BOOL inventory_has_focus = FALSE;
+	if (mHaveInventory && mFolders->getNumSelectedDescendants())
+	{
+		mFolders->getSelectionList(selected_items);
+		inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders);
+	}
+
+	reset();
+
+	LLViewerObject* objectp = gObjectList.findObject(mTaskUUID);
+	if (objectp)
+	{
+		LLInventoryObject* inventory_root = objectp->getInventoryRoot();
+		InventoryObjectList contents;
+		objectp->getInventoryContents(contents);
+		if (inventory_root)
+		{
+			createFolderViews(inventory_root, contents);
+			mHaveInventory = TRUE;
+			mIsInventoryEmpty = FALSE;
+			mFolders->setEnabled(TRUE);
+		}
+		else
+		{
+			// TODO: create an empty inventory
+			mIsInventoryEmpty = TRUE;
+			mHaveInventory = TRUE;
+		}
+	}
+	else
+	{
+		// TODO: create an empty inventory
+		mIsInventoryEmpty = TRUE;
+		mHaveInventory = TRUE;
+	}
+
+	// restore previous selection
+	std::set<LLUUID>::iterator selection_it;
+	BOOL first_item = TRUE;
+	for (selection_it = selected_items.begin(); selection_it != selected_items.end(); ++selection_it)
+	{
+		LLFolderViewItem* selected_item = mFolders->getItemByID(*selection_it);
+		if (selected_item)
+		{
+			//HACK: "set" first item then "change" each other one to get keyboard focus right
+			if (first_item)
+			{
+				mFolders->setSelection(selected_item, TRUE, inventory_has_focus);
+				first_item = FALSE;
+			}
+			else
+			{
+				mFolders->changeSelection(selected_item, TRUE);
+			}
+		}
+	}
+
+	mFolders->requestArrange();
+	mInventoryNeedsUpdate = FALSE;
+}
+
+// *FIX: This is currently a very expensive operation, because we have
+// to iterate through the inventory one time for each category. This
+// leads to an N^2 based on the category count. This could be greatly
+// speeded with an efficient multimap implementation, but we don't
+// have that in our current arsenal.
+void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents)
+{
+	if (!inventory_root)
+	{
+		return;
+	}
+	// Create a visible root category.
+	LLTaskInvFVBridge* bridge = NULL;
+	bridge = LLTaskInvFVBridge::createObjectBridge(this, inventory_root);
+	if(bridge)
+	{
+		LLFolderViewFolder* new_folder = NULL;
+		LLFolderViewFolder::Params p;
+		p.name = inventory_root->getName();
+		p.icon = LLUI::getUIImage("Inv_FolderClosed");
+		p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
+		p.root = mFolders;
+		p.listener = bridge;
+		new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+		new_folder->addToFolder(mFolders, mFolders);
+		new_folder->toggleOpen();
+
+		createViewsForCategory(&contents, inventory_root, new_folder);
+	}
+}
+
+typedef std::pair<LLInventoryObject*, LLFolderViewFolder*> obj_folder_pair;
+
+void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* inventory, 
+											  LLInventoryObject* parent,
+											  LLFolderViewFolder* folder)
+{
+	// Find all in the first pass
+	LLDynamicArray<obj_folder_pair*> child_categories;
+	LLTaskInvFVBridge* bridge;
+	LLFolderViewItem* view;
+
+	InventoryObjectList::iterator it = inventory->begin();
+	InventoryObjectList::iterator end = inventory->end();
+	for( ; it != end; ++it)
+	{
+		LLInventoryObject* obj = *it;
+
+		if(parent->getUUID() == obj->getParentUUID())
+		{
+			bridge = LLTaskInvFVBridge::createObjectBridge(this, obj);
+			if(!bridge)
+			{
+				continue;
+			}
+			if(LLAssetType::AT_CATEGORY == obj->getType())
+			{
+				LLFolderViewFolder::Params p;
+				p.name = obj->getName();
+				p.icon = LLUI::getUIImage("Inv_FolderClosed");
+				p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
+				p.root = mFolders;
+				p.listener = bridge;
+				view = LLUICtrlFactory::create<LLFolderViewFolder>(p);
+				child_categories.put(new obj_folder_pair(obj,
+														 (LLFolderViewFolder*)view));
+			}
+			else
+			{
+				LLFolderViewItem::Params params;
+				params.name(obj->getName());
+				params.icon(bridge->getIcon());
+				params.creation_date(bridge->getCreationDate());
+				params.root(mFolders);
+				params.listener(bridge);
+				params.rect(LLRect());
+				view = LLUICtrlFactory::create<LLFolderViewItem> (params);
+			}
+			view->addToFolder(folder, mFolders);
+		}
+	}
+
+	// now, for each category, do the second pass
+	for(S32 i = 0; i < child_categories.count(); i++)
+	{
+		createViewsForCategory(inventory, child_categories[i]->first,
+							   child_categories[i]->second );
+		delete child_categories[i];
+	}
+}
+
+void LLPanelObjectInventory::refresh()
+{
+	//llinfos << "LLPanelObjectInventory::refresh()" << llendl;
+	BOOL has_inventory = FALSE;
+	const BOOL non_root_ok = TRUE;
+	LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode(NULL, non_root_ok);
+	if(node)
+	{
+		LLViewerObject* object = node->getObject();
+		if(object && ((LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() == 1)
+					  || (LLSelectMgr::getInstance()->getSelection()->getObjectCount() == 1)))
+		{
+			// determine if we need to make a request. Start with a
+			// default based on if we have inventory at all.
+			BOOL make_request = !mHaveInventory;
+
+			// If the task id is different than what we've stored,
+			// then make the request.
+			if(mTaskUUID != object->mID)
+			{
+				mTaskUUID = object->mID;
+				make_request = TRUE;
+
+				// This is a new object so pre-emptively clear the contents
+				// Otherwise we show the old stuff until the update comes in
+				clearContents();
+
+				// Register for updates from this object,
+				registerVOInventoryListener(object,NULL);
+			}
+
+			// Based on the node information, we may need to dirty the
+			// object inventory and get it again.
+			if(node->mValid)
+			{
+				if(node->mInventorySerial != object->getInventorySerial() || object->isInventoryDirty())
+				{
+					make_request = TRUE;
+				}
+			}
+
+			// do the request if necessary.
+			if(make_request)
+			{
+				requestVOInventory();
+			}
+			has_inventory = TRUE;
+		}
+	}
+	if(!has_inventory)
+	{
+		mTaskUUID = LLUUID::null;
+		removeVOInventoryListener();
+		clearContents();
+	}
+	//llinfos << "LLPanelObjectInventory::refresh() " << mTaskUUID << llendl;
+}
+
+void LLPanelObjectInventory::removeSelectedItem()
+{
+	if(mFolders)
+	{
+		mFolders->removeSelectedItems();
+	}
+}
+
+void LLPanelObjectInventory::startRenamingSelectedItem()
+{
+	if(mFolders)
+	{
+		mFolders->startRenamingSelectedItem();
+	}
+}
+
+void LLPanelObjectInventory::draw()
+{
+	LLPanel::draw();
+
+	if(mIsInventoryEmpty)
+	{
+		if((LLUUID::null != mTaskUUID) && (!mHaveInventory))
+		{
+			LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("LoadingContents"), 0,
+													 (S32)(getRect().getWidth() * 0.5f),
+													 10,
+													 LLColor4( 1, 1, 1, 1 ),
+													 LLFontGL::HCENTER,
+													 LLFontGL::BOTTOM);
+		}
+		else if(mHaveInventory)
+		{
+			LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("NoContents"), 0,
+													 (S32)(getRect().getWidth() * 0.5f),
+													 10,
+													 LLColor4( 1, 1, 1, 1 ),
+													 LLFontGL::HCENTER,
+													 LLFontGL::BOTTOM);
+		}
+	}
+}
+
+void LLPanelObjectInventory::deleteAllChildren()
+{
+	mScroller = NULL;
+	mFolders = NULL;
+	LLView::deleteAllChildren();
+}
+
+BOOL LLPanelObjectInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg)
+{
+	if (mFolders && mHaveInventory)
+	{
+		LLFolderViewItem* folderp = mFolders->getNextFromChild(NULL);
+		if (!folderp)
+		{
+			return FALSE;
+		}
+		// Try to pass on unmodified mouse coordinates
+		S32 local_x = x - mFolders->getRect().mLeft;
+		S32 local_y = y - mFolders->getRect().mBottom;
+
+		if (mFolders->pointInView(local_x, local_y))
+		{
+			return mFolders->handleDragAndDrop(local_x, local_y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+		}
+		else
+		{
+			//force mouse coordinates to be inside folder rectangle
+			return mFolders->handleDragAndDrop(5, 1, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+		}
+	}
+	else
+	{
+		return FALSE;
+	}
+}
+
+//static
+void LLPanelObjectInventory::idle(void* user_data)
+{
+	LLPanelObjectInventory* self = (LLPanelObjectInventory*)user_data;
+
+
+	if (self->mInventoryNeedsUpdate)
+	{
+		self->updateInventory();
+	}
+}
diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h
new file mode 100644
index 0000000000000000000000000000000000000000..6722bb212e5afc8c26e7f81f9d1726d97aef82f5
--- /dev/null
+++ b/indra/newview/llpanelobjectinventory.h
@@ -0,0 +1,102 @@
+/** 
+ * @file llpanelobjectinventory.h
+ * @brief LLPanelObjectInventory class definition
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELOBJECTINVENTORY_H
+#define LL_LLPANELOBJECTINVENTORY_H
+
+#include "llvoinventorylistener.h"
+#include "llpanel.h"
+
+#include "llinventory.h"
+
+class LLScrollContainer;
+class LLFolderView;
+class LLFolderViewFolder;
+class LLViewerObject;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLPanelObjectInventory
+//
+// This class represents the panel used to view and control a
+// particular task's inventory.
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLPanelObjectInventory : public LLPanel, public LLVOInventoryListener
+{
+public:
+	// dummy param block for template registration purposes
+	struct Params : public LLPanel::Params {};
+
+	LLPanelObjectInventory(const Params&);
+	virtual ~LLPanelObjectInventory();
+	
+	virtual BOOL postBuild();
+
+	void doToSelected(const LLSD& userdata);
+	
+	void refresh();
+	const LLUUID& getTaskUUID() { return mTaskUUID;}
+	void removeSelectedItem();
+	void startRenamingSelectedItem();
+
+	LLFolderView* getRootFolder() const { return mFolders; }
+
+	virtual void draw();
+	virtual void deleteAllChildren();
+	virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, EAcceptance *accept, std::string& tooltip_msg);
+	
+	static void idle(void* user_data);
+
+protected:
+	void reset();
+	/*virtual*/ void inventoryChanged(LLViewerObject* object,
+								 InventoryObjectList* inventory,
+								 S32 serial_num,
+								 void* user_data);
+	void updateInventory();
+	void createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents);
+	void createViewsForCategory(InventoryObjectList* inventory,
+								LLInventoryObject* parent,
+								LLFolderViewFolder* folder);
+	void clearContents();
+
+private:
+	LLScrollContainer* mScroller;
+	LLFolderView* mFolders;
+	
+	LLUUID mTaskUUID;
+	BOOL mHaveInventory;
+	BOOL mIsInventoryEmpty;
+	BOOL mInventoryNeedsUpdate;
+};
+
+#endif // LL_LLPANELOBJECTINVENTORY_H
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 4580eeb336af3591db99b8d0f7da2020ded7e0dd..2f8fae0f5deedd58e40ca7f97422c2f521478da6 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -42,6 +42,7 @@
 #include "llpanelpeople.h"
 
 // newview
+#include "llaccordionctrl.h"
 #include "llaccordionctrltab.h"
 #include "llagent.h"
 #include "llavataractions.h"
@@ -516,6 +517,9 @@ BOOL LLPanelPeople::postBuild()
 	// call this method in case some list is empty and buttons can be in inconsistent state
 	updateButtons();
 
+	mOnlineFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2));
+	mAllFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2));
+
 	return TRUE;
 }
 
@@ -560,6 +564,8 @@ void LLPanelPeople::updateFriendList()
 
 	mOnlineFriendList->setDirty();
 	mAllFriendList->setDirty();
+
+	showFriendsAccordionsIfNeeded();
 }
 
 void LLPanelPeople::updateNearbyList()
@@ -797,14 +803,15 @@ void LLPanelPeople::reSelectedCurrentTab()
 
 void LLPanelPeople::onFilterEdit(const std::string& search_string)
 {
-	if (mFilterSubString == search_string)
-		return;
+	std::string search_upper = search_string;
+	// Searches are case-insensitive
+	LLStringUtil::toUpper(search_upper);
+	LLStringUtil::trimHead(search_upper);
 
-	mFilterSubString = search_string;
+	if (mFilterSubString == search_upper)
+		return;
 
-	// Searches are case-insensitive
-	LLStringUtil::toUpper(mFilterSubString);
-	LLStringUtil::trimHead(mFilterSubString);
+	mFilterSubString = search_upper;
 
 	// Apply new filter.
 	mNearbyList->setNameFilter(mFilterSubString);
@@ -812,6 +819,8 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
 	mAllFriendList->setNameFilter(mFilterSubString);
 	mRecentList->setNameFilter(mFilterSubString);
 	mGroupList->setNameFilter(mFilterSubString);
+
+	showFriendsAccordionsIfNeeded();
 }
 
 void LLPanelPeople::onTabSelected(const LLSD& param)
@@ -1124,3 +1133,49 @@ void	LLPanelPeople::onOpen(const LLSD& key)
 	else
 		reSelectedCurrentTab();
 }
+
+void LLPanelPeople::showAccordion(const std::string name, bool show)
+{
+	if(name.empty())
+	{
+		llwarns << "No name provided" << llendl;
+		return;
+	}
+
+	LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name);
+	tab->setVisible(show);
+	if(show)
+	{
+		// expand accordion
+		tab->changeOpenClose(false);
+	}
+}
+
+void LLPanelPeople::showFriendsAccordionsIfNeeded()
+{
+	if(FRIENDS_TAB_NAME == getActiveTabName())
+	{
+		// Expand and show accordions if needed, else - hide them
+		showAccordion("tab_online", mOnlineFriendList->filterHasMatches());
+		showAccordion("tab_all", mAllFriendList->filterHasMatches());
+
+		// Rearrange accordions
+		LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
+		accordion->arrange();
+	}
+}
+
+void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param)
+{
+	if(ctrl == mOnlineFriendList)
+	{
+		showAccordion("tab_online", param.asInteger());
+	}
+	else if(ctrl == mAllFriendList)
+	{
+		showAccordion("tab_all", param.asInteger());
+	}
+
+	LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
+	accordion->arrange();
+}
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index dc0aaeb70f1f19f4f69d73a4d9eb0f4293b2a9fe..9bf9befe906bee1623a9c4c0c513536689d0be71 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -124,6 +124,12 @@ class LLPanelPeople : public LLPanel
 
 	void					onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list);
 
+	void					showAccordion(const std::string name, bool show);
+
+	void					showFriendsAccordionsIfNeeded();
+
+	void					onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param);
+
 	LLFilterEditor*			mFilterEditor;
 	LLTabContainer*			mTabContainer;
 	LLAvatarList*			mOnlineFriendList;
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 34644cfe42d1bca8177db115f489214568c71f87..2c5f4b5afaa391656f72346ce9fe5722e1bc8fbc 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -1,6 +1,6 @@
 /**
  * @file llpanelplaceinfo.cpp
- * @brief Displays place information in Side Tray.
+ * @brief Base class for place information in Side Tray.
  *
  * $LicenseInfo:firstyear=2009&license=viewergpl$
  * 
@@ -39,66 +39,34 @@
 #include "llsecondlifeurls.h"
 
 #include "llinventory.h"
-#include "llparcel.h"
 
-#include "llqueryflags.h"
+#include "llsdutil_math.h"
 
-#include "llbutton.h"
-#include "llcombobox.h"
-#include "lliconctrl.h"
 #include "llscrollcontainer.h"
 #include "lltextbox.h"
-#include "lltrans.h"
 
-#include "llaccordionctrl.h"
-#include "llaccordionctrltab.h"
 #include "llagent.h"
-#include "llagentui.h"
-#include "llappviewer.h"
 #include "llavatarpropertiesprocessor.h"
-#include "llcallbacklist.h"
 #include "llexpandabletextbox.h"
 #include "llfloaterworldmap.h"
-#include "llfloaterbuycurrency.h"
 #include "llinventorymodel.h"
-#include "lllandmarkactions.h"
 #include "llpanelpick.h"
 #include "lltexturectrl.h"
-#include "llstatusbar.h"
 #include "llviewerinventory.h"
 #include "llviewerparcelmgr.h"
 #include "llviewerregion.h"
-#include "llviewercontrol.h" 
 #include "llviewertexteditor.h"
 #include "llworldmap.h"
-#include "llsdutil_math.h"
-
-//----------------------------------------------------------------------------
-// Aux types and methods
-//----------------------------------------------------------------------------
-
-typedef std::pair<LLUUID, std::string> folder_pair_t;
-
-static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right);
-static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats);
-
-static LLRegisterPanelClassWrapper<LLPanelPlaceInfo> t_place_info("panel_place_info");
 
 LLPanelPlaceInfo::LLPanelPlaceInfo()
 :	LLPanel(),
 	mParcelID(),
 	mRequestedID(),
 	mPosRegion(),
-	mLandmarkID(),
-	mMinHeight(0),
-	mScrollingPanel(NULL),
-	mInfoPanel(NULL),
-	mMediaPanel(NULL),
-	mForSalePanel(NULL),
-	mYouAreHerePanel(NULL),
-	mSelectedParcelID(-1)
+	mMinHeight(0)
 {}
 
+//virtual
 LLPanelPlaceInfo::~LLPanelPlaceInfo()
 {
 	if (mParcelID.notNull())
@@ -107,220 +75,41 @@ LLPanelPlaceInfo::~LLPanelPlaceInfo()
 	}
 }
 
+//virtual
 BOOL LLPanelPlaceInfo::postBuild()
 {
-	mTitle = getChild<LLTextBox>("panel_title");
+	mTitle = getChild<LLTextBox>("title");
 	mCurrentTitle = mTitle->getText();
 
-	mForSalePanel = getChild<LLPanel>("for_sale_panel");
-	mYouAreHerePanel = getChild<LLPanel>("here_panel");
-	gIdleCallbacks.addFunction(&LLPanelPlaceInfo::updateYouAreHereBanner, this);
-	
-	//Icon value should contain sale price of last selected parcel. 
-	mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")->
-				setMouseDownCallback(boost::bind(&LLPanelPlaceInfo::onForSaleBannerClick, this));
-
 	mSnapshotCtrl = getChild<LLTextureCtrl>("logo");
 	mRegionName = getChild<LLTextBox>("region_title");
 	mParcelName = getChild<LLTextBox>("parcel_title");
 	mDescEditor = getChild<LLExpandableTextBox>("description");
 
 	mMaturityRatingText = getChild<LLTextBox>("maturity_value");
-	mParcelOwner = getChild<LLTextBox>("owner_value");
-	mLastVisited = getChild<LLTextBox>("last_visited_value");
-
-	mRatingText = getChild<LLTextBox>("rating_value");
-	mVoiceText = getChild<LLTextBox>("voice_value");
-	mFlyText = getChild<LLTextBox>("fly_value");
-	mPushText = getChild<LLTextBox>("push_value");
-	mBuildText = getChild<LLTextBox>("build_value");
-	mScriptsText = getChild<LLTextBox>("scripts_value");
-	mDamageText = getChild<LLTextBox>("damage_value");
-
-	mRegionNameText = getChild<LLTextBox>("region_name");
-	mRegionTypeText = getChild<LLTextBox>("region_type");
-	mRegionRatingText = getChild<LLTextBox>("region_rating");
-	mRegionOwnerText = getChild<LLTextBox>("region_owner");
-	mRegionGroupText = getChild<LLTextBox>("region_group");
-
-	mEstateNameText = getChild<LLTextBox>("estate_name");
-	mEstateRatingText = getChild<LLTextBox>("estate_rating");
-	mEstateOwnerText = getChild<LLTextBox>("estate_owner");
-	mCovenantText = getChild<LLTextEditor>("covenant");
-
-	mSalesPriceText = getChild<LLTextBox>("sales_price");
-	mAreaText = getChild<LLTextBox>("area");
-	mTrafficText = getChild<LLTextBox>("traffic");
-	mPrimitivesText = getChild<LLTextBox>("primitives");
-	mParcelScriptsText = getChild<LLTextBox>("parcel_scripts");
-	mTerraformLimitsText = getChild<LLTextBox>("terraform_limits");
-	mSubdivideText = getChild<LLTextEditor>("subdivide");
-	mResaleText = getChild<LLTextEditor>("resale");
-	mSaleToText = getChild<LLTextBox>("sale_to");
 
-	mOwner = getChild<LLTextBox>("owner");
-	mCreator = getChild<LLTextBox>("creator");
-	mCreated = getChild<LLTextBox>("created");
-
-	mTitleEditor = getChild<LLLineEditor>("title_editor");
-	mNotesEditor = getChild<LLTextEditor>("notes_editor");
-	mFolderCombo = getChild<LLComboBox>("folder_combo");
-
-	LLScrollContainer* scroll_container = getChild<LLScrollContainer>("scroll_container");
+	LLScrollContainer* scroll_container = getChild<LLScrollContainer>("place_scroll");
 	scroll_container->setBorderVisible(FALSE);
 	mMinHeight = scroll_container->getScrolledViewRect().getHeight();
 
-	mScrollingPanel = getChild<LLPanel>("scrolling_panel");
-	mInfoPanel = getChild<LLPanel>("info_panel");
-	mMediaPanel = getChild<LLMediaPanel>("media_panel");
-	if (!mMediaPanel)
-		return FALSE;
-
 	return TRUE;
 }
 
-void LLPanelPlaceInfo::displayItemInfo(const LLInventoryItem* pItem)
-{
-	if (!pItem)
-		return;
-
-	mLandmarkID = pItem->getUUID();
-
-	if(!gCacheName)
-		return;
-
-	const LLPermissions& perm = pItem->getPermissions();
-
-	//////////////////
-	// CREATOR NAME //
-	//////////////////
-	if (pItem->getCreatorUUID().notNull())
-	{
-		std::string name;
-		LLUUID creator_id = pItem->getCreatorUUID();
-		if (!gCacheName->getFullName(creator_id, name))
-		{
-			gCacheName->get(creator_id, FALSE,
-							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mCreator, _2, _3));
-		}
-		mCreator->setText(name);
-	}
-	else
-	{
-		mCreator->setText(getString("unknown"));
-	}
-
-	////////////////
-	// OWNER NAME //
-	////////////////
-	if(perm.isOwned())
-	{
-		std::string name;
-		if (perm.isGroupOwned())
-		{
-			LLUUID group_id = perm.getGroup();
-			if (!gCacheName->getGroupName(group_id, name))
-			{
-				gCacheName->get(group_id, TRUE,
-								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3));
-			}
-		}
-		else
-		{
-			LLUUID owner_id = perm.getOwner();
-			if (!gCacheName->getFullName(owner_id, name))
-			{
-				gCacheName->get(owner_id, FALSE,
-								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3));
-			}
-		}
-		mOwner->setText(name);
-	}
-	else
-	{
-		mOwner->setText(getString("public"));
-	}
-	
-	//////////////////
-	// ACQUIRE DATE //
-	//////////////////
-	time_t time_utc = pItem->getCreationDate();
-	if (0 == time_utc)
-	{
-		mCreated->setText(getString("unknown"));
-	}
-	else
-	{
-		std::string timeStr = getString("acquired_date");
-		LLSD substitution;
-		substitution["datetime"] = (S32) time_utc;
-		LLStringUtil::format (timeStr, substitution);
-		mCreated->setText(timeStr);
-	}
-
-	mTitleEditor->setText(pItem->getName());
-	mNotesEditor->setText(pItem->getDescription());
-}
-
-void LLPanelPlaceInfo::nameUpdatedCallback(
-	LLTextBox* text,
-	const std::string& first,
-	const std::string& last)
-{
-	text->setText(first + " " + last);
-}
-
+//virtual
 void LLPanelPlaceInfo::resetLocation()
 {
 	mParcelID.setNull();
 	mRequestedID.setNull();
-	mLandmarkID.setNull();
 	mPosRegion.clearVec();
-	mForSalePanel->setVisible(FALSE);
-	mYouAreHerePanel->setVisible(FALSE);
+
 	std::string not_available = getString("not_available");
 	mMaturityRatingText->setValue(not_available);
-	mParcelOwner->setValue(not_available);
-	mLastVisited->setValue(not_available);
 	mRegionName->setText(not_available);
 	mParcelName->setText(not_available);
 	mDescEditor->setText(not_available);
-	mCreator->setText(not_available);
-	mOwner->setText(not_available);
-	mCreated->setText(not_available);
-	mTitleEditor->setText(LLStringUtil::null);
-	mNotesEditor->setText(LLStringUtil::null);
+
 	mSnapshotCtrl->setImageAssetID(LLUUID::null);
 	mSnapshotCtrl->setFallbackImageName("default_land_picture.j2c");
-
-	mRatingText->setText(not_available);
-	mVoiceText->setText(not_available);
-	mFlyText->setText(not_available);
-	mPushText->setText(not_available);
-	mBuildText->setText(not_available);
-	mParcelScriptsText->setText(not_available);
-	mDamageText->setText(not_available);
-
-	mRegionNameText->setValue(not_available);
-	mRegionTypeText->setValue(not_available);
-	mRegionRatingText->setValue(not_available);
-	mRegionOwnerText->setValue(not_available);
-	mRegionGroupText->setValue(not_available);
-
-	mEstateNameText->setValue(not_available);
-	mEstateRatingText->setValue(not_available);
-	mEstateOwnerText->setValue(not_available);
-	mCovenantText->setValue(not_available);
-
-	mSalesPriceText->setValue(not_available);
-	mAreaText->setValue(not_available);
-	mTrafficText->setValue(not_available);
-	mPrimitivesText->setValue(not_available);
-	mParcelScriptsText->setValue(not_available);
-	mTerraformLimitsText->setValue(not_available);
-	mSubdivideText->setValue(not_available);
-	mResaleText->setValue(not_available);
-	mSaleToText->setValue(not_available);
 }
 
 //virtual
@@ -330,108 +119,55 @@ void LLPanelPlaceInfo::setParcelID(const LLUUID& parcel_id)
 	sendParcelInfoRequest();
 }
 
+//virtual
 void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)
 {
-	LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel");
-	LLPanel* landmark_edit_panel = getChild<LLPanel>("landmark_edit_panel");
-
-	bool is_info_type_agent = type == AGENT;
-	bool is_info_type_create_landmark = type == CREATE_LANDMARK;
-	bool is_info_type_landmark = type == LANDMARK;
-	bool is_info_type_teleport_history = type == TELEPORT_HISTORY;
-
-	getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent);
-	mMaturityRatingText->setVisible(!is_info_type_agent);
-
-	getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent);
-	mParcelOwner->setVisible(is_info_type_agent);
-
-	getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history);
-	mLastVisited->setVisible(is_info_type_teleport_history);
-
-	landmark_info_panel->setVisible(is_info_type_landmark);
-	landmark_edit_panel->setVisible(is_info_type_landmark || is_info_type_create_landmark);
-
-	getChild<LLTextBox>("folder_lable")->setVisible(is_info_type_create_landmark);
-	mFolderCombo->setVisible(is_info_type_create_landmark);
-
-	getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent);
-
-	switch(type)
-	{
-		case CREATE_LANDMARK:
-			mCurrentTitle = getString("title_create_landmark");
-
-			mTitleEditor->setEnabled(TRUE);
-			mNotesEditor->setEnabled(TRUE);
-
-			populateFoldersList();
-		break;
-
-		case AGENT:
-		case PLACE:
-			mCurrentTitle = getString("title_place");
-
-			if (!isMediaPanelVisible())
-			{
-				mTitle->setText(mCurrentTitle);
-			}
-		break;
-
-		case LANDMARK:
-			mCurrentTitle = getString("title_landmark");
-
-			mTitleEditor->setEnabled(FALSE);
-			mNotesEditor->setEnabled(FALSE);
-
-			populateFoldersList();
-		break;
-
-		case TELEPORT_HISTORY:
-			mCurrentTitle = getString("title_teleport_history");
-		break;
-	}
-
-	if (type != AGENT)
-		toggleMediaPanel(FALSE);
+	mTitle->setText(mCurrentTitle);
 
 	mInfoType = type;
 }
 
-BOOL LLPanelPlaceInfo::isMediaPanelVisible()
+void LLPanelPlaceInfo::sendParcelInfoRequest()
 {
-	if (!mMediaPanel)
-		return FALSE;
+	if (mParcelID != mRequestedID)
+	{
+		LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this);
+		LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID);
 
-	return mMediaPanel->getVisible();
+		mRequestedID = mParcelID;
+	}
 }
 
-void LLPanelPlaceInfo::toggleMediaPanel(BOOL visible)
+void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
+										 const LLVector3d& pos_global)
 {
-    if (!mMediaPanel)
-        return;
+	LLViewerRegion* region = gAgent.getRegion();
+	if (!region)
+		return;
+
+	mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
+					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
+					  (F32)pos_global.mdV[VZ]);
 
-    if (visible)
+	LLSD body;
+	std::string url = region->getCapability("RemoteParcelRequest");
+	if (!url.empty())
 	{
-		mTitle->setText(getString("title_media"));
+		body["location"] = ll_sd_from_vector3(mPosRegion);
+		if (!region_id.isNull())
+		{
+			body["region_id"] = region_id;
+		}
+		if (!pos_global.isExactlyZero())
+		{
+			U64 region_handle = to_region_handle(pos_global);
+			body["region_handle"] = ll_sd_from_U64(region_handle);
+		}
+		LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
 	}
 	else
 	{
-		mTitle->setText(mCurrentTitle);
-	}
-
-    mInfoPanel->setVisible(!visible);
-    mMediaPanel->setVisible(visible);
-}
-
-void LLPanelPlaceInfo::sendParcelInfoRequest()
-{
-	if (mParcelID != mRequestedID)
-	{
-		LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this);
-		LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID);
-
-		mRequestedID = mParcelID;
+		mDescEditor->setText(getString("server_update_text"));
 	}
 }
 
@@ -473,27 +209,6 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
 		mDescEditor->setText(parcel_data.desc);
 	}
 
-	// HACK: Flag 0x2 == adult region,
-	// Flag 0x1 == mature region, otherwise assume PG
-	std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);
-	if (parcel_data.flags & 0x2)
-	{
-		rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT);
-	}
-	else if (parcel_data.flags & 0x1)
-	{
-		rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);
-	}
-
-	mMaturityRatingText->setValue(rating);
-	mRatingText->setValue(rating);
-
-	//update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE
-	//because we deal with remote parcel response format
-	bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) &&
-					 mInfoType == AGENT ? TRUE : FALSE;
-	mForSalePanel->setVisible(is_for_sale);
-
 	S32 region_x;
 	S32 region_y;
 	S32 region_z;
@@ -521,408 +236,25 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
 	{
 		mParcelName->setText(getString("not_available"));
 	}
-
-	if (mInfoType == CREATE_LANDMARK)
-	{
-		if (parcel_data.name.empty())
-		{
-			mTitleEditor->setText(llformat("%s (%d, %d, %d)",
-								  parcel_data.sim_name.c_str(), region_x, region_y, region_z));
-		}
-		else
-		{
-			mTitleEditor->setText(parcel_data.name);
-		}
-
-		// FIXME: Creating landmark works only for current agent location.
-		std::string desc;
-		LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent());
-		mNotesEditor->setText(desc);
-
-		if (!LLLandmarkActions::landmarkAlreadyExists())
-		{
-			createLandmark(mFolderCombo->getValue().asUUID());
-		}
-	}
 }
 
-void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id,
-										 const LLVector3d& pos_global)
+// virtual
+void LLPanelPlaceInfo::handleVisibilityChange(BOOL new_visibility)
 {
-	LLViewerRegion* region = gAgent.getRegion();
-	if (!region)
-		return;
-
-	mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
-					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
-					  (F32)pos_global.mdV[VZ]);
-
-	LLSD body;
-	std::string url = region->getCapability("RemoteParcelRequest");
-	if (!url.empty())
-	{
-		body["location"] = ll_sd_from_vector3(mPosRegion);
-		if (!region_id.isNull())
-		{
-			body["region_id"] = region_id;
-		}
-		if (!pos_global.isExactlyZero())
-		{
-			U64 region_handle = to_region_handle(pos_global);
-			body["region_handle"] = ll_sd_from_U64(region_handle);
-		}
-		LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
-	}
-	else
-	{
-		mDescEditor->setText(getString("server_update_text"));
-	}
-}
+	LLPanel::handleVisibilityChange(new_visibility);
 
-void LLPanelPlaceInfo::displaySelectedParcelInfo(LLParcel* parcel,
-											  LLViewerRegion* region,
-											  const LLVector3d& pos_global,
-											  bool is_current_parcel)
-{
-	if (!region || !parcel)
+	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
+	if (!parcel_mgr)
 		return;
 
-	// send EstateCovenantInfo message
-	LLMessageSystem *msg = gMessageSystem;
-	msg->newMessage("EstateCovenantRequest");
-	msg->nextBlockFast(_PREHASH_AgentData);
-	msg->addUUIDFast(_PREHASH_AgentID,	gAgent.getID());
-	msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
-	msg->sendReliable(region->getHost());
-
-	LLParcelData parcel_data;
-
-	// HACK: Converting sim access flags to the format
-	// returned by remote parcel response.
-	switch(region->getSimAccess())
-	{
-	case SIM_ACCESS_MATURE:
-		parcel_data.flags = 0x1;
-		break;
-
-	case SIM_ACCESS_ADULT:
-		parcel_data.flags = 0x2;
-		break;
-
-	default:
-		parcel_data.flags = 0;
-	}
-	parcel_data.desc = parcel->getDesc();
-	parcel_data.name = parcel->getName();
-	parcel_data.sim_name = region->getName();
-	parcel_data.snapshot_id = parcel->getSnapshotID();
-	mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
-					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
-					  (F32)pos_global.mdV[VZ]);
-	parcel_data.global_x = pos_global.mdV[VX];
-	parcel_data.global_y = pos_global.mdV[VY];
-	parcel_data.global_z = pos_global.mdV[VZ];
-
-	std::string on = getString("on");
-	std::string off = getString("off");
-
-	// Processing parcel characteristics
-	if (parcel->getParcelFlagAllowVoice())
-	{
-		mVoiceText->setText(on);
-	}
-	else
-	{
-		mVoiceText->setText(off);
-	}
-
-	if (!region->getBlockFly() && parcel->getAllowFly())
-	{
-		mFlyText->setText(on);
-	}
-	else
-	{
-		mFlyText->setText(off);
-	}
-
-	if (region->getRestrictPushObject() || parcel->getRestrictPushObject())
-	{
-		mPushText->setText(off);
-	}
-	else
-	{
-		mPushText->setText(on);
-	}
-
-	if (parcel->getAllowModify())
-	{
-		mBuildText->setText(on);
-	}
-	else
-	{
-		mBuildText->setText(off);
-	}
-
-	if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) ||
-	   (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) ||
-	   !parcel->getAllowOtherScripts())
-	{
-		mScriptsText->setText(off);
-	}
-	else
-	{
-		mScriptsText->setText(on);
-	}
-
-	if (region->getAllowDamage() || parcel->getAllowDamage())
-	{
-		mDamageText->setText(on);
-	}
-	else
-	{
-		mDamageText->setText(off);
-	}
-
-	mRegionNameText->setText(region->getName());
-	mRegionTypeText->setText(region->getSimProductName());
-	mRegionRatingText->setText(region->getSimAccessString());
-
-	// Determine parcel owner
-	if (parcel->isPublic())
-	{
-		mParcelOwner->setText(getString("public"));
-		mRegionOwnerText->setText(getString("public"));
-	}
-	else
-	{
-		if (parcel->getIsGroupOwned())
-		{
-			mRegionOwnerText->setText(getString("group_owned_text"));
-
-			if(!parcel->getGroupID().isNull())
-			{
-				// FIXME: Using parcel group as region group.
-				gCacheName->get(parcel->getGroupID(), TRUE,
-								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionGroupText, _2, _3));
-
-				gCacheName->get(parcel->getGroupID(), TRUE,
-								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3));
-			}
-			else
-			{
-				std::string owner = getString("none_text");
-				mRegionGroupText->setText(owner);
-				mParcelOwner->setText(owner);
-			}
-		}
-		else
-		{
-			// Figure out the owner's name
-			gCacheName->get(parcel->getOwnerID(), FALSE,
-							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3));
-			gCacheName->get(region->getOwner(), FALSE,
-							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionOwnerText, _2, _3));
-		}
-
-		if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
-		{
-			mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text"));
-		}
-	}
-
-	mEstateRatingText->setText(region->getSimAccessString());
-
-	S32 area;
-	S32 claim_price;
-	S32 rent_price;
-	F32 dwell;
-	BOOL for_sale = parcel->getForSale();
-	LLViewerParcelMgr::getInstance()->getDisplayInfo(&area,
-													 &claim_price,
-													 &rent_price,
-													 &for_sale,
-													 &dwell);
-	if (for_sale)
-	{
-		// Adding "For Sale" flag in remote parcel response format.
-		parcel_data.flags |= DFQ_FOR_SALE;
-
-		const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
-		if(auth_buyer_id.notNull())
-		{
-			gCacheName->get(auth_buyer_id, TRUE,
-							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mSaleToText, _2, _3));
-
-			// Show sales info to a specific person or a group he belongs to.
-			if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id))
-			{
-				for_sale = FALSE;
-			}
-		}
-		else
-		{
-			mSaleToText->setText(getString("anyone"));
-		}
-
-		const U8* sign = (U8*)getString("price_text").c_str();
-		const U8* sqm = (U8*)getString("area_text").c_str();
-
-		mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice()));
-		mAreaText->setText(llformat("%d %s", area, sqm));
-		mTrafficText->setText(llformat("%.0f", dwell));
-
-		// Can't have more than region max tasks, regardless of parcel
-		// object bonus factor.
-		S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()),
-							   (S32)region->getMaxTasks());
-
-		const U8* available = (U8*)getString("available").c_str();
-		const U8* allocated = (U8*)getString("allocated").c_str();
-
-		mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated));
-
-		if (parcel->getAllowOtherScripts())
-		{
-			mParcelScriptsText->setText(getString("all_residents_text"));
-		}
-		else if (parcel->getAllowGroupScripts())
-		{
-			mParcelScriptsText->setText(getString("group_text"));
-		}
-		else
-		{
-			mParcelScriptsText->setText(off);
-		}
-
-		mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off);
-
-		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES)
-		{
-			mSubdivideText->setText(getString("can_change"));
-		}
-		else
-		{
-			mSubdivideText->setText(getString("can_not_change"));
-		}
-		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)
-		{
-			mResaleText->setText(getString("can_not_resell"));
-		}
-		else
-		{
-			mResaleText->setText(getString("can_resell"));
-		}
-	}
-
-	mSelectedParcelID = parcel->getLocalID();
-	mLastSelectedRegionID = region->getRegionID();
-	processParcelInfo(parcel_data);
-
-	mYouAreHerePanel->setVisible(is_current_parcel);
-	getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale);
-}
-
-void LLPanelPlaceInfo::updateEstateName(const std::string& name)
-{
-	mEstateNameText->setText(name);
-}
-
-void LLPanelPlaceInfo::updateEstateOwnerName(const std::string& name)
-{
-	mEstateOwnerText->setText(name);
-}
-
-void LLPanelPlaceInfo::updateCovenantText(const std::string &text)
-{
-	mCovenantText->setText(text);
-}
-
-void LLPanelPlaceInfo::updateLastVisitedText(const LLDate &date)
-{
-	if (date.isNull())
-	{
-		mLastVisited->setText(getString("unknown"));
-	}
-	else
-	{
-		std::string timeStr = getString("acquired_date");
-		LLSD substitution;
-		substitution["datetime"] = (S32) date.secondsSinceEpoch();
-		LLStringUtil::format (timeStr, substitution);
-		mLastVisited->setText(timeStr);
-	}
-}
-
-void LLPanelPlaceInfo::toggleLandmarkEditMode(BOOL enabled)
-{
-	// If switching to edit mode while creating landmark
-	// the "Create Landmark" title remains.
-	if (enabled && mInfoType != CREATE_LANDMARK)
-	{
-		mTitle->setText(getString("title_edit_landmark"));
-	}
-	else
-	{
-		mTitle->setText(mCurrentTitle);
-	}
-
-	if (mNotesEditor->getReadOnly() ==  (enabled == TRUE))
-	{
-		mTitleEditor->setEnabled(enabled);
-		mNotesEditor->setReadOnly(!enabled);
-		mFolderCombo->setVisible(enabled);
-		getChild<LLTextBox>("folder_lable")->setVisible(enabled);
-
-		// HACK: To change the text color in a text editor
-		// when it was enabled/disabled we set the text once again.
-		mNotesEditor->setText(mNotesEditor->getText());
-	}
-}
-
-const std::string& LLPanelPlaceInfo::getLandmarkTitle() const
-{
-	return mTitleEditor->getText();
-}
-
-const std::string LLPanelPlaceInfo::getLandmarkNotes() const
-{
-	return mNotesEditor->getText();
-}
-
-const LLUUID LLPanelPlaceInfo::getLandmarkFolder() const
-{
-	return mFolderCombo->getValue().asUUID();
-}
-
-BOOL LLPanelPlaceInfo::setLandmarkFolder(const LLUUID& id)
-{
-	return mFolderCombo->setCurrentByID(id);
-}
-
-void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id)
-{
-	std::string name = mTitleEditor->getText();
-	std::string desc = mNotesEditor->getText();
-
-	LLStringUtil::trim(name);
-	LLStringUtil::trim(desc);
-
-	// If typed name is empty use the parcel name instead.
-	if (name.empty())
+	// Remove land selection when panel hides.
+	if (!new_visibility)
 	{
-		name = mParcelName->getText();
-
-		// If no parcel exists use the region name instead.
-		if (name.empty())
+		if (!parcel_mgr->selectionEmpty())
 		{
-			name = mRegionName->getText();
+			parcel_mgr->deselectLand();
 		}
 	}
-
-	LLStringUtil::replaceChar(desc, '\n', ' ');
-	// If no folder chosen use the "Landmarks" folder.
-	LLLandmarkActions::createLandmarkHere(name, desc,
-		folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK));
 }
 
 void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel)
@@ -942,159 +274,10 @@ void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit*
 	pick_panel->setPickData(&data);
 }
 
-// virtual
-void LLPanelPlaceInfo::handleVisibilityChange (BOOL new_visibility)
-{
-	LLPanel::handleVisibilityChange(new_visibility);
-
-	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
-	if (!parcel_mgr)
-		return;
-
-	// Remove land selection when panel hides.
-	if (!new_visibility)
-	{
-		if (!parcel_mgr->selectionEmpty())
-		{
-			parcel_mgr->deselectLand();
-		}
-	}
-}
-
-void LLPanelPlaceInfo::populateFoldersList()
+// static
+void LLPanelPlaceInfo::nameUpdatedCallback(LLTextBox* text,
+										   const std::string& first,
+										   const std::string& last)
 {
-	// Collect all folders that can contain landmarks.
-	LLInventoryModel::cat_array_t cats;
-	collectLandmarkFolders(cats);
-
-	mFolderCombo->removeall();
-
-	// Put the "Landmarks" folder first in list.
-	LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
-	const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id);
-	if (!cat)
-	{
-		llwarns << "Cannot find the landmarks folder" << llendl;
-	}
-	std::string cat_full_name = getFullFolderName(cat);
-	mFolderCombo->add(cat_full_name, cat->getUUID());
-
-	typedef std::vector<folder_pair_t> folder_vec_t;
-	folder_vec_t folders;
-	// Sort the folders by their full name.
-	for (S32 i = 0; i < cats.count(); i++)
-	{
-		cat = cats.get(i);
-		cat_full_name = getFullFolderName(cat);
-		folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
-	}
-	sort(folders.begin(), folders.end(), cmp_folders);
-
-	// Finally, populate the combobox.
-	for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++)
-		mFolderCombo->add(it->second, LLSD(it->first));
-}
-
-//static
-void LLPanelPlaceInfo::updateYouAreHereBanner(void* userdata)
-{
-	//YouAreHere Banner should be displayed only for selected places, 
-	// If you want to display it for landmark or teleport history item, you should check by mParcelId
-	
-	LLPanelPlaceInfo* self  = static_cast<LLPanelPlaceInfo*>(userdata);
-	if(!self->getVisible())
-		return;
-	if(!gDisconnected)
-	{
-		static F32 radius  = gSavedSettings.getF32("YouAreHereDistance");
-
-		BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID && 
-			LLAgentUI::checkAgentDistance(self->mPosRegion, radius);
-
-		self->mYouAreHerePanel->setVisible(display_banner);
-	}
-}
-
-void LLPanelPlaceInfo::onForSaleBannerClick()
-{
-	LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
-	LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection();
-	LLViewerRegion* selected_region =  mgr->getSelectionRegion();
-	if(!hParcel.isNull() && selected_region)
-	{
-		if(hParcel->getParcel()->getLocalID() == mSelectedParcelID && 
-				mLastSelectedRegionID ==selected_region->getRegionID())
-		{
-			if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0)
-			{
-				LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice());
-			}
-			else
-			{
-				LLViewerParcelMgr::getInstance()->startBuyLand();
-			}
-		}
-		else
-		{
-			LL_WARNS("Places") << "User  is trying  to buy remote parcel.Operation is not supported"<< LL_ENDL; 
-		}
-		
-	}
-	
-	
-}
-
-/*static*/
-std::string LLPanelPlaceInfo::getFullFolderName(const LLViewerInventoryCategory* cat)
-{
-	std::string name = cat->getName();
-	LLUUID parent_id;
-
-	// translate category name, if it's right below the root
-	// FIXME: it can throw notification about non existent string in strings.xml
-	if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
-	{
-		LLTrans::findString(name, "InvFolder " + name);
-	}
-
-	// we don't want "My Inventory" to appear in the name
-	while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
-	{
-		cat = gInventory.getCategory(parent_id);
-		name = cat->getName() + "/" + name;
-	}
-
-	return name;
-}
-
-static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right)
-{
-	return left.second < right.second;
-}
-
-static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats)
-{
-	LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
-
-	// Add descendent folders of the "Landmarks" category.
-	LLInventoryModel::item_array_t items; // unused
-	LLIsType is_category(LLAssetType::AT_CATEGORY);
-	gInventory.collectDescendentsIf(
-		landmarks_id,
-		cats,
-		items,
-		LLInventoryModel::EXCLUDE_TRASH,
-		is_category);
-
-	// Add the "My Favorites" category.
-	LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
-	LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id);
-	if (!favorites_cat)
-	{
-		llwarns << "Cannot find the favorites folder" << llendl;
-	}
-	else
-	{
-		cats.put(favorites_cat);
-	}
+	text->setText(first + " " + last);
 }
diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h
index 07a2434d59f598ded18f1baf63ae50cd3accbe06..c9e13475428c701d8cc771205d051374d825c050 100644
--- a/indra/newview/llpanelplaceinfo.h
+++ b/indra/newview/llpanelplaceinfo.h
@@ -1,6 +1,6 @@
 /** 
  * @file llpanelplaceinfo.h
- * @brief Displays place information in Side Tray.
+ * @brief Base class for place information in Side Tray.
  *
  * $LicenseInfo:firstyear=2009&license=viewergpl$
  * 
@@ -38,19 +38,13 @@
 #include "v3dmath.h"
 #include "lluuid.h"
 
-#include "llpanelmedia.h"
 #include "llremoteparcelrequest.h"
 
-class LLButton;
-class LLComboBox;
 class LLExpandableTextBox;
 class LLInventoryItem;
-class LLLineEditor;
 class LLPanelPickEdit;
 class LLParcel;
-class LLIconCtrl;
 class LLTextBox;
-class LLTextEditor;
 class LLTextureCtrl;
 class LLViewerRegion;
 class LLViewerInventoryCategory;
@@ -74,30 +68,18 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
 
 	// Ignore all old location information, useful if you are 
 	// recycling an existing dialog and need to clear it.
-	void resetLocation();
+	virtual void resetLocation();
 
 	// Sends a request for data about the given parcel, which will
 	// only update the location if there is none already available.
 	/*virtual*/ void setParcelID(const LLUUID& parcel_id);
 
-	// Depending on how the panel was triggered 
-	// (from landmark or current location, or other) 
+	// Depending on how the panel was triggered
+	// (from landmark or current location, or other)
 	// sets a corresponding title and contents.
-	void setInfoType(INFO_TYPE type);
-
-	// Create a landmark for the current location
-	// in a folder specified by folder_id.
-	void createLandmark(const LLUUID& folder_id);
-	
-	// Create a pick for the location specified
-	// by global_pos.
-	void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel);
-
-	BOOL isMediaPanelVisible();
-	void toggleMediaPanel(BOOL visible);
-	void displayItemInfo(const LLInventoryItem* pItem);
-	/*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
+	virtual void setInfoType(INFO_TYPE type);
 
+	// Requests remote parcel info by parcel ID.
 	void sendParcelInfoRequest();
 
 	// Displays information about a remote parcel.
@@ -105,109 +87,37 @@ class LLPanelPlaceInfo : public LLPanel, LLRemoteParcelInfoObserver
 	void displayParcelInfo(const LLUUID& region_id,
 						   const LLVector3d& pos_global);
 
-	// Displays information about the currently selected parcel
-	// without sending a request to the server.
-	// If is_current_parcel true shows "You Are Here" banner.
-	void displaySelectedParcelInfo(LLParcel* parcel,
-								LLViewerRegion* region,
-								const LLVector3d& pos_global,
-								bool is_current_parcel);
-
-	void updateEstateName(const std::string& name);
-	void updateEstateOwnerName(const std::string& name);
-	void updateCovenantText(const std::string &text);
-	void updateLastVisitedText(const LLDate &date);
-
-	void nameUpdatedCallback(LLTextBox* text,
-							 const std::string& first,
-							 const std::string& last);
-
-	void toggleLandmarkEditMode(BOOL enabled);
-
-	const std::string& getLandmarkTitle() const;
-	const std::string getLandmarkNotes() const;
-	const LLUUID getLandmarkFolder() const;
-
-	// Select current landmark folder in combobox.
-	BOOL setLandmarkFolder(const LLUUID& id);
+	/*virtual*/ void setErrorStatus(U32 status, const std::string& reason);
 
 	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+
 	/*virtual*/ void handleVisibilityChange (BOOL new_visibility);
-	
-	 static std::string getFullFolderName(const LLViewerInventoryCategory* cat);
 
-private:
+	// Create a pick for the location specified
+	// by global_pos.
+	void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel);
 
-	void populateFoldersList();
-	static void updateYouAreHereBanner(void*);// added to gIdleCallbacks
-	void onForSaleBannerClick();
+protected:
+	static void nameUpdatedCallback(LLTextBox* text,
+									const std::string& first,
+									const std::string& last);
 
 	/**
 	 * mParcelID is valid only for remote places, in other cases it's null. See resetLocation() 
 	 */
-	LLUUID			mParcelID;
-	LLUUID			mRequestedID;
-	LLUUID			mLandmarkID;
-	LLVector3		mPosRegion;
-	std::string		mCurrentTitle;
-	S32				mMinHeight;
-	INFO_TYPE 		mInfoType;
-
-	/**
-	 * Hold last displayed parcel. Needs for YouAreHere banner.
-	 */
-	S32			mSelectedParcelID;
-	LLUUID		mLastSelectedRegionID;
-
-	LLTextBox*			mTitle;
-	LLPanel*			mForSalePanel;
-	LLPanel*			mYouAreHerePanel;
-	LLTextureCtrl*		mSnapshotCtrl;
-	LLTextBox*			mRegionName;
-	LLTextBox*			mParcelName;
-	LLExpandableTextBox*mDescEditor;
-	LLTextBox*			mMaturityRatingText;
-	LLTextBox*			mParcelOwner;
-	LLTextBox*			mLastVisited;
-
-	LLTextBox*			mRatingText;
-	LLTextBox*			mVoiceText;
-	LLTextBox*			mFlyText;
-	LLTextBox*			mPushText;
-	LLTextBox*			mBuildText;
-	LLTextBox*			mScriptsText;
-	LLTextBox*			mDamageText;
-
-	LLTextBox*			mRegionNameText;
-	LLTextBox*			mRegionTypeText;
-	LLTextBox*			mRegionRatingText;
-	LLTextBox*			mRegionOwnerText;
-	LLTextBox*			mRegionGroupText;
-
-	LLTextBox*			mEstateNameText;
-	LLTextBox*			mEstateRatingText;
-	LLTextBox*			mEstateOwnerText;
-	LLTextEditor*		mCovenantText;
-
-	LLTextBox*			mSalesPriceText;
-	LLTextBox*			mAreaText;
-	LLTextBox*			mTrafficText;
-	LLTextBox*			mPrimitivesText;
-	LLTextBox*			mParcelScriptsText;
-	LLTextBox*			mTerraformLimitsText;
-	LLTextEditor*		mSubdivideText;
-	LLTextEditor*		mResaleText;
-	LLTextBox*			mSaleToText;
-
-	LLTextBox*			mOwner;
-	LLTextBox*			mCreator;
-	LLTextBox*			mCreated;
-	LLLineEditor*		mTitleEditor;
-	LLTextEditor*		mNotesEditor;
-	LLComboBox*			mFolderCombo;
-	LLPanel*            mScrollingPanel;
-	LLPanel*			mInfoPanel;
-	LLMediaPanel*		mMediaPanel;
+	LLUUID					mParcelID;
+	LLUUID					mRequestedID;
+	LLVector3				mPosRegion;
+	std::string				mCurrentTitle;
+	S32						mMinHeight;
+	INFO_TYPE 				mInfoType;
+
+	LLTextBox*				mTitle;
+	LLTextureCtrl*			mSnapshotCtrl;
+	LLTextBox*				mRegionName;
+	LLTextBox*				mParcelName;
+	LLExpandableTextBox*	mDescEditor;
+	LLTextBox*				mMaturityRatingText;
 };
 
 #endif // LL_LLPANELPLACEINFO_H
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9ba72fe6cff164316a51427851fe9d48cd83e4d7
--- /dev/null
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -0,0 +1,541 @@
+/**
+ * @file llpanelplaceprofile.cpp
+ * @brief Displays place profile in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelplaceprofile.h"
+
+#include "llparcel.h"
+
+#include "llqueryflags.h"
+
+#include "lliconctrl.h"
+#include "lllineeditor.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
+#include "llagent.h"
+#include "llagentui.h"
+#include "llappviewer.h"
+#include "llcallbacklist.h"
+#include "llfloaterbuycurrency.h"
+#include "llstatusbar.h"
+#include "llviewercontrol.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+
+static LLRegisterPanelClassWrapper<LLPanelPlaceProfile> t_place_profile("panel_place_profile");
+
+LLPanelPlaceProfile::LLPanelPlaceProfile()
+:	LLPanelPlaceInfo(),
+	mForSalePanel(NULL),
+	mYouAreHerePanel(NULL),
+	mSelectedParcelID(-1)
+{}
+
+// virtual
+LLPanelPlaceProfile::~LLPanelPlaceProfile()
+{}
+
+// virtual
+BOOL LLPanelPlaceProfile::postBuild()
+{
+	LLPanelPlaceInfo::postBuild();
+
+	mForSalePanel = getChild<LLPanel>("for_sale_panel");
+	mYouAreHerePanel = getChild<LLPanel>("here_panel");
+	gIdleCallbacks.addFunction(&LLPanelPlaceProfile::updateYouAreHereBanner, this);
+
+	//Icon value should contain sale price of last selected parcel.
+	mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")->
+				setMouseDownCallback(boost::bind(&LLPanelPlaceProfile::onForSaleBannerClick, this));
+
+	mParcelOwner = getChild<LLTextBox>("owner_value");
+	mLastVisited = getChild<LLTextBox>("last_visited_value");
+
+	mRatingText = getChild<LLTextBox>("rating_value");
+	mVoiceText = getChild<LLTextBox>("voice_value");
+	mFlyText = getChild<LLTextBox>("fly_value");
+	mPushText = getChild<LLTextBox>("push_value");
+	mBuildText = getChild<LLTextBox>("build_value");
+	mScriptsText = getChild<LLTextBox>("scripts_value");
+	mDamageText = getChild<LLTextBox>("damage_value");
+
+	mRegionNameText = getChild<LLTextBox>("region_name");
+	mRegionTypeText = getChild<LLTextBox>("region_type");
+	mRegionRatingText = getChild<LLTextBox>("region_rating");
+	mRegionOwnerText = getChild<LLTextBox>("region_owner");
+	mRegionGroupText = getChild<LLTextBox>("region_group");
+
+	mEstateNameText = getChild<LLTextBox>("estate_name");
+	mEstateRatingText = getChild<LLTextBox>("estate_rating");
+	mEstateOwnerText = getChild<LLTextBox>("estate_owner");
+	mCovenantText = getChild<LLTextEditor>("covenant");
+
+	mSalesPriceText = getChild<LLTextBox>("sales_price");
+	mAreaText = getChild<LLTextBox>("area");
+	mTrafficText = getChild<LLTextBox>("traffic");
+	mPrimitivesText = getChild<LLTextBox>("primitives");
+	mParcelScriptsText = getChild<LLTextBox>("parcel_scripts");
+	mTerraformLimitsText = getChild<LLTextBox>("terraform_limits");
+	mSubdivideText = getChild<LLTextEditor>("subdivide");
+	mResaleText = getChild<LLTextEditor>("resale");
+	mSaleToText = getChild<LLTextBox>("sale_to");
+
+	return TRUE;
+}
+
+// virtual
+void LLPanelPlaceProfile::resetLocation()
+{
+	LLPanelPlaceInfo::resetLocation();
+
+	mForSalePanel->setVisible(FALSE);
+	mYouAreHerePanel->setVisible(FALSE);
+
+	std::string not_available = getString("not_available");
+	mParcelOwner->setValue(not_available);
+	mLastVisited->setValue(not_available);
+
+	mRatingText->setText(not_available);
+	mVoiceText->setText(not_available);
+	mFlyText->setText(not_available);
+	mPushText->setText(not_available);
+	mBuildText->setText(not_available);
+	mParcelScriptsText->setText(not_available);
+	mDamageText->setText(not_available);
+
+	mRegionNameText->setValue(not_available);
+	mRegionTypeText->setValue(not_available);
+	mRegionRatingText->setValue(not_available);
+	mRegionOwnerText->setValue(not_available);
+	mRegionGroupText->setValue(not_available);
+
+	mEstateNameText->setValue(not_available);
+	mEstateRatingText->setValue(not_available);
+	mEstateOwnerText->setValue(not_available);
+	mCovenantText->setValue(not_available);
+
+	mSalesPriceText->setValue(not_available);
+	mAreaText->setValue(not_available);
+	mTrafficText->setValue(not_available);
+	mPrimitivesText->setValue(not_available);
+	mParcelScriptsText->setValue(not_available);
+	mTerraformLimitsText->setValue(not_available);
+	mSubdivideText->setValue(not_available);
+	mResaleText->setValue(not_available);
+	mSaleToText->setValue(not_available);
+}
+
+// virtual
+void LLPanelPlaceProfile::setInfoType(INFO_TYPE type)
+{
+	bool is_info_type_agent = type == AGENT;
+	bool is_info_type_teleport_history = type == TELEPORT_HISTORY;
+
+	getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent);
+	mMaturityRatingText->setVisible(!is_info_type_agent);
+
+	getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent);
+	mParcelOwner->setVisible(is_info_type_agent);
+
+	getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history);
+	mLastVisited->setVisible(is_info_type_teleport_history);
+
+	getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent);
+
+	switch(type)
+	{
+		case AGENT:
+		case PLACE:
+		default:
+			mCurrentTitle = getString("title_place");
+		break;
+
+		case TELEPORT_HISTORY:
+			mCurrentTitle = getString("title_teleport_history");
+		break;
+	}
+
+	LLPanelPlaceInfo::setInfoType(type);
+}
+
+// virtual
+void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data)
+{
+	LLPanelPlaceInfo::processParcelInfo(parcel_data);
+
+	// HACK: Flag 0x2 == adult region,
+	// Flag 0x1 == mature region, otherwise assume PG
+	std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG);
+	if (parcel_data.flags & 0x2)
+	{
+		rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT);
+	}
+	else if (parcel_data.flags & 0x1)
+	{
+		rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE);
+	}
+
+	mMaturityRatingText->setValue(rating);
+	mRatingText->setValue(rating);
+
+	//update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE
+	//because we deal with remote parcel response format
+	bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) &&
+					 mInfoType == AGENT ? TRUE : FALSE;
+	mForSalePanel->setVisible(is_for_sale);
+}
+
+void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
+													LLViewerRegion* region,
+													const LLVector3d& pos_global,
+													bool is_current_parcel)
+{
+	if (!region || !parcel)
+		return;
+
+	// send EstateCovenantInfo message
+	LLMessageSystem *msg = gMessageSystem;
+	msg->newMessage("EstateCovenantRequest");
+	msg->nextBlockFast(_PREHASH_AgentData);
+	msg->addUUIDFast(_PREHASH_AgentID,	gAgent.getID());
+	msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID());
+	msg->sendReliable(region->getHost());
+
+	LLParcelData parcel_data;
+
+	// HACK: Converting sim access flags to the format
+	// returned by remote parcel response.
+	switch(region->getSimAccess())
+	{
+	case SIM_ACCESS_MATURE:
+		parcel_data.flags = 0x1;
+		break;
+
+	case SIM_ACCESS_ADULT:
+		parcel_data.flags = 0x2;
+		break;
+
+	default:
+		parcel_data.flags = 0;
+	}
+	parcel_data.desc = parcel->getDesc();
+	parcel_data.name = parcel->getName();
+	parcel_data.sim_name = region->getName();
+	parcel_data.snapshot_id = parcel->getSnapshotID();
+	mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
+					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
+					  (F32)pos_global.mdV[VZ]);
+	parcel_data.global_x = pos_global.mdV[VX];
+	parcel_data.global_y = pos_global.mdV[VY];
+	parcel_data.global_z = pos_global.mdV[VZ];
+
+	std::string on = getString("on");
+	std::string off = getString("off");
+
+	// Processing parcel characteristics
+	if (parcel->getParcelFlagAllowVoice())
+	{
+		mVoiceText->setText(on);
+	}
+	else
+	{
+		mVoiceText->setText(off);
+	}
+
+	if (!region->getBlockFly() && parcel->getAllowFly())
+	{
+		mFlyText->setText(on);
+	}
+	else
+	{
+		mFlyText->setText(off);
+	}
+
+	if (region->getRestrictPushObject() || parcel->getRestrictPushObject())
+	{
+		mPushText->setText(off);
+	}
+	else
+	{
+		mPushText->setText(on);
+	}
+
+	if (parcel->getAllowModify())
+	{
+		mBuildText->setText(on);
+	}
+	else
+	{
+		mBuildText->setText(off);
+	}
+
+	if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) ||
+	   (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) ||
+	   !parcel->getAllowOtherScripts())
+	{
+		mScriptsText->setText(off);
+	}
+	else
+	{
+		mScriptsText->setText(on);
+	}
+
+	if (region->getAllowDamage() || parcel->getAllowDamage())
+	{
+		mDamageText->setText(on);
+	}
+	else
+	{
+		mDamageText->setText(off);
+	}
+
+	mRegionNameText->setText(region->getName());
+	mRegionTypeText->setText(region->getSimProductName());
+	mRegionRatingText->setText(region->getSimAccessString());
+
+	// Determine parcel owner
+	if (parcel->isPublic())
+	{
+		mParcelOwner->setText(getString("public"));
+		mRegionOwnerText->setText(getString("public"));
+	}
+	else
+	{
+		if (parcel->getIsGroupOwned())
+		{
+			mRegionOwnerText->setText(getString("group_owned_text"));
+
+			if(!parcel->getGroupID().isNull())
+			{
+				// FIXME: Using parcel group as region group.
+				gCacheName->get(parcel->getGroupID(), TRUE,
+								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionGroupText, _2, _3));
+
+				gCacheName->get(parcel->getGroupID(), TRUE,
+								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3));
+			}
+			else
+			{
+				std::string owner = getString("none_text");
+				mRegionGroupText->setText(owner);
+				mParcelOwner->setText(owner);
+			}
+		}
+		else
+		{
+			// Figure out the owner's name
+			gCacheName->get(parcel->getOwnerID(), FALSE,
+							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3));
+			gCacheName->get(region->getOwner(), FALSE,
+							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionOwnerText, _2, _3));
+		}
+
+		if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
+		{
+			mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text"));
+		}
+	}
+
+	mEstateRatingText->setText(region->getSimAccessString());
+
+	S32 area;
+	S32 claim_price;
+	S32 rent_price;
+	F32 dwell;
+	BOOL for_sale = parcel->getForSale();
+	LLViewerParcelMgr::getInstance()->getDisplayInfo(&area,
+													 &claim_price,
+													 &rent_price,
+													 &for_sale,
+													 &dwell);
+	if (for_sale)
+	{
+		// Adding "For Sale" flag in remote parcel response format.
+		parcel_data.flags |= DFQ_FOR_SALE;
+
+		const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
+		if(auth_buyer_id.notNull())
+		{
+			gCacheName->get(auth_buyer_id, TRUE,
+							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mSaleToText, _2, _3));
+
+			// Show sales info to a specific person or a group he belongs to.
+			if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id))
+			{
+				for_sale = FALSE;
+			}
+		}
+		else
+		{
+			mSaleToText->setText(getString("anyone"));
+		}
+
+		const U8* sign = (U8*)getString("price_text").c_str();
+		const U8* sqm = (U8*)getString("area_text").c_str();
+
+		mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice()));
+		mAreaText->setText(llformat("%d %s", area, sqm));
+		mTrafficText->setText(llformat("%.0f", dwell));
+
+		// Can't have more than region max tasks, regardless of parcel
+		// object bonus factor.
+		S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()),
+							   (S32)region->getMaxTasks());
+
+		const U8* available = (U8*)getString("available").c_str();
+		const U8* allocated = (U8*)getString("allocated").c_str();
+
+		mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated));
+
+		if (parcel->getAllowOtherScripts())
+		{
+			mParcelScriptsText->setText(getString("all_residents_text"));
+		}
+		else if (parcel->getAllowGroupScripts())
+		{
+			mParcelScriptsText->setText(getString("group_text"));
+		}
+		else
+		{
+			mParcelScriptsText->setText(off);
+		}
+
+		mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off);
+
+		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES)
+		{
+			mSubdivideText->setText(getString("can_change"));
+		}
+		else
+		{
+			mSubdivideText->setText(getString("can_not_change"));
+		}
+		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL)
+		{
+			mResaleText->setText(getString("can_not_resell"));
+		}
+		else
+		{
+			mResaleText->setText(getString("can_resell"));
+		}
+	}
+
+	mSelectedParcelID = parcel->getLocalID();
+	mLastSelectedRegionID = region->getRegionID();
+	processParcelInfo(parcel_data);
+
+	mYouAreHerePanel->setVisible(is_current_parcel);
+	getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale);
+}
+
+void LLPanelPlaceProfile::updateEstateName(const std::string& name)
+{
+	mEstateNameText->setText(name);
+}
+
+void LLPanelPlaceProfile::updateEstateOwnerName(const std::string& name)
+{
+	mEstateOwnerText->setText(name);
+}
+
+void LLPanelPlaceProfile::updateCovenantText(const std::string &text)
+{
+	mCovenantText->setText(text);
+}
+
+void LLPanelPlaceProfile::updateLastVisitedText(const LLDate &date)
+{
+	if (date.isNull())
+	{
+		mLastVisited->setText(getString("unknown"));
+	}
+	else
+	{
+		std::string timeStr = getString("acquired_date");
+		LLSD substitution;
+		substitution["datetime"] = (S32) date.secondsSinceEpoch();
+		LLStringUtil::format (timeStr, substitution);
+		mLastVisited->setText(timeStr);
+	}
+}
+
+void LLPanelPlaceProfile::onForSaleBannerClick()
+{
+	LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
+	LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection();
+	LLViewerRegion* selected_region =  mgr->getSelectionRegion();
+	if(!hParcel.isNull() && selected_region)
+	{
+		if(hParcel->getParcel()->getLocalID() == mSelectedParcelID &&
+				mLastSelectedRegionID ==selected_region->getRegionID())
+		{
+			if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0)
+			{
+				LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice());
+			}
+			else
+			{
+				LLViewerParcelMgr::getInstance()->startBuyLand();
+			}
+		}
+		else
+		{
+			LL_WARNS("Places") << "User  is trying  to buy remote parcel.Operation is not supported"<< LL_ENDL;
+		}
+
+	}
+}
+
+// static
+void LLPanelPlaceProfile::updateYouAreHereBanner(void* userdata)
+{
+	//YouAreHere Banner should be displayed only for selected places,
+	// If you want to display it for landmark or teleport history item, you should check by mParcelId
+
+	LLPanelPlaceProfile* self = static_cast<LLPanelPlaceProfile*>(userdata);
+	if(!self->getVisible())
+		return;
+
+	if(!gDisconnected)
+	{
+		static F32 radius = gSavedSettings.getF32("YouAreHereDistance");
+
+		BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID &&
+										LLAgentUI::checkAgentDistance(self->mPosRegion, radius);
+
+		self->mYouAreHerePanel->setVisible(display_banner);
+	}
+}
diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h
new file mode 100644
index 0000000000000000000000000000000000000000..d8e4bcb6bdb7098bcdb64411acab74a88c677eb3
--- /dev/null
+++ b/indra/newview/llpanelplaceprofile.h
@@ -0,0 +1,114 @@
+/**
+ * @file llpanelplaceprofile.h
+ * @brief Displays place profile in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELPLACEPROFILE_H
+#define LL_LLPANELPLACEPROFILE_H
+
+#include "llpanelplaceinfo.h"
+
+class LLTextEditor;
+
+class LLPanelPlaceProfile : public LLPanelPlaceInfo
+{
+public:
+	LLPanelPlaceProfile();
+	/*virtual*/ ~LLPanelPlaceProfile();
+
+	/*virtual*/ BOOL postBuild();
+
+	/*virtual*/ void resetLocation();
+
+	/*virtual*/ void setInfoType(INFO_TYPE type);
+
+	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data);
+
+	// Displays information about the currently selected parcel
+	// without sending a request to the server.
+	// If is_current_parcel true shows "You Are Here" banner.
+	void displaySelectedParcelInfo(LLParcel* parcel,
+								   LLViewerRegion* region,
+								   const LLVector3d& pos_global,
+								   bool is_current_parcel);
+
+	void updateEstateName(const std::string& name);
+	void updateEstateOwnerName(const std::string& name);
+	void updateCovenantText(const std::string &text);
+	void updateLastVisitedText(const LLDate &date);
+
+private:
+	void onForSaleBannerClick();
+
+	static void updateYouAreHereBanner(void*);// added to gIdleCallbacks
+
+	/**
+	 * Holds last displayed parcel. Needed for YouAreHere banner.
+	 */
+	S32					mSelectedParcelID;
+	LLUUID				mLastSelectedRegionID;
+
+	LLPanel*			mForSalePanel;
+	LLPanel*			mYouAreHerePanel;
+
+	LLTextBox*			mParcelOwner;
+	LLTextBox*			mLastVisited;
+
+	LLTextBox*			mRatingText;
+	LLTextBox*			mVoiceText;
+	LLTextBox*			mFlyText;
+	LLTextBox*			mPushText;
+	LLTextBox*			mBuildText;
+	LLTextBox*			mScriptsText;
+	LLTextBox*			mDamageText;
+
+	LLTextBox*			mRegionNameText;
+	LLTextBox*			mRegionTypeText;
+	LLTextBox*			mRegionRatingText;
+	LLTextBox*			mRegionOwnerText;
+	LLTextBox*			mRegionGroupText;
+
+	LLTextBox*			mEstateNameText;
+	LLTextBox*			mEstateRatingText;
+	LLTextBox*			mEstateOwnerText;
+	LLTextEditor*		mCovenantText;
+
+	LLTextBox*			mSalesPriceText;
+	LLTextBox*			mAreaText;
+	LLTextBox*			mTrafficText;
+	LLTextBox*			mPrimitivesText;
+	LLTextBox*			mParcelScriptsText;
+	LLTextBox*			mTerraformLimitsText;
+	LLTextEditor*		mSubdivideText;
+	LLTextEditor*		mResaleText;
+	LLTextBox*			mSaleToText;
+};
+
+#endif // LL_LLPANELPLACEPROFILE_H
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index b2e9110e966311e287f2a29fea78bfbbb0de1efc..66efb96fc7402b1672229d9fcede7c4216f08d7d 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -57,9 +57,10 @@
 #include "llinventorymodel.h"
 #include "lllandmarkactions.h"
 #include "lllandmarklist.h"
-#include "llpanelplaceinfo.h"
+#include "llpanellandmarkinfo.h"
 #include "llpanellandmarks.h"
 #include "llpanelpick.h"
+#include "llpanelplaceprofile.h"
 #include "llpanelteleporthistory.h"
 #include "llteleporthistorystorage.h"
 #include "lltoggleablemenu.h"
@@ -121,7 +122,8 @@ LLPanelPlaces::LLPanelPlaces()
 		mFilterSubString(LLStringUtil::null),
 		mActivePanel(NULL),
 		mFilterEditor(NULL),
-		mPlaceInfo(NULL),
+		mPlaceProfile(NULL),
+		mLandmarkInfo(NULL),
 		mPickPanel(NULL),
 		mItem(NULL),
 		mPlaceMenu(NULL),
@@ -135,7 +137,7 @@ LLPanelPlaces::LLPanelPlaces()
 	gInventory.addObserver(mInventoryObserver);
 
 	LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
-			boost::bind(&LLPanelPlaces::onAgentParcelChange, this));
+			boost::bind(&LLPanelPlaces::updateVerbs, this));
 
 	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
 }
@@ -206,25 +208,32 @@ BOOL LLPanelPlaces::postBuild()
 		mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false));
 	}
 
-	mPlaceInfo = getChild<LLPanelPlaceInfo>("panel_place_info");
+	mPlaceProfile = getChild<LLPanelPlaceProfile>("panel_place_profile");
+	mLandmarkInfo = getChild<LLPanelLandmarkInfo>("panel_landmark_info");
+	if (!mPlaceProfile || !mLandmarkInfo)
+		return FALSE;
 
-	LLButton* back_btn = mPlaceInfo->getChild<LLButton>("back_btn");
+	LLButton* back_btn = mPlaceProfile->getChild<LLButton>("back_btn");
 	back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
 
-	LLLineEditor* title_editor = mPlaceInfo->getChild<LLLineEditor>("title_editor");
+	back_btn = mLandmarkInfo->getChild<LLButton>("back_btn");
+	back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this));
+
+	LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor");
 	title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL);
 
-	LLTextEditor* notes_editor = mPlaceInfo->getChild<LLTextEditor>("notes_editor");
+	LLTextEditor* notes_editor = mLandmarkInfo->getChild<LLTextEditor>("notes_editor");
 	notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
 
-	LLComboBox* folder_combo = mPlaceInfo->getChild<LLComboBox>("folder_combo");
+	LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo");
 	folder_combo->setSelectionCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this));
+
 	return TRUE;
 }
 
 void LLPanelPlaces::onOpen(const LLSD& key)
 {
-	if(mPlaceInfo == NULL || key.size() == 0)
+	if(!mPlaceProfile || !mLandmarkInfo || key.size() == 0)
 		return;
 
 	mFilterEditor->clear();
@@ -239,11 +248,11 @@ void LLPanelPlaces::onOpen(const LLSD& key)
 
 	if (mPlaceInfoType == AGENT_INFO_TYPE)
 	{
-		mPlaceInfo->setInfoType(LLPanelPlaceInfo::AGENT);
+		mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);
 	}
 	else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
 	{
-		mPlaceInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
+		mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);
 
 		if (key.has("x") && key.has("y") && key.has("z"))
 		{
@@ -256,11 +265,11 @@ void LLPanelPlaces::onOpen(const LLSD& key)
 			mPosGlobal = gAgent.getPositionGlobal();
 		}
 
-		mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+		mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);
 	}
 	else if (mPlaceInfoType == LANDMARK_INFO_TYPE)
 	{
-		mPlaceInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
+		mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);
 
 		LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());
 		if (!item)
@@ -270,17 +279,12 @@ void LLPanelPlaces::onOpen(const LLSD& key)
 	}
 	else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
 	{
-		if (mPlaceInfo->isMediaPanelVisible())
-		{
-			toggleMediaPanel();
-		}
-
 		mPosGlobal = LLVector3d(key["x"].asReal(),
 								key["y"].asReal(),
 								key["z"].asReal());
 
-		mPlaceInfo->setInfoType(LLPanelPlaceInfo::PLACE);
-		mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+		mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
+		mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
 	}
 	else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
 	{
@@ -291,9 +295,9 @@ void LLPanelPlaces::onOpen(const LLSD& key)
 
 		mPosGlobal = hist_items[index].mGlobalPos;
 
-		mPlaceInfo->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
-		mPlaceInfo->updateLastVisitedText(hist_items[index].mDate);
-		mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal);
+		mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY);
+		mPlaceProfile->updateLastVisitedText(hist_items[index].mDate);
+		mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
 	}
 
 	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
@@ -321,7 +325,7 @@ void LLPanelPlaces::onOpen(const LLSD& key)
 
 void LLPanelPlaces::setItem(LLInventoryItem* item)
 {
-	if (!mPlaceInfo || !item)
+	if (!mLandmarkInfo || !item)
 		return;
 
 	mItem = item;
@@ -351,19 +355,19 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)
 
 	if (is_landmark_editable)
 	{
-		if(!mPlaceInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull())
+		if(!mLandmarkInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull())
 		{
 			const LLViewerInventoryCategory* cat = gInventory.getCategory(mItem->getParentUUID());
-			if(cat)
+			if (cat)
 			{
-				std::string cat_fullname = LLPanelPlaceInfo::getFullFolderName(cat);
-				LLComboBox* folderList = mPlaceInfo->getChild<LLComboBox>("folder_combo");
-				folderList->add(cat_fullname, cat->getUUID(),ADD_TOP);
+				std::string cat_fullname = LLPanelLandmarkInfo::getFullFolderName(cat);
+				LLComboBox* folderList = mLandmarkInfo->getChild<LLComboBox>("folder_combo");
+				folderList->add(cat_fullname, cat->getUUID(), ADD_TOP);
 			}
 		}
 	}
 
-	mPlaceInfo->displayItemInfo(mItem);
+	mLandmarkInfo->displayItemInfo(mItem);
 
 	LLLandmark* lm = gLandmarkList.getAsset(mItem->getAssetUUID(),
 											boost::bind(&LLPanelPlaces::onLandmarkLoaded, this, _1));
@@ -375,13 +379,13 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)
 
 void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark)
 {
-	if (!mPlaceInfo)
+	if (!mLandmarkInfo)
 		return;
 
 	LLUUID region_id;
 	landmark->getRegionID(region_id);
 	landmark->getGlobalPos(mPosGlobal);
-	mPlaceInfo->displayParcelInfo(region_id, mPosGlobal);
+	mLandmarkInfo->displayParcelInfo(region_id, mPosGlobal);
 }
 
 void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_filter)
@@ -418,10 +422,8 @@ void LLPanelPlaces::onShareButtonClicked()
 
 void LLPanelPlaces::onTeleportButtonClicked()
 {
-	if (!mPlaceInfo)
-		return;
-
-	if (mPlaceInfo->getVisible())
+	LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+	if (panel && panel->getVisible())
 	{
 		if (mPlaceInfoType == LANDMARK_INFO_TYPE)
 		{
@@ -450,10 +452,8 @@ void LLPanelPlaces::onTeleportButtonClicked()
 
 void LLPanelPlaces::onShowOnMapButtonClicked()
 {
-	if (!mPlaceInfo)
-		return;
-
-	if (mPlaceInfo->getVisible())
+	LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+	if (panel && panel->getVisible())
 	{
 		LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
 		if(!worldmap_instance)
@@ -496,31 +496,31 @@ void LLPanelPlaces::onShowOnMapButtonClicked()
 
 void LLPanelPlaces::onEditButtonClicked()
 {
-	if (!mPlaceInfo || isLandmarkEditModeOn)
+	if (!mLandmarkInfo || isLandmarkEditModeOn)
 		return;
 
 	isLandmarkEditModeOn = true;
 
-	mPlaceInfo->toggleLandmarkEditMode(TRUE);
+	mLandmarkInfo->toggleLandmarkEditMode(TRUE);
 
 	updateVerbs();
 }
 
 void LLPanelPlaces::onSaveButtonClicked()
 {
-	if (!mPlaceInfo || mItem.isNull())
+	if (!mLandmarkInfo || mItem.isNull())
 		return;
 
-	std::string current_title_value = mPlaceInfo->getLandmarkTitle();
+	std::string current_title_value = mLandmarkInfo->getLandmarkTitle();
 	std::string item_title_value = mItem->getName();
-	std::string current_notes_value = mPlaceInfo->getLandmarkNotes();
+	std::string current_notes_value = mLandmarkInfo->getLandmarkNotes();
 	std::string item_notes_value = mItem->getDescription();
 
 	LLStringUtil::trim(current_title_value);
 	LLStringUtil::trim(current_notes_value);
 
 	LLUUID item_id = mItem->getUUID();
-	LLUUID folder_id = mPlaceInfo->getLandmarkFolder();
+	LLUUID folder_id = mLandmarkInfo->getLandmarkFolder();
 
 	LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem);
 
@@ -553,7 +553,7 @@ void LLPanelPlaces::onSaveButtonClicked()
 
 void LLPanelPlaces::onCancelButtonClicked()
 {
-	if (!mPlaceInfo)
+	if (!mLandmarkInfo)
 		return;
 
 	if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)
@@ -562,13 +562,13 @@ void LLPanelPlaces::onCancelButtonClicked()
 	}
 	else
 	{
-		mPlaceInfo->toggleLandmarkEditMode(FALSE);
+		mLandmarkInfo->toggleLandmarkEditMode(FALSE);
 		isLandmarkEditModeOn = false;
 
 		updateVerbs();
 
 		// Reload the landmark properties.
-		mPlaceInfo->displayItemInfo(mItem);
+		mLandmarkInfo->displayItemInfo(mItem);
 	}
 }
 
@@ -597,7 +597,7 @@ void LLPanelPlaces::onOverflowButtonClicked()
 		if (mItem.notNull())
 		{
 			const LLUUID& item_id = mItem->getUUID();
-			const LLUUID& trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+			const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 			is_landmark_removable = gInventory.isObjectDescendentOf(item_id, gInventory.getRootFolderID()) &&
 									!gInventory.isObjectDescendentOf(item_id, trash_id);
 		}
@@ -652,9 +652,6 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
 	}
 	else if (item == "pick")
 	{
-		if (!mPlaceInfo)
-			return;
-
 		if (mPickPanel == NULL)
 		{
 			mPickPanel = LLPanelPickEdit::create();
@@ -667,7 +664,12 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
 
 		togglePickPanel(TRUE);
 		mPickPanel->onOpen(LLSD());
-		mPlaceInfo->createPick(mPosGlobal, mPickPanel);
+
+		LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+		if (panel)
+		{
+			panel->createPick(mPosGlobal, mPickPanel);
+		}
 
 		LLRect rect = getRect();
 		mPickPanel->reshape(rect.getWidth(), rect.getHeight());
@@ -677,7 +679,7 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
     {
         if ( mItem.notNull() ) 
         {
-            LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+            const LLUUID& favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
             if ( favorites_id.notNull() )
             {
                 copy_inventory_item(gAgent.getID(),
@@ -694,39 +696,16 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)
 
 void LLPanelPlaces::onBackButtonClicked()
 {
-	if (!mPlaceInfo)
-		return;
-	
-	if (mPlaceInfo->isMediaPanelVisible())
-	{
-		toggleMediaPanel();
-	}
-	else
-	{
-		togglePlaceInfoPanel(FALSE);
+	togglePlaceInfoPanel(FALSE);
 
-		// Resetting mPlaceInfoType when Place Info panel is closed.
-		mPlaceInfoType = LLStringUtil::null;
+	// Resetting mPlaceInfoType when Place Info panel is closed.
+	mPlaceInfoType = LLStringUtil::null;
 
-		isLandmarkEditModeOn = false;
-	}
+	isLandmarkEditModeOn = false;
 
 	updateVerbs();
 }
 
-void LLPanelPlaces::toggleMediaPanel()
-{
-	if (!mPlaceInfo)
-		return;
-
-	mPlaceInfo->toggleMediaPanel(!mPlaceInfo->isMediaPanelVisible());
-
-	// Refresh the current place info because
-	// the media panel controls can't refer to
-	// the remote parcel media.
-	onOpen(LLSD().insert("type", AGENT_INFO_TYPE));
-}
-
 void LLPanelPlaces::togglePickPanel(BOOL visible)
 {
 	setAllChildrenVisible(this, !visible);
@@ -737,26 +716,50 @@ void LLPanelPlaces::togglePickPanel(BOOL visible)
 
 void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)
 {
-	if (!mPlaceInfo)
+	if (!mPlaceProfile || !mLandmarkInfo)
 		return;
 
-	mPlaceInfo->setVisible(visible);
 	mFilterEditor->setVisible(!visible);
 	mTabContainer->setVisible(!visible);
 
-	if (visible)
+	if (mPlaceInfoType == AGENT_INFO_TYPE ||
+		mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
+		mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
 	{
-		mPlaceInfo->resetLocation();
+		mPlaceProfile->setVisible(visible);
 
-		LLRect rect = getRect();
-		LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
-		mPlaceInfo->reshape(new_rect.getWidth(),new_rect.getHeight());
+		if (visible)
+		{
+			mPlaceProfile->resetLocation();
+
+			LLRect rect = getRect();
+			LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
+			mPlaceProfile->reshape(new_rect.getWidth(), new_rect.getHeight());
+
+			mLandmarkInfo->setVisible(FALSE);
+		}
+	}
+	else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
+			 mPlaceInfoType == LANDMARK_INFO_TYPE)
+	{
+		mLandmarkInfo->setVisible(visible);
+
+		if (visible)
+		{
+			mLandmarkInfo->resetLocation();
+
+			LLRect rect = getRect();
+			LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
+			mLandmarkInfo->reshape(new_rect.getWidth(), new_rect.getHeight());
+
+			mPlaceProfile->setVisible(FALSE);
+		}
 	}
 }
 
 void LLPanelPlaces::changedParcelSelection()
 {
-	if (!mPlaceInfo)
+	if (!mPlaceProfile)
 		return;
 
 	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
@@ -782,8 +785,8 @@ void LLPanelPlaces::changedParcelSelection()
 		}
 	}
 
-	mPlaceInfo->resetLocation();
-	mPlaceInfo->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel);
+	mPlaceProfile->resetLocation();
+	mPlaceProfile->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel);
 
 	updateVerbs();
 }
@@ -830,30 +833,22 @@ void LLPanelPlaces::changedInventory(U32 mask)
 	gInventory.removeObserver(mInventoryObserver);
 }
 
-void LLPanelPlaces::onAgentParcelChange()
+void LLPanelPlaces::updateVerbs()
 {
-	if (!mPlaceInfo)
-		return;
+	bool is_place_info_visible;
 
-	if (mPlaceInfo->isMediaPanelVisible())
+	LLPanelPlaceInfo* panel = getCurrentInfoPanel();
+	if (panel)
 	{
-		onOpen(LLSD().insert("type", AGENT_INFO_TYPE));
+		is_place_info_visible = panel->getVisible();
 	}
 	else
 	{
-		updateVerbs();
+		is_place_info_visible = false;
 	}
-}
 
-void LLPanelPlaces::updateVerbs()
-{
-	if (!mPlaceInfo)
-		return;
-
-	bool is_place_info_visible = mPlaceInfo->getVisible();
 	bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE;
 	bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE;
-	bool is_media_panel_visible = mPlaceInfo->isMediaPanelVisible();
 
 	mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
 	mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
@@ -864,7 +859,7 @@ void LLPanelPlaces::updateVerbs()
 	mCancelBtn->setVisible(isLandmarkEditModeOn);
 	mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
 
-	mOverflowBtn->setEnabled(is_place_info_visible && !is_media_panel_visible && !is_create_landmark_visible);
+	mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible);
 
 	if (is_place_info_visible)
 	{
@@ -872,16 +867,13 @@ void LLPanelPlaces::updateVerbs()
 		{
 			// We don't need to teleport to the current location
 			// so check if the location is not within the current parcel.
-			mTeleportBtn->setEnabled(!is_media_panel_visible &&
-									 !mPosGlobal.isExactlyZero() &&
+			mTeleportBtn->setEnabled(!mPosGlobal.isExactlyZero() &&
 									 !LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal));
 		}
 		else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
 		{
 			mTeleportBtn->setEnabled(TRUE);
 		}
-
-		mShowOnMapBtn->setEnabled(!is_media_panel_visible);
 	}
 	else
 	{
@@ -890,6 +882,23 @@ void LLPanelPlaces::updateVerbs()
 	}
 }
 
+LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel()
+{
+	if (mPlaceInfoType == AGENT_INFO_TYPE ||
+		mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
+		mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
+	{
+		return mPlaceProfile;
+	}
+	else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE ||
+			 mPlaceInfoType == LANDMARK_INFO_TYPE)
+	{
+		return mLandmarkInfo;
+	}
+
+	return NULL;
+}
+
 static bool is_agent_in_selected_parcel(LLParcel* parcel)
 {
 	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h
index e2d281dd84061a6434f20cfbe575ad0842d22bed..39eb5261db4afdb94b6e5d85ede3ca54bd2d71af 100644
--- a/indra/newview/llpanelplaces.h
+++ b/indra/newview/llpanelplaces.h
@@ -37,6 +37,10 @@
 class LLInventoryItem;
 class LLFilterEditor;
 class LLLandmark;
+
+class LLPanelLandmarkInfo;
+class LLPanelPlaceProfile;
+
 class LLPanelPickEdit;
 class LLPanelPlaceInfo;
 class LLPanelPlacesTab;
@@ -85,13 +89,16 @@ class LLPanelPlaces : public LLPanel
 	void togglePickPanel(BOOL visible);
 	void togglePlaceInfoPanel(BOOL visible);
 
-	void onAgentParcelChange();
 	void updateVerbs();
 
+	LLPanelPlaceInfo* getCurrentInfoPanel();
+
 	LLFilterEditor*				mFilterEditor;
 	LLPanelPlacesTab*			mActivePanel;
 	LLTabContainer*				mTabContainer;
-	LLPanelPlaceInfo*			mPlaceInfo;
+	LLPanelPlaceProfile*		mPlaceProfile;
+	LLPanelLandmarkInfo*		mLandmarkInfo;
+
 	LLPanelPickEdit*			mPickPanel;
 	LLToggleableMenu*			mPlaceMenu;
 	LLToggleableMenu*			mLandmarkMenu;
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index e4b32c4820d379cbe98ddcc317995c6f03a88f01..0b2a7e8756bd161f13d6deb9ffcd8b0cc25c540d 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -228,7 +228,10 @@ void LLPanelPrimMediaControls::updateShape()
 
 	bool can_navigate = parcel->getMediaAllowNavigate();
 	bool enabled = false;
-	bool has_focus = media_impl->hasFocus();
+	// There is no such thing as "has_focus" being different from normal controls set
+	// anymore (as of user feedback from bri 10/09).  So we cheat here and force 'has_focus'
+	// to 'true' (or, actually, we use a setting)
+	bool has_focus = (gSavedSettings.getBOOL("PrimMediaControlsUseHoverControlSet")) ? media_impl->hasFocus() : true;
 	setVisible(enabled);
 
 	if (objectp)
@@ -310,8 +313,8 @@ void LLPanelPrimMediaControls::updateShape()
 			fwd_ctrl->setEnabled(has_focus);
 			media_address_ctrl->setVisible(false);
 			media_address_ctrl->setEnabled(false);
-			media_play_slider_panel->setVisible(!mini_controls);
-			media_play_slider_panel->setEnabled(!mini_controls);
+			media_play_slider_panel->setVisible(has_focus && !mini_controls);
+			media_play_slider_panel->setEnabled(has_focus && !mini_controls);
 				
 			volume_ctrl->setVisible(has_focus);
 			volume_up_ctrl->setVisible(has_focus);
@@ -688,24 +691,31 @@ bool LLPanelPrimMediaControls::isMouseOver()
 		getWindow()->getCursorPosition(&cursor_pos_window);
 		getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl);
 		
-		LLPanel* controls_panel = NULL;
-		controls_panel = getChild<LLPanel>("media_hover_controls");
-		if(controls_panel && !controls_panel->getVisible())
-		{
-			// The hover controls aren't visible -- use the focused controls instead.
-			controls_panel = getChild<LLPanel>("media_focused_controls");
-		}
+		LLView* controls_view = NULL;
+		controls_view = getChild<LLView>("media_controls");
 		
-		if(controls_panel && controls_panel->getVisible())
+		if(controls_view && controls_view->getVisible())
 		{
-			controls_panel->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
+			controls_view->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
 
-			LLView *hit_child = controls_panel->childFromPoint(x, y);
-			if(hit_child)
+			LLView *hit_child = controls_view->childFromPoint(x, y);
+			if(hit_child && hit_child->getVisible())
 			{
 				// This was useful for debugging both coordinate translation and view hieararchy problems...
-//				llinfos << "mouse coords: " << x << ", " << y << " hit child " << hit_child->getName() << llendl;
-				result = true;
+				// llinfos << "mouse coords: " << x << ", " << y << " hit child " << hit_child->getName() << llendl;
+
+				// This will be a direct child of the LLLayoutStack, which should be a layout_panel.
+				// These may not shown/hidden by the logic in updateShape(), so we need to do another hit test on the children of the layout panel,
+				// which are the actual controls.
+				hit_child->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
+				
+				LLView *hit_child_2 = hit_child->childFromPoint(x, y);
+				if(hit_child_2 && hit_child_2->getVisible())
+				{
+					// This was useful for debugging both coordinate translation and view hieararchy problems...
+					// llinfos << "    mouse coords: " << x << ", " << y << " hit child 2 " << hit_child_2->getName() << llendl;
+					result = true;
+				}
 			}
 		}
 	}
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index bec670cdaa7f74b1ff3df25197d5e4c990e192fe..8147ff17f0fc2bda63efcc067d6aa042c61b764a 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -59,17 +59,61 @@ class LLAgentHandler : public LLCommandHandler
 			return false;
 		}
 
-		if (params[1].asString() == "about")
+		const std::string verb = params[1].asString();
+		if (verb == "about")
 		{
 			LLAvatarActions::showProfile(avatar_id);
 			return true;
 		}
 
-		if (params[1].asString() == "inspect")
+		if (verb == "inspect")
 		{
 			LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", avatar_id));
 			return true;
 		}
+
+		if (verb == "im")
+		{
+			LLAvatarActions::startIM(avatar_id);
+			return true;
+		}
+
+		if (verb == "pay")
+		{
+			LLAvatarActions::pay(avatar_id);
+			return true;
+		}
+
+		if (verb == "offerteleport")
+		{
+			LLAvatarActions::offerTeleport(avatar_id);
+			return true;
+		}
+
+		if (verb == "requestfriend")
+		{
+			LLAvatarActions::requestFriendshipDialog(avatar_id);
+			return true;
+		}
+
+		if (verb == "mute")
+		{
+			if (! LLAvatarActions::isBlocked(avatar_id))
+			{
+				LLAvatarActions::toggleBlock(avatar_id);
+			}
+			return true;
+		}
+
+		if (verb == "unmute")
+		{
+			if (LLAvatarActions::isBlocked(avatar_id))
+			{
+				LLAvatarActions::toggleBlock(avatar_id);
+			}
+			return true;
+		}
+
 		return false;
 	}
 };
diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h
index b59d1d42f31acbcda672ae1f9379829adb3d3bc5..45c2fc116e7ff4ec0f8f8b2bbb5c12a793f9b114 100644
--- a/indra/newview/llpanelprofileview.h
+++ b/indra/newview/llpanelprofileview.h
@@ -36,6 +36,8 @@
 #include "llpanel.h"
 #include "llpanelprofile.h"
 #include "llavatarpropertiesprocessor.h"
+#include "llagent.h"
+#include "lltooldraganddrop.h"
 
 class LLPanelProfile;
 class LLPanelProfileTab;
@@ -64,6 +66,18 @@ class LLPanelProfileView : public LLPanelProfile
 
 	/*virtual*/ void togglePanel(LLPanel* panel);
 
+	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
+						   BOOL drop, EDragAndDropType cargo_type,
+						   void *cargo_data, EAcceptance *accept,
+						   std::string& tooltip_msg)
+	{
+		LLToolDragAndDrop::handleGiveDragAndDrop(getAvatarId(), gAgent.getSessionID(), drop,
+				 cargo_type, cargo_data, accept);
+
+		return TRUE;
+	}
+
+
 protected:
 
 	void onBackBtnClick();
diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp
index 4ac109bf3d2391c754896b8dd6b16dca7ba6583c..5a70842a733bf0d1e525733ea74cac9cfa098cc8 100644
--- a/indra/newview/llpanelvolume.cpp
+++ b/indra/newview/llpanelvolume.cpp
@@ -57,7 +57,6 @@
 #include "llfirstuse.h"
 #include "llfocusmgr.h"
 #include "llmanipscale.h"
-#include "llpanelinventory.h"
 #include "llpreviewscript.h"
 #include "llresmgr.h"
 #include "llselectmgr.h"
diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h
index 9d197aafa58b00d66f0aa265cbc7951271eca468..7bc935f986f053497611784610d64a0a17cc1dfc 100644
--- a/indra/newview/llpanelvolume.h
+++ b/indra/newview/llpanelvolume.h
@@ -45,7 +45,6 @@ class LLUICtrl;
 class LLButton;
 class LLViewerObject;
 class LLComboBox;
-class LLPanelInventory;
 class LLColorSwatchCtrl;
 
 class LLPanelVolume : public LLPanel
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index e97eb1df2b66e8f1df7f4145e31f9c07acaf35bb..9450bee315328c61a82290762c2ed1c7992e1573 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -32,6 +32,11 @@
 
 #include "llviewerprecompiledheaders.h"
 
+// common includes
+#include "lltrans.h"
+#include "llavataractions.h"
+#include "llagent.h"
+
 #include "llparticipantlist.h"
 #include "llavatarlist.h"
 #include "llspeakers.h"
@@ -39,15 +44,18 @@
 //LLParticipantList retrieves add, clear and remove events and updates view accordingly 
 LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list):
 	mSpeakerMgr(data_source),
-	mAvatarList(avatar_list)
+	mAvatarList(avatar_list),
+	mSpeakerAddListener(*this),
+	mSpeakerRemoveListener(*this),
+	mSpeakerClearListener(*this),
+	mSortOrder(E_SORT_BY_NAME)
 {
-	mSpeakerAddListener = new SpeakerAddListener(mAvatarList);
-	mSpeakerRemoveListener = new SpeakerRemoveListener(mAvatarList);
-	mSpeakerClearListener = new SpeakerClearListener(mAvatarList);
+	mSpeakerMgr->addListener(&mSpeakerAddListener, "add");
+	mSpeakerMgr->addListener(&mSpeakerRemoveListener, "remove");
+	mSpeakerMgr->addListener(&mSpeakerClearListener, "clear");
 
-	mSpeakerMgr->addListener(mSpeakerAddListener, "add");
-	mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove");
-	mSpeakerMgr->addListener(mSpeakerClearListener, "clear");
+	mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
+	mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
 
 	//Lets fill avatarList with existing speakers
 	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
@@ -58,24 +66,33 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
 	{
 		group_members.push_back((*it)->mID);
 	}
-	mAvatarList->setDirty();
-	mAvatarList->sortByName();
+	sort();
 }
 
 LLParticipantList::~LLParticipantList()
 {
-	delete mSpeakerAddListener;
-	delete mSpeakerRemoveListener;
-	delete mSpeakerClearListener;
-	mSpeakerAddListener = NULL;
-	mSpeakerRemoveListener = NULL;
-	mSpeakerClearListener = NULL;
 }
 
-//
-// LLParticipantList::SpeakerAddListener
-//
-bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list)
+{
+	LLUUID clicked_id = list->getSelectedUUID();
+
+	if (clicked_id.isNull() || clicked_id == gAgent.getID())
+		return;
+	
+	LLAvatarActions::startIM(clicked_id);
+}
+
+void LLParticipantList::setSortOrder(EParticipantSortOrder order)
+{
+	if ( mSortOrder != order )
+	{
+		mSortOrder = order;
+		sort();
+	}
+}
+
+bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
 {
 	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
 	LLUUID uu_id = event->getValue().asUUID();
@@ -88,15 +105,11 @@ bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::L
 	}
 
 	group_members.push_back(uu_id);
-	mAvatarList->setDirty();
-	mAvatarList->sortByName();
+	sort();
 	return true;
 }
 
-//
-// LLParticipantList::SpeakerRemoveListener
-//
-bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
 {
 	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
 	LLAvatarList::uuid_vector_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID());
@@ -108,10 +121,7 @@ bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents
 	return true;
 }
 
-//
-// LLParticipantList::SpeakerClearListener
-//
-bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
 {
 	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
 	group_members.clear();
@@ -119,3 +129,45 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents:
 	return true;
 }
 
+void LLParticipantList::sort()
+{
+	if ( !mAvatarList )
+		return;
+
+	// Mark AvatarList as dirty one
+	mAvatarList->setDirty();
+
+	// TODO: Implement more sorting orders after specs updating (EM)
+	switch ( mSortOrder ) {
+	case E_SORT_BY_NAME :
+		mAvatarList->sortByName();
+		break;
+	default :
+		llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl;
+		return;
+	}
+}
+
+//
+// LLParticipantList::SpeakerAddListener
+//
+bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+	return mParent.onAddItemEvent(event, userdata);
+}
+
+//
+// LLParticipantList::SpeakerRemoveListener
+//
+bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+	return mParent.onRemoveItemEvent(event, userdata);
+}
+
+//
+// LLParticipantList::SpeakerClearListener
+//
+bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
+{
+	return mParent.onClearListEvent(event, userdata);
+}
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 68aae0aee540dca7e64e12d1aa4a622efccaeb00..04d9e2925682cdd24bdd297307b617b27d6432ea 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -38,46 +38,74 @@ class LLAvatarList;
 
 class LLParticipantList
 {
+	LOG_CLASS(LLParticipantList);
 	public:
 		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);
 		~LLParticipantList();
 
+		typedef enum e_participant_sort_oder {
+			E_SORT_BY_NAME = 0,
+		} EParticipantSortOrder;
+
+		/**
+		  * Set and sort Avatarlist by given order
+		  */
+		void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME);
+
 	protected:
+		/**
+		 * LLSpeakerMgr event handlers
+		 */
+		bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+		bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+		bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
+
+		/**
+		 * Sorts the Avatarlist by stored order
+		 */
+		void sort();
 
 		//List of listeners implementing LLOldEvents::LLSimpleListener.
 		//There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way
 		//that one listener can handle only one type of event
-		class SpeakerAddListener : public LLOldEvents::LLSimpleListener
+		class BaseSpeakerListner : public LLOldEvents::LLSimpleListener
 		{
 		public:
-			SpeakerAddListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
+			BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {}
+		protected:
+			LLParticipantList& mParent;
+		};
 
+		class SpeakerAddListener : public BaseSpeakerListner
+		{
+		public:
+			SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
 			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
-			LLAvatarList* mAvatarList;
 		};
 
-		class SpeakerRemoveListener : public LLOldEvents::LLSimpleListener
+		class SpeakerRemoveListener : public BaseSpeakerListner
 		{
 		public:
-			SpeakerRemoveListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
-
+			SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
 			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
-			LLAvatarList* mAvatarList;
 		};
 
-		class SpeakerClearListener : public LLOldEvents::LLSimpleListener
+		class SpeakerClearListener : public BaseSpeakerListner
 		{
 		public:
-			SpeakerClearListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {}
-
+			SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}
 			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata);
-			LLAvatarList* mAvatarList;
 		};
+
 	private:
+		void onAvatarListDoubleClicked(LLAvatarList* list);
+
 		LLSpeakerMgr*		mSpeakerMgr;
-		LLAvatarList* 		mAvatarList;
+		LLAvatarList*		mAvatarList;
+
+		SpeakerAddListener		mSpeakerAddListener;
+		SpeakerRemoveListener	mSpeakerRemoveListener;
+		SpeakerClearListener	mSpeakerClearListener;
 
-		SpeakerAddListener* mSpeakerAddListener;
-		SpeakerRemoveListener* mSpeakerRemoveListener;
-		SpeakerClearListener* mSpeakerClearListener;
+		EParticipantSortOrder	mSortOrder;
 };
diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp
index b3b48577278f291d02494c2aae3637ef723ed3c0..83443687c92646a86af29f0205ec2dc01516ee3a 100644
--- a/indra/newview/llplacesinventorybridge.cpp
+++ b/indra/newview/llplacesinventorybridge.cpp
@@ -38,6 +38,7 @@
 
 #include "llfloaterinventory.h" // for LLInventoryPanel
 #include "llfolderview.h" // for FIRST_SELECTED_ITEM
+#include "llinventorypanel.h"
 
 
 static const std::string LANDMARKS_INVENTORY_LIST_NAME("landmarks_list");
@@ -83,7 +84,7 @@ void LLPlacesLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 		// they should be synchronized with Places/My Landmarks/Gear menu. See EXT-1601 
 	}
 
-	hideContextEntries(menu, items, disabled_items);
+	hide_context_entries(menu, items, disabled_items);
 }
 
 
@@ -116,7 +117,7 @@ void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 		// repeat parent functionality
  		sSelf = this; // necessary for "New Folder" functionality
 
-		hideContextEntries(menu, items, disabled_items);
+		hide_context_entries(menu, items, disabled_items);
 	}
 }
 
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index b06e70c00af466743aa88e0b3b023cfef8199d67..34e78b5c469abce87d5aef2c54988ce79f6f9f83 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -45,6 +45,7 @@
 #include "lltooldraganddrop.h"
 #include "llradiogroup.h"
 #include "llassetstorage.h"
+#include "llviewerassettype.h"
 #include "llviewerobject.h"
 #include "llviewerobjectlist.h"
 #include "lldbstrings.h"
@@ -317,7 +318,7 @@ BOOL LLPreview::handleHover(S32 x, S32 y, MASK mask)
 		   && LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y))
 		{
 			EDragAndDropType type;
-			type = LLAssetType::lookupDragAndDropType(item->getType());
+			type = LLViewerAssetType::lookupDragAndDropType(item->getType());
 			LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_LIBRARY;
 			if(!mObjectUUID.isNull())
 			{
@@ -406,7 +407,7 @@ void LLPreview::onDiscardBtn(void* data)
 	*/
 
 	// Move the item to the trash
-	LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	if (item->getParentUUID() != trash_id)
 	{
 		LLInventoryModel::update_list_t update;
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index ab2afb80560c572d304421b99dceddb64fad66f8..7b3a20d1020edf7323f7760f4c74edbb377cf9ae 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -130,10 +130,10 @@ LLPreviewGesture* LLPreviewGesture::show(const LLUUID& item_id, const LLUUID& ob
 	preview->setObjectID(object_id);
 	
 	// Start speculative download of sounds and animations
-	LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_ANIMATION);
+	const LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ANIMATION);
 	gInventory.startBackgroundFetch(animation_folder_id);
 
-	LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_SOUND);
+	const LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SOUND);
 	gInventory.startBackgroundFetch(sound_folder_id);
 
 	// this will call refresh when we have everything.
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index ac7abf14485da500d2c80ddbe38e5931ef15228d..2382befcfa7144435ad602aee25fd1b95e30589d 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -89,7 +89,6 @@
 #include "lltrans.h"
 #include "llviewercontrol.h"
 #include "llappviewer.h"
-#include "llpanelinventory.h"
 
 const std::string HELLO_LSL =
 	"default\n"
@@ -452,7 +451,7 @@ bool LLScriptEdCore::hasChanged()
 {
 	if (!mEditor) return false;
 
-	return !mEditor->isPristine();
+	return ((!mEditor->isPristine() || mEnableSave) && mHasScriptData);
 }
 
 void LLScriptEdCore::draw()
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 9c21faa3be5d386ea38bcd604cf909b57bef7fe7..86fa2c4695a672d31a842829210c2a17ab144431 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -552,7 +552,7 @@ void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata)
 
 void LLPreviewTexture::loadAsset()
 {
-	mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+	mImage = LLViewerTextureManager::getFetchedTexture(mImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 	mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
 	mAssetStatus = PREVIEW_ASSET_LOADING;
 	updateDimensions();
diff --git a/indra/newview/llresourcedata.h b/indra/newview/llresourcedata.h
index 46b79150bbf4c54cabbf45971a2ba19b8c30cd72..b4b90426895daa292c8ed8a095b113ef2c4d353c 100644
--- a/indra/newview/llresourcedata.h
+++ b/indra/newview/llresourcedata.h
@@ -39,11 +39,12 @@
 struct LLResourceData
 {
 	LLAssetInfo mAssetInfo;
-	LLAssetType::EType mPreferredLocation;
+	LLFolderType::EType mPreferredLocation;
 	LLInventoryType::EType mInventoryType;
 	U32 mNextOwnerPerm;
 	S32 mExpectedUploadCost;
 	void *mUserData;
+	static const S8 INVALID_LOCATION = -2;
 };
 
 #endif
diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp
index 0a520ff65fbb155803fd9da76a1288e1fdd418dd..1fbaeb94f534b1378402f6a36a829d659bf0a080 100644
--- a/indra/newview/llscrollingpanelparam.cpp
+++ b/indra/newview/llscrollingpanelparam.cpp
@@ -209,7 +209,7 @@ void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata)
 	F32 new_weight = self->percentToWeight( (F32)slider->getValue().asReal() );
 	if (current_weight != new_weight )
 	{
-		self->mWearable->setVisualParamWeight( param->getID(), new_weight, TRUE );
+		self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE );
 		gAgent.getAvatarObject()->updateVisualParams();
 	}
 }
@@ -298,7 +298,7 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint )
 			if (slider->getMinValue() < new_percent
 				&& new_percent < slider->getMaxValue())
 			{
-				mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, TRUE);
+				mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, FALSE);
 				gAgent.getAvatarObject()->updateVisualParams();
 
 				slider->setValue( weightToPercent( new_weight ) );
@@ -330,7 +330,7 @@ void LLScrollingPanelParam::onHintMinMouseUp( void* userdata )
 			if (slider->getMinValue() < new_percent
 				&& new_percent < slider->getMaxValue())
 			{
-				self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, TRUE);
+				self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE);
 				slider->setValue( self->weightToPercent( new_weight ) );
 			}
 		}
@@ -364,7 +364,7 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata )
 				if (slider->getMinValue() < new_percent
 					&& new_percent < slider->getMaxValue())
 				{
-					self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, TRUE);
+					self->mWearable->setVisualParamWeight(hint->getVisualParam()->getID(), new_weight, FALSE);
 					slider->setValue( self->weightToPercent( new_weight ) );
 				}
 			}
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index d68897b64f6a79465af1d0a8048a5fdc920d1fa9..26e668adb5aa71a5febfb123b6dc64978244615d 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -801,6 +801,8 @@ LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32
 		return NULL;
 	}
 
+	mHoverObjects->mPrimaryObject = objectp; 
+
 	objectp = objectp->getRootEdit();
 
 	// is the requested object the same as the existing hover object root?
@@ -834,6 +836,11 @@ LLSelectNode *LLSelectMgr::getHoverNode()
 	return mHoverObjects->getFirstRootNode();
 }
 
+LLSelectNode *LLSelectMgr::getPrimaryHoverNode()
+{
+	return mHoverObjects->mSelectNodeMap[mHoverObjects->mPrimaryObject];
+}
+
 void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp)
 {
 	if (!objectp)
@@ -1441,7 +1448,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
 				// Texture picker defaults aren't inventory items
 				// * Don't need to worry about permissions for them
 				// * Can just apply the texture and be done with it.
-				objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE));
+				objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
 			}
 			return true;
 		}
@@ -1597,7 +1604,7 @@ BOOL LLSelectMgr::selectionRevertTextures()
 					}
 					else
 					{
-						object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE));
+						object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
 					}
 				}
 			}
@@ -2820,7 +2827,7 @@ bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response,
 	case 0:
 		{
 			// TODO: Make sure you have delete permissions on all of them.
-			LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+			const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 			// attempt to derez into the trash.
 			LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id);
 			LLSelectMgr::getInstance()->sendListToRegions("DeRezObject",
@@ -4597,7 +4604,7 @@ void LLSelectMgr::updateSilhouettes()
 
 	if (!mSilhouetteImagep)
 	{
-		mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, TRUE);
+		mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, LLViewerTexture::BOOST_UI);
 	}
 
 	mHighlightedObjects->cleanupNodes();
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 6e757ef976fc05bc6a2e315adf07788bc7997e70..2050a73f2675c8518fcc3d6957389623bcbd6753 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -404,6 +404,7 @@ class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
 
 	LLObjectSelectionHandle setHoverObject(LLViewerObject *objectp, S32 face = -1);
 	LLSelectNode *getHoverNode();
+	LLSelectNode *getPrimaryHoverNode();
 
 	void highlightObjectOnly(LLViewerObject *objectp);
 	void highlightObjectAndFamily(LLViewerObject *objectp);
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3cf17fb7f272133156f531d6f51167af2821ca61
--- /dev/null
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -0,0 +1,244 @@
+/**
+ * @file LLSidepanelInventory.cpp
+ * @brief Side Bar "Inventory" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llsidepanelinventory.h"
+
+#include "llagent.h"
+#include "llbutton.h"
+#include "llinventorybridge.h"
+#include "llinventorypanel.h"
+#include "llpanelmaininventory.h"
+#include "llsidepanelobjectinfo.h"
+#include "lltabcontainer.h"
+
+static const S32 LANDMARK_FOLDERS_MENU_WIDTH = 250;
+static const std::string AGENT_INFO_TYPE			= "agent";
+static const std::string CREATE_LANDMARK_INFO_TYPE	= "create_landmark";
+static const std::string LANDMARK_INFO_TYPE			= "landmark";
+static const std::string REMOTE_PLACE_INFO_TYPE		= "remote_place";
+static const std::string TELEPORT_HISTORY_INFO_TYPE	= "teleport_history";
+
+static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
+
+LLSidepanelInventory::LLSidepanelInventory()
+	:	LLPanel(),
+		mSidepanelObjectInfo(NULL)
+{
+
+	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
+}
+
+LLSidepanelInventory::~LLSidepanelInventory()
+{
+}
+
+BOOL LLSidepanelInventory::postBuild()
+{
+	mInfoBtn = getChild<LLButton>("info_btn");
+	mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this));
+
+	mShareBtn = getChild<LLButton>("share_btn");
+	mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this));
+
+	mShareBtn = getChild<LLButton>("share_btn");
+	mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this));
+
+	mWearBtn = getChild<LLButton>("wear_btn");
+	mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this));
+
+	mPlayBtn = getChild<LLButton>("play_btn");
+	mPlayBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onPlayButtonClicked, this));
+
+	mTeleportBtn = getChild<LLButton>("teleport_btn");
+	mTeleportBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onTeleportButtonClicked, this));
+
+	mOverflowBtn = getChild<LLButton>("overflow_btn");
+	mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this));
+
+	mTabContainer = getChild<LLTabContainer>("Inventory Tabs");
+	mSidepanelObjectInfo = getChild<LLSidepanelObjectInfo>("sidepanel_object_info");
+
+	mPanelMainInventory = getChild<LLPanelMainInventory>("panel_main_inventory");
+	mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
+
+	LLButton* back_btn = mSidepanelObjectInfo->getChild<LLButton>("back_btn");
+	back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this));
+
+	return TRUE;
+}
+
+void LLSidepanelInventory::onOpen(const LLSD& key)
+{
+	if(key.size() == 0)
+		return;
+
+	mSidepanelObjectInfo->reset();
+
+	if (key.has("id"))
+	{
+		mSidepanelObjectInfo->setItemID(key["id"].asUUID());
+	}
+	
+	if (key.has("object"))
+	{
+		mSidepanelObjectInfo->setObjectID(key["object"].asUUID());
+	}
+
+	toggleObjectInfoPanel(TRUE);
+}
+
+void LLSidepanelInventory::onInfoButtonClicked()
+{
+	LLInventoryItem *item = getSelectedItem();
+	if (item)
+	{
+		mSidepanelObjectInfo->reset();
+		mSidepanelObjectInfo->setItemID(item->getUUID());
+		toggleObjectInfoPanel(TRUE);
+	}
+}
+
+void LLSidepanelInventory::onShareButtonClicked()
+{
+}
+
+void LLSidepanelInventory::performActionOnSelection(const std::string &action)
+{
+	LLInventoryPanel *panel = mPanelMainInventory->getActivePanel();
+	LLFolderViewItem* current_item = panel->getRootFolder()->getCurSelectedItem();
+	if (!current_item)
+	{
+		return;
+	}
+	current_item->getListener()->performAction(panel->getRootFolder(), panel->getModel(), action);
+}
+
+void LLSidepanelInventory::onWearButtonClicked()
+{
+	performActionOnSelection("wear");
+	performActionOnSelection("attach");
+}
+
+void LLSidepanelInventory::onPlayButtonClicked()
+{
+	performActionOnSelection("activate");
+}
+
+void LLSidepanelInventory::onTeleportButtonClicked()
+{
+	performActionOnSelection("teleport");
+}
+
+void LLSidepanelInventory::onOverflowButtonClicked()
+{
+}
+
+void LLSidepanelInventory::onBackButtonClicked()
+{
+	toggleObjectInfoPanel(FALSE);
+	updateVerbs();
+}
+
+void LLSidepanelInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+{
+	updateVerbs();
+}
+
+void LLSidepanelInventory::toggleObjectInfoPanel(BOOL visible)
+{
+	mSidepanelObjectInfo->setVisible(visible);
+	mTabContainer->setVisible(!visible);
+
+	if (visible)
+	{
+		mSidepanelObjectInfo->reset();
+		mSidepanelObjectInfo->setEditMode(FALSE);
+
+		LLRect rect = getRect();
+		LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom);
+		mSidepanelObjectInfo->reshape(new_rect.getWidth(),new_rect.getHeight());
+	}
+}
+
+void LLSidepanelInventory::updateVerbs()
+{
+	mInfoBtn->setEnabled(FALSE);
+	mShareBtn->setEnabled(FALSE);
+
+	mWearBtn->setVisible(FALSE);
+	mWearBtn->setEnabled(FALSE);
+	mPlayBtn->setVisible(FALSE);
+	mPlayBtn->setEnabled(FALSE);
+ 	mTeleportBtn->setVisible(FALSE);
+ 	mTeleportBtn->setEnabled(FALSE);
+	
+	const LLInventoryItem *item = getSelectedItem();
+	if (!item)
+		return;
+
+	mInfoBtn->setEnabled(TRUE);
+	mShareBtn->setEnabled(TRUE);
+
+	switch(item->getInventoryType())
+	{
+		case LLInventoryType::IT_WEARABLE:
+		case LLInventoryType::IT_OBJECT:
+		case LLInventoryType::IT_ATTACHMENT:
+			mWearBtn->setVisible(TRUE);
+			mWearBtn->setEnabled(TRUE);
+			break;
+		case LLInventoryType::IT_SOUND:
+		case LLInventoryType::IT_GESTURE:
+		case LLInventoryType::IT_ANIMATION:
+			mPlayBtn->setVisible(TRUE);
+			mPlayBtn->setEnabled(TRUE);
+			break;
+		case LLInventoryType::IT_LANDMARK:
+			mTeleportBtn->setVisible(TRUE);
+			mTeleportBtn->setEnabled(TRUE);
+			break;
+		default:
+			break;
+	}
+}
+
+LLInventoryItem *LLSidepanelInventory::getSelectedItem()
+{
+	LLFolderViewItem* current_item = mPanelMainInventory->getActivePanel()->getRootFolder()->getCurSelectedItem();
+	if (!current_item)
+	{
+		return NULL;
+	}
+	const LLUUID &item_id = current_item->getListener()->getUUID();
+	LLInventoryItem *item = gInventory.getItem(item_id);
+	return item;
+}
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
new file mode 100644
index 0000000000000000000000000000000000000000..62eeecc5e2336311b48fd3a40336ed8663115226
--- /dev/null
+++ b/indra/newview/llsidepanelinventory.h
@@ -0,0 +1,80 @@
+/** 
+ * @file LLSidepanelInventory.h
+ * @brief Side Bar "Inventory" panel
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSIDEPANELINVENTORY_H
+#define LL_LLSIDEPANELINVENTORY_H
+
+#include "llpanel.h"
+
+class LLInventoryItem;
+class LLSidepanelObjectInfo;
+class LLTabContainer;
+class LLPanelMainInventory;
+class LLFolderViewItem;
+
+class LLSidepanelInventory : public LLPanel
+{
+public:
+	LLSidepanelInventory();
+	virtual ~LLSidepanelInventory();
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
+
+protected:
+	LLInventoryItem *getSelectedItem();
+	void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+	void onTabSelected();
+	void toggleObjectInfoPanel(BOOL visible);
+	void updateVerbs();
+	void performActionOnSelection(const std::string &action);
+
+	LLTabContainer*				mTabContainer;
+	LLSidepanelObjectInfo*		mSidepanelObjectInfo;
+	LLPanelMainInventory*		mPanelMainInventory;
+
+	void 						onInfoButtonClicked();
+	void 						onShareButtonClicked();
+	void 						onWearButtonClicked();
+	void 						onPlayButtonClicked();
+	void 						onTeleportButtonClicked();
+	void 						onOverflowButtonClicked();
+	void 						onBackButtonClicked();
+	
+	LLButton*					mInfoBtn;
+	LLButton*					mShareBtn;
+	LLButton*					mWearBtn;
+	LLButton*					mPlayBtn;
+	LLButton*					mTeleportBtn;
+	LLButton*					mOverflowBtn;
+};
+
+#endif //LL_LLSIDEPANELINVENTORY_H
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 9f317803ce745c5cea1579136ad290b881227f29..279e14385199aad63543fb58a0120e746abd9a80 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -2704,7 +2704,7 @@ void renderTexturePriority(LLDrawable* drawable)
 		drawBox(center, size);
 		
 		/*S32 boost = imagep->getBoostLevel();
-		if (boost)
+		if (boost>LLViewerTexture::BOOST_NONE)
 		{
 			F32 t = (F32) boost / (F32) (LLViewerTexture::BOOST_MAX_LEVEL-1);
 			LLVector4 col = lerp(boost_cold, boost_hot, t);
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 9aa74e8b9f90c39ebdda57db4dc1ae8120d963d5..b23e7feda23ae0627fc3c9c4f6c7dfafb127d667 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -334,7 +334,7 @@ void populate_favorites_bar()
 	S32 count = lib_cats->count();
 	for(S32 i = 0; i < count; ++i)
 	{
-		if(lib_cats->get(i)->getPreferredType() == LLAssetType::AT_LANDMARK)
+		if(lib_cats->get(i)->getPreferredType() == LLFolderType::FT_LANDMARK)
 		{
 			lib_landmarks = lib_cats->get(i)->getUUID();
 			break;
@@ -351,7 +351,7 @@ void populate_favorites_bar()
 	gInventory.getDirectDescendentsOf(lib_landmarks, lm_cats, lm_items);
 	if (!lm_items) return;
 
-	LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE);
+	const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
 	if (favorites_id.isNull())
 	{
 		llerror("My Inventory is missing My Favorites", 0);
@@ -738,7 +738,7 @@ bool idle_startup()
 		}
 		if (!gLoginHandler.getFirstName().empty()
 			|| !gLoginHandler.getLastName().empty()
-			|| !gLoginHandler.getWebLoginKey().isNull() )
+			/*|| !gLoginHandler.getWebLoginKey().isNull()*/ )
 		{
 			// We have at least some login information on a SLURL
 			gFirstname = gLoginHandler.getFirstName();
@@ -895,13 +895,9 @@ bool idle_startup()
 		gViewerWindow->moveProgressViewToFront();
 
 		//reset the values that could have come in from a slurl
-		if (!gLoginHandler.getWebLoginKey().isNull())
-		{
-			gFirstname = gLoginHandler.getFirstName();
-			gLastname = gLoginHandler.getLastName();
-//			gWebLoginKey = gLoginHandler.getWebLoginKey();
-		}
-				
+		gFirstname = gLoginHandler.getFirstName();
+		gLastname = gLoginHandler.getLastName();
+
 		if (show_connect_box)
 		{
 			// TODO if not use viewer auth
@@ -1677,7 +1673,7 @@ bool idle_startup()
 		gInventory.buildParentChildMap();
 
 		//all categories loaded. lets create "My Favorites" category
-		gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE,true);
+		gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
 
 		// lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies
 		LLFriendCardsManager::instance().syncFriendsFolder();
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 4940d9b5bb8be0421263e1b18b5ecd87a9bc172f..de00ca8420b601f7947eba7f355c35d3c838de11 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -47,7 +47,9 @@
 #include "llfolderview.h"
 #include "llfoldervieweventlistener.h"
 #include "llinventory.h"
+#include "llinventoryfunctions.h"
 #include "llinventorymodel.h"
+#include "llinventorypanel.h"
 #include "llfloaterinventory.h"
 #include "lllineeditor.h"
 #include "llui.h"
@@ -424,7 +426,7 @@ BOOL LLFloaterTexturePicker::postBuild()
 		mInventoryPanel->getRootFolder()->getFilter()->markDefault();
 
 		// Commented out to stop opening all folders with textures
-		// mInventoryPanel->openDefaultFolderForType(LLAssetType::AT_TEXTURE);
+		// mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_TEXTURE);
 
 		// don't put keyboard focus on selected item, because the selection callback
 		// will assume that this was user input
@@ -527,7 +529,7 @@ void LLFloaterTexturePicker::draw()
 		mTexturep = NULL;
 		if(mImageAssetID.notNull())
 		{
-			mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO);
+			mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES);
 			mTexturep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
 		}
 		else if (!mFallbackImageName.empty())
@@ -1071,7 +1073,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
 	{
 		showPicker(FALSE);
 		//grab textures first...
-		gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLAssetType::AT_TEXTURE));
+		gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE));
 		//...then start full inventory fetch.
 		gInventory.startBackgroundFetch();
 		handled = TRUE;
@@ -1188,7 +1190,7 @@ void LLTextureCtrl::draw()
 	}
 	else if (!mImageAssetID.isNull())
 	{
-		mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES, IMMEDIATE_NO);
+		mTexturep = LLViewerTextureManager::getFetchedTexture(mImageAssetID, MIPMAP_YES);
 		mTexturep->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
 	}
 	else if (!mFallbackImageName.empty())
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index ea675c5a6e48646fa51113f7a1f277b3fc04e46f..dafa4f25caac818e3a2e57ce5736d9553e3fcdee 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -168,7 +168,7 @@ void LLTextureBar::draw()
 	{
 		color = LLColor4::green4;
 	}
-	else if (mImagep->getBoostLevel())
+	else if (mImagep->getBoostLevel() > LLViewerTexture::BOOST_NONE)
 	{
 		color = LLColor4::magenta;
 	}
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index e26a0776ff44ddb07931b5708a05a815352714ee..f82573f46cd4400af4af66b1acfab7b5a98e0a05 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -38,6 +38,7 @@
 
 #include "llbutton.h"
 #include "lliconctrl.h"
+#include "llinventoryfunctions.h"
 #include "llnotify.h"
 #include "lltextbox.h"
 
@@ -219,7 +220,6 @@ bool LLToastGroupNotifyPanel::isAttachmentOpenable(LLAssetType::EType type)
 	switch(type)
 	{
 	case LLAssetType::AT_LANDMARK:
-	case LLAssetType::AT_FAVORITE:
 	case LLAssetType::AT_NOTECARD:
 	case LLAssetType::AT_IMAGE_JPEG:
 	case LLAssetType::AT_IMAGE_TGA:
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 9a63f07a7e578d0c121714b21c1500b912d50324..959cb3f182248fd124a267954f4c058469004b6b 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -92,7 +92,7 @@ class LLNoPreferredType : public LLInventoryCollectFunctor
 	virtual bool operator()(LLInventoryCategory* cat,
 							LLInventoryItem* item)
 	{
-		if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE))
+		if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE))
 		{
 			return true;
 		}
@@ -109,7 +109,7 @@ class LLNoPreferredTypeOrItem : public LLInventoryCollectFunctor
 							LLInventoryItem* item)
 	{
 		if(item) return true;
-		if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE))
+		if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE))
 		{
 			return true;
 		}
@@ -1317,8 +1317,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
 
 	// Check if it's in the trash.
 	bool is_in_trash = false;
-	LLUUID trash_id;
-	trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
 	{
 		is_in_trash = true;
@@ -2088,7 +2087,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
 	if(!item || !item->isComplete()) return ACCEPT_NO;
 
 	// must not be in the trash
-	LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH));
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
 	{
 		return ACCEPT_NO;
@@ -2170,8 +2169,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
 	}
 
 	// Check if it's in the trash.
-	LLUUID trash_id;
-	trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
 	{
 		accept = ACCEPT_YES_SINGLE;
@@ -2249,8 +2247,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
 	}
 
 	// Check if it's in the trash.
-	LLUUID trash_id;
-	trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
 	{
 		accept = ACCEPT_YES_SINGLE;
@@ -2388,7 +2385,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
 	if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
 	{
 		// it's in the agent inventory
-		LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
 		{
 			return ACCEPT_NO;
@@ -2443,7 +2440,7 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture(
 	if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
 	{
 		// it's in the agent inventory
-		LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
 		{
 			return ACCEPT_NO;
@@ -2502,7 +2499,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
 
 	if(mSource == SOURCE_AGENT)
 	{
-		LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH));
+		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		if( gInventory.isObjectDescendentOf( category->getUUID(), trash_id ) )
 		{
 			return ACCEPT_NO;
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 304f1dffaf009f7a248b2f771cd4e6b9a13bb4b2..24017202cc65c73bbaa252c6620958572e3de8e8 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -598,6 +598,9 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
 
 static bool needs_tooltip(LLSelectNode* nodep)
 {
+	if (!nodep) 
+		return false;
+
 	LLViewerObject* object = nodep->getObject();
 	LLViewerObject *parent = (LLViewerObject *)object->getParent();
 	if (object->flagHandleTouch()
@@ -758,14 +761,14 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
 								{
 									is_time_based_media = true;
 									is_web_based_media = false;
-									args["[CurrentURL]"] =  media_impl->getMediaURL();
+									//args["[CurrentURL]"] =  media_impl->getMediaURL();
 									is_media_playing = media_impl->isMediaPlaying();
 								}
 								else
 								{
 									is_time_based_media = false;
 									is_web_based_media = true;
-									args["[CurrentURL]"] =  media_plugin->getLocation();
+									//args["[CurrentURL]"] =  media_plugin->getLocation();
 								}
 								//tooltip_msg.append(LLTrans::getString("CurrentURL", args));
 							}
@@ -773,7 +776,10 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
 					}
 				}
 				
-				bool needs_tip = needs_tooltip(nodep);
+				// also check the primary node since sometimes it can have an action even though
+				// the root node doesn't
+				bool needs_tip = needs_tooltip(nodep) || 
+					             needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode());
 
 				if (show_all_object_tips || needs_tip)
 				{
@@ -1033,31 +1039,28 @@ void LLToolPie::playCurrentMedia(const LLPickInfo& info)
 	if(!mep)
 		return;
 	
+	//TODO: Can you Use it? 
+
 	LLPluginClassMedia* media_plugin = NULL;
 	
-//	if (gSavedSettings.getBOOL("MediaOnAPrimUI"))
-//	{		
-		viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
+	viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
 		
-		if(media_impl.notNull() && media_impl->hasMedia())
+	if(media_impl.notNull() && media_impl->hasMedia())
+	{
+		media_plugin = media_impl->getMediaPlugin();
+		if (media_plugin && media_plugin->pluginSupportsMediaTime())
 		{
-			media_plugin = media_impl->getMediaPlugin();
-			
-			if (media_plugin && media_plugin->pluginSupportsMediaTime())
+			if(media_impl->isMediaPlaying())
 			{
-				if(media_impl->isMediaPlaying())
-				{
-					media_impl->pause();
-				}
-				else //if(media_impl->isMediaPaused())
-				{
-					media_impl->play();
-				}
-				
+				media_impl->pause();
+			}
+			else 
+			{
+				media_impl->play();
 			}
-					
 		}
-//	 }
+	}
+
 
 }
 
@@ -1088,6 +1091,8 @@ void LLToolPie::VisitHomePage(const LLPickInfo& info)
 	if(!mep)
 		return;
 	
+	//TODO: Can you Use it? 
+	
 	LLPluginClassMedia* media_plugin = NULL;
 	
 	viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c974171c2c2e7173b758ed39b153649e797d44dd
--- /dev/null
+++ b/indra/newview/llviewerassettype.cpp
@@ -0,0 +1,114 @@
+/** 
+ * @file llassettype.cpp
+ * @brief Implementatino of LLViewerAssetType functionality.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewerassettype.h"
+#include "lldictionary.h"
+#include "llmemory.h"
+#include "llsingleton.h"
+
+static const std::string empty_string;
+
+struct ViewerAssetEntry : public LLDictionaryEntry
+{
+	ViewerAssetEntry(EDragAndDropType dad_type // drag and drop type
+		)
+		:
+		LLDictionaryEntry(empty_string), // no reverse lookup needed for now, so just leave this blank
+		mDadType(dad_type)
+	{
+	}
+	EDragAndDropType mDadType;
+};
+
+class LLViewerAssetDictionary : public LLSingleton<LLViewerAssetDictionary>,
+						  public LLDictionary<LLViewerAssetType::EType, ViewerAssetEntry>
+{
+public:
+	LLViewerAssetDictionary();
+};
+
+LLViewerAssetDictionary::LLViewerAssetDictionary()
+{
+	//       												      	   	   	 DRAG&DROP TYPE		    
+	//   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	|--------------------|
+	addEntry(LLViewerAssetType::AT_TEXTURE, 			new ViewerAssetEntry(DAD_TEXTURE));
+	addEntry(LLViewerAssetType::AT_SOUND, 				new ViewerAssetEntry(DAD_SOUND));
+	addEntry(LLViewerAssetType::AT_CALLINGCARD, 		new ViewerAssetEntry(DAD_CALLINGCARD));
+	addEntry(LLViewerAssetType::AT_LANDMARK, 			new ViewerAssetEntry(DAD_LANDMARK));
+	addEntry(LLViewerAssetType::AT_SCRIPT, 				new ViewerAssetEntry(DAD_NONE));
+	addEntry(LLViewerAssetType::AT_CLOTHING, 			new ViewerAssetEntry(DAD_CLOTHING));
+	addEntry(LLViewerAssetType::AT_OBJECT, 				new ViewerAssetEntry(DAD_OBJECT));
+	addEntry(LLViewerAssetType::AT_NOTECARD, 			new ViewerAssetEntry(DAD_NOTECARD));
+	addEntry(LLViewerAssetType::AT_CATEGORY, 			new ViewerAssetEntry(DAD_CATEGORY));
+	addEntry(LLViewerAssetType::AT_ROOT_CATEGORY, 		new ViewerAssetEntry(DAD_ROOT_CATEGORY));
+	addEntry(LLViewerAssetType::AT_LSL_TEXT, 			new ViewerAssetEntry(DAD_SCRIPT));
+	addEntry(LLViewerAssetType::AT_LSL_BYTECODE, 		new ViewerAssetEntry(DAD_NONE));
+	addEntry(LLViewerAssetType::AT_TEXTURE_TGA, 		new ViewerAssetEntry(DAD_NONE));
+	addEntry(LLViewerAssetType::AT_BODYPART, 			new ViewerAssetEntry(DAD_BODYPART));
+	addEntry(LLViewerAssetType::AT_SOUND_WAV, 			new ViewerAssetEntry(DAD_NONE));
+	addEntry(LLViewerAssetType::AT_IMAGE_TGA, 			new ViewerAssetEntry(DAD_NONE));
+	addEntry(LLViewerAssetType::AT_IMAGE_JPEG, 			new ViewerAssetEntry(DAD_NONE));
+	addEntry(LLViewerAssetType::AT_ANIMATION, 			new ViewerAssetEntry(DAD_ANIMATION));
+	addEntry(LLViewerAssetType::AT_GESTURE, 			new ViewerAssetEntry(DAD_GESTURE));
+	addEntry(LLViewerAssetType::AT_SIMSTATE, 			new ViewerAssetEntry(DAD_NONE));
+
+	addEntry(LLViewerAssetType::AT_LINK, 				new ViewerAssetEntry(DAD_LINK));
+	addEntry(LLViewerAssetType::AT_LINK_FOLDER, 		new ViewerAssetEntry(DAD_LINK));
+
+	addEntry(LLViewerAssetType::AT_NONE, 				new ViewerAssetEntry(DAD_NONE));
+};
+
+EDragAndDropType LLViewerAssetType::lookupDragAndDropType(EType asset_type)
+{
+	const LLViewerAssetDictionary *dict = LLViewerAssetDictionary::getInstance();
+	const ViewerAssetEntry *entry = dict->lookup(asset_type);
+	if (entry)
+		return entry->mDadType;
+	else
+		return DAD_NONE;
+}
+
+// Generate a good default description
+void LLViewerAssetType::generateDescriptionFor(LLViewerAssetType::EType asset_type,
+											   std::string& description)
+{
+	const S32 BUF_SIZE = 30;
+	char time_str[BUF_SIZE];	/* Flawfinder: ignore */
+	time_t now;
+	time(&now);
+	memset(time_str, '\0', BUF_SIZE);
+	strftime(time_str, BUF_SIZE - 1, "%Y-%m-%d %H:%M:%S ", localtime(&now));
+	description.assign(time_str);
+	description.append(LLAssetType::lookupHumanReadable(asset_type));
+}
diff --git a/indra/newview/llviewerassettype.h b/indra/newview/llviewerassettype.h
new file mode 100644
index 0000000000000000000000000000000000000000..01158885cecc5345a189db8130fc6576bf6c6546
--- /dev/null
+++ b/indra/newview/llviewerassettype.h
@@ -0,0 +1,54 @@
+/** 
+ * @file llviewerassettype.h
+ * @brief Declaration of LLViewerViewerAssetType.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERASSETTYPE_H
+#define LL_LLVIEWERASSETTYPE_H
+
+#include <string>
+#include "llassettype.h"
+
+// This class is similar to llassettype, but contains methods
+// only used by the viewer.
+class LLViewerAssetType : public LLAssetType
+{
+public:
+	// Generate a good default description. You may want to add a verb
+	// or agent name after this depending on your application.
+	static void 				generateDescriptionFor(LLViewerAssetType::EType asset_type,
+													   std::string& description);
+	static EDragAndDropType   	lookupDragAndDropType(EType asset_type);
+protected:
+	LLViewerAssetType() {}
+	~LLViewerAssetType() {}
+};
+
+#endif // LL_LLVIEWERASSETTYPE_H
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..384538364f04707df336d605fb570748855835e2
--- /dev/null
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -0,0 +1,263 @@
+/** 
+ * @file llfoldertype.cpp
+ * @brief Implementation of LLViewerFolderType functionality.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewerfoldertype.h"
+#include "lldictionary.h"
+#include "llmemory.h"
+#include "llvisualparam.h"
+
+static const std::string empty_string;
+
+struct ViewerFolderEntry : public LLDictionaryEntry
+{
+	// Constructor for non-ensembles
+	ViewerFolderEntry(const std::string &new_category_name, // default name when creating a new category of this type
+					  const std::string &icon_name 			// name of the folder icon
+		) 
+		:
+		LLDictionaryEntry(empty_string), // no reverse lookup needed on non-ensembles, so just leave this blank
+		mIconName(icon_name),
+		mNewCategoryName(new_category_name)
+	{
+		mAllowedNames.clear();
+	}
+
+	// Constructor for ensembles
+	ViewerFolderEntry(const std::string &xui_name, 			// name of the xui menu item
+					  const std::string &new_category_name, // default name when creating a new category of this type
+					  const std::string &icon_name, 		// name of the folder icon
+					  const std::string allowed_names 		// allowed item typenames for this folder type
+		) 
+		:
+		LLDictionaryEntry(xui_name),
+		mIconName(icon_name),
+		mNewCategoryName(new_category_name)
+	{
+		const std::string delims (",");
+		LLStringUtilBase<char>::getTokens(allowed_names, mAllowedNames, delims);
+	}
+
+	bool getIsAllowedName(const std::string &name) const
+	{
+		if (mAllowedNames.empty())
+			return false;
+		for (name_vec_t::const_iterator iter = mAllowedNames.begin();
+			 iter != mAllowedNames.end();
+			 iter++)
+		{
+			if (name == (*iter))
+				return true;
+		}
+		return false;
+	}
+	const std::string mIconName;
+	const std::string mNewCategoryName;
+	typedef std::vector<std::string> name_vec_t;
+	name_vec_t mAllowedNames;
+};
+
+class LLViewerFolderDictionary : public LLSingleton<LLViewerFolderDictionary>,
+								 public LLDictionary<LLFolderType::EType, ViewerFolderEntry>
+{
+public:
+	LLViewerFolderDictionary();
+protected:
+	bool initEnsemblesFromFile(); // Reads in ensemble information from foldertypes.xml
+};
+
+LLViewerFolderDictionary::LLViewerFolderDictionary()
+{
+	initEnsemblesFromFile();
+
+	//       													    	  NEW CATEGORY NAME         FOLDER ICON NAME
+	//      												  		     |-------------------------|---------------------------|
+	addEntry(LLFolderType::FT_TEXTURE, 				new ViewerFolderEntry("Textures",				"inv_folder_texture.tga"));
+	addEntry(LLFolderType::FT_SOUND, 				new ViewerFolderEntry("Sounds",					"inv_folder_sound.tga"));
+	addEntry(LLFolderType::FT_CALLINGCARD, 			new ViewerFolderEntry("Calling Cards",			"inv_folder_callingcard.tga"));
+	addEntry(LLFolderType::FT_LANDMARK, 			new ViewerFolderEntry("Landmarks",				"inv_folder_landmark.tga"));
+	addEntry(LLFolderType::FT_CLOTHING, 			new ViewerFolderEntry("Clothing",				"inv_folder_clothing.tga"));
+	addEntry(LLFolderType::FT_OBJECT, 				new ViewerFolderEntry("Objects",				"inv_folder_object.tga"));
+	addEntry(LLFolderType::FT_NOTECARD, 			new ViewerFolderEntry("Notecards",				"inv_folder_notecard.tga"));
+	addEntry(LLFolderType::FT_CATEGORY, 			new ViewerFolderEntry("New Folder",				"inv_folder_plain_closed.tga"));
+	addEntry(LLFolderType::FT_ROOT_CATEGORY, 		new ViewerFolderEntry("Inventory",				""));
+	addEntry(LLFolderType::FT_LSL_TEXT, 			new ViewerFolderEntry("Scripts",				"inv_folder_script.tga"));
+	addEntry(LLFolderType::FT_BODYPART, 			new ViewerFolderEntry("Body Parts",				"inv_folder_bodypart.tga"));
+	addEntry(LLFolderType::FT_TRASH, 				new ViewerFolderEntry("Trash",					"inv_folder_trash.tga"));
+	addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, 	new ViewerFolderEntry("Photo Album",			"inv_folder_snapshot.tga"));
+	addEntry(LLFolderType::FT_LOST_AND_FOUND, 		new ViewerFolderEntry("Lost And Found",	   		"inv_folder_lostandfound.tga"));
+	addEntry(LLFolderType::FT_ANIMATION, 			new ViewerFolderEntry("Animations",				"inv_folder_animation.tga"));
+	addEntry(LLFolderType::FT_GESTURE, 				new ViewerFolderEntry("Gestures",				"inv_folder_gesture.tga"));
+	addEntry(LLFolderType::FT_FAVORITE, 			new ViewerFolderEntry("Favorite",				"inv_folder_plain_closed.tga"));
+
+	addEntry(LLFolderType::FT_CURRENT_OUTFIT, 		new ViewerFolderEntry("Current Outfit",			"inv_folder_current_outfit.tga"));
+	addEntry(LLFolderType::FT_OUTFIT, 				new ViewerFolderEntry("New Outfit",				"inv_folder_outfit.tga"));
+	addEntry(LLFolderType::FT_MY_OUTFITS, 			new ViewerFolderEntry("My Outfits",				"inv_folder_my_outfits.tga"));
+	addEntry(LLFolderType::FT_INBOX, 				new ViewerFolderEntry("Inbox",					"inv_folder_inbox.tga"));
+		 
+	addEntry(LLFolderType::FT_NONE, 				new ViewerFolderEntry("New Folder",				"inv_folder_plain_closed.tga"));
+}
+
+bool LLViewerFolderDictionary::initEnsemblesFromFile()
+{
+	std::string xml_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"foldertypes.xml");
+	LLXmlTree folder_def;
+	if (!folder_def.parseFile(xml_filename))
+	{
+		llerrs << "Failed to parse folders file " << xml_filename << llendl;
+		return false;
+	}
+
+	LLXmlTreeNode* rootp = folder_def.getRoot();
+	for (LLXmlTreeNode* ensemble = rootp->getFirstChild();
+		 ensemble;
+		 ensemble = rootp->getNextChild())
+	{
+		if (!ensemble->hasName("ensemble"))
+		{
+			llwarns << "Invalid ensemble definition node " << ensemble->getName() << llendl;
+			continue;
+		}
+
+		S32 ensemble_type;
+		static LLStdStringHandle ensemble_num_string = LLXmlTree::addAttributeString("foldertype_num");
+		if (!ensemble->getFastAttributeS32(ensemble_num_string, ensemble_type))
+		{
+			llwarns << "No ensemble type defined" << llendl;
+			continue;
+		}
+
+
+		if (ensemble_type < S32(LLFolderType::FT_ENSEMBLE_START) || ensemble_type > S32(LLFolderType::FT_ENSEMBLE_END))
+		{
+			llwarns << "Exceeded maximum ensemble index" << LLFolderType::FT_ENSEMBLE_END << llendl;
+			break;
+		}
+
+		std::string xui_name;
+		static LLStdStringHandle xui_name_string = LLXmlTree::addAttributeString("xui_name");
+		if (!ensemble->getFastAttributeString(xui_name_string, xui_name))
+		{
+			llwarns << "No xui name defined" << llendl;
+			continue;
+		}
+
+		std::string icon_name;
+		static LLStdStringHandle icon_name_string = LLXmlTree::addAttributeString("icon_name");
+		if (!ensemble->getFastAttributeString(icon_name_string, icon_name))
+		{
+			llwarns << "No ensemble icon name defined" << llendl;
+			continue;
+		}
+
+		std::string allowed_names;
+		static LLStdStringHandle allowed_names_string = LLXmlTree::addAttributeString("allowed");
+		if (!ensemble->getFastAttributeString(allowed_names_string, allowed_names))
+		{
+		}
+
+		// Add the entry and increment the asset number.
+		const static std::string new_ensemble_name = "New Ensemble";
+		addEntry(LLFolderType::EType(ensemble_type), new ViewerFolderEntry(xui_name, new_ensemble_name, icon_name, allowed_names));
+	}
+
+	return true;
+}
+
+
+const std::string &LLViewerFolderType::lookupXUIName(LLFolderType::EType folder_type)
+{
+	const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
+	if (entry)
+	{
+		return entry->mName;
+	}
+	return badLookup();
+}
+
+LLFolderType::EType LLViewerFolderType::lookupTypeFromXUIName(const std::string &name)
+{
+	return LLViewerFolderDictionary::getInstance()->lookup(name);
+}
+
+const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder_type)
+{
+	const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
+	if (entry)
+	{
+		return entry->mIconName;
+	}
+	return badLookup();
+}
+
+const std::string &LLViewerFolderType::lookupNewCategoryName(LLFolderType::EType folder_type)
+{
+	const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
+	if (entry)
+	{
+		return entry->mNewCategoryName;
+	}
+	return badLookup();
+}
+
+LLFolderType::EType LLViewerFolderType::lookupTypeFromNewCategoryName(const std::string& name)
+{
+	for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin();
+		 iter != LLViewerFolderDictionary::getInstance()->end();
+		 iter++)
+	{
+		const ViewerFolderEntry *entry = iter->second;
+		if (entry->mNewCategoryName == name)
+		{
+			return iter->first;
+		}
+	}
+	return FT_NONE;
+}
+
+
+U64 LLViewerFolderType::lookupValidFolderTypes(const std::string& item_name)
+{
+	U64 matching_folders = 0;
+	for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin();
+		 iter != LLViewerFolderDictionary::getInstance()->end();
+		 iter++)
+	{
+		const ViewerFolderEntry *entry = iter->second;
+		if (entry->getIsAllowedName(item_name))
+		{
+			matching_folders |= 1LL << iter->first;
+		}
+	}
+	return matching_folders;
+}
diff --git a/indra/newview/llviewerfoldertype.h b/indra/newview/llviewerfoldertype.h
new file mode 100644
index 0000000000000000000000000000000000000000..a6aea62b2a33096559a70b24e30cfe8f85b59ad1
--- /dev/null
+++ b/indra/newview/llviewerfoldertype.h
@@ -0,0 +1,57 @@
+/** 
+ * @file llviewerfoldertype.h
+ * @brief Declaration of LLAssetType.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ * 
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERFOLDERTYPE_H
+#define LL_LLVIEWERFOLDERTYPE_H
+
+#include <string>
+#include "llfoldertype.h"
+
+// This class is similar to llfoldertype, but contains methods
+// only used by the viewer.  This also handles ensembles.
+class LLViewerFolderType : public LLFolderType
+{
+public:
+	static const std::string&   lookupXUIName(EType folder_type); // name used by the UI
+	static LLFolderType::EType 	lookupTypeFromXUIName(const std::string& name);
+
+	static const std::string&   lookupIconName(EType asset_type); // folder icon name
+	static const std::string&	lookupNewCategoryName(EType folder_type); // default name when creating new category
+	static LLFolderType::EType	lookupTypeFromNewCategoryName(const std::string& name); // default name when creating new category
+
+	static U64					lookupValidFolderTypes(const std::string& item_name); // which folders allow an item of this type?
+protected:
+	LLViewerFolderType() {}
+	~LLViewerFolderType() {}
+};
+
+#endif // LL_LLVIEWERFOLDERTYPE_H
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 366e5602bd8696ab0b2e19134aca2193e08db8f9..1d62ead843729c6f052b28aa94d02c66399aea51 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -37,7 +37,8 @@
 #include "indra_constants.h"
 
 #include "llagent.h"
-#include "llfoldertype.h"
+#include "llviewerfoldertype.h"
+#include "llfolderview.h"
 #include "llviewercontrol.h"
 #include "llconsole.h"
 #include "llinventorymodel.h"
@@ -47,6 +48,7 @@
 #include "llinventorybridge.h"
 #include "llfloaterinventory.h"
 
+#include "llviewerassettype.h"
 #include "llviewerregion.h"
 #include "llviewerobjectlist.h"
 #include "llpreviewgesture.h"
@@ -358,7 +360,7 @@ void LLViewerInventoryItem::updateParentOnServer(BOOL restamp) const
 
 LLViewerInventoryCategory::LLViewerInventoryCategory(const LLUUID& uuid,
 													 const LLUUID& parent_uuid,
-													 LLAssetType::EType pref,
+													 LLFolderType::EType pref,
 													 const std::string& name,
 													 const LLUUID& owner_id) :
 	LLInventoryCategory(uuid, parent_uuid, pref, name),
@@ -415,7 +417,7 @@ void LLViewerInventoryCategory::updateServer(BOOL is_new) const
 {
 	// communicate that change with the server.
 
-	if (LLAssetType::lookupIsProtectedCategoryType(mPreferredType))
+	if (LLFolderType::lookupIsProtectedType(mPreferredType))
 	{
 		LLNotifications::instance().add("CannotModifyProtectedCategories");
 		return;
@@ -439,7 +441,7 @@ void LLViewerInventoryCategory::removeFromServer( void )
 	llinfos << "Removing inventory category " << mUUID << " from server."
 			<< llendl;
 	// communicate that change with the server.
-	if(LLAssetType::lookupIsProtectedCategoryType(mPreferredType))
+	if(LLFolderType::lookupIsProtectedType(mPreferredType))
 	{
 		LLNotifications::instance().add("CannotRemoveProtectedCategories");
 		return;
@@ -542,7 +544,7 @@ bool LLViewerInventoryCategory::importFileLocal(LLFILE* fp)
 		}
 		else if(0 == strcmp("pref_type", keyword))
 		{
-			mPreferredType = LLAssetType::lookup(valuestr);
+			mPreferredType = LLFolderType::lookup(valuestr);
 		}
 		else if(0 == strcmp("name", keyword))
 		{
@@ -580,7 +582,7 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const
 	mParentUUID.toString(uuid_str);
 	fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str());
 	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType));
-	fprintf(fp, "\t\tpref_type\t%s\n", LLAssetType::lookup(mPreferredType));
+	fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str());
 	fprintf(fp, "\t\tname\t%s|\n", mName.c_str());
 	mOwnerID.toString(uuid_str);
 	fprintf(fp, "\t\towner_id\t%s\n", uuid_str.c_str());
@@ -591,8 +593,8 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const
 
 void LLViewerInventoryCategory::determineFolderType()
 {
-	LLAssetType::EType original_type = getPreferredType();
-	if (LLAssetType::lookupIsProtectedCategoryType(original_type))
+	LLFolderType::EType original_type = getPreferredType();
+	if (LLFolderType::lookupIsProtectedType(original_type))
 		return;
 
 	U64 folder_valid = 0;
@@ -615,28 +617,28 @@ void LLViewerInventoryCategory::determineFolderType()
 			{
 				const EWearableType wearable_type = item->getWearableType();
 				const std::string& wearable_name = LLWearableDictionary::getTypeName(wearable_type);
-				U64 valid_folder_types = LLFolderType::lookupValidFolderTypes(wearable_name);
+				U64 valid_folder_types = LLViewerFolderType::lookupValidFolderTypes(wearable_name);
 				folder_valid |= valid_folder_types;
 				folder_invalid |= ~valid_folder_types;
 			}
 		}
-		for (U8 i = LLAssetType::AT_FOLDER_ENSEMBLE_START; i <= LLAssetType::AT_FOLDER_ENSEMBLE_END; i++)
+		for (U8 i = LLFolderType::FT_ENSEMBLE_START; i <= LLFolderType::FT_ENSEMBLE_END; i++)
 		{
 			if ((folder_valid & (1LL << i)) &&
 				!(folder_invalid & (1LL << i)))
 			{
-				changeType((LLAssetType::EType)i);
+				changeType((LLFolderType::EType)i);
 				return;
 			}
 		}
 	}
-	if (LLAssetType::lookupIsEnsembleCategoryType(original_type))
+	if (LLFolderType::lookupIsEnsembleType(original_type))
 	{
-		changeType(LLAssetType::AT_NONE);
+		changeType(LLFolderType::FT_NONE);
 	}
 }
 
-void LLViewerInventoryCategory::changeType(LLAssetType::EType new_folder_type)
+void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type)
 {
 	const LLUUID &folder_id = getUUID();
 	const LLUUID &parent_id = getParentUUID();
@@ -947,7 +949,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar
     body["notecard-id"] = notecard_inv_id;
     body["object-id"] = object_id;
     body["item-id"] = src->getUUID();
-    body["folder-id"] = gInventory.findCategoryUUIDForType(src->getType());
+	body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType()));
     body["callback-id"] = (LLSD::Integer)callback_id;
 
     request["message"] = "CopyInventoryFromNotecard";
@@ -963,7 +965,7 @@ void create_new_item(const std::string& name,
 				   U32 next_owner_perm)
 {
 	std::string desc;
-	LLAssetType::generateDescriptionFor(asset_type, desc);
+	LLViewerAssetType::generateDescriptionFor(asset_type, desc);
 	next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER;
 
 	
@@ -988,19 +990,14 @@ const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not
 const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably not)
 const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not)
 
+// ! REFACTOR ! Really need to refactor this so that it's not a bunch of if-then statements...
 void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid)
 {
-	std::string type = userdata.asString();
+	std::string type_name = userdata.asString();
 	
-	if (("category" == type) || ("current" == type) || ("outfit" == type) || ("my_otfts" == type) )
+	if (("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))
 	{
-		LLAssetType::EType a_type = LLAssetType::AT_NONE;
-		if ("current" == type)
-			a_type = LLAssetType::AT_CURRENT_OUTFIT;
-		if ("outfit" == type)
-			a_type = LLAssetType::AT_OUTFIT;
-		if ("my_otfts" == type)
-			a_type = LLAssetType::AT_MY_OUTFITS;
+		LLFolderType::EType preferred_type = LLFolderType::lookup(type_name);
 
 		LLUUID parent_id;
 		if (bridge)
@@ -1016,100 +1013,100 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co
 			parent_id = gInventory.getRootFolderID();
 		}
 
-		LLUUID category = gInventory.createNewCategory(parent_id, a_type, LLStringUtil::null);
+		LLUUID category = gInventory.createNewCategory(parent_id, preferred_type, LLStringUtil::null);
 		gInventory.notifyObservers();
 		folder->setSelectionByID(category, TRUE);
 	}
-	else if ("lsl" == type)
+	else if ("lsl" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_LSL_TEXT);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_LSL_TEXT);
 		create_new_item(NEW_LSL_NAME,
 					  parent_id,
 					  LLAssetType::AT_LSL_TEXT,
 					  LLInventoryType::IT_LSL,
 					  PERM_MOVE | PERM_TRANSFER);
 	}
-	else if ("notecard" == type)
+	else if ("notecard" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_NOTECARD);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_NOTECARD);
 		create_new_item(NEW_NOTECARD_NAME,
 					  parent_id,
 					  LLAssetType::AT_NOTECARD,
 					  LLInventoryType::IT_NOTECARD,
 					  PERM_ALL);
 	}
-	else if ("gesture" == type)
+	else if ("gesture" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
 		create_new_item(NEW_GESTURE_NAME,
 					  parent_id,
 					  LLAssetType::AT_GESTURE,
 					  LLInventoryType::IT_GESTURE,
 					  PERM_ALL);
 	}
-	else if ("shirt" == type)
+	else if ("shirt" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 		LLFolderBridge::createWearable(parent_id, WT_SHIRT);
 	}
-	else if ("pants" == type)
+	else if ("pants" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 		LLFolderBridge::createWearable(parent_id, WT_PANTS);
 	}
-	else if ("shoes" == type)
+	else if ("shoes" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 		LLFolderBridge::createWearable(parent_id, WT_SHOES);
 	}
-	else if ("socks" == type)
+	else if ("socks" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 		LLFolderBridge::createWearable(parent_id, WT_SOCKS);
 	}
-	else if ("jacket" == type)
+	else if ("jacket" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 		LLFolderBridge::createWearable(parent_id, WT_JACKET);
 	}
-	else if ("skirt" == type)
+	else if ("skirt" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 		LLFolderBridge::createWearable(parent_id, WT_SKIRT);
 	}
-	else if ("gloves" == type)
+	else if ("gloves" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 		LLFolderBridge::createWearable(parent_id, WT_GLOVES);
 	}
-	else if ("undershirt" == type)
+	else if ("undershirt" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 		LLFolderBridge::createWearable(parent_id, WT_UNDERSHIRT);
 	}
-	else if ("underpants" == type)
+	else if ("underpants" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
 		LLFolderBridge::createWearable(parent_id, WT_UNDERPANTS);
 	}
-	else if ("shape" == type)
+	else if ("shape" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);
 		LLFolderBridge::createWearable(parent_id, WT_SHAPE);
 	}
-	else if ("skin" == type)
+	else if ("skin" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);
 		LLFolderBridge::createWearable(parent_id, WT_SKIN);
 	}
-	else if ("hair" == type)
+	else if ("hair" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);
 		LLFolderBridge::createWearable(parent_id, WT_HAIR);
 	}
-	else if ("eyes" == type)
+	else if ("eyes" == type_name)
 	{
-		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART);
+		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);
 		LLFolderBridge::createWearable(parent_id, WT_EYES);
 	}
 	
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index d523bf2859413eee54869d2f023a9270693d2053..529425aa258800f09140cb71d7fc074acf62e65b 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -185,7 +185,7 @@ class LLViewerInventoryCategory  : public LLInventoryCategory
 	
 public:
 	LLViewerInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid,
-							  LLAssetType::EType preferred_type,
+							  LLFolderType::EType preferred_type,
 							  const std::string& name,
 							  const LLUUID& owner_id);
 	LLViewerInventoryCategory(const LLUUID& owner_id);
@@ -221,7 +221,7 @@ class LLViewerInventoryCategory  : public LLInventoryCategory
 	bool exportFileLocal(LLFILE* fp) const;
 	bool importFileLocal(LLFILE* fp);
 	void determineFolderType();
-	void changeType(LLAssetType::EType new_folder_type);
+	void changeType(LLFolderType::EType new_folder_type);
 protected:
 	LLUUID mOwnerID;
 	S32 mVersion;
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index cd60a8d560630f68b49fa4298167765fb0e4fb7f..5b8902dec48be1f1803caba1cd6c37f200df472c 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -582,7 +582,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
 	}
 	else
 	{
-		gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR));
+		gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT));
 	}
 	
 	if (gRenderForSelect)
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 517a76ce3dd6aa4c9b06677a19c25ce48d4bba6c..d6dde0c93e382463f4015c0ed3fce0c773a7637f 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -258,7 +258,7 @@ class LLViewerMediaImpl
 	void calculateInterest();
 	F64 getInterest() const { return mInterest; };
 	F64 getApproximateTextureInterest();
-	S32 getProximity() { return mProximity; };
+	S32 getProximity() const { return mProximity; };
 	
 	// Mark this object as being used in a UI panel instead of on a prim
 	// This will be used as part of the interest sorting algorithm.
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index 2f7040aaa30b19ccb054c2e70e3019cf2c7299aa..657c58364f69aa3d48492502066d53f830c01132 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -86,6 +86,9 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 		mFocusedObjectID = objectp->getID();
 		mFocusedObjectFace = face;
 		mFocusedObjectNormal = pick_normal;
+		
+		// Focusing on a media face clears its disable flag.
+		media_impl->setDisabled(false);
 
 		LLTextureEntry* tep = objectp->getTE(face);
 		if(tep->hasMedia())
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 9da9ff5ce7fc3d104d8120ad29d0e6d8bdfe549e..2c2b2047cae5014867f9da6932d892961f2190a1 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -50,6 +50,7 @@
 #include "llfocusmgr.h"
 #include "llfontgl.h"
 #include "llinstantmessage.h"
+#include "llinventorypanel.h"
 #include "llpermissionsflags.h"
 #include "llrect.h"
 #include "llsecondlifeurls.h"
@@ -145,7 +146,6 @@
 #include "llmenucommands.h"
 #include "llmenugl.h"
 #include "llmimetypes.h"
-#include "llmorphview.h"
 #include "llmoveview.h"
 #include "llmutelist.h"
 #include "llnotify.h"
@@ -4175,12 +4175,10 @@ void handle_take_copy()
 {
 	if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return;
 
-	LLUUID category_id =
-		gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
+	const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
 	derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id);
 }
 
-
 // You can return an object to its owner if it is on your land.
 class LLObjectReturn : public view_listener_t
 {
@@ -4261,7 +4259,7 @@ class LLObjectEnableReturn : public view_listener_t
 void force_take_copy(void*)
 {
 	if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return;
-	const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
+	const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
 	derez_objects(DRD_FORCE_TO_GOD_INVENTORY, category_id);
 }
 
@@ -4322,8 +4320,7 @@ void handle_take()
 		if(category_id.notNull())
 		{
 		        // check trash
-			LLUUID trash;
-			trash = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+			const LLUUID trash = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 			if(category_id == trash || gInventory.isObjectDescendentOf(category_id, trash))
 			{
 				category_id.setNull();
@@ -4339,7 +4336,7 @@ void handle_take()
 	}
 	if(category_id.isNull())
 	{
-		category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT);
+		category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
 	}
 	LLSD payload;
 	payload["folder_id"] = category_id;
@@ -6918,7 +6915,7 @@ void handle_grab_texture(void* data)
 		LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl;
 		LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE;
 		LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE;
-		LLUUID folder_id(gInventory.findCategoryUUIDForType(asset_type));
+		const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(asset_type));
 		if(folder_id.notNull())
 		{
 			std::string name = "Unknown";
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index d3a9e1cef8a96c54811166324fbffc25ea90cf1c..d17c7e486feab21400b49b85d475103565eb3b46 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -319,7 +319,7 @@ class LLFileUploadBulk : public view_listener_t
 			LLAssetStorage::LLStoreAssetCallback callback = NULL;
 			S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
 			void *userdata = NULL;
-			upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE,
+			upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
 				LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
 					    display_name,
 					    callback, expected_upload_cost, userdata);
@@ -493,7 +493,7 @@ void handle_compress_image(void*)
 
 void upload_new_resource(const std::string& src_filename, std::string name,
 			 std::string desc, S32 compression_info,
-			 LLAssetType::EType destination_folder_type,
+			 LLFolderType::EType destination_folder_type,
 			 LLInventoryType::EType inv_type,
 			 U32 next_owner_perms,
 			 U32 group_perms,
@@ -810,7 +810,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
 
 	if(result >= 0)
 	{
-		LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation;
+		LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation;
 
 		if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
 			LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
@@ -856,7 +856,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
 		{
 			// Actually add the upload to inventory
 			llinfos << "Adding " << uuid << " to inventory." << llendl;
-			LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc));
+			const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc);
 			if(folder_id.notNull())
 			{
 				U32 next_owner_perms = data->mNextOwnerPerm;
@@ -903,7 +903,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
 		LLAssetStorage::LLStoreAssetCallback callback = NULL;
 		void *userdata = NULL;
 		upload_new_resource(next_file, asset_name, asset_name,	// file
-				    0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE,
+				    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
 				    PERM_NONE, PERM_NONE, PERM_NONE,
 				    display_name,
 				    callback,
@@ -915,7 +915,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
 void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,
 			 std::string name,
 			 std::string desc, S32 compression_info,
-			 LLAssetType::EType destination_folder_type,
+			 LLFolderType::EType destination_folder_type,
 			 LLInventoryType::EType inv_type,
 			 U32 next_owner_perms,
 			 U32 group_perms,
@@ -973,14 +973,14 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
 	llinfos << "Name: " << name << llendl;
 	llinfos << "Desc: " << desc << llendl;
 	llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl;
-	lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl;
+	lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl;
 	lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;
 	std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
 	if (!url.empty())
 	{
 		llinfos << "New Agent Inventory via capability" << llendl;
 		LLSD body;
-		body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type);
+		body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type);
 		body["asset_type"] = LLAssetType::lookup(asset_type);
 		body["inventory_type"] = LLInventoryType::lookup(inv_type);
 		body["name"] = name;
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index bf21292082bc53a3bc37c88072d33918725958e8..da78537a295c3993c0583460f5db5c059172fc8c 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -33,7 +33,7 @@
 #ifndef LLVIEWERMENUFILE_H
 #define LLVIEWERMENUFILE_H
 
-#include "llassettype.h"
+#include "llfoldertype.h"
 #include "llinventorytype.h"
 
 class LLTransactionID;
@@ -45,7 +45,7 @@ void upload_new_resource(const std::string& src_filename,
 			 std::string name,
 			 std::string desc, 
 			 S32 compression_info,
-			 LLAssetType::EType destination_folder_type,
+			 LLFolderType::EType destination_folder_type,
 			 LLInventoryType::EType inv_type,
 			 U32 next_owner_perms,
 			 U32 group_perms,
@@ -60,7 +60,7 @@ void upload_new_resource(const LLTransactionID &tid,
 			 std::string name,
 			 std::string desc, 
 			 S32 compression_info,
-			 LLAssetType::EType destination_folder_type,
+			 LLFolderType::EType destination_folder_type,
 			 LLInventoryType::EType inv_type,
 			 U32 next_owner_perms,
 			 U32 group_perms,
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 5fd762ab3d33001c605fbbb9d032f88b31783871..d8e6c52c8ccfbdea4a2d6834c3daea5346d1e374 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -89,6 +89,7 @@
 #include "llhudeffecttrail.h"
 #include "llhudmanager.h"
 #include "llinventorymodel.h"
+#include "llinventorypanel.h"
 #include "llfloaterinventory.h"
 #include "llmenugl.h"
 #include "llmoveview.h"
@@ -139,7 +140,7 @@
 #include "llgroupactions.h"
 #include "llagentui.h"
 #include "llpanelblockedlist.h"
-#include "llpanelplaceinfo.h"
+#include "llpanelplaceprofile.h"
 
 #include <boost/tokenizer.hpp>
 #include <boost/algorithm/string/split.hpp>
@@ -208,7 +209,6 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] =
 bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
-	LLUUID fid;
 	LLMessageSystem* msg = gMessageSystem;
 	const LLSD& payload = notification["payload"];
 
@@ -218,10 +218,11 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
 	switch(option)
 	{
 	case 0:
+	{
 		// accept
 		LLAvatarTracker::formFriendship(payload["from_id"]);
 
-		fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+		const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
 
 		// This will also trigger an onlinenotification if the user is online
 		msg->newMessageFast(_PREHASH_AcceptFriendship);
@@ -234,7 +235,9 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
 		msg->addUUIDFast(_PREHASH_FolderID, fid);
 		msg->sendReliable(LLHost(payload["sender"].asString()));
 		break;
+	}
 	case 1:
+	{
 		// decline
 		// We no longer notify other viewers, but we DO still send
 		// the rejection to the simulator to delete the pending userop.
@@ -246,6 +249,7 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
 		msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);
 		msg->sendReliable(LLHost(payload["sender"].asString()));
 		break;
+	}
 	default:
 		// close button probably, possibly timed out
 		break;
@@ -766,8 +770,7 @@ class LLDiscardAgentOffer : public LLInventoryFetchComboObserver
 	virtual void done()
 	{
 		LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL;
-		LLUUID trash_id;
-		trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		bool notify = false;
 		if(trash_id.notNull() && mObjectID.notNull())
 		{
@@ -874,7 +877,7 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)
 {
 	std::vector<LLUUID>::const_iterator it = items.begin();
 	std::vector<LLUUID>::const_iterator end = items.end();
-	LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH));
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 	LLInventoryItem* item;
 	for(; it != end; ++it)
 	{
@@ -945,13 +948,12 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)
 		}
 
 		//Trash Check
-		LLUUID trash_id;
-		trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
+		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
 		if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
 		{
 			return;
 		}
-		LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND);
+		const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
 		//BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view);
 		BOOL user_is_away = gAwayTimer.getStarted();
 
@@ -1715,7 +1717,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 				info->mFromGroup = from_group;
 				info->mTransactionID = session_id;
 				info->mType = (LLAssetType::EType) asset_type;
-				info->mFolderID = gInventory.findCategoryUUIDForType(info->mType);
+				info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType));
 				std::string from_name;
 
 				from_name += "A group member named ";
@@ -1849,7 +1851,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			info->mFromID = from_id;
 			info->mFromGroup = from_group;
 			info->mTransactionID = session_id;
-			info->mFolderID = gInventory.findCategoryUUIDForType(info->mType);
+			info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType));
 
 			if (dialog == IM_TASK_INVENTORY_OFFERED)
 			{
@@ -2143,7 +2145,7 @@ bool callingcard_offer_callback(const LLSD& notification, const LLSD& response)
 		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
 		msg->nextBlockFast(_PREHASH_TransactionBlock);
 		msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID());
-		fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
+		fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
 		msg->nextBlockFast(_PREHASH_FolderData);
 		msg->addUUIDFast(_PREHASH_FolderID, fid);
 		msg->sendReliable(LLHost(notification["payload"]["sender"].asString()));
@@ -2596,11 +2598,10 @@ BOOL LLPostTeleportNotifiers::tick()
 	{
 		// get callingcards and landmarks available to the user arriving.
 		LLInventoryFetchDescendentsObserver::folder_ref_t folders;
-		LLUUID folder_id;
-		folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
-		if(folder_id.notNull()) 
-			folders.push_back(folder_id);
-		folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK);
+		const LLUUID callingcard_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+		if(callingcard_id.notNull()) 
+			folders.push_back(callingcard_id);
+		const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
 		if(folder_id.notNull()) 
 			folders.push_back(folder_id);
 		if(!folders.empty())
@@ -4818,7 +4819,7 @@ void container_inventory_arrived(LLViewerObject* object,
 		// create a new inventory category to put this in
 		LLUUID cat_id;
 		cat_id = gInventory.createNewCategory(gInventory.getRootFolderID(),
-											  LLAssetType::AT_NONE,
+											  LLFolderType::FT_NONE,
 											  LLTrans::getString("AcquiredItems"));
 
 		InventoryObjectList::const_iterator it = inventory->begin();
@@ -4868,7 +4869,7 @@ void container_inventory_arrived(LLViewerObject* object,
 		}
 
 		LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
-		LLUUID category = gInventory.findCategoryUUIDForType(item->getType());
+		const LLUUID category = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));
 
 		LLUUID item_id;
 		item_id.generate();
@@ -5548,7 +5549,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**)
 	LLPanelLandCovenant::updateEstateOwnerName(owner_name);
 	LLFloaterBuyLand::updateEstateOwnerName(owner_name);
 
-	LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info");
+	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile");
 	if (panel)
 	{
 		panel->updateEstateName(estate_name);
@@ -5682,7 +5683,7 @@ void onCovenantLoadComplete(LLVFS *vfs,
 	LLPanelLandCovenant::updateCovenantText(covenant_text);
 	LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid);
 
-	LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info");
+	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile");
 	if (panel)
 	{
 		panel->updateCovenantText(covenant_text);
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 20cd516fa06e08a53d1bc616d6e700cd93dfd6e8..26411ce152a008e1d3ea9a0fee19193f95b21b2c 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -2928,7 +2928,7 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */)
 	{
 		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
 		LLUUID sculpt_id = sculpt_params->getSculptTexture();
-		LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
+		LLViewerTextureManager::getFetchedTexture(sculpt_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE)->setBoostLevel(LLViewerTexture::BOOST_SELECTED);
 	}
 	
 	if (boost_children)
@@ -3691,7 +3691,7 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
 //	if (mDrawable.notNull() && mDrawable->isVisible())
 //	{
 		const LLUUID& image_id = getTE(te)->getID();
-		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 //	}
 }
 
@@ -3717,7 +3717,7 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost hos
 		uuid == LLUUID::null)
 	{
 		retval = LLPrimitive::setTETexture(te, uuid);
-		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
+		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
 		setChanged(TEXTURE);
 		if (mDrawable.notNull())
 		{
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 5c40f2a540256824e3a325736e23f736a2f7f513..90dff465c942250f5070ca314307020ab1fc2417 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -62,6 +62,7 @@
 #include "lltooltip.h"
 #include "lltrans.h"
 #include "lluictrlfactory.h"
+#include "llviewerassettype.h"
 #include "llviewercontrol.h"
 #include "llviewerinventory.h"
 #include "llviewertexturelist.h"
@@ -505,19 +506,17 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const
 				}
 
 				break;
-			case LLAssetType::AT_SOUND:			img_name = "Inv_Sound";	break;
+			case LLAssetType::AT_SOUND:			img_name = "Inv_Sound";		break;
 			case LLAssetType::AT_CLOTHING:		img_name = "Inv_Clothing";	break;
-			case LLAssetType::AT_OBJECT:		img_name = "Inv_Object"; break;
+			case LLAssetType::AT_OBJECT:		img_name = "Inv_Object"; 	break;
 			case LLAssetType::AT_CALLINGCARD:	img_name = "Inv_CallingCard"; break;
-			case LLAssetType::AT_LANDMARK:		img_name = "Inv_Landmark"; break;
+			case LLAssetType::AT_LANDMARK:		img_name = "Inv_Landmark"; 	break;
 			case LLAssetType::AT_NOTECARD:		img_name = "Inv_Notecard";	break;
 			case LLAssetType::AT_LSL_TEXT:		img_name = "Inv_Script";	break;
-			case LLAssetType::AT_BODYPART:		img_name = "Inv_Skin";	break;
-			case LLAssetType::AT_ANIMATION:		img_name = "Inv_Animation";break;
-			case LLAssetType::AT_GESTURE:			img_name = "Inv_Gesture";	break;
-				//TODO need img_name
-			case LLAssetType::AT_FAVORITE:		img_name = "Inv_Landmark";	 break;
-			default: llassert(0); 
+			case LLAssetType::AT_BODYPART:		img_name = "Inv_Skin";		break;
+			case LLAssetType::AT_ANIMATION:		img_name = "Inv_Animation";	break;
+			case LLAssetType::AT_GESTURE:		img_name = "Inv_Gesture";	break;
+			default: llassert(0);
 		}
 
 		return LLUI::getUIImage(img_name);
@@ -732,11 +731,10 @@ BOOL LLViewerTextEditor::handleHover(S32 x, S32 y, MASK mask)
 		if( LLToolDragAndDrop::getInstance()->isOverThreshold( screen_x, screen_y ) )
 		{
 			LLToolDragAndDrop::getInstance()->beginDrag(
-				LLAssetType::lookupDragAndDropType( mDragItem->getType() ),
+				LLViewerAssetType::lookupDragAndDropType( mDragItem->getType() ),
 				mDragItem->getUUID(),
 				LLToolDragAndDrop::SOURCE_NOTECARD,
 				mPreviewID, mObjectID);
-
 			return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask );
 		}
 		getWindow()->setCursor(UI_CURSOR_HAND);
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 758bf8c1aa012d501fe5e7a6cceba660788b76e9..6b8c8c01d4b321010471b6e6355fb8db33b22374 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -198,6 +198,7 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(
 												   LLGLenum primary_format,
 												   LLHost request_from_host)
 {
+	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;
 	return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ;
 }
 	
@@ -210,6 +211,7 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile(
 												   LLGLenum primary_format, 
 												   const LLUUID& force_id)
 {
+	llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;
 	return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ;
 }
 
@@ -256,10 +258,10 @@ void LLViewerTextureManager::init()
 	image_raw = NULL;
 	LLViewerFetchedTexture::sDefaultImagep->dontDiscard();
 #else
- 	LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE);
+ 	LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI);
 #endif
 	
- 	LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, TRUE);
+ 	LLViewerFetchedTexture::sSmokeImagep = LLViewerTextureManager::getFetchedTexture(IMG_SMOKE, TRUE, LLViewerTexture::BOOST_UI);
 	LLViewerFetchedTexture::sSmokeImagep->setNoDelete() ;
 
 	LLViewerTexture::initClass() ;
@@ -1240,7 +1242,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 		{
 			ddiscard+=2;
 		}
-		else if (mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == 0)
+		else if (mGLTexturep.notNull() && !mGLTexturep->getBoundRecently() && mBoostLevel == LLViewerTexture::BOOST_NONE)
 		{
 			ddiscard-=2;
 		}
@@ -1252,11 +1254,11 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 		pixel_priority = llclamp(pixel_priority, 0.0f, priority-1.f); // priority range = 100000-900000
 		if ( mBoostLevel > BOOST_HIGH)
 		{
-			priority = 1000000.f + pixel_priority + 1000.f * mBoostLevel;
+			priority = 1000000.f + pixel_priority + 1000.f * (mBoostLevel - LLViewerTexture::BOOST_NONE);
 		}
 		else
 		{
-			priority +=      0.f + pixel_priority + 1000.f * mBoostLevel;
+			priority +=      0.f + pixel_priority + 1000.f * (mBoostLevel - LLViewerTexture::BOOST_NONE);
 		}
 	}
 	return priority;
@@ -1436,7 +1438,7 @@ bool LLViewerFetchedTexture::updateFetch()
 		}
 		if (!mDontDiscard)
 		{
-			if (mBoostLevel == 0)
+			if (mBoostLevel == LLViewerTexture::BOOST_NONE)
 			{
 				desired_discard = llmax(desired_discard, current_discard-1);
 			}
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 020478beef2c6026ebebe3a9d694df1ff1236f82..ff8f14e8792cc76ee28a7891acf9e142e120f433 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -107,11 +107,12 @@ class LLViewerTexture : public LLTexture
 
 	enum EBoostLevel
 	{
-		BOOST_NONE 			= 0,
-		BOOST_AVATAR_BAKED	= 1,
-		BOOST_AVATAR		= 2,
-		BOOST_CLOUDS		= 3,
-		BOOST_SCULPTED      = 4,
+		//skip 0 and 1 to avoid mistakenly mixing boost level with boolean numbers.
+		BOOST_NONE 			= 2,
+		BOOST_AVATAR_BAKED	= 3,
+		BOOST_AVATAR		= 4,
+		BOOST_CLOUDS		= 5,
+		BOOST_SCULPTED      = 6,
 		
 		BOOST_HIGH 			= 10,
 		BOOST_TERRAIN		= 11, // has to be high priority for minimap / low detail
@@ -601,7 +602,7 @@ class LLViewerTextureManager
 
 	static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,									 
 									 BOOL usemipmap = TRUE,
-									 BOOL level_immediate = FALSE,		// Get the requested level immediately upon creation.
+									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -610,7 +611,7 @@ class LLViewerTextureManager
 	
 	static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename,									 
 									 BOOL usemipmap = TRUE,
-									 BOOL level_immediate = FALSE,		// Get the requested level immediately upon creation.
+									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index b5986c70f589069618e7adede346fcaf5aeba637..d2be1ac9b559410bbb7cceccf46cf48d5e673872 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -197,7 +197,7 @@ void LLViewerTextureList::doPrefetchImages()
 
 		if(LLViewerTexture::FETCHED_TEXTURE == texture_type || LLViewerTexture::LOD_TEXTURE == texture_type)
 		{
-			LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, FALSE, texture_type);
+			LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(uuid, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, texture_type);
 			if (image)
 			{
 				image->addTextureStats((F32)pixel_area);
@@ -325,14 +325,14 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
 	{
 		// Never mind that this ignores image_set_id;
 		// getImage() will handle that later.
-		return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE);
+		return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI);
 	}
 
 	std::string full_path = gDirUtilp->findSkinnedFilename("textures", filename);
 	if (full_path.empty())
 	{
 		llwarns << "Failed to find local image file: " << filename << llendl;
-		return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE);
+		return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI);
 	}
 
 	// generate UUID based on hash of filename
@@ -400,7 +400,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
 	
 	if ((&image_id == NULL) || image_id.isNull())
 	{
-		return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, TRUE));
+		return (LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI));
 	}
 	
 	LLPointer<LLViewerFetchedTexture> imagep = findImage(image_id);
@@ -1171,7 +1171,7 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d
 	U8 *data = new U8[data_size];
 	msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
 	
-	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 	if (!image)
 	{
 		delete [] data;
@@ -1235,7 +1235,7 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d
 	U8 *data = new U8[data_size];
 	msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
 	
-	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+	LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 	if (!image)
 	{
 		delete [] data;
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index fda57ce981bd5fe6e3bf90684bc31c955660b9b9..6948db70f8386db7dcf802ab5dca2a84d6891a1d 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -131,7 +131,7 @@ class LLViewerTextureList
 
 	LLViewerFetchedTexture * getImage(const LLUUID &image_id,									 
 									 BOOL usemipmap = TRUE,
-									 BOOL level_immediate = FALSE,		// Get the requested level immediately upon creation.
+									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -140,7 +140,7 @@ class LLViewerTextureList
 	
 	LLViewerFetchedTexture * getImageFromFile(const std::string& filename,									 
 									 BOOL usemipmap = TRUE,
-									 BOOL level_immediate = FALSE,		// Get the requested level immediately upon creation.
+									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -149,7 +149,7 @@ class LLViewerTextureList
 
 	LLViewerFetchedTexture* createImage(const LLUUID &image_id,
 									 BOOL usemipmap = TRUE,
-									 BOOL level_immediate = FALSE,		// Get the requested level immediately upon creation.
+									 S32 boost_priority = LLViewerTexture::BOOST_NONE,		// Get the requested level immediately upon creation.
 									 S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
 									 LLGLint internal_format = 0,
 									 LLGLenum primary_format = 0,
@@ -159,7 +159,7 @@ class LLViewerTextureList
 	// Request image from a specific host, used for baked avatar textures.
 	// Implemented in header in case someone changes default params above. JC
 	LLViewerFetchedTexture* getImageFromHost(const LLUUID& image_id, LLHost host)
-	{ return getImage(image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); }
+	{ return getImage(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); }
 
 public:
 	typedef std::set<LLPointer<LLViewerFetchedTexture> > image_list_t;	
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 4bf66ba17e08ea1230766c3a56ad18e91092c072..240f87d104e312ee02620c3b39e8106439c0949d 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -6520,7 +6520,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 			&& baked_index != BAKED_SKIRT)
 		{
 			setTEImage(mBakedTextureDatas[baked_index].mTextureIndex, 
-				LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE));
+				LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
 		}
 	}
 
diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp
index 5624f19c8d040fffc9e74db8387f8949c699a68c..49c4a1a6c89da64e6563219e193600851d194fe2 100644
--- a/indra/newview/llvoavatardefines.cpp
+++ b/indra/newview/llvoavatardefines.cpp
@@ -84,34 +84,34 @@ LLVOAvatarDictionary::BakedTextures::BakedTextures()
 {
 	// Baked textures
 	addEntry(BAKED_HEAD,       new BakedEntry(TEX_HEAD_BAKED,  
-											  "head", "18ded8d6-bcfc-e415-8539-944c0f5ea7a6", 
+											  "head", "a4b9dc38-e13b-4df9-b284-751efb0566ff", 
 											  3, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA,
 											  5, WT_SHAPE, WT_SKIN, WT_HAIR, WT_TATTOO, WT_ALPHA));
 
 	addEntry(BAKED_UPPER,      new BakedEntry(TEX_UPPER_BAKED, 
-											  "upper_body", "338c29e3-3024-4dbb-998d-7c04cf4fa88f", 
+											  "upper_body", "5943ff64-d26c-4a90-a8c0-d61f56bd98d4", 
 											  7, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET,
 											  TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA,
 											  8, WT_SHAPE, WT_SKIN,	WT_SHIRT, WT_JACKET, WT_GLOVES, WT_UNDERSHIRT, WT_TATTOO, WT_ALPHA));											  
 
 	addEntry(BAKED_LOWER,      new BakedEntry(TEX_LOWER_BAKED, 
-											  "lower_body", "91b4a2c7-1b1a-ba16-9a16-1f8f8dcc1c3f",
+											  "lower_body", "2944ee70-90a7-425d-a5fb-d749c782ed7d",
 											  8, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS,
 											  TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA,
 											  9, WT_SHAPE, WT_SKIN,	WT_PANTS, WT_SHOES,	 WT_SOCKS,  WT_JACKET, WT_UNDERPANTS, WT_TATTOO, WT_ALPHA));
 
 	addEntry(BAKED_EYES,       new BakedEntry(TEX_EYES_BAKED,  
-											  "eyes", "b2cf28af-b840-1071-3c6a-78085d8128b5",
+											  "eyes", "27b1bc0f-979f-4b13-95fe-b981c2ba9788",
 											  2, TEX_EYES_IRIS, TEX_EYES_ALPHA,
 											  2, WT_EYES, WT_ALPHA));
 
 	addEntry(BAKED_SKIRT,      new BakedEntry(TEX_SKIRT_BAKED,
-											  "skirt", "ea800387-ea1a-14e0-56cb-24f2022f969a", 
+											  "skirt", "03e7e8cb-1368-483b-b6f3-74850838ba63", 
 											  1, TEX_SKIRT,
 											  1, WT_SKIRT));
 
 	addEntry(BAKED_HAIR,       new BakedEntry(TEX_HAIR_BAKED,
-											  "hair", "0af1ef7c-ad24-11dd-8790-001f5bf833e8", 
+											  "hair", "a60e85a9-74e8-48d8-8a2d-8129f28d9b61", 
 											  2, TEX_HAIR, TEX_HAIR_ALPHA,
 											  2, WT_HAIR, WT_ALPHA));
 }
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 758db538a28f4cbddb991e7908c9fa91b726d9a1..85a68fdd3f5b1ef5d5bfcc771586c0c3fb3d2918 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -41,53 +41,22 @@
 #include "llvoavatarself.h"
 #include "llvoavatar.h"
 
-#include <stdio.h>
-#include <ctype.h>
-
-#include "llaudioengine.h"
-#include "noise.h"
+#include "pipeline.h"
 
-// TODO: Seraph - Remove unnecessary headers.  These are copied from llvoavatar.h.
 #include "llagent.h" //  Get state values from here
 #include "llagentwearables.h"
-#include "llviewercontrol.h"
-#include "lldrawpoolavatar.h"
-#include "lldriverparam.h"
-#include "lleditingmotion.h"
-#include "llemote.h"
-#include "llface.h"
-#include "llfirstuse.h"
-#include "llheadrotmotion.h"
 #include "llhudeffecttrail.h"
 #include "llhudmanager.h"
-#include "llkeyframefallmotion.h"
-#include "llkeyframestandmotion.h"
-#include "llkeyframewalkmotion.h"
-#include "llmutelist.h"
 #include "llselectmgr.h"
-#include "llsprite.h"
-#include "lltargetingmotion.h"
-#include "lltexlayer.h"
-#include "lltexglobalcolor.h"
 #include "lltoolgrab.h"	// for needsRenderBeam
 #include "lltoolmgr.h" // for needsRenderBeam
 #include "lltoolmorph.h"
 #include "lltrans.h"
 #include "llviewercamera.h"
-#include "llviewertexturelist.h"
 #include "llviewermenu.h"
 #include "llviewerobjectlist.h"
-#include "llviewerparcelmgr.h"
 #include "llviewerstats.h"
-#include "llvovolume.h"
-#include "llworld.h"
-#include "pipeline.h"
-#include "llviewershadermgr.h"
-#include "llsky.h"
-#include "llanimstatelabels.h"
-#include "llgesturemgr.h" //needed to trigger the voice gesticulations
-#include "llvoiceclient.h"
-#include "llvoicevisualizer.h" // Ventrella
+#include "llviewerregion.h"
 #include "llappearancemgr.h"
 
 #if LL_MSVC
@@ -205,7 +174,10 @@ void LLVOAvatarSelf::markDead()
 		 param;
 		 param = (LLViewerVisualParam*) getNextVisualParam())
 	{
-		param->setIsDummy(TRUE);
+		if (param->getWearableType() != WT_INVALID)
+		{
+			param->setIsDummy(TRUE);
+		}
 	}
 
 	return success;
@@ -1080,15 +1052,8 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
 	if (attachment->isObjectAttached(viewer_object))
 	{
 		const LLUUID& attachment_id = viewer_object->getItemID();
-		LLViewerInventoryItem *item = gInventory.getItem(attachment_id);
-		if (item)
-		{
-			LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:");
-			LLAppearanceManager::wearItem(item,false);  // Add COF link for item.
-			gInventory.addChangedMask(LLInventoryObserver::LABEL, attachment_id);
-		}
+		LLAppearanceManager::registerAttachment(attachment_id);
 	}
-	gInventory.notifyObservers();
 
 	return attachment;
 }
@@ -1096,12 +1061,12 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
 //virtual
 BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
 {
-	const LLUUID item_id = viewer_object->getItemID();
+	const LLUUID attachment_id = viewer_object->getItemID();
 	if (LLVOAvatar::detachObject(viewer_object))
 	{
 		// the simulator should automatically handle permission revocation
 		
-		stopMotionFromSource(item_id);
+		stopMotionFromSource(attachment_id);
 		LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE);
 		
 		LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
@@ -1126,13 +1091,9 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
 		}
 		else
 		{
-			LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
-			LLAppearanceManager::removeItemLinks(item_id, false);
+			LLAppearanceManager::unregisterAttachment(attachment_id);
 		}
 		
-		// BAP - needs to change for label to track link.
-		gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
-		gInventory.notifyObservers();
 		return TRUE;
 	}
 	return FALSE;
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index 570a3334b9ec4b25da058e7571bed200db5be109..110433a27d438daeaabee2e2cc02d2d616b226ff 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -106,7 +106,7 @@ void LLVOGrass::updateSpecies()
 		SpeciesMap::const_iterator it = sSpeciesTable.begin();
 		mSpecies = (*it).first;
 	}
-	setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE));
+	setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
 }
 
 
diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp
index 9bafc03a6d1845893194a41e8163db4fc42d43d3..e777d7362f7ec18abe2a2c7dbf7bc3154e2d96cf 100644
--- a/indra/newview/llvoicevisualizer.cpp
+++ b/indra/newview/llvoicevisualizer.cpp
@@ -142,7 +142,7 @@ LLVoiceVisualizer::LLVoiceVisualizer( const U8 type )
 	for (int i=0; i<NUM_VOICE_SYMBOL_WAVES; i++)
 	{
 		mSoundSymbol.mWaveFadeOutStartTime	[i] = mCurrentTime;
-		mSoundSymbol.mTexture				[i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FALSE, TRUE);
+		mSoundSymbol.mTexture				[i] = LLViewerTextureManager::getFetchedTextureFromFile(sound_level_img[i], FALSE, LLViewerTexture::BOOST_UI);
 		mSoundSymbol.mWaveActive			[i] = false;
 		mSoundSymbol.mWaveOpacity			[i] = 1.0f;
 		mSoundSymbol.mWaveExpansion			[i] = 1.0f;
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index d44c5432669c4aa0759bb371debf2ef791f02fc6..d37deaf53d15ce3091418f1e88296e60d908aa82 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -376,9 +376,9 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
 	mSun.setIntensity(SUN_INTENSITY);
 	mMoon.setIntensity(0.1f * SUN_INTENSITY);
 
-	mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, TRUE);
+	mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI);
 	mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
-	mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, TRUE);
+	mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI);
 	mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
 	mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1);
 	mBloomTexturep->setNoDelete() ;
@@ -472,9 +472,9 @@ void LLVOSky::restoreGL()
 	{
 		mSkyTex[i].restoreGL();
 	}
-	mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, TRUE);
+	mSunTexturep = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI);
 	mSunTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
-	mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, TRUE);
+	mMoonTexturep = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI);
 	mMoonTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
 	mBloomTexturep = LLViewerTextureManager::getFetchedTexture(IMG_BLOOM1);
 	mBloomTexturep->setNoDelete() ;
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 615ae13bc2c40c19e1f75225bf470a8ea95e4b2f..ec118d89bcc920b216fb0feaeae6a4cc92480b28 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -311,7 +311,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
 	//
 	//  Load Species-Specific data 
 	//
-	mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+	mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 	mBranchLength = sSpeciesTable[mSpecies]->mBranchLength;
 	mTrunkLength = sSpeciesTable[mSpecies]->mTrunkLength;
 	mLeafScale = sSpeciesTable[mSpecies]->mLeafScale;
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 7d4bef3f7d3f6b34f07c832da13f0fe23798b83f..1d94e9118e0aa1b8c42ec851364ea2df468d6d89 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -665,7 +665,7 @@ void LLVOVolume::updateTextures()
 	{
 		LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
 		LLUUID id =  sculpt_params->getSculptTexture(); 
-		mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+		mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 		if (mSculptTexture.notNull())
 		{
 			S32 lod = llmin(mLOD, 3);
@@ -876,7 +876,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail
 		
 		if (isSculpted())
 		{
-			mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+			mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 			if (mSculptTexture.notNull())
 			{
 				//ignore sculpt GL usage since bao fixed this in a separate branch
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 4cd29bb83866a8365a1ba2c4fc450cb908b704ae..2b4861ce4fedc80aea35f238e373ef3a5d099ee9 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -60,7 +60,7 @@ static std::string asset_id_to_filename(const LLUUID &asset_id);
 
 LLWearable::LLWearable(const LLTransactionID& transaction_id) :
 	mDefinitionVersion(LLWearable::sCurrentDefinitionVersion),
-	mType(WT_SHAPE)
+	mType(WT_INVALID)
 {
 	mTransactionID = transaction_id;
 	mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());
@@ -68,7 +68,7 @@ LLWearable::LLWearable(const LLTransactionID& transaction_id) :
 
 LLWearable::LLWearable(const LLAssetID& asset_id) :
 	mDefinitionVersion( LLWearable::sCurrentDefinitionVersion ),
-	mType(WT_SHAPE)
+	mType(WT_INVALID)
 {
 	mAssetID = asset_id;
 	mTransactionID.setNull();
@@ -181,13 +181,7 @@ void LLWearable::createVisualParams()
 	{
 		if (param->getWearableType() == mType)
 		{
-			if (mVisualParamIndexMap[param->getID()])
-			{
-				delete mVisualParamIndexMap[param->getID()];
-			}
-			LLViewerVisualParam *new_param = param->cloneParam(this);
-			new_param->setIsDummy(FALSE);
-			mVisualParamIndexMap[param->getID()] = new_param;
+			addVisualParam(param->cloneParam(this));
 		}
 	}
 
@@ -661,7 +655,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user, BOOL update_customize_floater
 			{	
 				image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);
 			}
-			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE );
+			LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE );
 			// MULTI-WEARABLE: replace hard-coded 0
 			avatar->setLocalTextureTE(te, image, set_by_user, 0);
 		}
@@ -750,7 +744,8 @@ void LLWearable::copyDataFrom(const LLWearable* src)
 	mDescription = src->mDescription;
 	mPermissions = src->mPermissions;
 	mSaleInfo = src->mSaleInfo;
-	mType = src->mType;
+
+	setType(src->mType);
 
 	mSavedVisualParamMap.clear();
 	// Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed)
@@ -763,9 +758,6 @@ void LLWearable::copyDataFrom(const LLWearable* src)
 			S32 id = param->getID();
 			F32 weight = src->getVisualParamWeight(id);
 			mSavedVisualParamMap[id] = weight;
-			
-			// Clones a visual param from src and adds it to this wearable. Value of param is taken from current value of source param, not saved.
-			addVisualParam(param->cloneParam(this));
 		}
 	}
 
@@ -860,6 +852,7 @@ void LLWearable::addVisualParam(LLVisualParam *param)
 	{
 		delete mVisualParamIndexMap[param->getID()];
 	}
+	param->setIsDummy(FALSE);
 	mVisualParamIndexMap[param->getID()] = param;
 }
 
@@ -1123,7 +1116,7 @@ void LLWearable::saveNewAsset() const
 		{
 			llinfos << "Update Agent Inventory via capability" << llendl;
 			LLSD body;
-			body["folder_id"] = gInventory.findCategoryUUIDForType(getAssetType());
+			body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType()));
 			body["asset_type"] = LLAssetType::lookup(getAssetType());
 			body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE);
 			body["name"] = getName();
diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp
index f198f3a0cf531b8984cd0004aca2f3fc17a8ab7a..355d4141c352ec851bb5d5ecbd45f229faa6a338 100644
--- a/indra/newview/llworldmap.cpp
+++ b/indra/newview/llworldmap.cpp
@@ -525,7 +525,7 @@ void LLWorldMap::processMapLayerReply(LLMessageSystem* msg, void**)
 		LLWorldMapLayer new_layer;
 		new_layer.LayerDefined = TRUE;
 		msg->getUUIDFast(_PREHASH_LayerData, _PREHASH_ImageID, new_layer.LayerImageID, block);
-		new_layer.LayerImage = LLViewerTextureManager::getFetchedTexture(new_layer.LayerImageID, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+		new_layer.LayerImage = LLViewerTextureManager::getFetchedTexture(new_layer.LayerImageID, MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 
 		gGL.getTexUnit(0)->bind(new_layer.LayerImage);
 		new_layer.LayerImage->setAddressMode(LLTexUnit::TAM_CLAMP);
@@ -640,14 +640,15 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)
 			siminfo->mMapImageID[agent_flags] = image_id;
 
 #ifdef IMMEDIATE_IMAGE_LOAD
-			siminfo->mCurrentImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+			siminfo->mCurrentImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], 
+				MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 			siminfo->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP);
 #endif
 			
 			if (siminfo->mMapImageID[2].notNull())
 			{
 #ifdef IMMEDIATE_IMAGE_LOAD
-				siminfo->mOverlayImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[2], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+				siminfo->mOverlayImage = LLViewerTextureManager::getFetchedTexture(siminfo->mMapImageID[2], MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 #endif
 			}
 			else
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 823db027eeb872e0a1f9f3927200c37b4910e3a8..920415873e9fea716ff608483ed6ca968309a714 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -511,7 +511,8 @@ void LLWorldMapView::draw()
 				 (textures_requested_this_tick < MAX_REQUEST_PER_TICK)))
 			{
 				textures_requested_this_tick++;
-				info->mCurrentImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+				info->mCurrentImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[LLWorldMap::getInstance()->mCurrentMap], 
+					MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
                 info->mCurrentImage->setAddressMode(LLTexUnit::TAM_CLAMP);
 				simimage = info->mCurrentImage;
 				gGL.getTexUnit(0)->bind(simimage);
@@ -524,7 +525,7 @@ void LLWorldMapView::draw()
 				 (textures_requested_this_tick < MAX_REQUEST_PER_TICK)))
 			{
 				textures_requested_this_tick++;
-				info->mOverlayImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[2], MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+				info->mOverlayImage = LLViewerTextureManager::getFetchedTexture(info->mMapImageID[2], MIPMAP_TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
 				info->mOverlayImage->setAddressMode(LLTexUnit::TAM_CLAMP);
 				overlayimage = info->mOverlayImage;
 				gGL.getTexUnit(0)->bind(overlayimage);
diff --git a/indra/newview/skins/default/html/da/loading/loading.html b/indra/newview/skins/default/html/da/loading/loading.html
index cdad5702b9851f457a48ed564a4533bb7ff5e33a..5f3426eb609306458ed1b8138b2cee9b5b23bee9 100644
--- a/indra/newview/skins/default/html/da/loading/loading.html
+++ b/indra/newview/skins/default/html/da/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Indlæser...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Indlæser...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/de/loading/loading.html b/indra/newview/skins/default/html/de/loading/loading.html
index 3eddbc24f5e9ae6510ed3cd31e133aa0c2ebd1a3..44a621b2164c6df52c8f42e513a2db51b24397bf 100644
--- a/indra/newview/skins/default/html/de/loading/loading.html
+++ b/indra/newview/skins/default/html/de/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Wird geladen...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Wird geladen...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/en-us/loading/loading.html b/indra/newview/skins/default/html/en-us/loading/loading.html
index 34e5c84c4d476b1e6a53db45664eef533017aea6..1c62d2f73e0e7ee72773a83e0437bfd62a4c0706 100644
--- a/indra/newview/skins/default/html/en-us/loading/loading.html
+++ b/indra/newview/skins/default/html/en-us/loading/loading.html
@@ -1,9 +1,9 @@
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;loading...
-		</td>
-	</tr>
-</table>
-</body>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;loading...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/es/loading/loading.html b/indra/newview/skins/default/html/es/loading/loading.html
index f03284ba8ca4d27794bf9217b1ab619ef5cb4c2a..c4260b34c08cea4189b3ea5bed809364ad19d597 100644
--- a/indra/newview/skins/default/html/es/loading/loading.html
+++ b/indra/newview/skins/default/html/es/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Cargando...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Cargando...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/fr/loading/loading.html b/indra/newview/skins/default/html/fr/loading/loading.html
index 23c0ef03bc4ee5a7a2b316455598fe0d430da1af..b3953448e97ab1b65350fc922deec3b784369e70 100644
--- a/indra/newview/skins/default/html/fr/loading/loading.html
+++ b/indra/newview/skins/default/html/fr/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Chargement...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Chargement...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/hu/loading/loading.html b/indra/newview/skins/default/html/hu/loading/loading.html
index ade91f76c28b706a7617af45d4b32bcce7f8e96e..ab15a073bae471441748b9112fc1fa3e96903b9f 100644
--- a/indra/newview/skins/default/html/hu/loading/loading.html
+++ b/indra/newview/skins/default/html/hu/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Betöltés folyamatban...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Betöltés folyamatban...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/it/loading/loading.html b/indra/newview/skins/default/html/it/loading/loading.html
index 0f9af31f6ef880ee8128ad7b19d1d276c594e047..ab37e41f0453bacafde9c57af2ddd15dd57c40f5 100644
--- a/indra/newview/skins/default/html/it/loading/loading.html
+++ b/indra/newview/skins/default/html/it/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Attendi...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Attendi...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/ja/loading/loading.html b/indra/newview/skins/default/html/ja/loading/loading.html
index 069dc5d12fffac9f361599f97d127db049b12954..35cf74a35f936d5afb971af79a9286cc6f92f6ef 100644
--- a/indra/newview/skins/default/html/ja/loading/loading.html
+++ b/indra/newview/skins/default/html/ja/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;ロード中...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;ロード中...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/nl/loading/loading.html b/indra/newview/skins/default/html/nl/loading/loading.html
index 39a8691f3f95053245cd4460d6bc017d3f1faf99..0215bd7e47228e86a3bf8fbb5796a9ef7f8b903b 100644
--- a/indra/newview/skins/default/html/nl/loading/loading.html
+++ b/indra/newview/skins/default/html/nl/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Laden...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Laden...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/pl/loading/loading.html b/indra/newview/skins/default/html/pl/loading/loading.html
index 515890c2d5cad0801b487db19048d834a61cef85..50f3dfb0c5b18b900f449807c2ee80a463ca1c3e 100644
--- a/indra/newview/skins/default/html/pl/loading/loading.html
+++ b/indra/newview/skins/default/html/pl/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Ładowanie...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Ładowanie...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/pt/loading/loading.html b/indra/newview/skins/default/html/pt/loading/loading.html
index 635ea62406e12733ed1d6ef4a089b111a53787a7..a83e1123d0f6088510d21df187a13cd9424e1e52 100644
--- a/indra/newview/skins/default/html/pt/loading/loading.html
+++ b/indra/newview/skins/default/html/pt/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Carregando...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Carregando...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/ru/loading/loading.html b/indra/newview/skins/default/html/ru/loading/loading.html
index dcc0d73c1acfd4e26fce52c806351ccc37ffcf20..892c0b9f7fb045d3c856b40ff7883d6950b702a6 100644
--- a/indra/newview/skins/default/html/ru/loading/loading.html
+++ b/indra/newview/skins/default/html/ru/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Загрузка...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Загрузка...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/tr/loading/loading.html b/indra/newview/skins/default/html/tr/loading/loading.html
index e7812e7c8e66e913fd9eeb9fcd8ce6bfea6eb548..1ac07bff3403b87bcff4f970c8a7b193a8a44a17 100644
--- a/indra/newview/skins/default/html/tr/loading/loading.html
+++ b/indra/newview/skins/default/html/tr/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Yükleniyor...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Yükleniyor...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/uk/loading/loading.html b/indra/newview/skins/default/html/uk/loading/loading.html
index 0f67994635083f8e43bcaa2f3ca13d209c55c697..3b5b8679b43d88c8342cba5aa0437eb4bfa91fbe 100644
--- a/indra/newview/skins/default/html/uk/loading/loading.html
+++ b/indra/newview/skins/default/html/uk/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Завантаж...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Завантаж...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/zh/loading/loading.html b/indra/newview/skins/default/html/zh/loading/loading.html
index 462ea291d9658b33fe6560ac511072b09b952ba3..d1d5d25c927538a41b42ee4eb01c6924bb652d8a 100644
--- a/indra/newview/skins/default/html/zh/loading/loading.html
+++ b/indra/newview/skins/default/html/zh/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
-	<tr>
-		<td align="center" valign="middle" style="font-size:0.8em;">
-			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;请等待...
-		</td>
-	</tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+	<tr>
+		<td align="center" valign="middle" style="font-size:0.8em;">
+			<img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;请等待...
+		</td>
+	</tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tga
new file mode 100644
index 0000000000000000000000000000000000000000..04539c2cc4f002c9c1c4724215e5b7cf08cfb177
Binary files /dev/null and b/indra/newview/skins/default/textures/inv_folder_inbox.tga differ
diff --git a/indra/newview/skins/default/textures/navbar/Favorite_Link_Over.png b/indra/newview/skins/default/textures/navbar/Favorite_Link_Over.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4f126f9692110c2f8ecb9f6c80e85c05d947e65
Binary files /dev/null and b/indra/newview/skins/default/textures/navbar/Favorite_Link_Over.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index a75d38d9671fcb0bde242d400c595c275c8caf8e..8be90cb03ee4f814df7f4759734f21ea3adecb2c 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -89,6 +89,7 @@
   <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
   <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" />
   <texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" />
+  <texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" />
 
   <texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" scale.left="2" scale.top="0" scale.right="2" scale.bottom="0" />
   <texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/da/panel_edit_profile.xml b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
index 74b7c7dd72642afc93cd8e275bf9a503c1430792..b4d0fa20ef12c59d124e1d6cc58d443110d86e18 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Beboer" />
-   <string name="AcctTypeTrial"
-    value="På prøve" />
-   <string name="AcctTypeCharterMember"
-    value="æresmedlem" />
-   <string name="AcctTypeEmployee"
-    value="Linden Lab medarbejder" />
-   <string name="PaymentInfoUsed"
-    value="Betalende medlem" />
-   <string name="PaymentInfoOnFile"
-    value="Registreret betalende" />
-   <string name="NoPaymentInfoOnFile"
-    value="Ingen betalingsinfo" />
-   <string name="AgeVerified"
-    value="Alders-checket" />
-   <string name="NotAgeVerified"
-    value="Ikke alders-checket" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=da
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partner:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Optaget autosvar:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Beboer" />
+   <string name="AcctTypeTrial"
+    value="På prøve" />
+   <string name="AcctTypeCharterMember"
+    value="æresmedlem" />
+   <string name="AcctTypeEmployee"
+    value="Linden Lab medarbejder" />
+   <string name="PaymentInfoUsed"
+    value="Betalende medlem" />
+   <string name="PaymentInfoOnFile"
+    value="Registreret betalende" />
+   <string name="NoPaymentInfoOnFile"
+    value="Ingen betalingsinfo" />
+   <string name="AgeVerified"
+    value="Alders-checket" />
+   <string name="NotAgeVerified"
+    value="Ikke alders-checket" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=da
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partner:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Optaget autosvar:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
index 1f67e0231d06387f251a61f7addf1e6594481aae..3203eacdb5503573ee5f7625d578921db259a6a2 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Einwohner" />
-   <string name="AcctTypeTrial"
-    value="Test" />
-   <string name="AcctTypeCharterMember"
-    value="Charta-Mitglied" />
-   <string name="AcctTypeEmployee"
-    value="Linden Lab-Mitarbeiter" />
-   <string name="PaymentInfoUsed"
-    value="Zahlungsinfo verwendet" />
-   <string name="PaymentInfoOnFile"
-    value="Zahlungsinfo archiviert" />
-   <string name="NoPaymentInfoOnFile"
-    value="Keine Zahlungsinfo archiviert" />
-   <string name="AgeVerified"
-    value="Altersgeprüft" />
-   <string name="NotAgeVerified"
-    value="Nicht altersgeprüft" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=de
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partner:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Antwort für Beschäftigt-Modus:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Einwohner" />
+   <string name="AcctTypeTrial"
+    value="Test" />
+   <string name="AcctTypeCharterMember"
+    value="Charta-Mitglied" />
+   <string name="AcctTypeEmployee"
+    value="Linden Lab-Mitarbeiter" />
+   <string name="PaymentInfoUsed"
+    value="Zahlungsinfo verwendet" />
+   <string name="PaymentInfoOnFile"
+    value="Zahlungsinfo archiviert" />
+   <string name="NoPaymentInfoOnFile"
+    value="Keine Zahlungsinfo archiviert" />
+   <string name="AgeVerified"
+    value="Altersgeprüft" />
+   <string name="NotAgeVerified"
+    value="Nicht altersgeprüft" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=de
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partner:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Antwort für Beschäftigt-Modus:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/favorites_bar_button.xml b/indra/newview/skins/default/xui/en/favorites_bar_button.xml
index c35cbb15393aa446f5a4cf386518fae8573306b6..361f5a7bc827dad2abd8b5d9ab312b16134f38c8 100644
--- a/indra/newview/skins/default/xui/en/favorites_bar_button.xml
+++ b/indra/newview/skins/default/xui/en/favorites_bar_button.xml
@@ -9,10 +9,10 @@
  image_disabled_selected="transparent.j2c"
  image_selected="transparent.j2c"
  image_unselected="transparent.j2c"
- image_hover_selected="FileMenu_BarSelect"
- image_hover_unselected="FileMenu_BarSelect"
- image_pressed="FileMenu_BarSelect"
- image_pressed_selected="FileMenu_BarSelect"
+ image_hover_selected="Favorite_Link_Over"
+ image_hover_unselected="Favorite_Link_Over"
+ image_pressed="Favorite_Link_Over"
+ image_pressed_selected="Favorite_Link_Over"
  hover_glow_amount="0.15"
  layout="topleft"
  left="0"
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index e13aa610e535d118259e86ce2d530297267e765b..1def98d1bba472487e9ce2d799a5fa23ead08bed 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
- legacy_header_height="18"
  can_tear_off="false"
  height="420"
  layout="topleft"
@@ -26,28 +25,24 @@
         remaining
     </floater.string>
     <tab_container
-     follows="all"
+     follows="left|top|right|bottom"
      height="400"
-   halign="center"
      layout="topleft"
-     font="SansSerifSmall"
      left="1"
-      tab_padding_right="5"
-      tab_height="20"
      name="landtab"
      tab_position="top"
      top="20"
      width="459">
-   <panel
+        <panel
          border="true"
-         follows="all"
+         follows="left|top|right|bottom"
          height="380"
          label="General"
          layout="topleft"
          left="1"
          help_topic="land_general_tab"
          name="land_general_panel"
-         top="0"
+         top="-31"
          width="458">
             <panel.string
              name="new users only">
@@ -536,7 +531,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
         </panel>
         <panel
          border="true"
-         follows="all"
+         follows="left|top|right|bottom"
          height="380"
          label="Covenant"
          layout="topleft"
@@ -632,7 +627,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              length="1"
              enabled="false"
              follows="left|top|right|bottom"
-             handle_edit_keys_directly="true"
+             handle_edit_keys_directly="true" 
              height="115"
              layout="topleft"
              left_delta="0"
@@ -803,7 +798,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
         </panel>
         <panel
          border="true"
-         follows="all"
+         follows="left|top|right|bottom"
          height="380"
          label="Objects"
          layout="topleft"
@@ -854,7 +849,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              left_delta="152"
              name="objects_available"
              top_delta="0"
-             width="212">
+             width="260">
                 [COUNT] out of [MAX] ([AVAILABLE] available)
             </text>
             <text
@@ -875,7 +870,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              follows="left|top"
              height="16"
              layout="topleft"
-             left_delta="152"
+             left_delta="200"
              name="object_contrib_text"
              top_delta="0"
              width="212">
@@ -899,7 +894,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              follows="left|top"
              height="16"
              layout="topleft"
-             left_delta="152"
+             left_delta="200"
              name="total_objects_text"
              top_delta="0"
              width="48">
@@ -914,7 +909,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              left="28"
              name="Owned by parcel owner:"
              top="84"
-             width="128">
+             width="176">
                 Owned by parcel owner:
             </text>
             <text
@@ -923,7 +918,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              follows="left|top"
              height="16"
              layout="topleft"
-             left_delta="128"
+             left_delta="176"
              name="owner_objects_text"
              top_delta="0"
              width="48">
@@ -939,7 +934,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              label_selected="Show"
              layout="topleft"
              name="ShowOwner"
-             right="-190"
+             right="-140"
              width="60" />
             <button
              bottom="100"
@@ -951,7 +946,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              label_selected="Return..."
              layout="topleft"
              name="ReturnOwner..."
-             right="-60"
+             right="-10"
              tool_tip="Return objects to their owners."
              width="119" />
             <text
@@ -963,7 +958,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              left="28"
              name="Set to group:"
              top="104"
-             width="128">
+             width="176">
                 Set to group:
             </text>
             <text
@@ -972,7 +967,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              follows="left|top"
              height="16"
              layout="topleft"
-             left_delta="128"
+             left_delta="176"
              name="group_objects_text"
              top_delta="0"
              width="48">
@@ -988,7 +983,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              label_selected="Show"
              layout="topleft"
              name="ShowGroup"
-             right="-190"
+             right="-140"
              width="60" />
             <button
              bottom="120"
@@ -1000,7 +995,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              label_selected="Return..."
              layout="topleft"
              name="ReturnGroup..."
-             right="-60"
+             right="-10"
              tool_tip="Return objects to their owners."
              width="119" />
             <text
@@ -1012,7 +1007,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              left="28"
              name="Owned by others:"
              top="124"
-             width="128">
+             width="176">
                 Owned by others:
             </text>
             <text
@@ -1021,7 +1016,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              follows="left|top"
              height="16"
              layout="topleft"
-             left_delta="128"
+             left_delta="176"
              name="other_objects_text"
              top_delta="0"
              width="48">
@@ -1037,7 +1032,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              label_selected="Show"
              layout="topleft"
              name="ShowOther"
-             right="-190"
+             right="-140"
              width="60" />
             <button
              bottom="140"
@@ -1049,7 +1044,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              label_selected="Return..."
              layout="topleft"
              name="ReturnOther..."
-             right="-60"
+             right="-10"
              tool_tip="Return objects to their owners."
              width="119" />
             <text
@@ -1061,7 +1056,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              left="28"
              name="Selected / sat upon:"
              top="144"
-             width="128">
+             width="176">
                 Selected / sat upon:
             </text>
             <text
@@ -1070,7 +1065,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              follows="left|top"
              height="16"
              layout="topleft"
-             left_delta="128"
+             left_delta="176"
              name="selected_objects_text"
              top_delta="0"
              width="48">
@@ -1097,7 +1092,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
              layout="topleft"
              max_length="6"
              name="clean other time"
-             right="-100"
+             right="-50"
              width="56" />
             <text
              type="string"
@@ -1169,7 +1164,7 @@ Go to World menu &gt; About Land or select another parcel to show its details.
         </panel>
         <panel
          border="true"
-         follows="all"
+         follows="left|top|right|bottom"
          height="333"
          label="Options"
          layout="topleft"
@@ -1492,16 +1487,6 @@ Only large parcels can be listed in search.
                  name="item12"
                  value="other" />
             </combo_box>
-            <button
-             follows="left|top"
-             height="18"
-             label="?"
-             label_selected="?"
-             layout="topleft"
-             left_pad="15"
-             name="?"
-             top_delta="0"
-             width="18" />
             <check_box
              height="16"
              label="Mature Content"
@@ -1605,15 +1590,16 @@ Only large parcels can be listed in search.
                  value="Anywhere" />
             </combo_box>
         </panel>
-     <panel
+        <panel
          border="true"
-         follows="all"
+         follows="left|top|right|bottom"
          height="363"
          label="Media"
          layout="topleft"
          left_delta="0"
          help_topic="land_media_tab"
          name="land_media_panel"
+         top_delta="1"
          width="458">
             <text
              type="string"
@@ -1624,22 +1610,24 @@ Only large parcels can be listed in search.
              left="10"
              name="with media:"
              top="9"
-             width="100">
+             width="65">
                 Type:
             </text>
             <combo_box
-            height="20"
+             height="18"
              layout="topleft"
-             left_pad="10"
+             left_pad="5"
              name="media type"
              tool_tip="Specify if the URL is a movie, web page, or other media"
-             width="150" />
+             top_delta="-2"
+             width="120" />
             <text
              follows="left|top"
              height="16"
              layout="topleft"
              left_pad="10"
              name="mime_type"
+             top_delta="2"
              width="200" />
             <text
              type="string"
@@ -1649,30 +1637,32 @@ Only large parcels can be listed in search.
              layout="topleft"
              left="10"
              name="at URL:"
-             top_pad="10"
-             width="100">
+             top="29"
+             width="65">
                 Home URL:
             </text>
             <line_editor
+             bottom_delta="0"
              follows="left|top"
-             height="20"
+             height="16"
              layout="topleft"
-             left_pad="10"
+             left="80"
              max_length="255"
              name="media_url"
+             right="-80"
              select_on_focus="true"
-             width="270"
-            />
+             text_readonly_color="0.576471 0.662745 0.835294 1" />
             <button
              follows="left|top"
              font="SansSerifSmall"
-             height="20"
-             label="Set"
-             label_selected="Set"
+             height="16"
+             label="Set..."
+             label_selected="Set..."
              layout="topleft"
-             left_pad="5"
+             left_pad="8"
              name="set_media_url"
-             width="50" />
+             top_delta="0"
+             width="60" />
             <text
              type="string"
              length="1"
@@ -1681,34 +1671,37 @@ Only large parcels can be listed in search.
              layout="topleft"
              left="10"
              name="CurrentURL:"
-             top_pad="10"
-             width="100">
+             top="49"
+             width="65">
                 Current URL:
             </text>
             <text
              follows="left|top"
              height="16"
              layout="topleft"
-             left_pad="10"
+             left_pad="5"
              name="current_url"
-             width="260">http://</text>
+             top_delta="0"
+             width="300" />
             <button
              follows="left|top"
-             height="20"
-             label="Reset"
-             label_selected="Reset"
+             font="SansSerifSmall"
+             height="16"
+             label="Reset..."
+             label_selected="Reset..."
              layout="topleft"
              left_pad="6"
              name="reset_media_url"
+             top_delta="0"
              width="60" />
             <check_box
              height="16"
              label="Hide URL"
              layout="topleft"
-             left="120"
+             left="100"
              name="hide_media_url"
              tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types."
-             top_pad="2"
+             top="89"
              width="200" />
             <text
              type="string"
@@ -1718,20 +1711,23 @@ Only large parcels can be listed in search.
              layout="topleft"
              left="10"
              name="Description:"
-             top_pad="10"
-             width="100">
+             top="49"
+             width="364">
                 Description:
             </text>
             <line_editor
+             border_style="line"
+             border_thickness="1"
+             bottom_delta="0"
              follows="left|top"
-             height="35"
+             height="16"
              layout="topleft"
+             left="80"
+             max_length="255"
              name="url_description"
-             left_pad="10"
+             right="-80"
              select_on_focus="true"
-             tool_tip="Text displayed next to play/load button"
-             top_delta="0"
-             width="270" />
+             tool_tip="Text displayed next to play/load button" />
             <text
              type="string"
              length="1"
@@ -1740,9 +1736,10 @@ Only large parcels can be listed in search.
              layout="topleft"
              left="10"
              name="Media texture:"
-             top_pad="10"
-             width="100">
-                Replace Texture:
+             top="69"
+             width="364">
+                Replace
+Texture:
             </text>
             <texture_picker
              allow_no_texture="true"
@@ -1750,7 +1747,7 @@ Only large parcels can be listed in search.
              follows="left|top"
              height="80"
              layout="topleft"
-             left_pad="10"
+             left_delta="70"
              name="media texture"
              tool_tip="Click to choose a picture"
              top_delta="0"
@@ -1759,22 +1756,25 @@ Only large parcels can be listed in search.
              type="string"
              length="1"
              follows="left|top"
-             height="50"
+             height="16"
              layout="topleft"
-             left_pad="10"
+             left_delta="75"
              name="replace_texture_help"
-             top_delta="0"
-             word_wrap="true"
-             width="240">
-                Objects using this texture will show the movie or  web page after you click the play arrow.
+             top="85"
+             width="270">
+                Objects using this texture will show the movie or
+        web page after you click the play arrow.
+
+        Select the thumbnail to choose a different texture.
             </text>
             <check_box
              height="16"
              label="Auto scale"
              layout="topleft"
+             left_delta="70"
              name="media_auto_scale"
              tool_tip="Checking this option will scale the content for this parcel automatically. It may be slightly slower and lower quality visually but no other texture scaling or alignment will be required."
-             top_pad="3"
+             top_delta="0"
              width="200" />
             <text
              type="string"
@@ -1782,11 +1782,11 @@ Only large parcels can be listed in search.
              follows="left|top"
              height="16"
              layout="topleft"
-             left="10"
-             top_pad="10"
+             left="85"
              name="media_size"
              tool_tip="Size to render Web media, leave 0 for default."
-             width="100">
+             top="185"
+             width="85">
                 Size:
             </text>
             <spinner
@@ -1798,22 +1798,12 @@ Only large parcels can be listed in search.
              increment="1"
              initial_value="0"
              layout="topleft"
-             left_pad="10"
+             left_delta="65"
              max_val="1024"
              name="media_size_width"
              tool_tip="Size to render Web media, leave 0 for default."
              top_delta="0"
              width="64" />
-                         <text
-             type="string"
-             length="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             left_pad="5"
-             name="pixels">
-                px wide
-            </text>
             <spinner
              decimal_digits="0"
              enabled="false"
@@ -1823,21 +1813,23 @@ Only large parcels can be listed in search.
              increment="1"
              initial_value="0"
              layout="topleft"
-             left="120"
-             top_pad="3"
+             left_pad="16"
              max_val="1024"
              name="media_size_height"
              tool_tip="Size to render Web media, leave 0 for default."
+             top_delta="0"
              width="64" />
             <text
              type="string"
              length="1"
+             bottom_delta="0"
              follows="left|top"
              height="16"
              layout="topleft"
-             left_pad="5"
-             name="pixels">
-                px high
+             left_delta="70"
+             name="pixels"
+             right="-10">
+                pixels
             </text>
             <text
              type="string"
@@ -1847,15 +1839,15 @@ Only large parcels can be listed in search.
              layout="topleft"
              left="10"
              name="Options:"
-             top_pad="10"
-             width="100">
+             top="237"
+             width="292">
                 Options:
             </text>
             <check_box
              height="16"
              label="Loop"
              layout="topleft"
-             left_pad="10"
+             left_delta="70"
              name="media_loop"
              tool_tip="Play media in a loop.  When the media has finished playing, it will restart from the beginning."
              top_delta="0"
@@ -1863,9 +1855,9 @@ Only large parcels can be listed in search.
         </panel>
         <panel
          border="true"
-         follows="all"
+         follows="left|top|right|bottom"
          height="363"
-         label="Sound"
+         label="Audio"
          layout="topleft"
          left_delta="0"
          help_topic="land_audio_tab"
@@ -1916,16 +1908,6 @@ Only large parcels can be listed in search.
              name="check sound local"
              top_delta="0"
              width="292" />
-            <button
-             follows="left|top"
-             height="18"
-             label="?"
-             label_selected="?"
-             layout="topleft"
-             left_delta="292"
-             name="?"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -1967,7 +1949,7 @@ Only large parcels can be listed in search.
         </panel>
         <panel
          border="true"
-         follows="all"
+         follows="left|top|right|bottom"
          height="333"
          label="Access"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
index ab3d5722f0a174e89bc2f89934034e7d872ad2e1..ebce758d3d7ac8cb21b8b9cd48889e824350eadc 100644
--- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
@@ -455,7 +455,6 @@ Maximum animation length is [MAX_LENGTH] seconds.
      layout="topleft"
      left="10"
      name="play_btn"
-     picture_style="true"
      tool_tip="Play/pause your animation"
      top_pad="0"
      width="28" />
@@ -467,7 +466,6 @@ Maximum animation length is [MAX_LENGTH] seconds.
      layout="topleft"
      left_pad="4"
      name="stop_btn"
-     picture_style="true"
      tool_tip="Stop animation playback"
      top_delta="0"
      width="28" />
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index 1fd9b9531873f45bf164b84663a3fa1a24cc3cb0..592cf7e8fd5892c3959814cd18aa5aad2157ac96 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -116,7 +116,6 @@
              height="20"
              width="20"
              name="RefreshFriends"
-             picture_style="true"
              image_overlay="Refresh_Off">
              <button.commit_callback 
               function="Refresh.FriendList"/>
@@ -188,7 +187,6 @@
              height="28"
              width="28"
              name="Refresh"
-             picture_style="true"
              image_overlay="Refresh_Off" />
             <scroll_list
              follows="all"
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 1b694180130cf6dff0e59b91fbf8c5201c47eb91..a569b62e967c666fea0870990b20da77255dc63e 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -42,7 +42,6 @@
          layout="topleft"
          left="45"
          name="cam_track_stick"
-         picture_style="true"
          quadrant="left"
          scale_image="false"
          sound_flags="3"
@@ -59,7 +58,6 @@
          left="7"
          minus_image="ScrollThumb_Vert"
          name="zoom"
-         picture_style="true"
          plus_image="ScrollThumb_Vert"
          quadrant="left"
          scale_image="false"
@@ -75,7 +73,6 @@
          layout="topleft"
          left="45"
          name="cam_rotate_stick"
-         picture_style="true"
          quadrant="left"
          scale_image="false"
          sound_flags="3"
@@ -98,7 +95,6 @@
              layout="topleft"
              left="5"
              name="rear_view"
-             picture_style="true"
              tool_tip="Rear View"
              top="2"
              width="30">
@@ -113,7 +109,6 @@
              layout="topleft"
              left_pad="5"
              name="group_view"
-             picture_style="true"
              tool_tip="Group View"
              top="2"
              width="30">
@@ -128,7 +123,6 @@
              layout="topleft"
              left="5"
              name="front_view"
-             picture_style="true"
              tool_tip="Front View"
              top_pad="5"
              width="30">
@@ -143,7 +137,6 @@
              layout="topleft"
              left_pad="5"
              name="mouselook_view"
-             picture_style="true"
              tool_tip="Mouselook View"
              top_pad="-30"
              width="30">
diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml
index 686b8dc40fb808c54fa848941b86c41d7efd79d7..7c6376d84a61734d723ee6a27f4f4a3b3cddc07b 100644
--- a/indra/newview/skins/default/xui/en/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml
@@ -180,7 +180,6 @@
      layout="topleft"
      left_pad="30"
      name="color_pipette"
-     picture_style="true"
      width="32" />
     <button
      follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 07d76f4810025e8d62a59d9b3d4d4d0b9b7869ee..c021dd79de194b795ef89e681b0261440086cea2 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -3378,6 +3378,16 @@ scratch and wear it.
          layout="topleft"
          name="panel_list" />
     </scroll_container>
+	<button
+     bottom="536"
+     follows="right|bottom"
+     height="20"
+     label="Make Outfit"
+     label_selected="Make Outfit"
+     layout="topleft"
+     name="make_outfit_btn"
+     right="-216"
+     width="100" />
     <button
      bottom="536"
      follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
index b8fa104352a362b0b196bd12a1f88c003fb80ee9..b0d636445d5bd40245a94895bf74d6f3f998eb21 100644
--- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
@@ -28,16 +28,6 @@
          name="Day Cycle"
          top="0"
          width="642">
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="15"
-             label="?"
-             layout="topleft"
-             left="612"
-             name="WLDayCycleHelp"
-             top="3"
-             width="18" />
             <multi_slider
              can_edit_text="true"
              control_name="WLTimeSlider"
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index 128d518e12a07a04dc61022a5dbe82d46080106e..90b3339225e4faa7a9bae0c600aef84ea693d987 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -68,7 +68,6 @@
                layout="topleft"
                left="10"
                name="recent_viewsort_btn"
-               picture_style="true"
                top="5"
                width="18" />
               <button
@@ -81,7 +80,6 @@
                  layout="topleft"
                  left_pad="5"
                  name="new_gesture_btn"
-                 picture_style="true"
                  tool_tip="Make new gesture"
                  top_delta="0"
                  width="18" />
@@ -95,7 +93,6 @@
                  layout="topleft"
                  left_pad="230"
                  name="del_btn"
-                 picture_style="true"
                  tool_tip="Delete this gesture"
                  top_delta="0"
                  width="18" />
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 26d2f4e497f707eb7cc6dd9647a4a9fe664d002f..88aca005cfedec555a06fe59e12bfada224dc083 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -3,7 +3,7 @@
  legacy_header_height="18"
  background_visible="true"
  follows="left|top|right|bottom"
- height="270"
+ height="359"
  layout="topleft"
  left="0"
  name="panel_im"
@@ -12,13 +12,13 @@
  can_dock="true"
  can_minimize="true"
  visible="true" 
- width="365"
+ width="400"
  can_resize="true"
  min_width="200"
  min_height="150">
   <layout_stack follows="left|top|right|bottom"
-                height="255"
-                width="365"
+                height="344"
+                width="400"
                 layout="topleft"
                 orientation="horizontal"
                 name="im_panels"
@@ -28,13 +28,13 @@
       name="panel_im_control_panel"
       layout="topleft"
       top_delta="-3"
-      width="146"
-      height="255"
+      height="344"
       follows="left"
       label="IM Control Panel"
+      auto_resize="false"
       user_resize="false" />
-    <layout_panel height="255"
-                  width="200"
+    <layout_panel height="344"
+                  width="235"
                   left_delta="146" 
                   top="0"
                   user_resize="false">
@@ -56,14 +56,14 @@
        length="1"
        follows="left|top|right|bottom"
        font="SansSerif"
-       height="205"
+       height="290"
        layout="topleft"
        name="chat_history"
        parse_highlights="true"
        allow_html="true" 
-       width="195">
+       width="230">
       </chat_history>
-      <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="190">
+      <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="225">
       </line_editor>
     </layout_panel>
   </layout_stack>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index dfa6c83b4e51b44cbbb1b42f03e2c9e6f337bd9d..3e19bdee0fe5ec0da5c491c4f241448b9306babb 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -30,405 +30,16 @@
      name="Fetched">
         Fetched
     </floater.string>
-    <filter_editor
-     search_button_visible="false"
-     text_pad_left="12"
-     follows="left|top|right"
-     height="16"
-     label="Type here to search"
-     layout="topleft"
-     left="6"
-     name="inventory search editor"
-     top="34"
-     width="455" />
-    <tab_container
-     follows="all"
-     height="508"
-     halign="center"
-     layout="topleft"
-     left_delta="-4"
-     name="inventory filter tabs"
-     tab_position="top"
-     tab_height="20"
-     top_pad="5"
-     width="463">
-        <inventory_panel
-         follows="left|top|right|bottom"
-         height="491"
-         label="All Items"
-         layout="topleft"
-         left="1"
-         name="All Items"
-         top="16"
-         width="461" />
-        <inventory_panel
-         follows="left|top|right|bottom"
-         height="491"
-         label="Recent Items"
-         layout="topleft"
-         left_delta="0"
-         name="Recent Items"
-         top_delta="0"
-         width="461" />
-    </tab_container>
-    <menu_bar
-     bg_visible="false"
-     follows="left|top|right"
-     height="18"
-     layout="topleft"
-     left_delta="0"
-     mouse_opaque="false"
-     name="Inventory Menu"
-     top_delta="-38"
-     width="461">
-        <menu
-         height="101"
-         label="File"
-         layout="topleft"
-         left="0"
-         mouse_opaque="false"
-         name="File"
-         tear_off="true"
-         top="-117"
-         width="128">
-            <menu_item_call
-             label="Open"
-             layout="topleft"
-             name="Open">
-                <menu_item_call.on_click
-                 function="Inventory.DoToSelected"
-                 parameter="open" />
-            </menu_item_call>
-            <menu
-             create_jump_keys="true"
-             label="Upload"
-             layout="topleft"
-             name="upload"
-             tear_off="true">
-                <menu_item_call
-                 label="Image (L$[COST])..."
-                 layout="topleft"
-                 name="Upload Image"
-                 shortcut="control|U">
-                    <menu_item_call.on_click
-                     function="File.UploadImage"
-                     parameter="" />
-                    <menu_item_call.on_enable
-                     function="File.EnableUpload" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Sound (L$[COST])..."
-                 layout="topleft"
-                 name="Upload Sound">
-                    <menu_item_call.on_click
-                     function="File.UploadSound"
-                     parameter="" />
-                    <menu_item_call.on_enable
-                     function="File.EnableUpload" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Animation (L$[COST])..."
-                 layout="topleft"
-                 name="Upload Animation">
-                    <menu_item_call.on_click
-                     function="File.UploadAnim"
-                     parameter="" />
-                    <menu_item_call.on_enable
-                     function="File.EnableUpload" />
-                </menu_item_call>
-                <menu_item_call
-                 label="Bulk (L$[COST] per file)..."
-                 layout="topleft"
-                 name="Bulk Upload">
-                    <menu_item_call.on_click
-                     function="File.UploadBulk"
-                     parameter="" />
-                </menu_item_call>
-                <menu_item_separator
-                 layout="topleft" />
-            </menu>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_call
-             label="New Window"
-             layout="topleft"
-             name="New Window">
-                <menu_item_call.on_click
-                 function="Inventory.NewWindow" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft"
-             name="separator2" />
-            <menu_item_call
-             label="Show Filters"
-             layout="topleft"
-             name="Show Filters">
-                <menu_item_call.on_click
-                 function="Inventory.ShowFilters" />
-            </menu_item_call>
-            <menu_item_call
-             label="Reset Filters"
-             layout="topleft"
-             name="Reset Current">
-                <menu_item_call.on_click
-                 function="Inventory.ResetFilter" />
-            </menu_item_call>
-            <menu_item_call
-             label="Close All Folders"
-             layout="topleft"
-             name="Close All Folders">
-                <menu_item_call.on_click
-                 function="Inventory.CloseAllFolders" />
-            </menu_item_call>
-            <menu_item_separator
-             layout="topleft"
-             name="separator3" />
-            <menu_item_call
-             label="Empty Trash"
-             layout="topleft"
-             name="Empty Trash">
-                <menu_item_call.on_click
-                 function="Inventory.EmptyTrash" />
-            </menu_item_call>
-            <menu_item_call
-             label="Empty Lost And Found"
-             layout="topleft"
-             name="Empty Lost And Found">
-                <menu_item_call.on_click
-                 function="Inventory.EmptyLostAndFound" />
-            </menu_item_call>
-        </menu>
-        <menu
-         height="121"
-         label="Create"
-         layout="topleft"
-         left="0"
-         mouse_opaque="false"
-         name="Create"
-         tear_off="true"
-         top="-201"
-         width="121">
-            <menu_item_call
-             label="New Folder"
-             layout="topleft"
-             name="New Folder">
-                <menu_item_call.on_click
-                 function="Inventory.DoCreate"
-                 parameter="category" />
-            </menu_item_call>
-            <menu_item_call
-             label="New Script"
-             layout="topleft"
-             name="New Script">
-                <menu_item_call.on_click
-                 function="Inventory.DoCreate"
-                 parameter="lsl" />
-            </menu_item_call>
-            <menu_item_call
-             label="New Note"
-             layout="topleft"
-             name="New Note">
-                <menu_item_call.on_click
-                 function="Inventory.DoCreate"
-                 parameter="notecard" />
-            </menu_item_call>
-            <menu_item_call
-             label="New Gesture"
-             layout="topleft"
-             name="New Gesture">
-                <menu_item_call.on_click
-                 function="Inventory.DoCreate"
-                 parameter="gesture" />
-            </menu_item_call>
-            <menu
-             height="175"
-             label="New Clothes"
-             layout="topleft"
-             left_delta="0"
-             mouse_opaque="false"
-             name="New Clothes"
-             top_pad="514"
-             width="125">
-                <menu_item_call
-                 label="New Shirt"
-                 layout="topleft"
-                 name="New Shirt">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="shirt" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Pants"
-                 layout="topleft"
-                 name="New Pants">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="pants" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Shoes"
-                 layout="topleft"
-                 name="New Shoes">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="shoes" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Socks"
-                 layout="topleft"
-                 name="New Socks">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="socks" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Jacket"
-                 layout="topleft"
-                 name="New Jacket">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="jacket" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Skirt"
-                 layout="topleft"
-                 name="New Skirt">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="skirt" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Gloves"
-                 layout="topleft"
-                 name="New Gloves">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="gloves" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Undershirt"
-                 layout="topleft"
-                 name="New Undershirt">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="undershirt" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Underpants"
-                 layout="topleft"
-                 name="New Underpants">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="underpants" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Alpha"
-                 layout="topleft"
-                 name="New Alpha">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="alpha" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Tattoo"
-                 layout="topleft"
-                 name="New Tattoo">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="tattoo" />
-                </menu_item_call>
-            </menu>
-            <menu
-             height="85"
-             label="New Body Parts"
-             layout="topleft"
-             left_delta="0"
-             mouse_opaque="false"
-             name="New Body Parts"
-             top_pad="514"
-             width="118">
-                <menu_item_call
-                 label="New Shape"
-                 layout="topleft"
-                 name="New Shape">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="shape" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Skin"
-                 layout="topleft"
-                 name="New Skin">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="skin" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Hair"
-                 layout="topleft"
-                 name="New Hair">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="hair" />
-                </menu_item_call>
-                <menu_item_call
-                 label="New Eyes"
-                 layout="topleft"
-                 name="New Eyes">
-                    <menu_item_call.on_click
-                     function="Inventory.DoCreate"
-                     parameter="eyes" />
-                </menu_item_call>
-            </menu>
-        </menu>
-        <menu
-         height="49"
-         label="Sort"
-         layout="topleft"
-         left="0"
-         mouse_opaque="false"
-         name="Sort"
-         tear_off="true"
-         top="-113"
-         width="118">
-            <menu_item_check
-             control_name="Inventory.SortByName"
-             label="By Name"
-             layout="topleft"
-             name="By Name">
-                <menu_item_check.on_click
-                 function="Inventory.SetSortBy"
-                 parameter="name" />
-            </menu_item_check>
-            <menu_item_check
-             control_name="Inventory.SortByDate"
-             label="By Date"
-             layout="topleft"
-             name="By Date">
-                <menu_item_check.on_click
-                 function="Inventory.SetSortBy"
-                 parameter="date" />
-            </menu_item_check>
-            <menu_item_separator
-             layout="topleft" />
-            <menu_item_check
-             control_name="Inventory.FoldersAlwaysByName"
-             label="Folders Always By Name"
-             layout="topleft"
-             name="Folders Always By Name">
-                <menu_item_check.on_click
-                 function="Inventory.SetSortBy"
-                 parameter="foldersalwaysbyname" />
-            </menu_item_check>
-            <menu_item_check
-             control_name="Inventory.SystemFoldersToTop"
-             label="System Folders To Top"
-             layout="topleft"
-             name="System Folders To Top">
-                <menu_item_check.on_click
-                 function="Inventory.SetSortBy"
-                 parameter="systemfolderstotop" />
-            </menu_item_check>
-        </menu>
-    </menu_bar>
+<panel
+     bottom="560"
+	 class="panel_main_inventory"
+	 filename="panel_main_inventory.xml"
+	 follows="all"
+	 layout="topleft"
+	 left="0"
+	 label="Inventory Panel"
+	 name="Inventory Panel"
+	 top="15"
+	 width="467">
+</panel>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_lagmeter.xml b/indra/newview/skins/default/xui/en/floater_lagmeter.xml
index d98fdc5118be58d3176bcdc6a2c0c3397a5ffb4a..c4b9463927ce177621d7322211243da2d2168fca 100644
--- a/indra/newview/skins/default/xui/en/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/en/floater_lagmeter.xml
@@ -184,7 +184,6 @@
      layout="topleft"
      left="8"
      name="client_lagmeter"
-     picture_style="true"
      tab_stop="false"
      tool_tip="Client lag status"
      top="24"
@@ -233,7 +232,6 @@
      layout="topleft"
      left="8"
      name="network_lagmeter"
-     picture_style="true"
      tab_stop="false"
      tool_tip="Network lag status"
      top="64"
@@ -282,7 +280,6 @@
      layout="topleft"
      left="8"
      name="server_lagmeter"
-     picture_style="true"
      tab_stop="false"
      tool_tip="Server lag status"
      top="104"
@@ -323,15 +320,6 @@
      left="40"
      name="server_lag_cause"
      right="-32" />
-    <!--button
-     bottom="145"
-     follows="left|top"
-     height="18"
-     label="?"
-     layout="topleft"
-     name="server_help"
-     right="-10"
-     width="18" /-->
     <button
      follows="left|top"
      height="20"
diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
index 46d74b6aff8a258eb284285f1cb31f650791c42e..85f0e6411bf92a1a6631dc3f648fc02adf21ceef 100644
--- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  legacy_header_height="18"
- height="400"
+ height="430"
  layout="topleft"
  name="land holdings floater"
  help_topic="land_holdings_floater"
- title="My Land"
- width="280">
+ title="MY LAND"
+ width="600">
     <floater.string
      name="area_string">
         [AREA] m²
@@ -15,81 +15,82 @@
      draw_heading="true"
      height="170"
      layout="topleft"
-     left="8"
+     left="10"
      name="parcel list"
-     top="24"
-     width="270">
+     top="28"
+     width="580">
         <scroll_list.columns
          label="Parcel"
          name="name"
-         width="69" />
+         width="167" />
         <scroll_list.columns
          label="Region"
          name="location"
-         width="74" />
+         width="180" />
         <scroll_list.columns
          label="Type"
          name="type"
-         width="55" />
+         width="145" />
         <scroll_list.columns
          label="Area"
          name="area"
-         width="10" />
+         width="88" />
         <scroll_list.columns
          label=""
          name="hidden"
          width="-1" />
     </scroll_list>
     <button
-     height="20"
-     font="SansSerifSmall"
+     height="23"
+     font="SansSerifBold"
      label="Teleport"
      label_selected="Teleport"
      layout="topleft"
-     left_delta="4"
+     top="208"
+     left="10"
      name="Teleport"
      tool_tip="Teleport to the center of this land."
-     top_pad="4"
-     width="100" />
+     width="80" />
     <button
-     height="20"
-     font="SansSerifSmall"
+     height="23"
+     font="SansSerifBold"
      label="Map"
      label_selected="Map"
      layout="topleft"
-     left_pad="4"
+     top="208"
+     left="95"
      name="Show on Map"
      tool_tip="Show this land on the world map"
-     top_delta="0"
-     width="100" />
+     width="80" />
     <text
      type="string"
      length="1"
      follows="left|top"
-     height="16"
      layout="topleft"
-     left="12"
+     top="251"
+     left="10"
      name="contrib_label"
-     top="222"
-     width="480">
+     height="16"
+     width="580">
         Contributions to your groups:
     </text>
     <scroll_list
      draw_heading="true"
      height="75"
      layout="topleft"
-     left_delta="-4"
      name="grant list"
-     top_pad="4"
-     width="270">
+     top="271"
+     left="10"
+     width="580">
         <scroll_list.columns
          label="Group"
          name="group"
-         width="125" />
+         width="290"
+	 left_pad="10" />
         <scroll_list.columns
          label="Area"
          name="area"
-         width="125" />
+         width="290" />
     </scroll_list>
     <text
      type="string"
@@ -97,12 +98,11 @@
      follows="left|top"
      height="16"
      layout="topleft"
-     left_delta="4"
      name="allowed_label"
-     top_pad="4"
-     width="150">
-        Allowed land holdings at
-current payment plan:
+     top="366"
+     left="10"
+     width="290">
+        Allowed land holdings at current payment plan:
     </text>
     <text
      type="string"
@@ -110,10 +110,10 @@ current payment plan:
      follows="left|top"
      height="16"
      layout="topleft"
-     left_pad="5"
      name="allowed_text"
-     top_delta="10"
-     width="132">
+     top="366"
+     left="305"
+     width="290">
         [AREA] m²
     </text>
     <text
@@ -122,10 +122,10 @@ current payment plan:
      follows="left|top"
      height="16"
      layout="topleft"
-     left="12"
+     top="386"
+     left="10"
      name="current_label"
-     top_pad="5"
-     width="150">
+     width="290">
         Current land holdings:
     </text>
     <text
@@ -134,10 +134,10 @@ current payment plan:
      follows="left|top"
      height="16"
      layout="topleft"
-     left_pad="5"
+     top="386"
+     left="305"
      name="current_text"
-     top_delta="0"
-     width="132">
+     width="290">
         [AREA] m²
     </text>
     <text
@@ -147,12 +147,11 @@ current payment plan:
      font="SansSerifBold"
      height="16"
      layout="topleft"
-     left="12"
+     top="406"
+     left="10"
      name="available_label"
-     top_pad="5"
-     width="150">
-        Available for land
-purchases:
+     width="290">
+        Available for land purchases:
     </text>
     <text
      type="string"
@@ -161,10 +160,10 @@ purchases:
      font="SansSerifBold"
      height="16"
      layout="topleft"
-     left_pad="5"
      name="available_text"
-     top_delta="5"
-     width="140">
+     top="406"
+     left="305"
+     width="290">
         [AREA] m²
     </text>
 </floater>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml
index b11892be74ca4d229af3e8b4156665b5db4ac71b..bc590dc612048880ca09e07e72de240728d0455a 100644
--- a/indra/newview/skins/default/xui/en/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml
@@ -127,7 +127,6 @@
              layout="topleft"
              left_delta="55"
              name="play"
-             picture_style="true"
              top_delta="0"
              width="55" />
             <button
@@ -138,7 +137,6 @@
              layout="topleft"
              left_delta="0"
              name="pause"
-             picture_style="true"
              top_delta="0"
              width="55" />
             <button
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 02cbef5987e3591121b3dfb15fe3a77ca6fe39a6..5a8ffcebea5b1c238710f4f208c580e8ce65ee07 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -56,7 +56,6 @@
          layout="topleft"
          left="17"
          name="turn left btn"
-         picture_style="true"
          scale_image="false"
          tool_tip="Turn left (press Left Arrow or A)"
          top="45"
@@ -70,7 +69,6 @@
          layout="topleft"
          left_pad="34"
          name="turn right btn"
-         picture_style="true"
          scale_image="false"
          tool_tip="Turn right (press Right Arrow or D)"
          top_delta="0"
@@ -84,7 +82,6 @@
          layout="topleft"
          left="10"
          name="move up btn"
-         picture_style="true"
          scale_image="false"
          tool_tip="Fly up, press &quot;E&quot;"
          top="14"
@@ -98,7 +95,6 @@
          layout="topleft"
          left_pad="45"
          name="move down btn"
-         picture_style="true"
          scale_image="false"
          tool_tip="Fly down, press &quot;C&quot;"
          top_delta="0"
@@ -112,7 +108,6 @@
          layout="topleft"
          left="46"
          name="forward btn"
-         picture_style="true"
          quadrant="up"
          scale_image="false"
          tool_tip="Walk forward (press up arrow or W)"
@@ -127,7 +122,6 @@
          layout="topleft"
          left_delta="0"
          name="backward btn"
-         picture_style="true"
          quadrant="down"
          scale_image="false"
          tool_tip="Walk backward (press down arrow or S)"
diff --git a/indra/newview/skins/default/xui/en/floater_openobject.xml b/indra/newview/skins/default/xui/en/floater_openobject.xml
index cc50f43339c9d02152577f10eeed1a2061021c0a..af8aadf0e0bc3eb1442bc5ecbc8b0f9d3d7bc9a5 100644
--- a/indra/newview/skins/default/xui/en/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/en/floater_openobject.xml
@@ -26,7 +26,7 @@
      width="284">
         [DESC]:
     </text>
-    <panel_inventory
+    <panel_inventory_object
      background_visible="false"
      draw_border="false"
      follows="all"
diff --git a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
index eb0c22b9c493e92725cfdace4751950093a7abb4..0967706cc29c4014d6b2fb32582c01ccfb72ea26 100644
--- a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
@@ -17,20 +17,6 @@
      name="permissions"
      top="20"
      width="315">
-        <button
-         follows="left"
-         height="18"
-         label="?"
-         label_selected="?"
-         layout="topleft"
-         left="260"
-         name="help"
-         top="7"
-         width="22">
-            <button.commit_callback
-            function="Notification.Show" 
-			parameter="ClickUploadHelpPermissions" />
-        </button>
         <check_box
          control_name="ShareWithGroup"
          height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
index 3797055054863f87ed92372093f4c0851efee938..b44de8e178203c0659e4fae7a6703473324ed36b 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
@@ -75,7 +75,7 @@
      left="4"
      max_length="65536"
      name="Notecard Editor"
-     allow_html="true" 
+     allow_html="false" 
      handle_edit_keys_directly="true"
      tab_group="1"
      top="46"
diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
index 88f09b521cc87f7139a70ba0d6d984460173b44f..0b61dcef58385f6a4f94263546735524196b2463 100644
--- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
@@ -126,7 +126,6 @@
      layout="topleft"
      left_delta="0"
      name="pick_btn"
-     picture_style="true"
      image_overlay="Inv_Object"
      tool_tip="Object Picker - Identify an object as the subject of this report"
      top_pad="0"
diff --git a/indra/newview/skins/default/xui/en/floater_test_button.xml b/indra/newview/skins/default/xui/en/floater_test_button.xml
index 89a1ddda99ee8c793d58bc1b318c1a47e5d51613..2bd0d1a0fabf9a6e7a22f4ff06b3cf6e0c4820cd 100644
--- a/indra/newview/skins/default/xui/en/floater_test_button.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_button.xml
@@ -96,7 +96,6 @@
      layout="topleft"
      left="200"
      name="image_button"
-     picture_style="true"
      top="20"
      width="16" />
     <button
@@ -107,7 +106,6 @@
      layout="topleft"
      left_delta="0"
      name="image_color_button"
-     picture_style="true"
      top_pad="10"
      width="16" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
index f39d27761cdf94e811a8069ea198f5d23af50df8..9e2e9e74e3f9ce5dc0540c0cb4aed007a49fe37a 100644
--- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
@@ -145,11 +145,11 @@
   <text
  type="string"
  length="1"
- bottom="390"
+ height="60" 
  label="N"
  layout="topleft"
  left="10"
- name="centered_text"
+ name="left_aligned_text"
  width="380"
  halign="left"
  text_color="1 1 1 0.7"
diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
index 0a1f6e0e2973d6b07e0ea0f644f8f6afccc42804..7b0baa5de22b2357a3c7db426896f095c8e10849 100644
--- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml
@@ -125,7 +125,6 @@
      layout="topleft"
      left="139"
      name="Pipette"
-     picture_style="true"
      top="250"
      width="32" />
     <button
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index ca125383023c306d1f6d3ce9c53944cda97aa6dd..0614653d76fb1bd8622fa9cf3b514086d2578222 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -75,7 +75,6 @@
      layout="topleft"
      left="10"
      name="button focus"
-     picture_style="true"
      tool_tip="Focus"
      width="20">
 	  <button.commit_callback
@@ -92,7 +91,6 @@
      layout="topleft"
      left_pad="20"
      name="button move"
-     picture_style="true"
      tool_tip="Move"
      width="20">
 	  <button.commit_callback
@@ -109,7 +107,6 @@
      layout="topleft"
      left_pad="20"
      name="button edit"
-     picture_style="true"
      tool_tip="Edit"
      width="20">
 	  <button.commit_callback
@@ -126,7 +123,6 @@
      layout="topleft"
      left_pad="20"
      name="button create"
-     picture_style="true"
      tool_tip="Create"
      width="20">
 	  <button.commit_callback
@@ -143,7 +139,6 @@
      layout="topleft"
      left_pad="20"
      name="button land"
-     picture_style="true"
      tool_tip="Land"
      width="20">
 	  <button.commit_callback
@@ -320,8 +315,6 @@
      image_disabled="ForwardArrow_Disabled"
      image_selected="ForwardArrow_Press"
      image_unselected="ForwardArrow_Off"
-     picture_style="true"
-     label_selected="Options"
      layout="topleft"
      name="Options..."
      tool_tip="Grid options"
@@ -342,7 +335,6 @@
      layout="topleft"
      left="4"
      name="ToolCube"
-     picture_style="true"
      tool_tip="Cube"
      top="51"
      width="20" />
@@ -356,7 +348,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolPrism"
-     picture_style="true"
      tool_tip="Prism"
      top_delta="0"
      width="20" />
@@ -370,7 +361,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolPyramid"
-     picture_style="true"
      tool_tip="Pyramid"
      top_delta="0"
      width="20" />
@@ -384,7 +374,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolTetrahedron"
-     picture_style="true"
      tool_tip="Tetrahedron"
      top_delta="0"
      width="20" />
@@ -398,7 +387,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolCylinder"
-     picture_style="true"
      tool_tip="Cylinder"
      top_delta="0"
      width="20" />
@@ -412,7 +400,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolHemiCylinder"
-     picture_style="true"
      tool_tip="Hemicylinder"
      top_delta="0"
      width="20" />
@@ -426,7 +413,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolCone"
-     picture_style="true"
      tool_tip="Cone"
      top_delta="0"
      width="20" />
@@ -440,7 +426,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolHemiCone"
-     picture_style="true"
      tool_tip="Hemicone"
      top_delta="0"
      width="20" />
@@ -454,7 +439,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolSphere"
-     picture_style="true"
      tool_tip="Sphere"
      top_delta="0"
      width="20" />
@@ -468,7 +452,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolHemiSphere"
-     picture_style="true"
      tool_tip="Hemisphere"
      top_delta="0"
      width="20" />
@@ -482,7 +465,6 @@
      layout="topleft"
      left="4"
      name="ToolTorus"
-     picture_style="true"
      tool_tip="Torus"
      top="77"
      width="20" />
@@ -496,7 +478,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolTube"
-     picture_style="true"
      tool_tip="Tube"
      top_delta="0"
      width="20" />
@@ -510,7 +491,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolRing"
-     picture_style="true"
      tool_tip="Ring"
      top_delta="0"
      width="20" />
@@ -524,7 +504,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolTree"
-     picture_style="true"
      tool_tip="Tree"
      top_delta="0"
      width="20" />
@@ -538,7 +517,6 @@
      layout="topleft"
      left_delta="26"
      name="ToolGrass"
-     picture_style="true"
      tool_tip="Grass"
      top_delta="0"
      width="20" />
@@ -927,7 +905,6 @@
 			 left_pad="0"
 			 top_delta="0"
 			 name="button set group"
-			 picture_style="true"
 			 tab_stop="false"
 			 tool_tip="Choose a group to share this object's permissions"
 			 width="10" />
@@ -1034,8 +1011,11 @@
            label="Original"
            value="1" />
       </combo_box>
-<!-- NEW PRICE SPINNER -->
-      <spinner
+<!-- NEW PRICE SPINNER
+Objects are allowed to be for sale for L$0 to invoke buy UI behavior
+even though the user gets a free copy.
+-->
+    <spinner
         follows="left|top"
         decimal_digits="0"
         increment="1"
@@ -1046,7 +1026,7 @@
         label="Price: L$"
         label_width="65"
         width="150"
-        min_val="1"
+        min_val="0"
         height="20"
         max_val="999999999" />
       <check_box
@@ -2700,7 +2680,6 @@
 			 layout="topleft"
 			 left_pad="0"
 			 name="add_media"
-			 picture_style="true"
 			 tab_stop="false"
 			 top_delta="0"
 			 tool_tip="Add Media"
@@ -2716,7 +2695,6 @@
 			 layout="topleft"
 			 left_pad="5"
 			 name="delete_media"
-			 picture_style="true"
 			 tool_tip="Delete this media texture"
 			 top_delta="0"
 			 width="18">
@@ -2733,7 +2711,6 @@
 			 layout="topleft"
 			 left_pad="10"
 			 name="edit_media"
-			 picture_style="true"
 			 top_delta="0"
 			 width="18">
 				<button.commit_callback
@@ -2793,7 +2770,7 @@
              left_pad="8"
              name="button permissions"
              width="130" />
-            <panel_inventory
+            <panel_inventory_object
              follows="left|top"
              height="210"
              layout="topleft"
@@ -2868,15 +2845,6 @@
          tool_tip="Colorize the parcels according to the type of owner: &#10;&#10;Green = Your land &#10;Aqua = Your group&apos;s land &#10;Red = Owned by others &#10;Yellow = For sale &#10;Purple = For auction &#10;Grey = Public"
          top_pad="8"
          width="205" />
-        <!--TODO: HOOK UP TO HELP VIEWER-->
-       <!-- <button
-         image_overlay="Arrow_Right_Off"
-         picture_style="true"
-         left_pad="5"
-         name="button show owners help"
-         tool_tip="See an explanation of colors"
-         width="26"
-         height="22" />-->
         <text
          type="string"
          length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml
index af3606fd1c01819976d494f86ce6561ca5a94e9e..012b69c3e3f187bbc133af8ad2b227e98f2d08bc 100644
--- a/indra/newview/skins/default/xui/en/floater_water.xml
+++ b/indra/newview/skins/default/xui/en/floater_water.xml
@@ -95,16 +95,6 @@
              width="355">
                 Water Fog Color
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WaterFogColorHelp"
-             top_delta="-2"
-             width="18" />
             <color_swatch
              border_color="0.45098 0.517647 0.607843 1"
              can_apply_immediately="true"
@@ -130,16 +120,6 @@
              width="355">
                 Fog Density Exponent
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WaterFogDensityHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WaterFogDensity"
              decimal_digits="1"
@@ -165,16 +145,6 @@
              width="355">
                 Underwater Fog Modifier
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WaterUnderWaterFogModHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              decimal_digits="2"
              follows="left"
@@ -200,16 +170,6 @@
              width="355">
                 Reflection Wavelet Scale
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WaterNormalScaleHelp"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -298,16 +258,6 @@
              width="355">
                 Fresnel Scale
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WaterFresnelScaleHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WaterFresnelScale"
              decimal_digits="2"
@@ -333,16 +283,6 @@
              width="355">
                 Fresnel Offset
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WaterFresnelOffsetHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WaterFresnelOffset"
              decimal_digits="2"
@@ -368,16 +308,6 @@
              width="355">
                 Refract Scale Above
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WaterScaleAboveHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WaterScaleAbove"
              decimal_digits="2"
@@ -403,16 +333,6 @@
              width="355">
                 Refract Scale Below
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WaterScaleBelowHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WaterScaleBelow"
              decimal_digits="2"
@@ -438,16 +358,6 @@
              width="355">
                 Blur Multiplier
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WaterBlurMultiplierHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WaterBlurMult"
              follows="left"
@@ -486,16 +396,6 @@
              width="355">
                 Big Wave Direction
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="145"
-             name="WaterWave1Help"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -563,16 +463,6 @@
              width="355">
                 Little Wave Direction
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="145"
-             name="WaterWave2Help"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -640,16 +530,6 @@
              width="355">
                 Normal Map
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="125"
-             name="WaterNormalMapHelp"
-             top_delta="-2"
-             width="18" />
             <texture_picker
              height="143"
              layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
index 2c09e82f087577e85ef18dfd8ee6574376fc90d0..fd905d7a14ef8324557b54646fc83be0922eb30c 100644
--- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
@@ -104,16 +104,6 @@
              width="355">
                 Blue Horizon
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLBlueHorizonHelp"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -227,16 +217,6 @@
              width="355">
                 Haze Horizon
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLHazeHorizonHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLHazeHorizon"
              decimal_digits="2"
@@ -262,16 +242,6 @@
              width="355">
                 Blue Density
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLBlueDensityHelp"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -385,16 +355,6 @@
              width="355">
                 Haze Density
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLHazeDensityHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLHazeDensity"
              decimal_digits="2"
@@ -421,16 +381,6 @@
              width="355">
                 Density Multiplier
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLDensityMultHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLDensityMult"
              decimal_digits="2"
@@ -457,16 +407,6 @@
              width="355">
                 Distance Multiplier
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLDistanceMultHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLDistancMult"
              decimal_digits="1"
@@ -492,16 +432,6 @@
              width="355">
                 Max Altitude
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLMaxAltitudeHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLMaxAltitude"
              decimal_digits="0"
@@ -540,16 +470,6 @@
              width="355">
                 Sun/Moon Color
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLSunlightColorHelp"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -663,16 +583,6 @@
              width="355">
                 Sun/Moon Position
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLTimeOfDayHelp"
-             top_delta="-2"
-             width="18" />
             <icon
              height="20"
              image_name="icon_diurnal.tga"
@@ -705,16 +615,6 @@
              width="355">
                 Ambient
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLAmbientHelp"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -828,16 +728,6 @@
              width="355">
                 East Angle
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLEastAngleHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLEastAngle"
              decimal_digits="2"
@@ -863,16 +753,6 @@
              width="355">
                 Sun Glow
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLSunGlowHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLGlowB"
              decimal_digits="2"
@@ -915,16 +795,6 @@
              width="200">
                 Scene Gamma
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLSceneGammaHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLGamma"
              decimal_digits="2"
@@ -951,16 +821,6 @@
              width="355">
                 Star Brightness
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLStarBrightnessHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLStarAlpha"
              decimal_digits="2"
@@ -1000,16 +860,6 @@
              width="355">
                 Cloud Color
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLCloudColorHelp"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -1123,16 +973,6 @@
              width="355">
                 Cloud XY/Density
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLCloudDensityHelp"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -1221,16 +1061,6 @@
              width="355">
                 Cloud Coverage
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLCloudCoverageHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLCloudCoverage"
              decimal_digits="2"
@@ -1256,16 +1086,6 @@
              width="355">
                 Cloud Scale
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLCloudScaleHelp"
-             top_delta="-2"
-             width="18" />
             <slider
              control_name="WLCloudScale"
              decimal_digits="2"
@@ -1292,16 +1112,6 @@
              width="355">
                 Cloud Detail (XY/Density)
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="150"
-             name="WLCloudDetailHelp"
-             top_delta="-2"
-             width="18" />
             <text
              type="string"
              length="1"
@@ -1390,16 +1200,6 @@
              width="355">
                 Cloud Scroll X
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="125"
-             name="WLCloudScrollXHelp"
-             top_delta="-2"
-             width="18" />
             <check_box
              control_name="WLCloudLockX"
              follows="left"
@@ -1436,16 +1236,6 @@
              width="355">
                 Cloud Scroll Y
             </text>
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left_delta="125"
-             name="WLCloudScrollYHelp"
-             top_delta="-2"
-             width="18" />
             <check_box
              control_name="WLCloudLockY"
              follows="left"
@@ -1479,16 +1269,6 @@
              name="DrawClassicClouds"
              top="104"
              width="200" />
-            <button
-             follows="left|top"
-             font="SansSerifSmall"
-             height="18"
-             label="?"
-             layout="topleft"
-             left="608"
-             name="WLClassicCloudsHelp"
-             top="84"
-             width="18" />
         </panel>
     </tab_container>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index 6b13e2f1c7cbd4f5c56f7b03cf308ef737ec3e36..2c1e2b6dc0e3cb601315c21d6baa3f540ce806ff 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -102,7 +102,6 @@
      left_pad="0"
      top_delta="4"
      name="mute_btn"
-     picture_style="true"
      width="16" />
     <avatar_icon
      follows="all"
@@ -122,12 +121,13 @@
      image_unselected="ForwardArrow_Off"
      layout="topleft"
      name="view_profile_btn"
-     picture_style="true"
      right="-8"
      top="35"
      left_delta="110"
      tab_stop="false"
      width="18" />
+  <!-- Overlapping buttons for default actions
+    llinspectavatar.cpp makes visible the most likely default action -->
     <button
      follows="bottom|left"
      height="23"
@@ -136,6 +136,16 @@
      top="246"
      name="add_friend_btn"
      width="100" />
+    <button
+     follows="bottom|left"
+     height="23"
+     label="IM"
+     left_delta="0"
+     top_delta="0"
+     name="im_btn"
+     width="100"
+     commit_callback.function="InspectAvatar.IM"
+     />
     <menu_button
      follows="top|left"
      height="18"
@@ -144,7 +154,6 @@
      image_unselected="OptionsMenu_Off"
      menu_filename="menu_inspect_avatar_gear.xml"
      name="gear_btn"
-     picture_style="true"
      right="-10"
      top="249"
      width="18" />
@@ -157,7 +166,6 @@
      image_unselected="OptionsMenu_Off"
      menu_filename="menu_inspect_self_gear.xml"
      name="gear_self_btn"
-     picture_style="true"
      right="-10"
      top="249"
      width="18" />
diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml
index db12daa6e04074ada14db2fbe644e7b7ad3a4ce9..e5e5007c5651af7cf5d4d0848b80b5d1d464537c 100644
--- a/indra/newview/skins/default/xui/en/inspect_group.xml
+++ b/indra/newview/skins/default/xui/en/inspect_group.xml
@@ -73,6 +73,8 @@ L$123 to join
      name="group_icon"
      top="24"
      width="38" />
+  <!-- Must be tab_stop="true" so something can hold focus even when the
+    other buttons are disabled or invisible, otherwise inspector closes -->
     <button
      follows="top|left"
      height="18"
@@ -80,11 +82,10 @@ L$123 to join
      image_selected="ForwardArrow_Press"
      image_unselected="ForwardArrow_Off"
      name="view_profile_btn"
-     picture_style="true"
      right="-8"
      top="35"
      left_delta="110"
-     tab_stop="false"
+     tab_stop="true"
      width="18"
      commit_callback.function="InspectGroup.ViewProfile" />
   <button
diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index fe492e0ae808f60ef1f02b6aa026405739f3ef80..8bd4bb76c6932c5be236814515411041cf4a18c8 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -168,7 +168,6 @@ This is a really long description for an object being as how it is at least 80 c
      image_unselected="OptionsMenu_Off"
      menu_filename="menu_inspect_object_gear.xml"
      name="gear_btn"
-     picture_style="true"
      right="-10"
      top_delta="5"
      width="18" />
@@ -180,7 +179,6 @@ This is a really long description for an object being as how it is at least 80 c
      image_unselected="ForwardArrow_Off"
      layout="topleft"
      name="more_info_btn"
-     picture_style="true"
      right="-5"
      top="20"
      left_delta="110"
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index 6049476a43f6360558548af69b1ffbb43d901de6..8ee67b9a020f7c845c2bac2d18b7e7d8ec74bf52 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
@@ -7,7 +7,6 @@
          name="Gear Menu">
   <menu_item_call
    label="View Profile"
-   layout="topleft"
    enabled="true" 
    name="view_profile">
     <menu_item_call.on_click
@@ -15,49 +14,42 @@
   </menu_item_call>
   <menu_item_call
    label="Add Friend"
-   layout="topleft"
    name="add_friend">
     <menu_item_call.on_click
      function="InspectAvatar.AddFriend"/>
   </menu_item_call>
   <menu_item_call
    label="IM"
-   layout="topleft"
    name="im">
     <menu_item_call.on_click
      function="InspectAvatar.IM"/>
   </menu_item_call>
   <menu_item_call
    label="Call"
-   layout="topleft"
    enabled="true"
    name="call">
   </menu_item_call>
   <menu_item_call
    label="Teleport"
-   layout="topleft"
    name="teleport">
     <menu_item_call.on_click
      function="InspectAvatar.Teleport"/>
   </menu_item_call>
   <menu_item_call
    label="Invite to Group"
-   layout="topleft"
    name="invite_to_group">
     <menu_item_call.on_click
      function="InspectAvatar.InviteToGroup"/>
   </menu_item_call>
-  <menu_item_separator layout="topleft" />
+  <menu_item_separator />
   <menu_item_call
    label="Block"
-   layout="topleft"
    name="block">
     <menu_item_call.on_click
      function="InspectAvatar.Block"/>
   </menu_item_call>
   <menu_item_call
    label="Report"
-   layout="topleft"
    name="report">
     <menu_item_call.on_click
      function="InspectAvatar.Report"/>
@@ -88,7 +80,6 @@
   </menu_item_call>
   <menu_item_call
    label="Find On Map"
-   layout="topleft"
    name="find_on_map">
     <menu_item_call.on_click
      function="InspectAvatar.FindOnMap"/>
@@ -97,16 +88,14 @@
   </menu_item_call>
   <menu_item_call
    label="Zoom In"
-   layout="topleft"
    name="zoom_in">
     <menu_item_call.on_click
      function="InspectAvatar.ZoomIn"/>
   </menu_item_call>  
   <menu_item_call
    label="Pay"
-   layout="topleft"
    name="pay">
     <menu_item_call.on_click
      function="InspectAvatar.Pay"/>
   </menu_item_call>
-</menu>
\ No newline at end of file
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
index 240822e5cab8c200505518ae79c13f316cf5e5a3..ce5ee83f55627d163fcdfd62f3f76230df13ba26 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
@@ -1,53 +1,48 @@
-<?xml version="1.0" encoding="utf-8"?>
-<menu
-         create_jump_keys="true"
-         layout="topleft"
-         mouse_opaque="false"
-         visible="false"
-         name="Gear Menu">
-  <menu_item_call
-   label="Stand Up"
-   layout="topleft"
-   enabled="true"
-   name="stand_up">
-    <menu_item_call.on_click
-     function="Self.StandUp"
-     parameter="" />
-    <menu_item_call.on_visible
-     function="Self.VisibleStandUp" />
-  </menu_item_call>
-  <menu_item_call
-   label="My Appearance"
-   layout="topleft"
-   name="my_appearance">
-    <menu_item_call.on_click
-     function="ShowFloater"
-     parameter="appearance" />
-    <menu_item_call.on_enable
-     function="Edit.EnableCustomizeAvatar" />
-  </menu_item_call>
-  <menu_item_call
-   label="My Profile"
-   layout="topleft"
-   enabled="true" 
-   name="my_profile">
-    <menu_item_call.on_click
-     function="ShowAgentProfile"
-     parameter="agent" />
-  </menu_item_call>
-  <menu_item_call
-   label="My Friends"
-   layout="topleft"
-   name="my_friends">
-    <menu_item_call.on_click
-     function="Self.Friends"
-     parameter="" />
-  </menu_item_call>
-  <menu_item_call
-   label="My Groups"
-   layout="topleft"
-   name="my_groups">
-    <menu_item_call.on_click
-     function="Self.Groups" />
-  </menu_item_call>
-</menu>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?>
+<menu
+         create_jump_keys="true"
+         layout="topleft"
+         mouse_opaque="false"
+         visible="false"
+         name="Gear Menu">
+  <menu_item_call
+   label="Stand Up"
+   enabled="true"
+   name="stand_up">
+    <menu_item_call.on_click
+     function="Self.StandUp"
+     parameter="" />
+    <menu_item_call.on_visible
+     function="Self.VisibleStandUp" />
+  </menu_item_call>
+  <menu_item_call
+   label="My Appearance"
+   name="my_appearance">
+    <menu_item_call.on_click
+     function="ShowFloater"
+     parameter="appearance" />
+    <menu_item_call.on_enable
+     function="Edit.EnableCustomizeAvatar" />
+  </menu_item_call>
+  <menu_item_call
+   label="My Profile"
+   enabled="true" 
+   name="my_profile">
+    <menu_item_call.on_click
+     function="ShowAgentProfile"
+     parameter="agent" />
+  </menu_item_call>
+  <menu_item_call
+   label="My Friends"
+   name="my_friends">
+    <menu_item_call.on_click
+     function="Self.Friends"
+     parameter="" />
+  </menu_item_call>
+  <menu_item_call
+   label="My Groups"
+   name="my_groups">
+    <menu_item_call.on_click
+     function="Self.Groups" />
+  </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index c3ee6e250b0f601a6622e0e81a66bee06fcff0b7..dfa5adb743a5df0765effc63bd20b5e262a1caba 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -10,22 +10,18 @@
     <menu
      create_jump_keys="true"
      label="Me"
-     layout="topleft"
      name="File">
         <menu_item_call
          label="Preferences"
-         layout="topleft"
          name="Preferences..."
          shortcut="control|P">
             <menu_item_call.on_click
              function="ShowFloater"
              parameter="preferences" />
         </menu_item_call>
-        <menu_item_separator
-         layout="topleft" />
+        <menu_item_separator />
         <menu_item_call
          label="Quit [APP_NAME]"
-         layout="topleft"
          name="Quit"
          shortcut="control|Q">
             <menu_item_call.on_click
@@ -36,7 +32,6 @@
     <menu
      create_jump_keys="true"
      label="Edit"
-     layout="topleft"
      name="Edit"
      width="153">
     </menu>
@@ -44,22 +39,18 @@
     <menu
      create_jump_keys="true"
      label="Help"
-     layout="topleft"
      name="Help">
         <menu_item_call
          label="[SECOND_LIFE] Help"
-         layout="topleft"
          name="Second Life Help"
          shortcut="F1">
             <menu_item_call.on_click
              function="ShowFloater"
              parameter="help f1" />
         </menu_item_call>
-        <menu_item_separator
-         layout="topleft" />
+        <menu_item_separator />
         <menu_item_call
          label="About [APP_NAME]"
-         layout="topleft"
          name="About Second Life">
             <menu_item_call.on_click
              function="ShowFloater"
@@ -69,7 +60,6 @@
     <menu
      create_jump_keys="true"
      label="Debug"
-     layout="topleft"
      name="Debug"
      tear_off="true">
       <!-- Need a copy of the edit menu here so keyboard shortcuts like
@@ -78,12 +68,10 @@
       <menu
        create_jump_keys="true"
        label="Edit"
-       layout="topleft"
        name="Edit"
        tear_off="true">
         <menu_item_call
          label="Undo"
-         layout="topleft"
          name="Undo"
          shortcut="control|Z">
           <menu_item_call.on_click
@@ -93,7 +81,6 @@
         </menu_item_call>
         <menu_item_call
          label="Redo"
-         layout="topleft"
          name="Redo"
          shortcut="control|Y">
           <menu_item_call.on_click
@@ -101,11 +88,9 @@
           <menu_item_call.on_enable
            function="Edit.EnableRedo" />
         </menu_item_call>
-        <menu_item_separator
-         layout="topleft" />
+        <menu_item_separator />
         <menu_item_call
          label="Cut"
-         layout="topleft"
          name="Cut"
          shortcut="control|X">
           <menu_item_call.on_click
@@ -115,7 +100,6 @@
         </menu_item_call>
         <menu_item_call
          label="Copy"
-         layout="topleft"
          name="Copy"
          shortcut="control|C">
           <menu_item_call.on_click
@@ -125,7 +109,6 @@
         </menu_item_call>
         <menu_item_call
          label="Paste"
-         layout="topleft"
          name="Paste"
          shortcut="control|V">
           <menu_item_call.on_click
@@ -135,7 +118,6 @@
         </menu_item_call>
         <menu_item_call
          label="Delete"
-         layout="topleft"
          name="Delete"
          shortcut="Del">
           <menu_item_call.on_click
@@ -145,7 +127,6 @@
         </menu_item_call>
         <menu_item_call
          label="Duplicate"
-         layout="topleft"
          name="Duplicate"
          shortcut="control|D">
           <menu_item_call.on_click
@@ -153,11 +134,9 @@
           <menu_item_call.on_enable
            function="Edit.EnableDuplicate" />
         </menu_item_call>
-        <menu_item_separator
-         layout="topleft" />
+        <menu_item_separator />
         <menu_item_call
          label="Select All"
-         layout="topleft"
          name="Select All"
          shortcut="control|A">
           <menu_item_call.on_click
@@ -167,7 +146,6 @@
         </menu_item_call>
         <menu_item_call
          label="Deselect"
-         layout="topleft"
          name="Deselect"
          shortcut="control|E">
           <menu_item_call.on_click
@@ -179,7 +157,6 @@
       <menu_item_separator />
       <menu_item_call
          label="Show Debug Settings"
-         layout="topleft"
          name="Debug Settings">
             <menu_item_call.on_click
              function="Advanced.ShowDebugSettings"
@@ -187,7 +164,6 @@
         </menu_item_call>
         <menu_item_call
          label="UI/Color Settings"
-         layout="topleft"
          name="UI/Color Settings">
             <menu_item_call.on_click
              function="Advanced.ShowDebugSettings"
@@ -196,7 +172,6 @@
         <menu_item_separator />
         <menu_item_call
          label="XUI Preview Tool"
-         layout="topleft"
          name="UI Preview Tool"
          shortcut="control|T">
             <menu_item_call.on_click
@@ -206,7 +181,6 @@
       <menu_item_separator />
       <menu_item_call
          label="Widget Test"
-         layout="topleft"
          name="Widget Test"
          shortcut="control|shift|T">
         <menu_item_call.on_click
@@ -228,10 +202,18 @@
         <menu_item_call.on_click
          function="Advanced.ShowSideTray" />
       </menu_item_call>
+      <menu_item_check
+         label="Reg In Client Test (restart)"
+         name="Reg In Client Test (restart)">
+            <menu_item_check.on_check
+               control="RegInClient" />
+            <menu_item_check.on_click
+               function="ToggleControl"
+               parameter="RegInClient" />
+      </menu_item_check>
       <menu_item_separator />
         <menu_item_call
          label="Show TOS"
-         layout="topleft"
          name="TOS">
             <menu_item_call.on_click
              function="ShowFloater"
@@ -239,7 +221,6 @@
         </menu_item_call>
         <menu_item_call
          label="Show Critical Message"
-         layout="topleft"
          name="Critical">
             <menu_item_call.on_click
              function="ShowFloater"
diff --git a/indra/newview/skins/default/xui/en/menu_url_map.xml b/indra/newview/skins/default/xui/en/menu_url_map.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2ca9e3b3fe63a1fa5dacd0c6dbf18194c9365a14
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_url_map.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Url Popup">
+    <menu_item_call
+     label="Show on Map"
+     layout="topleft"
+     name="show_on_map">
+        <menu_item_call.on_click
+         function="Url.Execute" />
+    </menu_item_call>
+    <menu_item_separator
+     layout="topleft" />
+    <menu_item_call
+     label="Teleport to Location"
+     layout="topleft"
+     name="teleport_to_location">
+        <menu_item_call.on_click
+         function="Url.Teleport" />
+    </menu_item_call>
+    <menu_item_separator
+     layout="topleft" />
+    <menu_item_call
+     label="Copy SLurl to clipboard"
+     layout="topleft"
+     name="url_copy">
+        <menu_item_call.on_click
+         function="Url.CopyUrl" />
+    </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
index 6f7e659f48d65a05750ca4b7b4409006b7ab6bc8..35c2269b0d1a5f9d941c533504eecb5129fcd831 100644
--- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
@@ -11,6 +11,13 @@
     </menu_item_call>
     <menu_item_separator
      layout="topleft" />
+    <menu_item_call
+     label="Show on Map"
+     layout="topleft"
+     name="show_on_map">
+        <menu_item_call.on_click
+         function="Url.ShowOnMap" />
+    </menu_item_call>
     <menu_item_call
      label="Teleport to Object Location"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_url_parcel.xml b/indra/newview/skins/default/xui/en/menu_url_parcel.xml
index 3804f7f7802c19b54bff255f09041fecef2c6378..f477c310fb708b20b415632c223aa4a17ed30bcf 100644
--- a/indra/newview/skins/default/xui/en/menu_url_parcel.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_parcel.xml
@@ -9,6 +9,15 @@
         <menu_item_call.on_click
          function="Url.Execute" />
     </menu_item_call>
+    <menu_item_separator
+     layout="topleft" />
+    <menu_item_call
+     label="Show on Map"
+     layout="topleft"
+     name="show_on_map">
+        <menu_item_call.on_click
+         function="Url.ShowOnMap" />
+    </menu_item_call>
     <menu_item_separator
      layout="topleft" />
     <menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_url_slurl.xml b/indra/newview/skins/default/xui/en/menu_url_slurl.xml
index 58714f1f42f8a7e6b9071a479bbedc2e959c579b..98abc206a590129ca2f23841291911df351f348d 100644
--- a/indra/newview/skins/default/xui/en/menu_url_slurl.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_slurl.xml
@@ -11,6 +11,13 @@
     </menu_item_call>
     <menu_item_separator
      layout="topleft" />
+    <menu_item_call
+     label="Show on Map"
+     layout="topleft"
+     name="show_on_map">
+        <menu_item_call.on_click
+         function="Url.ShowOnMap" />
+    </menu_item_call>
     <menu_item_call
      label="Teleport to Location"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_url_teleport.xml b/indra/newview/skins/default/xui/en/menu_url_teleport.xml
index ff52d7e1092b4c106f5642d1967680751ffee34e..289e32bcf418abb7d6f1686ac9bdfb52424f8985 100644
--- a/indra/newview/skins/default/xui/en/menu_url_teleport.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_teleport.xml
@@ -9,6 +9,15 @@
         <menu_item_call.on_click
          function="Url.Execute" />
     </menu_item_call>
+    <menu_item_separator
+     layout="topleft" />
+    <menu_item_call
+     label="Show on Map"
+     layout="topleft"
+     name="show_on_map">
+        <menu_item_call.on_click
+         function="Url.ShowOnMap" />
+    </menu_item_call>
     <menu_item_separator
      layout="topleft" />
     <menu_item_call
diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml
index 2de9449ea6c7bf8ae1c68ec28da825924d785a1d..76c0d027f336f42203c0da977608ced2e2740164 100644
--- a/indra/newview/skins/default/xui/en/mime_types.xml
+++ b/indra/newview/skins/default/xui/en/mime_types.xml
@@ -163,8 +163,8 @@
 			movie
 		</widgettype>
 		<impl>
-      media_plugin_quicktime
-    </impl>
+			media_plugin_quicktime
+		</impl>
 	</mimetype>
 	<mimetype name="application/javascript">
 		<label name="application/javascript_label">
@@ -208,7 +208,7 @@
 	</mimetype>
 	<mimetype name="application/smil">
 		<label name="application/smil_label">
-		    Synchronized Multimedia Integration Language (SMIL)
+			Synchronized Multimedia Integration Language (SMIL)
 		</label>
 		<widgettype>
 			movie
@@ -348,8 +348,8 @@
 			web
 		</widgettype>
 		<impl>
-      media_plugin_webkit
-    </impl>
+			media_plugin_webkit
+		</impl>
 	</mimetype>
 	<mimetype menu="1" name="text/plain">
 		<label name="text/plain_label">
@@ -381,8 +381,8 @@
 			movie
 		</widgettype>
 		<impl>
-      media_plugin_quicktime
-    </impl>
+			media_plugin_quicktime
+		</impl>
 	</mimetype>
 	<mimetype name="video/mp4">
 		<label name="video/mp4_label">
@@ -392,8 +392,8 @@
 			movie
 		</widgettype>
 		<impl>
-      media_plugin_quicktime
-    </impl>
+			media_plugin_quicktime
+		</impl>
 	</mimetype>
 	<mimetype menu="1" name="video/quicktime">
 		<label name="video/quicktime_label">
@@ -403,8 +403,8 @@
 			movie
 		</widgettype>
 		<impl>
-      media_plugin_quicktime
-    </impl>
+			media_plugin_quicktime
+		</impl>
 	</mimetype>
 	<mimetype name="video/x-ms-asf">
 		<label name="video/x-ms-asf_label">
@@ -414,8 +414,8 @@
 			movie
 		</widgettype>
 		<impl>
-      media_plugin_quicktime
-    </impl>
+			media_plugin_quicktime
+		</impl>
 	</mimetype>
 	<mimetype name="video/x-ms-wmv">
 		<label name="video/x-ms-wmv_label">
@@ -425,8 +425,8 @@
 			movie
 		</widgettype>
 		<impl>
-      media_plugin_quicktime
-    </impl>
+			media_plugin_quicktime
+		</impl>
 	</mimetype>
 	<mimetype menu="1" name="video/x-msvideo">
 		<label name="video/x-msvideo_label">
@@ -436,7 +436,7 @@
 			movie
 		</widgettype>
 		<impl>
-      media_plugin_quicktime
-    </impl>
+			media_plugin_quicktime
+		</impl>
 	</mimetype>
 </mimetypes>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index d51cb1309310ec5587154537cd27d0f5f8799744..babed28f10eaac707b0fd7d5286631dd2f3b9dbe 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -370,99 +370,12 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
   </notification>
 
   <notification
-   icon="alertmodal.tga"
-   name="ClickPublishHelpLand"
-   type="alertmodal">
-Selecting the &quot;Publish in Search&quot;
-Checking this box will show:
-- this parcel in search results
-- this parcel&apos;s public objects
-- this parcel in web search
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ClickSoundHelpLand"
-   type="alertmodal">Media and Music can only be experienced within the parcel. Sound and Voice options can be restricted to the parcel or will be heard by residents outside the parcel depending on their maturity Rating. Go to Knowledge Base to learn more about how to set these options?
-    <url option="0" name="url">
-	https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
-    </url>
-    <usetemplate
-     name="okcancelbuttons"
-     yestext="Go to Knowledge Base"
-	 notext="Close" />
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ClickSearchHelpAll"
-   type="alertmodal">
-Search results are organized based on the tab you are in, your maturity Rating, the category chosen, and other factors. For more details, please see the Knowledge Base.
-    <url option="0" name="url">
-	https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
-    </url>
-    <usetemplate
-     name="okcancelbuttons"
-     yestext="Go to Knowledge Base"
-	 notext="Close" />
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ClickPublishHelpLandDisabled"
-   type="alertmodal">
-You can&apos;t make this parcel show in search because it is located in a region that forbids this.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ClickPublishHelpAvatar"
-   type="alertmodal">
-Selecting &quot;Show in Search&quot; will show:
-- my profile in search results
-- a link to my profile in public group pages
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ClickPartnerHelpAvatar"
-   type="alertmodal">
-You can propose to another Resident or dissolve an existing partnership through the [SECOND_LIFE] website.
-
-Go to the [SECOND_LIFE] web site for more information on partnering?
-    <usetemplate
-     name="okcancelbuttons"
-     notext="Cancel"
-     yestext="Go to Page"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ClickUploadHelpPermissions"
-   type="alertmodal">
-Your default permissions may not work in older regions.
-  </notification>
-
-<notification
     icon="alertmodal.tga"
     name="ClickUnimplemented"
     type="alertmodal">
 Sorry, not implemented yet.
   </notification>
 
-  <notification
-   icon="alertmodal.tga"
-   name="ClickWebProfileHelpAvatar"
-   type="alertmodal">
-If this Resident has set a web profile URL then you can:
- * Click &apos;Load&apos; to see the page in this Web tab.
- * Click Load &gt; &apos;In external browser&apos; to view the page in your default web browser.
- * Click Load &gt; &apos;Home URL&apos; to return to this Resident&apos;s web profile if you&apos;ve navigated away.
-
-When viewing your own profile, you can enter any URL as your web profile and click OK to set it.
-Other residents can visit the URL you set when they look at your profile.
-  </notification>
-
   <notification
    icon="alertmodal.tga"
    name="JoinGroupCanAfford"
@@ -1957,21 +1870,6 @@ Join land?
      yestext="OK"/>
   </notification>
 
-  <notification
-   icon="alertmodal.tga"
-   name="ShowOwnersHelp"
-   type="alertmodal">
-Show owners:
-Color parcels to show the owner type.
-
-Green = Your land
-Aqua = Your Group&apos;s land
-Red = Owned by others
-Yellow = For sale
-Purple = For auction
-Grey = Public
-  </notification>
-
   <notification
    icon="alertmodal.tga"
    name="ConfirmNotecardSave"
@@ -2845,18 +2743,6 @@ Visit the [SECOND_LIFE] Public Issue Tracker, where you can report bugs and othe
      yestext="Go to page"/>
   </notification>
 
-  <notification
-   icon="alertmodal.tga"
-   name="WebLaunchPublicIssueHelp"
-   type="alertmodal">
-Visit the [SECOND_LIFE] Wiki for info on how to use the Public Issue Tracker.
-    <usetemplate
-     ignoretext="Launch my browser to view instructions for the Public Issue Tracker"
-     name="okcancelignore"
-     notext="Cancel"
-     yestext="Go to page"/>
-  </notification>
-
   <notification
    icon="alertmodal.tga"
    name="WebLaunchSupportWiki"
@@ -3634,669 +3520,272 @@ Type a short announcement which will be sent to everyone in this region.
 
   <notification
    icon="alertmodal.tga"
-   label="Block Terraform"
-   name="HelpRegionBlockTerraform"
+   label="Changed Region Maturity"
+   name="RegionMaturityChange"
    type="alertmodal">
-If this box is checked, land owners will not be able to terraform their land regardless of the per-parcel &apos;Edit Terrain&apos; setting.
-
-Default: off
+The maturity rating for this region has been updated.
+It may take some time for the change to be reflected on the map.
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Block Fly"
-   name="HelpRegionBlockFly"
+   label="Voice Version Mismatch"
+   name="VoiceVersionMismatch"
    type="alertmodal">
-If this box is checked, people will not be able to fly in this region regardless of the per-parcel &apos;Fly&apos; setting.
-
-Default: off
+This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME].
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Bulk Change Content Permissions"
-   name="HelpBulkPermission"
+   label="Can&apos;t Buy Objects"
+   name="BuyObjectOneOwner"
    type="alertmodal">
-The Bulk Permissions tool helps you to quickly change the permissions on multiple items in the contents of the selected object(s).  However, please note that you are only setting permissions on the items in the Contents of the selected objects -- not permissions on the container object(s) themselves.
-
-Also note, the permissions are not applied to the nested contents of any of the contained items.  Your request only operates on items exactly one level deep.
-
-You can selectively choose which types of items to modify by using the checklist under &apos;Content Types&apos; here. Snapshots are included when you select Textures.
-
-* This tool will only succeed at changing permissions on items you are allowed to change.
-* You cannot grant any Next owner permissions which you do not already have.
-* The Next owner permissions are merely requests. If any item cannot take all of the new permissions, none of its permissions will change.
-
-When you are ready to change the permissions in bulk, click &apos;Apply&apos; and wait for the results to display.
-
-If you close the Bulk Permissions window while permissions are being changed, it will halt the operation.
+Cannot buy objects from different owners at the same time.
+Please select only one object and try again.
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Allow Damage"
-   name="HelpRegionAllowDamage"
+   label="Can&apos;t Buy Contents"
+   name="BuyContentsOneOnly"
    type="alertmodal">
-If this box is checked, the health system across all parcels regardless of individual parcel settings. If this box is left unchecked, individual parcel owners will still be able to activate the health system on their parcels.
-
-Default: off
+Unable to buy the contents of more than one object at a time.
+Please select only one object and try again.
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Agent Limit"
-   name="HelpRegionAgentLimit"
+   label="Can&apos;t Buy Contents"
+   name="BuyContentsOneOwner"
    type="alertmodal">
-Sets the maximum number of avatars allowed in this region.
-Performance may vary depending on the number avatars present.
-
-Default: 40
+Cannot buy objects from different owners at the same time.
+Please select only one object and try again.
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Object Bonus"
-   name="HelpRegionObjectBonus"
+   name="BuyOriginal"
    type="alertmodal">
-The Object Bonus is a multiplier for primitives allowed on any given parcel. The range allowed is 1 to 10. Set at &apos;1&apos;, each 512m² parcel is allowed 117 objects. Set at &apos;2&apos;, each 512m² parcel is allowed 234, or twice as many, and so on. The max number of objects allowed per region remains 15,000 no matter what the Object Bonus is. Once set, be aware that lowering the Object Bonus may cause objects to be returned or deleted.
-
-Default: 1.0
+Buy original object from [OWNER] for L$[PRICE]?
+You will become the owner of this object.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="OK"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Maturity"
-   name="HelpRegionMaturity"
+   name="BuyOriginalNoOwner"
    type="alertmodal">
-Sets the maturity Rating of the Region, as shown in the menu bar at the top of any Resident&apos;s viewer, and in tooltips on the World Map when the cursor hovers over this Region. This setting also affects access to this Region and search results. Other Residents may only enter Regions or view search results with the same maturity Ratings they have chosen in their preferences.
-
-It may take some time for this change to be reflected on the map.
+Buy original object for L$[PRICE]?
+You will become the owner of this object.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="OK"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Restrict Pushing"
-   name="HelpRegionRestrictPushObject"
+   name="BuyCopy"
    type="alertmodal">
-This checkbox sets the full region to restricted push permissions.
-When enabled, Residents may only be pushed by themselves or by the parcel&apos;s owner.
-(Push refers to the llPushObject() LSL function.)
-
-Default: Off
+Buy a copy from [OWNER] for L$[PRICE]?
+The object will be copied to your inventory.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="OK"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Parcel Join/Subdivide"
-   name="HelpParcelChanges"
+   name="BuyCopyNoOwner"
    type="alertmodal">
-This checkbox sets whether or not parcels not owned by the estate owner can be joined or subdivided.
-If this option is unchecked:
- * Only estate owners or managers can join or subdivide parcels.
- * They may only join or subdivide parcels belonging to the owner, or to a group where they have the appropriate group powers.
-If this option is checked:
- * All parcel owners can join or subdivide the parcels they own.
- * For group owned parcels, those with appropriate group powers may join or subdivide parcels.
-
-Default: Checked
+Buy a copy for L$[PRICE]?
+The object will be copied to your inventory.
+You will be able to:
+ Modify: [MODIFYPERM]
+ Copy: [COPYPERM]
+ Resell or Give Away: [RESELLPERM]
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="OK"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Do Not Show In Search"
-   name="HelpRegionSearch"
+   name="BuyContents"
    type="alertmodal">
-Checking this box will block parcel owners from listing their parcels in search.
-
-Default: Off
+Buy contents from [OWNER] for L$[PRICE]?
+They will be copied to your inventory.
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="OK"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Changed Region Maturity"
-   name="RegionMaturityChange"
+   name="BuyContentsNoOwner"
    type="alertmodal">
-The maturity rating for this region has been updated.
-It may take some time for the change to be reflected on the map.
+Buy contents for L$[PRICE]?
+They will be copied to your inventory.
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="OK"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Land Resale"
-   name="HelpRegionLandResell"
+   name="ConfirmPurchase"
    type="alertmodal">
-Estate owners and managers can sell any land owned by the estate owner.
-If this option is left unchecked, buyers cannot resell their land in this region.
-If this option is checked, buyers can resell their land in this region.
+This transaction will:
+[ACTION]
 
-Default: Disallow
+Are you sure you want to proceed with this purchase?
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="OK"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Disable Scripts"
-   name="HelpRegionDisableScripts"
-   type="alertmodal">
-When sim performance is poor, a script may be to blame. Open the Statistics Bar (Ctrl+Shift+1). Look at the Simulator Physics FPS.
-If it is lower than 45,  open the Time panel located at the bottom of the Stats Bar. If Script Time reads 25 ms or higher, click the Get Top Scripts button. You will be given the name and location of scripts that may be causing poor performance.
+   name="ConfirmPurchasePassword"
+   type="password">
+This transaction will:
+[ACTION]
 
-Checking the Disable Scripts box and then pressing the Apply button will temporarily disable all scripts in this region. You may need to do this in order to travel to the location of a noted &apos;top script&apos;. Once you have arrived at the location, investigate the script to determine if it is causing the problem. You may want to contact the owner of the script or delete or return the object.
-Uncheck the Disable Script box and then Apply to reactivate the scripts in the region.
+Are you sure you want to proceed with this purchase?
+Please re-enter your password and click OK.
+    <form name="form">
+      <input
+       name="message"
+       type="password"/>
+      <button
+       default="true"
+       index="0"
+       name="ConfirmPurchase"
+       text="OK"/>
+      <button
+       index="1"
+       name="Cancel"
+       text="Cancel"/>
+    </form>
+  </notification>
 
-Default: off
+  <notification
+   icon="alert.tga"
+   name="SetPickLocation"
+   type="alert">
+Note:
+You have updated the location of this pick but the other details will retain their original values.
+    <usetemplate
+     name="okbutton"
+     yestext="OK"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Disable Collisions"
-   name="HelpRegionDisableCollisions"
+   name="MoveInventoryFromObject"
    type="alertmodal">
-When sim performance is poor, physical objects may be to blame.
-Open the Statistics Bar (Ctrl+Shift+1). Look at the Simulator Physics FPS.  If it is lower than 45, open the Time panel located at the bottom of the Stats Bar. If Sim Time (Physics) reads 20 ms or higher, click the Get Top Colliders button.
-You will be given the name and location of physical objects that may be causing poor performance.
-
-Checking the Disable Collisions box and then pressing the Apply button will temporarily disable object-object collisions. You may need to do this in order to travel to the location of a noted &apos;top collider&apos;. Once you have arrived at the location, investigate the object - is it constantly colliding with other objects? You may want to contact the owner of the object or delete or return the object.
-Uncheck the Disable Collisions box and then Apply to reactivate collisions in the region.
+You have selected &apos;no copy&apos; inventory items.
+These items will be moved to your inventory, not copied.
 
-Default: off
+Move the inventory item(s)?
+    <usetemplate
+     ignoretext="Warn me before I move &apos;no-copy&apos; items from an object"
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="OK"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Disable Physics"
-   name="HelpRegionDisablePhysics"
+   name="MoveInventoryFromScriptedObject"
    type="alertmodal">
-Disable Physics is similar to Disable Collisions, except all physics simulation is disabled.  This means that not only will objects stop colliding, but avatars will be unable to move.
-
-This should only be used when Disable Collisions does not give back enough performance to the region to investigate a physics problem or Top Collider.
+You have selected &apos;no copy&apos; inventory items.  These items will be moved to your inventory, not copied.
+Because this object is scripted, moving these items to your inventory may cause the script to malfunction.
 
-Be sure to re-enable physics when you are done, or avatars will continue to be unable to move.
+Move the inventory item(s)?
+    <usetemplate
+     ignoretext="Warn me before I move &apos;no-copy&apos; items which might break a scripted object"
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="OK"/>
+  </notification>
 
-Default: off
+  <notification
+   icon="alert.tga"
+   name="ClickActionNotPayable"
+   type="alert">
+Warning: The &apos;Pay object&apos; click action has been set, but it will only work if a script is added with a money() event.
+    <form name="form">
+      <ignore name="ignore"
+       text="I set the action &apos;Pay object&apos; when building an object without a money() script"/>
+    </form>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Top Colliders"
-   name="HelpRegionTopColliders"
+   name="OpenObjectCannotCopy"
    type="alertmodal">
-Show a list of objects experiencing the greatest number of potential object-object collisions.  These objects can slow performance.  Select Advanced &gt; Performance Tools &gt; Statistics Bar and look under Simulator &gt; Time &gt; Physics Time to see if more than 20 ms is being spent in physics.
+There are no items in this object that you are allowed to copy.
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Top Scripts"
-   name="HelpRegionTopScripts"
+   name="WebLaunchAccountHistory"
    type="alertmodal">
-Show a list of objects spending the most time running LSL scripts.  These objects can slow performance.
-Select Advanced &gt; Performance Tools &gt; Statistics Bar and look under Simulator &gt; Time &gt; Script Time to see if more than 25 ms is being spent in scripts.
+Go to  your [http://secondlife.com/account/ Dashboard] to see your account history?
+    <usetemplate
+     ignoretext="Launch my browser to see my account history"
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="Go to page"/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Restart Region"
-   name="HelpRegionRestart"
+   name="ConfirmQuit"
    type="alertmodal">
-Restart the server process running this region after a two minute warning.  All Residents in the region will be disconnected.  The region will save its data, and should come back up within 90 seconds.
-
-Restarting the region will not fix most performance problems, and should usually be used only when directed.
+Are you sure you want to quit?
+    <usetemplate
+     ignoretext="Confirm before I quit"
+     name="okcancelignore"
+     notext="Don&apos;t Quit"
+     yestext="Quit"/>
+     <unique/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Water Height"
-   name="HelpRegionWaterHeight"
+   name="HelpReportAbuseEmailLL"
    type="alertmodal">
-This is the height in meters where water appears. If this setting is anything other than 20 and you have water that is adjacent to the edge of world or &apos;void&apos; water, there will be a visible gap.
+Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
 
-Default: 20
+All reported abuses are investigated and resolved. You can view the resolution by reading the [http://secondlife.com/support/incidentreport.php Incident Report].
+   <unique/>
   </notification>
 
   <notification
    icon="alertmodal.tga"
-   label="Terrain Raise"
-   name="HelpRegionTerrainRaise"
-   type="alertmodal">
-This is the distance in meters that parcel owners can raise their terrain above the &apos;baked&apos; terrain default height.
-
-Default: 4
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Terrain Lower"
-   name="HelpRegionTerrainLower"
-   type="alertmodal">
-This is the distance in meters that parcel owners can lower their terrain below the &apos;baked&apos; terrain default height.
-
-Default: -4
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Upload RAW Terrain"
-   name="HelpRegionUploadRaw"
-   type="alertmodal">
-This button uploads a .RAW file to the region you are in.
-The file must have the correct dimensions (RGB, 256x256) and 13 channels.  The best way to create a terrain file is to download the existing RAW file.  A good first step is to modify the red channel (land height), and upload it.
-
-The upload can take up to 45 seconds. Note that uploading a terrain file *will not* move the objects that are on the land, only the terrain itself and the permissions associated with the parcels.  This can result in objects going underground.
-
-For more information on editing region height fields, consult F1 Help.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Download RAW Terrain"
-   name="HelpRegionDownloadRaw"
-   type="alertmodal">
-This button downloads a file containing the height field data, parcel dimensions, parcel for sale status and some parcel permissions for this region. When opening the file in a program such as Photoshop you must specify the document&apos;s dimensions which are: RGB, 256x256 with 13 channels. This terrain file cannot be opened in any other way.
-
-For more information on editing region height fields, consult F1 help.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Use Estate Sun"
-   name="HelpRegionUseEstateSun"
-   type="alertmodal">
-This checkbox makes the sun position in this region the same as the sun position in the rest of the estate.
-
-Default: on
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Fixed Sun"
-   name="HelpRegionFixedSun"
-   type="alertmodal">
-This checkbox sets the sun position to the position in the Phase slider and stops the sun from moving.
-
-Default: off
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Bake Terrain"
-   name="HelpRegionBakeTerrain"
-   type="alertmodal">
-This button saves the current shape of the terrain as the new default for the region. Once baked, the land can revert to the saved shape whenever you or others use the Edit Terrain &apos;Revert&apos; option. The baked terrain is also the middle point for the terrain raise and lower limits.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Estate Managers"
-   name="HelpEstateEstateManager"
-   type="alertmodal">
-An estate manager is a Resident to whom you have delegated control of region and estate settings.  An estate manager can change any setting in these panels, except for uploading, downloading, and baking terrain.  In particular, they can allow or ban Residents from your estate.
-
-Estate managers can only be added or removed by the owner of the estate, not by each other.  Please only choose Residents you trust as estate managers, as you will be ultimately responsible for their actions.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Use Global Time"
-   name="HelpEstateUseGlobalTime"
-   type="alertmodal">
-This checkbox makes the sun in your estate follow the same position as on the Linden-owned &apos;mainland&apos; estates.
-
-Default: on
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Fixed Sun"
-   name="HelpEstateFixedSun"
-   type="alertmodal">
-This checkbox sets the sun position to the position in the Phase slider and stops the sun from moving.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Public Access"
-   name="HelpEstateExternallyVisible"
-   type="alertmodal">
-This checkbox sets whether Residents who are on other estates can enter this estate without being on an access list.
-
-Default: on
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Allow Direct Teleport"
-   name="HelpEstateAllowDirectTeleport"
-   type="alertmodal">
-When checked, allows Residents to directly teleport to any point in your estate.  When unchecked, Residents teleport to the nearest telehub.
-
-Default: off
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Allow Access"
-   name="HelpEstateAllowResident"
-   type="alertmodal">
-Access to this estate will be limited to Residents listed here and any groups below.  This setting is only available when Public Access is unchecked.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Allow Group Access"
-   name="HelpEstateAllowGroup"
-   type="alertmodal">
-Access to this estate will be limited to groups listed here and any Residents above.  This setting is only available when Public Access is unchecked.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Abuse Email Address"
-   name="HelpEstateAbuseEmailAddress"
-   type="alertmodal">
-Setting this to a valid email address will cause abuse reports on this estate to be sent to that address.
-Setting it blank will cause abuse reports to be sent only to Linden Lab.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Deny Access"
-   name="HelpEstateBanResident"
-   type="alertmodal">
-Residents on this list are denied access to your estate, regardless of any other settings.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Allow Voice Chat"
-   name="HelpEstateVoiceChat"
-   type="alertmodal">
-Parcels in this estate are allowed to have their own voice channels in which residents may hear and talk with others nearby.
-
-Default: off
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Voice Version Mismatch"
-   name="VoiceVersionMismatch"
-   type="alertmodal">
-This version of [APP_NAME] is not compatible with the Voice Chat feature in this region. In order for Voice Chat to function correctly you will need to update [APP_NAME].
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Estate Covenant"
-   name="HelpEstateCovenant"
-   type="alertmodal">
-Setting an estate covenant enables you to sell parcels within that estate. If a covenant is not set, you cannot sell the land. The notecard for your covenant can be empty if you do not wish to apply any rules or advise buyers of anything in relation to the land before they buy it.
-
-A covenant can be used to communicate rules, guidelines, cultural information or simply your own expectations to the prospective buyer. This can include zoning, building regulations, payment options or any other information you feel it is important for the new owner to have seen and to have agreed to before they purchase.
-
-The buyer must agree to the covenant by ticking the check box before they will be able to finish the purchase. Estate covenants are always visible in the About Land dialog for any parcels that have one set.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Can&apos;t Buy Objects"
-   name="BuyObjectOneOwner"
-   type="alertmodal">
-Cannot buy objects from different owners at the same time.
-Please select only one object and try again.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Can&apos;t Buy Contents"
-   name="BuyContentsOneOnly"
-   type="alertmodal">
-Unable to buy the contents of more than one object at a time.
-Please select only one object and try again.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   label="Can&apos;t Buy Contents"
-   name="BuyContentsOneOwner"
-   type="alertmodal">
-Cannot buy objects from different owners at the same time.
-Please select only one object and try again.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="BuyOriginal"
-   type="alertmodal">
-Buy original object from [OWNER] for L$[PRICE]?
-You will become the owner of this object.
-You will be able to:
- Modify: [MODIFYPERM]
- Copy: [COPYPERM]
- Resell or Give Away: [RESELLPERM]
-    <usetemplate
-     name="okcancelbuttons"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="BuyOriginalNoOwner"
-   type="alertmodal">
-Buy original object for L$[PRICE]?
-You will become the owner of this object.
-You will be able to:
- Modify: [MODIFYPERM]
- Copy: [COPYPERM]
- Resell or Give Away: [RESELLPERM]
-    <usetemplate
-     name="okcancelbuttons"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="BuyCopy"
-   type="alertmodal">
-Buy a copy from [OWNER] for L$[PRICE]?
-The object will be copied to your inventory.
-You will be able to:
- Modify: [MODIFYPERM]
- Copy: [COPYPERM]
- Resell or Give Away: [RESELLPERM]
-    <usetemplate
-     name="okcancelbuttons"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="BuyCopyNoOwner"
-   type="alertmodal">
-Buy a copy for L$[PRICE]?
-The object will be copied to your inventory.
-You will be able to:
- Modify: [MODIFYPERM]
- Copy: [COPYPERM]
- Resell or Give Away: [RESELLPERM]
-    <usetemplate
-     name="okcancelbuttons"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="BuyContents"
-   type="alertmodal">
-Buy contents from [OWNER] for L$[PRICE]?
-They will be copied to your inventory.
-    <usetemplate
-     name="okcancelbuttons"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="BuyContentsNoOwner"
-   type="alertmodal">
-Buy contents for L$[PRICE]?
-They will be copied to your inventory.
-    <usetemplate
-     name="okcancelbuttons"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ConfirmPurchase"
-   type="alertmodal">
-This transaction will:
-[ACTION]
-
-Are you sure you want to proceed with this purchase?
-    <usetemplate
-     name="okcancelbuttons"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ConfirmPurchasePassword"
-   type="password">
-This transaction will:
-[ACTION]
-
-Are you sure you want to proceed with this purchase?
-Please re-enter your password and click OK.
-    <form name="form">
-      <input
-       name="message"
-       type="password"/>
-      <button
-       default="true"
-       index="0"
-       name="ConfirmPurchase"
-       text="OK"/>
-      <button
-       index="1"
-       name="Cancel"
-       text="Cancel"/>
-    </form>
-  </notification>
-
-  <notification
-   icon="alert.tga"
-   name="SetPickLocation"
-   type="alert">
-Note:
-You have updated the location of this pick but the other details will retain their original values.
-    <usetemplate
-     name="okbutton"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="MoveInventoryFromObject"
-   type="alertmodal">
-You have selected &apos;no copy&apos; inventory items.
-These items will be moved to your inventory, not copied.
-
-Move the inventory item(s)?
-    <usetemplate
-     ignoretext="Warn me before I move &apos;no-copy&apos; items from an object"
-     name="okcancelignore"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="MoveInventoryFromScriptedObject"
-   type="alertmodal">
-You have selected &apos;no copy&apos; inventory items.  These items will be moved to your inventory, not copied.
-Because this object is scripted, moving these items to your inventory may cause the script to malfunction.
-
-Move the inventory item(s)?
-    <usetemplate
-     ignoretext="Warn me before I move &apos;no-copy&apos; items which might break a scripted object"
-     name="okcancelignore"
-     notext="Cancel"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alert.tga"
-   name="ClickActionNotPayable"
-   type="alert">
-Warning: The &apos;Pay object&apos; click action has been set, but it will only work if a script is added with a money() event.
-    <form name="form">
-      <ignore name="ignore"
-       text="I set the action &apos;Pay object&apos; when building an object without a money() script"/>
-    </form>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="OpenObjectCannotCopy"
-   type="alertmodal">
-There are no items in this object that you are allowed to copy.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="WebLaunchAccountHistory"
-   type="alertmodal">
-Go to  your [http://secondlife.com/account/ Dashboard] to see your account history?
-    <usetemplate
-     ignoretext="Launch my browser to see my account history"
-     name="okcancelignore"
-     notext="Cancel"
-     yestext="Go to page"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ClickOpenF1Help"
-   type="alertmodal">
-Do you want to visit [SECOND_LIFE] help?
-    <usetemplate
-     ignoretext="Launch my browser to view Help/Support"
-     name="okcancelignore"
-     notext="Cancel"
-     yestext="Go"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="ConfirmQuit"
-   type="alertmodal">
-Are you sure you want to quit?
-    <usetemplate
-     ignoretext="Confirm before I quit"
-     name="okcancelignore"
-     notext="Don&apos;t Quit"
-     yestext="Quit"/>
-     <unique/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpReportAbuseEmailLL"
-   type="alertmodal">
-Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
-
-All reported abuses are investigated and resolved. You can view the resolution by reading the [http://secondlife.com/support/incidentreport.php Incident Report].
-   <unique/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpReportAbuseEmailEO"
+   name="HelpReportAbuseEmailEO"
    type="alertmodal">
 IMPORTANT: This report will go to the owner of the region you are currently in and not to Linden Lab.
 
@@ -4499,31 +3988,6 @@ Link to this from a web page to give others easy access to this location, or try
     </form>
   </notification>
 
-  <notification
-   icon="alertmodal.tga"
-   name="GraphicsPreferencesHelp"
-   type="alertmodal">
-This panel controls window size and resolution and the quality of the client&apos;s graphics.  The Preferences &gt; Graphics interface allows you to choose between four graphics levels: Low, Mid, High, and Ultra. You may also customize your graphics settings by clicking the Advanced button and manipulating the following settings:
-
-Shaders: Enable or disable various types of pixel shaders.
-
-Reflection Detail: Sets the types of objects that water can reflect.
-
-Avatar Rendering: Sets options that affect how the client renders avatars.
-
-Draw Distance: Affects how far out from your viewpoint objects will be rendered in the scene.
-
-Max Particle Count: Sets the maximum number of particles you are able to see on your screen at once.
-
-Post Process Quality: Sets the resolution with which Glow is rendered.
-
-Mesh Detail: Sets the amount of detail or number of triangles used in rendering certain objects. A higher value takes longer to render, but makes these objects appear with more detail.
-
-Lighting Detail: Selects what types of lights you would like to render.
-
-Terrain Detail: Sets the amount of detail you would like to see for the terrain texture.
-  </notification>
-
   <notification
    icon="alertmodal.tga"
    name="WLSavePresetAlert"
@@ -4571,306 +4035,6 @@ PostProcess Effect exists. Do you still wish overwrite it?
      yestext="Yes"/>
   </notification>
 
-  <notification
-   icon="alertmodal.tga"
-   name="HelpEditSky"
-   type="alertmodal">
-Edit the WindLight sliders to create and save a set of skies.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpEditDayCycle"
-   type="alertmodal">
-Set which skies to turn to throughout the day.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="EnvSettingsHelpButton"
-   type="alertmodal">
-These settings adjust the way the environment looks locally on your computer.  Your graphics card needs to support atmospheric shaders in order to have access to all of the settings.
-
-Adjust the &quot;Time of Day&quot; slider to change the day&apos;s phase locally on the viewer.
-
-Adjust the &quot;Cloud Cover&quot; slider to control how much the clouds cover the sky.
-
-Pick a color in the &quot;Water Color&quot; color picker to change the color of the water.
-
-Adjust the &quot;Water Fog&quot; slider to control how dense the fog is underwater.
-
-Click &quot;Use Estate Time&quot; to reset the time of day to the region&apos;s current time of day and remain linked to it.
-
-Click &quot;Advanced Sky&quot; to bring up an editor with more advanced settings for the sky.
-
-Click &quot;Advanced Water&quot; to bring up an editor with more advanced settings for the water.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpDayCycle"
-   type="alertmodal">
-The Day Cycle Editor gives you control over the sky during [SECOND_LIFE]&apos;s day/night cycle. This is the cycle that is used by the Basic Environment Editor&apos;s Time of Day slider.
-
-The Day Cycle Editor works by setting keyframes. These are nodes (represented by the gray blips on the time graph) that have Sky Presets associated with them. As the Time of Day progresses, the WindLight sky &quot;animates&quot; as it interpolates between these keyframes.
-
-The yellow arrow above the timeline represents your current view, based on Time of Day. Click and drag it to see how your day will animate. You may add or delete keyframes by pressing the Add Key and Delete Key buttons to the right of the timeline.
-
-You can set the time position of a keyframe by either dragging it along the timeline, or by setting its value manually in the Key Frame Settings frame. Within the Key Frame Settings frame, you&apos;ll be able to associate the keyframe with its respective WindLight preset.
-
-Length of Cycle dictates the overall duration of a &quot;day&quot;. Setting this to a low value (for instance, 2 min.) will mean your entire 24-hour timeline will animate in only two real minutes! Once you are satisfied with your timeline and keyframe cycle, use the Play and Stop buttons to preview the results. Remember- you can also move the yellow time-indicator arrow above the timeline to see the cycle animate interactively. Using the Use Estate Time button will synchronize your day length and time of day with the Estate&apos;s day cycle.
-
-Once you are pleased with your Day Cycle, you can save and load it with the Save Test Day and Load Test Day buttons. Note that, for now, we only allow one Day Cycle.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpBlueHorizon"
-   type="alertmodal">
-Use the Red/Green/Blue (RGB) sliders to adjust the color of the sky. You can use the Intensity (I) slider to move all three RGB sliders in unison.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpHazeHorizon"
-   type="alertmodal">
-Haze Horizon is one of the most useful parameters for adjusting overall light exposure in the scene.  It is effective for simulating many exposure settings, such as white-outs from the sun and darker, closed-iris settings.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpBlueDensity"
-   type="alertmodal">
-Blue Density affects the overall color saturation of the sky and fog. If you move the Intensity (I) slider to the right, colors will become brighter and more vibrant. If you move it all the way to the left, the colors will become duller, eventually fading to black and white. If you want to fine-tune the sky&apos;s color balance, you can control individual elements of saturation by using the Red/Green/Blue (RGB) sliders.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpHazeDensity"
-   type="alertmodal">
-Haze Density controls the level of dull, gray haze in the atmosphere.  It is effective for simulating scenes with high levels of smoke and man-made pollutants.  It is also effective for simulating fog and mist.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpDensityMult"
-   type="alertmodal">
-The Density Multiplier can be used to affect the overall atmospheric density. At lower settings, it creates a feeling of &quot;thin air&quot;, and at higher settings, it creates a very heavy, smoggy effect.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpDistanceMult"
-   type="alertmodal">
-Adjusts WindLight&apos;s perceived distance.  A value of zero effectively turns off WindLight&apos;s influence on terrain and objects.  Values greater than 1 simulate greater distances for thicker atmospheric effects.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpMaxAltitude"
-   type="alertmodal">
-Max Altitude adjusts the altitude calculations WindLight performs when computing its atmospheric lighting.  At later times of day, it is useful for adjusting how &quot;deep&quot; the sunset appears.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpSunlightColor"
-   type="alertmodal">
-Adjusts the color and intensity of the direct light in the scene.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpSunAmbient"
-   type="alertmodal">
-Adjusts the color and intensity of ambient atmospheric light in the scene.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpSunGlow"
-   type="alertmodal">
-The Size slider controls the size of the sun.
-The Focus slider controls how blurred the sun is over the sky.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpSceneGamma"
-   type="alertmodal">
-Adjust the screen&apos;s distribution of light and dark.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpStarBrightness"
-   type="alertmodal">
-Adjusts the brightness of the stars in the sky.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpTimeOfDay"
-   type="alertmodal">
-Controls the location of the sun in the sky.
-Similar to elevation.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpEastAngle"
-   type="alertmodal">
-Controls the location of the sun in the sky.
-Similar to azimuth.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpCloudColor"
-   type="alertmodal">
-Edits the color of the clouds.  It is generally recommended to keep it whitish, but hey, have fun if you want.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpCloudDetail"
-   type="alertmodal">
-Controls the detail image layered on top of the main cloud image.  X and Y control its position.  D (Density) controls how puffy or fractured the clouds appear.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpCloudDensity"
-   type="alertmodal">
-Allows you to control the position of the clouds with the X and Y sliders and how dense they are with the the D slider.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpCloudCoverage"
-   type="alertmodal">
-Controls how much the clouds cover the sky.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpCloudScale"
-   type="alertmodal">
-Controls the scaling of the cloud image on the sky dome.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpCloudScrollX"
-   type="alertmodal">
-Controls the speed of the clouds as they move in the X direction.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpCloudScrollY"
-   type="alertmodal">
-Controls the speed of the clouds as they move in the Y direction.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpClassicClouds"
-   type="alertmodal">
-Check this box to enable rendering of [SECOND_LIFE]&apos;s older classic clouds in addition to WindLight&apos;s clouds.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterFogColor"
-   type="alertmodal">
-Chooses the color of the underwater fog.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterFogDensity"
-   type="alertmodal">
-Controls how dense the water fog is and how far you can see underwater.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpUnderWaterFogMod"
-   type="alertmodal">
-Modifies the effect of the Fog Density Exponent to control how far you can see when your avatar is underwater.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterGlow"
-   type="alertmodal">
-Controls how much the surface of the water glows.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterNormalScale"
-   type="alertmodal">
-Controls the scaling of the three wavelets that make up the water.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterFresnelScale"
-   type="alertmodal">
-Controls how much light is reflected at different angles.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterFresnelOffset"
-   type="alertmodal">
-Controls how much light intensity is reflected.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterScaleAbove"
-   type="alertmodal">
-Controls how much light is refracted from looking above the surface of the water.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterScaleBelow"
-   type="alertmodal">
-Controls how much light is refracted from looking from below the surface of the water.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterBlurMultiplier"
-   type="alertmodal">
-Controls how waves and reflections are mixed.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterNormalMap"
-   type="alertmodal">
-Controls what normal map is layered across the water to determine reflections/refractions.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterWave1"
-   type="alertmodal">
-Controls where and how fast the large scaled version of the normal map moves in the X and Y direction.
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="HelpWaterWave2"
-   type="alertmodal">
-Controls where and how fast the the small scaled version of the normal map moves in the X and Y direction.
-  </notification>
-
   <notification
    icon="alert.tga"
    name="NewSkyPreset"
@@ -5618,14 +4782,6 @@ You are banned from the region.
 Your account cannot connect to this teen grid region.
   </notification>
 
-  <notification
-	icon="notify.tga"
-	name="NoHelpIslandTP"
-	type="notify">
-You cannot teleport back to Help Island.
-Go to &apos;Help Island Public&apos; to repeat the tutorial.
-  </notification>
-
   <notification
 	icon="notify.tga"
 	name="ImproperPaymentStatus"
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index f50acc224f053796b42600374bac9757d6fb8425..87c4e2787f489e0387a50eefff2ec1a97dff6f56 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  name="panel_im_control_panel"
- width="146"
+ width="180"
  height="215"
  border="false">
     <avatar_list
@@ -16,10 +16,11 @@
      show_info_btn="false"
      show_profile_btn="false"
      top="10"
-     width="140" />
+     width="180" />
     <button
      name="call_btn"
      label="Call"
+     left_delta="27"
      width="125"
      height="20" />
     <button
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 18761c3bb9ab6d38ad0c652509284b9f4f1d17ca..0c426865310df0ffdd978d7a716d7f296ec42cc1 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -76,7 +76,6 @@
      left_pad="3"
      right="-31"
      name="info_btn"
-     picture_style="true"
      top_delta="-2"
      width="16" />
     <button
@@ -87,7 +86,6 @@
      left_pad="5"
      right="-3"
      name="profile_btn"
-     picture_style="true"
      top_delta="-2"
      width="20" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 61bd1d186e51bd614b7693368ae2903df7943ccc..3149a1f7b395d22d2fdb81d27715dc4065c549c1 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -60,7 +60,7 @@
          min_width="96"
          name="speak_panel"
          user_resize="false">
-         <chiclet_talk
+         <talk_button
           follows="right"
           height="23"
           speak_button.tab_stop="true"
@@ -93,7 +93,7 @@
          min_width="76"
          name="gesture_panel"
          user_resize="false">
-         <button
+         <gesture_combo_box
            follows="right"
           height="23"
           label="Gesture"
@@ -271,7 +271,6 @@
                follows="right"
                flash_color="EmphasisColor"
                name="Unread"
-               picture_style="true"
                image_overlay="Widget_UpArrow" />
                <unread_notifications
                width="34"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index bac6f6e4d1b144bbde5f2128fcebcb034894f88b..282b3f3e55471f8035a867e09621a51fdc5a29c0 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -17,7 +17,6 @@
      image_overlay="BackArrow_Off"
      layout="topleft"
      name="back_btn"
-     picture_style="true"
      left="10"
      tab_stop="false"
      top="2"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
index 77b887de9ba6b49b0a43d4fcd7c1b7fb0c291db6..f76a56bda49e369534b1901a329ec5477b77c62c 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -137,7 +137,6 @@ left="0"
      image_overlay="BackArrow_Off"
      layout="topleft"
      name="back_btn"
-     picture_style="true"
      left="10"
      top="7" />
 	<text
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 9ed510dff3e1feeed5f2a99f428c6529ffdc0b13..3358015335d8aef83d08df25d7c3cf3b5ce1a249 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  name="panel_im_control_panel"
- width="146"
+ width="180"
  height="238"
  border="false">
     <avatar_list
@@ -16,11 +16,11 @@
      show_info_btn="false"
      show_profile_btn="false"
      top="10"
-     width="140" />
+     width="180" />
     <button
      name="group_info_btn"
      label="Group Info"
-     left_delta="3"
+     left_delta="27"
      width="125"
      height="20" />
     <button
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index a85c55f9b2ca54c83e510715402c11da7582e0da..4f24c7a745b62232b734cb28ccdf2319fcc8505a 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -1,14 +1,14 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="all"
- height="412"
+     height="380"
  label="General"
  class="panel_group_general"
  layout="topleft"
  left="0"
  top="0"
  name="general_tab"
- width="313">
+ width="303">
     <panel.string
      name="help_text">
         The General tab contains general information about this group, a list of members, general Group Preferences and member options.
@@ -41,7 +41,7 @@ Hover your mouse over the options for more help.
      draw_heading="true"
      follows="left|top"
      heading_height="16"
-     height="160"
+     height="130"
      layout="topleft"
      left_delta="0"
      name="visible_members"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index d8d47c40084940d6390abfcb49aa9aab3b9ceb3d..c2f9cfe6755f26d30ee6c8feb40f2b5717a4e008 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -5,7 +5,7 @@ background_visible="true"
  height="570"
  label="Group Info"
  layout="topleft"
- min_height="350"
+ min_height="425"
  left="0"
  top="20"
  name="GroupInfo"
@@ -32,7 +32,6 @@ background_visible="true"
      image_overlay="BackArrow_Off"
      layout="topleft"
      name="back"
-     picture_style="true"
      left="10"
      tab_stop="false"
      top="2"
@@ -47,7 +46,7 @@ background_visible="true"
      text_color="white"
      top="0"
      value="(Loading...)"
-     use_elipsis="true"
+     use_ellipses="true"
      width="300" />
     <line_editor
      follows="left|top"
@@ -60,7 +59,7 @@ background_visible="true"
      top_delta="5"
      width="250"
      height="20"
-     visible="true" />
+     visible="false" />
     <texture_picker
      follows="left|top"
      height="113"
@@ -112,33 +111,46 @@ background_visible="true"
      left_delta="0"
      top_pad="6"
      height="23"
-     label="Join now!"
-     label_selected="Join now!"
+     label="JOIN NOW!"
      name="btn_join"
      visible="true"
      width="120" />
    <accordion
              follows="all"
-             height="405"
+             height="425"
              layout="topleft"
              left="0"
+             multiple_expansion="false"
              name="groups_accordion"
-             top_pad="20"
-             width="333">
+             top_pad="15"
+             width="336">
              <accordion_tab
                  can_resize="false"
+                 expanded="true"
                  layout="topleft"
                  name="tab_general"
                  title="General">
-        <panel
-        border="false"
-         filename="panel_group_general.xml"
+         <scroll_container
+         color="DkGray2"
+         opaque="true"
+         height="323"
+         follows="all"
          layout="topleft"
          left="0"
-         help_topic="group_general_tab"
-         name="general_tab"
          top="0"
-         width="333" />
+         name="general_scroll"
+         reserve_scroll_corner="false"
+         width="333">
+            <panel
+            border="false"
+             filename="panel_group_general.xml"
+             layout="topleft"
+             left="0"
+             help_topic="group_general_tab"
+             name="general_tab"
+             top="0"
+             width="303" />
+         </scroll_container>
          </accordion_tab>
          <accordion_tab
                  can_resize="false"
@@ -146,15 +158,27 @@ background_visible="true"
                  layout="topleft"
                  name="tab_roles"
                  title="Roles">
-        <panel
-        border="false"
-         filename="panel_group_roles.xml"
-         layout="topleft"
-         left="0"
-         help_topic="group_roles_tab"
-         name="roles_tab"
-         top="0"
-         width="333" />
+               <scroll_container
+                  color="DkGray2"
+                  opaque="true"
+                  height="323"
+                  follows="all"
+                  layout="topleft"
+                  left="0"
+                  top="0"
+                  name="roles_scroll"
+                  reserve_scroll_corner="false"
+                  width="333">
+                 <panel
+                 border="false"
+                  filename="panel_group_roles.xml"
+                  layout="topleft"
+                  left="0"
+                  help_topic="group_roles_tab"
+                  name="roles_tab"
+                  top="0"
+             width="303" />
+         </scroll_container>
          </accordion_tab>
          <accordion_tab
                  can_resize="false"
@@ -162,21 +186,45 @@ background_visible="true"
                  layout="topleft"
                  name="tab_notices"
                  title="Notices">
+            <scroll_container
+                  color="DkGray2"
+                  opaque="true"
+                  height="323"
+                  follows="all"
+                  layout="topleft"
+                  left="0"
+                  top="0"
+                  name="notices_scroll"
+                  reserve_scroll_corner="false"
+                  width="333">
         <panel
+        border="false"
          filename="panel_group_notices.xml"
          layout="topleft"
          left="0"
          help_topic="group_notices_tab"
          name="notices_tab"
          top="0"
-         width="333" />
+         width="303" />
+         </scroll_container>
          </accordion_tab>
-                  <accordion_tab
+        <accordion_tab
                  can_resize="false"
                  expanded="false"
                  layout="topleft"
                  name="tab_notices"
                  title="Land/Assets">
+           <scroll_container
+                  color="DkGray2"
+                  opaque="true"
+                  height="323"
+                  follows="all"
+                  layout="topleft"
+                  left="0"
+                  top="0"
+                  name="land_scroll"
+                  reserve_scroll_corner="false"
+                  width="333">
         <panel
         border="false"
          filename="panel_group_land_money.xml"
@@ -185,41 +233,42 @@ background_visible="true"
          help_topic="group_land_money_tab"
          name="land_money_tab"
          top="0"
-         width="333" />
+         width="313" />
+         </scroll_container>
          </accordion_tab>
          </accordion>
-    <button
+   <button
      follows="top|left"
-     height="20"
+     height="22"
      image_overlay="Refresh_Off"
      layout="topleft"
-     name="btn_refresh"
-     picture_style="true"
      left="5"
-     width="20" />
-     <button
-     height="20"
-     font="SansSerifSmall"
-     label="Save"
-     label_selected="Save"
-     name="btn_apply"
-     left_pad="5"
-     width="65" />
-    <button
+     name="btn_refresh"
+     top_pad="-15"
+     width="23" />
+         <button
      height="20"
      label="Create"
-     label_selected="Create"
+     label_selected="New group"
      name="btn_create"
-     left_pad="5"
+     left_pad="10"
      visible="false"
-     width="65" />
-    <button
-     left_pad="5"
+     width="100" />
+   <!-- <button
+     left_pad="10"
      height="20"
      label="Cancel"
      label_selected="Cancel"
      name="btn_cancel"
      visible="false"
+     width="65" />-->
+     <button
+     height="20"
+     font="SansSerifSmall"
+     label="Save"
+     label_selected="Save"
+     name="btn_apply"
+     left_pad="10"
+     right="-10"
      width="65" />
-
 </panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 04e0ad3be8a3d3b94bfcaeb09b66d0974b45b32f..99fc39c466aaa96700bf7e6f28d2964d6967387e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -1,25 +1,25 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
- border="true"
+ border="false"
  follows="all"
  height="510"
  label="Land &amp; L$"
  layout="topleft"
  left="1"
  name="land_money_tab"
- top="490"
- width="280">
+ top="0"
+ width="313">
     <panel.string
      name="help_text">
-        Parcels owned by the group are listed along with contribution details. A warning appears until the Total Land in Use is less than or equal to the Total Contribution. The Planning, Details, and Sales tabs provide information about the group&apos;s finances.
+        Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution.
     </panel.string>
     <panel.string
      name="cant_view_group_land_text">
-        You do not have permission to view group owned land.
+        You don&apos;t have permission to view group owned land
     </panel.string>
     <panel.string
      name="cant_view_group_accounting_text">
-        You do not have permission to view the group&apos;s accounting information.
+        You don&apos;t have permission to view the group&apos;s accounting information.
     </panel.string>
     <panel.string
      name="loading_txt">
@@ -27,19 +27,8 @@
     </panel.string>
     <panel.string
      name="land_contrib_error">
-        Unable to set your land contribution.
+        Unable to set your land contribution
     </panel.string>
-    <!--
-    <button
-      follows="left|top"
-     height="16"
-     label="?"
-     layout="topleft"
-     left="250"
-     name="help_button"
-     top="8"
-     width="20" />
-    -->
    <!-- <text
      type="string"
      follows="left|top"
@@ -55,29 +44,29 @@
     <scroll_list
      draw_heading="true"
      follows="top"
-     heading_height="14"
-     height="100"
+     heading_height="20"
+     height="150"
      layout="topleft"
-     left="5"
+     left="0"
      name="group_parcel_list"
-     top_pad="10"
-     width="265">
+     top_pad="0"
+     width="313">
         <scroll_list.columns
          label="Parcel"
          name="name"
-         width="67" />
+         width="78" />
         <scroll_list.columns
          label="Region"
          name="location"
-         width="72" />
+         width="78" />
         <scroll_list.columns
          label="Type"
          name="type"
-         width="60" />
+         width="70" />
         <scroll_list.columns
          label="Area"
          name="area"
-         width="20" />
+         width="50" />
         <scroll_list.columns
          label=""
          name="hidden"
@@ -85,14 +74,14 @@
     </scroll_list>
     <button
      follows="top"
-     height="20"
+     height="23"
      label="Map"
      label_selected="Map"
      layout="topleft"
-     left="150"
      name="map_button"
-     top_pad="10"
-     width="125"
+     right="-10"
+     top_pad="5"
+     width="95"
      enabled="false" />
     <text
      type="string"
@@ -102,11 +91,12 @@
      layout="topleft"
      left="5"
      name="total_contributed_land_label"
-     top_pad="10"
+     top_pad="0"
      width="130">
         Total Contribution:
     </text>
     <text
+    text_color="EmphasisColor"
      type="string"
      follows="left|top"
      height="16"
@@ -130,6 +120,7 @@
         Total Land In Use:
     </text>
     <text
+    text_color="EmphasisColor"
      type="string"
      follows="left|top"
      height="16"
@@ -153,6 +144,7 @@
         Land Available:
     </text>
     <text
+    text_color="EmphasisColor"
      type="string"
      follows="left|top"
      height="16"
@@ -179,19 +171,19 @@
      border_style="line"
      border_thickness="1"
      follows="left|top"
-     height="16"
+     height="19"
      layout="topleft"
      left_pad="5"
      max_length="10"
      name="your_contribution_line_editor"
-     top_delta="-2"
+     top_delta="0"
      width="95" />
     <text
      type="string"
      follows="left|top"
      height="16"
      layout="topleft"
-     left_pad="5"
+     left_pad="3"
      name="your_contribution_units"
      top_delta="2">
         m²
@@ -204,13 +196,13 @@
      layout="topleft"
      left="140"
      name="your_contribution_max_value"
-     top_pad="0"
+     top_pad="2"
      width="95">
         ([AMOUNT] max)
     </text>
     <icon
      height="16"
-     image_name="smicon_warn.tga"
+     image_name="notify_next"
      layout="topleft"
      left="9"
      name="group_over_limit_icon"
@@ -222,14 +214,14 @@
      type="string"
      word_wrap="true"
      font="SansSerifSmall"
-     height="40"
+     height="35"
      layout="topleft"
-     left_pad="5"
+     left_pad="0"
      name="group_over_limit_text"
-     text_color="GroupOverTierColor"
+     text_color="EmphasisColor"
      top_delta="0"
-     width="250">
-        Group members must contribute more land credits to support land in use.
+     width="290">
+        Group members must contribute more land credits to support land in use
     </text>
     <text
      type="string"
@@ -253,128 +245,126 @@
      name="group_money_tab_container"
      tab_position="top"
      tab_height="20"
-     top_pad="10"
-     width="265">
+     top_pad="2"
+     tab_min_width="70"
+     width="300">
         <panel
-         border="true"
+         border="false"
          follows="all"
          height="180"
-         label="Planning"
+         label="PLANNING"
          layout="topleft"
-         left="1"
+         left="0"
          help_topic="group_money_planning_tab"
          name="group_money_planning_tab"
          top="5"
-         width="265">
+         width="300">
             <text_editor
              type="string"
-             bg_readonly_color="0.784314 0.819608 0.8 1"
              follows="all"
-             font="Monospace"
-             height="168"
+             font="SansSerif"
+             height="140"
              layout="topleft"
-             left="8"
+             left="0"
              max_length="4096"
              name="group_money_planning_text"
-             top="5"
-             width="250"
+             top="0"
+             width="300"
              word_wrap="true">
-                Computing...
+                Loading...
             </text_editor>
         </panel>
       <panel
-         border="true"
-         follows="left|top|right|bottom"
+         border="false"
+         follows="all"
          height="180"
-         label="Details"
+         label="DETAILS"
          layout="topleft"
-         left_delta="0"
+         left="0"
          help_topic="group_money_details_tab"
          name="group_money_details_tab"
-         top_delta="0"
-         width="265">
+         top="5"
+         width="300">
           <text_editor
              type="string"
-             bg_readonly_color="0.784314 0.819608 0.8 1"
              follows="all"
-             font="Monospace"
              height="140"
              layout="topleft"
-             left="8"
+             left="0"
              max_length="4096"
              name="group_money_details_text"
-             top="7"
-             width="250"
+             top="0"
+             width="300"
              word_wrap="true">
-                Computing...
+                Loading...
             </text_editor>
-          <button
-             height="20"
-             label="&lt; Earlier"
-             label_selected="&lt; Earlier"
-             layout="topleft"
-             left="5"
-             name="earlier_details_button"
-             tool_tip="Go back in time"
-             top_pad="10"
-             width="125" />
             <button
-             height="20"
-             label="Later &gt;"
-             label_selected="Later &gt;"
-             layout="topleft"
-             left_pad="5"
+	     follows="left|top"
+	     height="23"
+	     image_overlay="Arrow_Left_Off"
+	     layout="topleft"
+	     name="earlier_details_button"
+	     picture_style="true"
+	     tool_tip="Back"
+	     top_pad="3"
+             right="-35"
+	     width="31" />
+             <button
+	     follows="left|top"
+	     height="23"
+	     image_overlay="Arrow_Right_Off"
+	     layout="topleft"
+	     left_pad="10"
              name="later_details_button"
-             tool_tip="Go forward in time"
-             top_delta="0"
-             width="125" />
+	     picture_style="true"
+	     tool_tip="Next"
+	     width="31" />
         </panel>
       <panel
-         border="true"
-         follows="left|top|right|bottom"
+         border="false"
+         follows="all"
          height="180"
-         label="Sales"
+         label="SALES"
          layout="topleft"
          left_delta="0"
          help_topic="group_money_sales_tab"
          name="group_money_sales_tab"
          top_delta="-1"
-         width="265">
+         width="300">
             <text_editor
              type="string"
-             bg_readonly_color="0.784314 0.819608 0.8 1"
              follows="all"
-             font="Monospace"
              height="140"
              layout="topleft"
-             left="8"
+             left="0"
              max_length="4096"
              name="group_money_sales_text"
-             top="7"
-             width="250"
+             top="0"
+             width="300"
              word_wrap="true">
-                Computing...
+                Loading...
             </text_editor>
-            <button
-             height="20"
-             label="&lt; Earlier"
-             label_selected="&lt; Earlier"
-             layout="topleft"
-             left="5"
-             name="earlier_sales_button"
-             tool_tip="Go back in time"
-             top_pad="10"
-             width="125" />
-            <button
-             height="20"
-             label="Later &gt;"
-             label_selected="Later &gt;"
-             layout="topleft"
-             left_pad="5"
+                         <button
+	     follows="left|top"
+	     height="23"
+	     image_overlay="Arrow_Left_Off"
+	     layout="topleft"
+	     name="earlier_sales_button"
+	     picture_style="true"
+	     tool_tip="Back"
+	     top_pad="3"
+             right="-35"
+	     width="31" />
+             <button
+	     follows="left|top"
+	     height="23"
+	     image_overlay="Arrow_Right_Off"
+	     layout="topleft"
+	     left_pad="10"
              name="later_sales_button"
-             tool_tip="Go forward in time"
-             top_delta="0"
-             width="125" />
+	     picture_style="true"
+	     tool_tip="Next"
+	     width="31" />
         </panel>
     </tab_container>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
index ffa485051c7b91c7a68d3e71d81afbe854fdd7f2..5f6b911620f353e88682f98c794247b7147611c2 100644
--- a/indra/newview/skins/default/xui/en/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_list_item.xml
@@ -54,7 +54,6 @@
      left_pad="3"
      right="-31"
      name="info_btn"
-     picture_style="true"
      top_delta="-2"
      width="16" />
    <!--*TODO: Should only appear on rollover-->
@@ -66,7 +65,6 @@
      left_pad="5"
      right="-3"
      name="profile_btn"
-     picture_style="true"
      top_delta="-2"
      width="20" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index d9fb962998246cfac15a5d5cb18205a41e40cc0b..bfb49a60c25247a40a70aa5af50f0ae89360dfa5 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -1,14 +1,13 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
- border="true"
  follows="all"
  height="485"
  label="Notices"
  layout="topleft"
- left="1"
+ left="0"
  name="notices_tab"
- top="485"
- width="280">
+ top="0"
+ width="313">
     <panel.string
      name="help_text">
         Notices are a quick way to communicate across a 
@@ -20,70 +19,48 @@ the General tab.
     </panel.string>
     <panel.string
      name="no_notices_text">
-        There are no past notices.
+        There are no past notices
     </panel.string>
-   <!-- <button
-      follows="left|top"
-     height="16"
-     label="?"
-     label_selected="?"
-     layout="topleft"
-     left="250"
-     name="help_button"
-     top="8"
-     width="20" /> -->
-     <!--<text
-      follows="left|top"
-     type="string"
-     font="SansSerifBig"
-     height="16"
-     layout="topleft"
-     left="10"
-     name="lbl"
-     top_pad="10"
-     width="269">
-        Group Notices Archive
-    </text> -->
     <text
       follows="left|top"
      type="string"
      word_wrap="true"
-     height="40"
+     height="30"
      layout="topleft"
-     left_delta="10"
+     left="10"
      name="lbl2"
-     text_color="EmphasisColor"
-     top_pad="10"
-     width="270">
-        Notices are kept for 14 days. Notice lists are limited to 200 notices per group on a daily basis.
+     top="5"
+     width="300">
+     Notices are kept for 14 days
+Groups are limited to 200 notices/group daily
     </text>
     <scroll_list
       follows="left|top"
      column_padding="0"
      draw_heading="true"
-     heading_height="14"
-     height="109"
+     heading_height="16"
+     height="125"
      layout="topleft"
-     left_delta="0"
+     left="0"
      name="notice_list"
      top_pad="0"
-     width="265">
+     width="303">
         <scroll_list.columns
          label=""
          name="icon"
-         width="16" />
+         width="20" />
         <scroll_list.columns
          label="Subject"
          name="subject"
-         width="100" />
+         width="125" />
         <scroll_list.columns
          label="From"
          name="from"
-         width="83" />
+         width="90" />
         <scroll_list.columns
          label="Date"
          name="date"
-         width="50" />
+         width="30" />
         <scroll_list.columns
          name="sort"
          width="-1" />
@@ -94,39 +71,42 @@ the General tab.
      layout="topleft"
      name="notice_list_none_found"
      visible="false">
-        None found.
+        None found
     </text>
-    <button
-      follows="left|top"
-     height="20"
-     font="SansSerifSmall"
-     label="New Notice"
-     label_selected="Create New Notice"
+         <button
+       follows="bottom|left"
+       height="18"
+       image_selected="AddItem_Press"
+       image_unselected="AddItem_Off"
+       image_disabled="AddItem_Disabled"
+       layout="topleft"
+       label="Create a new notice"
+       left="15"
+       name="create_new_notice"
+       picture_style="true"
+       tool_tip="Create a new notice"
+     top_delta="-5"
+       width="18" />
+     <button
+     follows="top|left"
+     height="22"
+     image_overlay="Refresh_Off"
      layout="topleft"
-     left_delta="0"
-     name="create_new_notice"
-     top_delta="4"
-     width="125" />
-    <button
-      follows="left|top"
-     height="20"
-     font="SansSerifSmall"
-     label="Refresh"
-     label_selected="Refresh List"
-     layout="topleft"
-     left_pad="12"
      name="refresh_notices"
-     top_delta="0"
-     width="125" />
+     picture_style="true"
+     right="-5"
+     top_delta="5"
+     width="23" />
     <panel
      follows="left|top"
-     height="268"
+     height="300"
      label="Create New Notice"
      layout="topleft"
      left="0"
-     name="panel_create_new_notice"
      top_pad="10"
-     width="265">
+     visible="false"
+     name="panel_create_new_notice"
+     width="303">
         <text
          follows="left|top"
          type="string"
@@ -137,30 +117,16 @@ the General tab.
          mouse_opaque="false"
          name="lbl"
          text_color="EmphasisColor"
-         top_pad="0"
-         width="265">
+         top="0"
+         width="200">
             Create a Notice
         </text>
-        <text
-         follows="left|top"
-         type="string"
-         word_wrap="true"
-         height="90"
-         layout="topleft"
-         left_delta="0"
-         name="lbl2"
-         text_color="EmphasisColor"
-         top_pad="4"
-         width="195">
-            You can add a single item to a notice by dragging it from your inventory to this panel. Attached items must be copiable and transferrable, and you can&apos;t send a folder.
-        </text>
         <text
          follows="left|top"
          type="string"
          halign="left"
          height="16"
          layout="topleft"
-         left_delta="0"
          name="lbl3"
          top_pad="10"
          width="60">
@@ -174,8 +140,7 @@ the General tab.
          left_pad="3"
          max_length="63"
          name="create_subject"
-         top_delta="-1"
-         width="200" />
+         width="220" />
         <text
          follows="left|top"
          type="string"
@@ -184,106 +149,100 @@ the General tab.
          layout="topleft"
          left="10"
          name="lbl4"
-         top_pad="10"
+         top_pad="5"
          width="60">
             Message:
         </text>
         <text_editor
-         height="75"
+         height="90"
          layout="topleft"
          left_pad="3"
          max_length="511"
          name="create_message"
          top_delta="0"
-         width="200"
+         width="220"
          word_wrap="true" />
         <text
          follows="left|top"
          type="string"
          halign="left"
-         height="16"
+         height="14"
          layout="topleft"
          left="10"
          name="lbl5"
-         top_pad="10"
-         width="60">
+         width="200">
             Attach:
         </text>
         <line_editor
          enabled="false"
-         height="16"
+         height="19"
          layout="topleft"
-         left_pad="3"
-         max_length="63"
+         max_length="90"
          mouse_opaque="false"
          name="create_inventory_name"
-         top_delta="0"
-         width="200" />
+         top_pad="2"
+         width="285" />
+        <text
+        text_color="EmphasisColor"
+         follows="left|top"
+         type="string"
+         halign="right"
+         height="34"
+         layout="topleft"
+         left="10"
+         name="string"
+         top_pad="15"
+         word_wrap="true"
+         width="150">
+            Drag here to attach something -- >
+        </text>
         <icon
-         height="16"
+         height="72"
+         image_name="DropTarget"
          layout="topleft"
-         left_delta="0"
-         name="create_inv_icon"
-         top_delta="0"
-         width="16" />
+         left_pad="10"
+         mouse_opaque="true"
+         name="drop_icon"
+         top_delta="-10"
+         width="72" />
         <button
          follows="left|top"
-         height="20"
-         font="SansSerifSmall"
-         label="Remove Attachment"
-         label_selected="Remove Attachment"
+         height="23"
+         label="Remove"
          layout="topleft"
-         left="10"
+         left="70"
          name="remove_attachment"
-         top_pad="10"
-         width="135" />
+         top_delta="45"
+         width="90" />
         <button
          follows="left|top"
-         height="20"
-         font="SansSerifSmall"
+         height="23"
          label="Send"
          label_selected="Send Notice"
          layout="topleft"
-         left_delta="138"
+         right="-10"
+         top_pad="20"
          name="send_notice"
-         top_delta="0"
-         width="125" />
-        <panel
-         bevel_style="in"
-         border="true"
-         height="71"
-         layout="topleft"
-         left="200"
-         name="drop_target2"
-         top="20"
-         width="71" />
-        <icon
-         height="59"
-         image_name="icon_groupnoticeinventory.tga"
-         layout="topleft"
-         left_delta="6"
-         mouse_opaque="true"
-         name="drop_icon"
-         top="26"
-         width="59" />
-        <group_drop_target
+         width="100" />
+      <group_drop_target
          height="466"
-         layout="topleft"
+         top="0"
          left="0"
+         layout="topleft"
          name="drop_target"
          tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."
-         top="-198"
-         width="280" />
+         width="295" />
    </panel> 
     <panel
      follows="left|top"
-     height="268"
+     height="300"
      label="View Past Notice"
      layout="topleft"
      left="0"
+     visible="true"
      name="panel_view_past_notice"
-     top="197"
-     width="265">
+     top="180"
+     width="303">
         <text
          type="string"
          font="SansSerifBig"
@@ -304,9 +263,9 @@ the General tab.
          layout="topleft"
          left_delta="0"
          name="lbl2"
-         top_pad="4"
+         top_pad="2"
          width="265">
-            To send a new notice, click the &apos;New Notice&apos; button above.
+            To send a new notice, click the + button
         </text>
         <text
          type="string"
@@ -315,7 +274,7 @@ the General tab.
          layout="topleft"
          left_delta="0"
          name="lbl3"
-         top_pad="24"
+         top_pad="15"
          visible="false"
          width="60">
             Subject:
@@ -346,13 +305,13 @@ the General tab.
         </text>
         <text_editor
          enabled="false"
-         height="150"
+         height="205"
          layout="topleft"
          left="10"
          max_length="511"
          name="view_message"
          top_delta="-35"
-         width="260"
+         width="285"
          word_wrap="true" />
         <line_editor
          enabled="false"
@@ -363,7 +322,7 @@ the General tab.
          mouse_opaque="false"
          name="view_inventory_name"
          top_pad="10"
-         width="260" />
+         width="285" />
         <icon
          height="16"
          layout="topleft"
@@ -373,14 +332,12 @@ the General tab.
          width="16" />
         <button
          follows="left|top"
-         height="20"
-         font="SansSerifSmall"
-         label="Open Attachment"
-         label_selected="Open Attachment"
+         height="23"
+         label="Open attachment"
          layout="topleft"
-         left_delta="0"
+         right="-10"
          name="open_attachment"
-         top_pad="10"
+         top_pad="5"
          width="135" />
         </panel>
-</panel>
\ No newline at end of file
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 909c3f457760fbfb8c6f5e71cee8fab6b9d989db..5ed464bcec8b7cb016ca940aba0100ae43b3b21e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  border="false"
- height="412"
+ height="552"
  label="Members &amp; Roles"
  layout="topleft"
  left="0"
@@ -18,169 +18,28 @@
     </panel.string>
     <panel.string
      name="help_text" />
-    <!--
-    <button
-     follows="left|top"
-     height="16"
-     label="?"
-     layout="topleft"
-     left="250"
-     name="help_button"
-     top="8"
-     width="20" />
-    -->
-    <!--<panel
-     follows="left|top"
-     height="80"
-     layout="topleft"
-     left="10"
-     name="members_header"
-     top_pad="10"
-     width="270">
-        <text
-         type="string"
-         font="SansSerifBig"
-         height="16"
-         layout="topleft"
-         left="0"
-         name="static"
-         top="0"
-         width="270">
-            Members &amp; Roles
-        </text>
-        <text
-         type="string"
-         word_wrap="true"
-         height="40"
-         layout="topleft"
-         left_delta="0"
-         name="static2"
-         top_pad="4"
-         width="270">
-            Group Members are assigned Roles with Abilities. These settings can easily be customized, allowing for greater organization and flexibility.
-        </text>
-    </panel>
-    <panel
-     follows="left|top"
-     height="24"
-     layout="topleft"
-     left_delta="0"
-     name="roles_header"
-     top_delta="0"
-     visible="false"
-     width="270">
-        <text
-         type="string"
-         font="SansSerifBig"
-         height="16"
-         layout="topleft"
-         left="0"
-         name="static"
-         top="0"
-         width="270">
-            Roles
-        </text>
-        <text
-         type="string"
-         word_wrap="true"
-         height="40"
-         layout="topleft"
-         left_delta="0"
-         name="role_properties_modifiable"
-         top_pad="4"
-         visible="false"
-         width="270">
-            Select a Role below.  You can modify its Name, Description and Member Title.
-        </text>
-        <text
-         type="string"
-         word_wrap="true"
-         height="40"
-         layout="topleft"
-         left_delta="0"
-         name="role_properties_not_modifiable"
-         top_delta="0"
-         width="270">
-            Select a Role below to see its properties, Members and allowed Abilities.
-        </text>
-        <text
-         type="string"
-         word_wrap="true"
-         height="16"
-         layout="topleft"
-         left_delta="0"
-         name="role_actions_modifiable"
-         top_delta="24"
-         visible="false"
-         width="270">
-            You can also assign Abilities to the Role.
-        </text>
-        <text
-         type="string"
-         word_wrap="true"
-         height="16"
-         layout="topleft"
-         left_delta="0"
-         name="role_actions_not_modifiable"
-         top_delta="0"
-         width="270">
-            You may view, but not modify, assigned Abilities.
-        </text>
-    </panel>
-    <panel
-     follows="left|top"
-     height="24"
-     layout="topleft"
-     left_delta="0"
-     name="actions_header"
-     top_delta="0"
-     visible="false"
-     width="270">
-        <text
-         type="string"
-         font="SansSerifBig"
-         height="16"
-         layout="topleft"
-         left="0"
-         name="static"
-         top="0"
-         width="270">
-            Abilities
-        </text>
-        <text
-         type="string"
-         word_wrap="true"
-         height="40"
-         layout="topleft"
-         left_delta="0"
-         name="static2"
-         top_pad="4"
-         width="270">
-            You can view an Ability&apos;s Description and which Roles and Members can execute the Ability.
-        </text>
-    </panel> -->
     <tab_container
-    border="true"
+    border="false"
      follows="left|top"
-     height="260"
+     height="245"
      halign="center"
      layout="topleft"
      left="5"
      name="roles_tab_container"
      tab_position="top"
      tab_height="20"
-     top="0"
+     tab_min_width="96"
+     top="3"
      width="303">
         <panel
          border="false"
-         height="260"
-         label="Members"
+         height="220"
+         label="MEMBERS"
          layout="topleft"
-         left="1"
+         left="0"
          help_topic="roles_members_tab"
          name="members_sub_tab"
          tool_tip="Members"
-         top="17"
          class="panel_group_members_subtab"
          width="300">
             <panel.string
@@ -198,8 +57,7 @@ clicking on their names.
          follows="left|top|right"
          max_length="250"
          label="Filter Members"
-         name="filter_input"
-         font="SansSerif" />
+         name="filter_input" />
           <!--  <button
              enabled="false"
              font="SansSerifSmall"
@@ -240,6 +98,7 @@ clicking on their names.
              font="SansSerifSmall"
              label="Invite"
              layout="topleft"
+             left="5"
              name="member_invite"
              top_pad="3"
              width="100" />
@@ -249,8 +108,10 @@ clicking on their names.
              label="Eject"
              layout="topleft"
              left_pad="5"
+             right="-5"
              name="member_eject"
              width="100" />
+             <!--What is this?-->
             <icon
              height="16"
              image_name="Inv_FolderClosed"
@@ -261,15 +122,14 @@ clicking on their names.
         </panel>
         <panel
          border="false"
-         height="164"
-         label="Roles"
+         height="220"
+         label="ROLES"
          layout="topleft"
-         left_delta="0"
+         left="0"
          help_topic="roles_roles_tab"
          name="roles_sub_tab"
          class="panel_group_roles_subtab"
-         top="17"
-         width="265">
+         width="300">
             <panel.string
              name="help_text">
                 Roles have a title and an allowed list of Abilities
@@ -293,40 +153,19 @@ including the Everyone and Owner Roles.
              name="power_partial_icon">
                 checkbox_enabled_false.tga
             </panel.string>
-            <filter_editor
-            layout="topleft"
-            top="10"
-            left="4"
-            width="260"
-            height="20"
-            follows="left|top|right"
-            max_length="250"
-            label="Filter Roles"
-            name="filter_input"
-            font="SansSerif" />
-            <!--<line_editor
-             border_style="line"
-             border_thickness="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             left="4"
-             max_length="63"
-             name="search_text"
-             top="10"
-             width="90" />
-            <button
-             font="SansSerifSmall"
-             height="20"
-             label="Search"
-             layout="topleft"
-             left_pad="5"
-             name="search_button"
-             top_delta="-2"
-             width="80" />
+         <filter_editor
+         layout="topleft"
+         top="10"
+         left="4"
+         width="280"
+         height="20"
+         follows="left|top|right"
+         max_length="250"
+         label="Filter Roles"
+         name="filter_input" />
+            <!--
             <button
              enabled="false"
-             font="SansSerifSmall"
              height="20"
              label="Show All"
              layout="topleft"
@@ -337,11 +176,13 @@ including the Everyone and Owner Roles.
             <scroll_list
              column_padding="0"
              draw_heading="true"
+             draw_stripes="false"
              follows="left|top"
              heading_height="20"
              height="150"
              layout="topleft"
-             left="4"
+             search_column="1"
+             left="0"
              name="role_list"
              top_pad="4"
              width="300">
@@ -363,7 +204,7 @@ including the Everyone and Owner Roles.
              font="SansSerifSmall"
              label="Add Role"
              layout="topleft"
-             left_delta="0"
+             left="5"
              name="role_create"
              top_pad="6"
              width="125" />
@@ -373,20 +214,20 @@ including the Everyone and Owner Roles.
              label="Delete Role"
              layout="topleft"
              left_pad="5"
+             right="-5"
              name="role_delete"
              top_delta="0"
              width="125" />
         </panel>
         <panel
          border="false"
-         height="164"
-         label="Abilities"
+         height="220"
+         label="ABILITIES"
          layout="topleft"
-         left_delta="0"
+         left="0"
          help_topic="roles_actions_tab"
          name="actions_sub_tab"
          class="panel_group_actions_subtab"
-         top="17"
          tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability."
          width="300">
             <panel.string
@@ -394,37 +235,17 @@ including the Everyone and Owner Roles.
                 Abilities allow Members in Roles to do specific
 things in this group. There&apos;s a broad variety of Abilities.
             </panel.string>
-            <filter_editor
-            layout="topleft"
-            top="10"
-            left="4"
-            width="255"
-            height="20"
-            follows="left|top|right"
-            max_length="250"
-            label="Filter Abilities"
-            name="filter_input"
-            font="SansSerif" />
-            <!--<line_editor
-             border_style="line"
-             border_thickness="1"
-             follows="left|top"
-             height="16"
-             layout="topleft"
-             left="4"
-             max_length="63"
-             name="search_text"
-             top="10"
-             width="90" />
-            <button
-             font="SansSerifSmall"
-             height="20"
-             label="Search"
-             layout="topleft"
-             left_pad="5"
-             name="search_button"
-             top_delta="-2"
-             width="80" />
+         <filter_editor
+         layout="topleft"
+         top="10"
+         left="4"
+         width="280"
+         height="20"
+         follows="left|top|right"
+         max_length="250"
+         label="Filter Abilities"
+         name="filter_input" />
+            <!--
             <button
              enabled="false"
              font="SansSerifSmall"
@@ -439,19 +260,19 @@ things in this group. There&apos;s a broad variety of Abilities.
              column_padding="0"
              draw_stripes="false"
              follows="left|top"
-             height="100"
+             height="160"
              layout="topleft"
-             left="6"
+             left="0"
              multi_select="true"
              name="action_list"
              search_column="1"
              tool_tip="Select an Ability to view more details"
              top_pad="6"
-             width="255">
+             width="300">
                 <scroll_list.columns
                  label=""
                  name="icon"
-                 width="18" />
+                 width="16" />
                 <scroll_list.columns
                  label=""
                  name="action"
@@ -459,7 +280,7 @@ things in this group. There&apos;s a broad variety of Abilities.
             </scroll_list>
             <icon
              height="16"
-             image_name="inv_folder_plain_closed.tga"
+             image_name="Inv_FolderClosed"
              layout="topleft"
              name="power_folder_icon"
              visible="false"
@@ -467,105 +288,93 @@ things in this group. There&apos;s a broad variety of Abilities.
         </panel>
     </tab_container>
     <panel
-     height="150"
+     height="252"
      layout="topleft"
      follows="left|top"
      left="10"
      name="members_footer"
-     top_pad="2"
+     top_pad="10"
+     top_delta="0"
      width="300">
         <text
          type="string"
-         font="SansSerif"
          height="16"
          layout="topleft"
          follows="left|top"
          left="0"
          name="static"
-         top_pad="0"
-         width="100">
+         top_pad="5"
+         width="295">
             Assigned Roles
         </text>
-        <text
-         type="string"
-         font="SansSerif"
-         height="16"
-         layout="topleft"
-         follows="left|top"
-         left_pad="35"
-         name="static2"
-         top_delta="0"
-         width="100">
-            Allowed Abilities
-        </text>
         <scroll_list
          draw_stripes="false"
          follows="left|top"
-         height="150"
+         height="80"
          layout="topleft"
          left="0"
          name="member_assigned_roles"
-         top_pad="5"
-         width="130">
+         top_pad="0"
+         width="295">
             <scroll_list.columns
              label=""
              name="checkbox"
-             width="18" />
+             width="30" />
             <scroll_list.columns
              label=""
              name="role"
-             width="107" />
+             width="265" />
         </scroll_list>
-        <scroll_list
-         draw_stripes="false"
-         height="150"
+                 <text
+         type="string"
+         height="16"
          layout="topleft"
          follows="left|top"
-         left_pad="5"
+         left="0"
+         name="static2"
+         top_pad="5"
+         width="295">
+            Allowed Abilities
+        </text>
+         <scroll_list
+         draw_stripes="false"
+         height="80"
+         layout="topleft"
+         left="0"
          name="member_allowed_actions"
+         search_column="2"
          tool_tip="For details of each allowed ability see the abilities tab"
-         top_delta="0"
-         width="130">
+         top_pad="0"
+         width="295">
             <scroll_list.columns
              label=""
              name="icon"
-             width="14" />
+             width="20" />
             <scroll_list.columns
              label=""
              name="action"
-             width="126" />
+             width="275" />
         </scroll_list>
     </panel>
     <panel
-     height="252"
+     height="297"
      layout="topleft"
-     left_delta="0"
+     left="10"
      name="roles_footer"
      top_delta="0"
+     top="245"
      visible="false"
-     width="270">
+     width="300">
         <text
          type="string"
-         font="SansSerif"
          height="16"
          layout="topleft"
          left="0"
          name="static"
          top="0"
-         width="100">
+         width="140">
             Name
         </text>
-        <text
-         type="string"
-         font="SansSerif"
-         height="16"
-         layout="topleft"
-         left_pad="35"
-         name="static2"
-         top_delta="0"
-         width="100">
-            Description
-        </text>
         <line_editor
          type="string"
          border_style="line"
@@ -574,21 +383,19 @@ things in this group. There&apos;s a broad variety of Abilities.
          height="20"
          layout="topleft"
          left="0"
-         max_length="20"
+         max_length="295"
          name="role_name"
          top_pad="0"
-         width="130">
+         width="295">
             Employees
         </line_editor>
         <text
          type="string"
-         font="SansSerif"
          height="16"
          layout="topleft"
-         left_delta="0"
          name="static3"
-         top_pad="10"
-         width="100">
+         top_pad="5"
+         width="295">
             Title
         </text>
         <line_editor
@@ -598,158 +405,159 @@ things in this group. There&apos;s a broad variety of Abilities.
          follows="left|top"
          height="20"
          layout="topleft"
-         left_delta="0"
-         max_length="20"
+         max_length="295"
          name="role_title"
          top_pad="0"
-         width="130">
-            (waiting)
+         width="295">
+          (waiting)
         </line_editor>
+                <text
+         type="string"
+         height="16"
+         layout="topleft"
+         left="0"
+         name="static2"
+         top_pad="5"
+         width="100">
+            Description
+        </text>
         <text_editor
          type="string"
          halign="left"
-         height="48"
+         height="35"
          layout="topleft"
-         left="135"
-         max_length="254"
+         left="0"
+         max_length="295"
          name="role_description"
-         top="16"
-         width="130"
+         top_pad="0"
+         width="295"
          word_wrap="true">
-            (waiting)
+          (waiting)
         </text_editor>
         <text
          type="string"
-         font="SansSerif"
          height="16"
          layout="topleft"
+         follows="left|top"
          left="0"
-         name="static4"
-         top="85"
-         width="120">
-            Assigned Members
-        </text>
-        <text
-         type="string"
-         font="SansSerif"
-         height="16"
-         layout="topleft"
-         left_pad="15"
-         name="static5"
-         tool_tip="A list of abilities the currently selected role can perform"
-         top_delta="0"
-         width="100">
-            Allowed Abilities
+         name="static"
+         top_pad="5"
+         width="295">
+            Assigned Roles
         </text>
         <name_list
          draw_stripes="false"
-         height="150"
+         height="50"
          layout="topleft"
          left="0"
          name="role_assigned_members"
          top_pad="0"
-         width="130" />
+         width="295" />
         <check_box
-         height="16"
-         label="Members are visible"
+         height="15"
+         label="Reveal members"
          layout="topleft"
-         left_delta="0"
          name="role_visible_in_list"
          tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."
-         top_pad="10"
-         width="130" />
+         top_pad="3"
+         width="290" />
+         <text
+         type="string"
+         height="16"
+         layout="topleft"
+         follows="left|top"
+         left="0"
+         name="static2"
+         top_pad="5"
+         width="295">
+            Allowed Abilities
+        </text>
         <scroll_list
          draw_stripes="false"
-         height="150"
+         height="50"
          layout="topleft"
-         left="135"
+         left="0"
          name="role_allowed_actions"
          search_column="2"
          tool_tip="For details of each allowed ability see the abilities tab"
-         top="101"
-         width="130">
+         top_pad="0"
+         width="295">
             <scroll_list.columns
              label=""
              name="icon"
-             width="2" />
+             width="20" />
             <scroll_list.columns
              label=""
              name="checkbox"
-             width="16" />
+             width="20" />
             <scroll_list.columns
              label=""
              name="action"
-             width="220" />
+             width="250" />
         </scroll_list>
     </panel>
    <panel
-     height="215"
+     height="303"
      layout="topleft"
-     left_delta="0"
+     left="10"
      name="actions_footer"
      top_delta="0"
+     top="245"
      visible="false"
-     width="265">
+     width="300">
         <text
          type="string"
-         font="SansSerif"
          height="16"
          layout="topleft"
-         left="0"
          name="static"
-         top="0"
          width="200">
-            Description
+            Ability description
         </text>
         <text_editor
          type="string"
          enabled="false"
          halign="left"
-         height="48"
+         height="80"
          layout="topleft"
          left_delta="0"
          max_length="512"
          name="action_description"
          top_pad="0"
-         width="265"
+         width="295"
          word_wrap="true">
             This Ability is &apos;Eject Members from this Group&apos;. Only an Owner can eject another Owner.
         </text_editor>
         <text
          type="string"
-         font="SansSerif"
          height="16"
          layout="topleft"
          left_delta="0"
          name="static2"
-         top_pad="10"
-         width="125">
-            Roles with Ability
+         top_pad="5"
+         width="295">
+            Roles with this ability
         </text>
-        <text
+        <scroll_list
+         height="60"
+         layout="topleft"
+         left="0"
+         name="action_roles"
+         top_pad="0"
+         width="295" />
+                 <text
          type="string"
-         font="SansSerif"
          height="16"
          layout="topleft"
-         left_pad="10"
          name="static3"
-         top_delta="0"
-         width="125">
-            Members with Ability
+         top_pad="5"
+         width="295">
+            Members with this ability
         </text>
-        <scroll_list
-         height="150"
-         layout="topleft"
-         left="0"
-         name="action_roles"
-         top="90"
-         width="130" />
         <name_list
-         height="150"
+         height="100"
          layout="topleft"
-         left_pad="5"
          name="action_members"
-         top_delta="0"
-         width="130" />
+         top_pad="0"
+         width="295" />
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index c4cdaa41f970cf401e376ee43599a558c21d3500..0dd387842631677b7af9090edc501c16b2a766c9 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -1,30 +1,35 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel name="panel_im_control_panel"
-       width="125"
-       height="248"
+       width="128"
+       height="327"
        border="false">
 
   <avatar_icon name="avatar_icon"
-               width="96"
-               height="96" />
+               follows="left|top"
+               left_delta="3"
+               width="125"
+               height="125" />
 
   <button name="view_profile_btn"
+          follows="left|bottom"
           label="View Profile"
-          left_delta="3"
           width="125"
 		  height="20" />
 
   <button name="add_friend_btn"
+          follows="left|bottom"
           label="Add Friend"
           width="125"
           height="20" />
 
   <button name="call_btn"
+          follows="left|bottom"
           label="Call"
           width="125"
           height="20" />
 
     <button
+     follows="left|bottom"
      height="20"
      label="End Call"
      name="end_call_btn"
@@ -33,15 +38,27 @@
 
   <button
 	 enabled="false"
+     follows="left|bottom"
      name="voice_ctrls_btn"
      label="Open Voice Controls"
      width="125"
      height="20"
      visible="false"/>
 
+  <button name="teleport_btn"
+          follows="left|bottom"
+          label="Teleport"
+          width="125"
+          height="20" />
   <button name="share_btn"
+          follows="left|bottom"
           label="Share"
           width="125"
           height="20" />
+  <button name="pay_btn"
+          follows="left|bottom"
+          label="Pay"
+          width="125"
+          height="20" />
 
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..03ba7f7c81f9f3352a1fa59f4a88c2a9b830287c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -0,0 +1,257 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="landmark_info"
+ top="20"
+ width="330">
+    <string
+     name="title_create_landmark"
+     value="Create Landmark" />
+    <string
+     name="title_edit_landmark"
+     value="Edit Landmark" />
+    <string
+     name="title_landmark"
+     value="Landmark" />
+    <string
+     name="not_available"
+     value="(N\A)" />
+    <string
+     name="unknown"
+     value="(unknown)" />
+    <string
+     name="public"
+     value="(public)" />
+    <string
+     name="server_update_text">
+        Place information not available without server update.
+    </string>
+    <string
+     name="server_error_text">
+        Information about this location is unavailable at this time, please try again later.
+    </string>
+    <string
+     name="server_forbidden_text">
+        Information about this location is unavailable due to access restrictions.  Please check your permissions with the parcel owner.
+    </string>
+    <string
+     name="acquired_date">
+        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+    </string>
+    <button
+     follows="top|right"
+     height="23"
+     image_overlay="BackArrow_Off"
+     layout="topleft"
+     left="10"
+     name="back_btn"
+     picture_style="true"
+     tab_stop="false"
+     top="0"
+     width="23" />
+    <text
+     follows="top|left|right"
+     font="SansSerifHugeBold"
+     height="26"
+     layout="topleft"
+     left_pad="10"
+     name="title"
+     text_color="white"
+     top="0"
+     use_ellipses="true"
+     value="Place Profile"
+     width="275" />
+    <scroll_container
+     color="DkGray2"
+     follows="all"
+     height="533"
+     layout="topleft"
+     left="10"
+     name="place_scroll"
+     opaque="true"
+     top_pad="5"
+     width="313">
+        <panel
+         bg_alpha_color="DkGray2"
+         follows="all"
+         height="533"
+         layout="topleft"
+         left="0"
+         min_height="300"
+         name="scrolling_panel"
+         top="0"
+         width="313">
+            <texture_picker
+             enabled="false"
+             follows="top|left"
+             height="190"
+             layout="topleft"
+             left="10"
+             name="logo"
+             top="10"
+             width="290" />
+            <text
+             follows="left|top|right"
+             font="SansSerifLarge"
+             height="14"
+             layout="topleft"
+             left="10"
+             name="region_title"
+             text_color="white"
+             top_pad="5"
+             use_ellipses="true"
+             value="SampleRegion"
+             width="290" />
+            <text
+             follows="left|top|right"
+             height="14"
+             layout="topleft"
+             left="10"
+             name="parcel_title"
+             top_pad="4"
+             use_ellipses="true"
+             value="SampleParcel, Name Long (145, 228, 26)"
+             width="285" />
+            <expandable_text
+             follows="left|top|right"
+             height="50"
+             layout="topleft"
+             left="5"
+             name="description"
+             top_pad="10"
+             value="Du waltz die spritz"
+             width="300" />
+            <panel
+             follows="left|top|right"
+             height="55"
+             layout="topleft"
+             left="10"
+             name="landmark_info_panel"
+             top_pad="10"
+             width="290">
+                <text
+                 follows="left|top"
+                 height="15"
+                 layout="topleft"
+                 left="0"
+                 name="owner_label"
+                 top_pad="10"
+                 value="Owner:"
+                 width="90" />
+                <text
+                 follows="left|top|right"
+                 height="15"
+                 layout="topleft"
+                 left="70"
+                 name="owner"
+                 top_delta="0"
+                 width="200" />
+                <text
+                 follows="left|top"
+                 height="15"
+                 layout="topleft"
+                 left="0"
+                 name="creator_label"
+                 value="Creator:"
+                 width="90" />
+                <text
+                 follows="left|top|right"
+                 height="15"
+                 layout="topleft"
+                 left="70"
+                 name="creator"
+                 top_delta="0"
+                 width="200" />
+                <text
+                 follows="left|top"
+                 height="15"
+                 layout="topleft"
+                 left="0"
+                 name="created_label"
+                 value="Created:"
+                 width="50" />
+                <text
+                 follows="left|top|right"
+                 height="15"
+                 layout="topleft"
+                 left="70"
+                 name="created"
+                 top_delta="0"
+                 width="200" />
+            </panel>
+            <panel
+             follows="left|top|right"
+             height="210"
+             layout="topleft"
+             left="10"
+             name="landmark_edit_panel"
+             width="290">
+                <text
+                 follows="left|top"
+                 height="15"
+                 layout="topleft"
+                 left="0"
+                 name="title_label"
+                 top_pad="10"
+                 value="Title:"
+                 width="290" />
+                <line_editor
+                 background_image_disabled="task_panel_background.png"
+                 follows="left|top|right"
+                 height="22"
+                 layout="topleft"
+                 left="0"
+                 max_length="63"
+                 name="title_editor"
+                 prevalidate_callback="ascii"
+                 text_readonly_color="white"
+                 top_pad="5"
+                 width="290" />
+                <text
+                 follows="left|top"
+                 height="15"
+                 layout="topleft"
+                 left="0"
+                 name="notes_label"
+                 top_pad="10"
+                 value="My notes:"
+                 width="290" />
+                <text_editor
+                 bg_readonly_color="DkGray2"
+                 follows="all"
+                 height="70"
+                 layout="topleft"
+                 left="0"
+                 max_length="127"
+                 name="notes_editor"
+                 read_only="true"
+                 text_readonly_color="white"
+                 top_pad="5"
+                 width="290"
+                 wrap="true" />
+                <text
+                 follows="left|top"
+                 height="15"
+                 layout="topleft"
+                 left="0"
+                 name="folder_label"
+                 top_pad="15"
+                 value="Landmark location:"
+                 width="290" />
+                <combo_box
+                 follows="bottom|left|right"
+                 height="20"
+                 layout="topleft"
+                 left="0"
+                 name="folder_combo"
+                 top_pad="5"
+                 width="200" />
+            </panel>
+        </panel>
+    </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 5293043ba7df9d8ed2ed156d076f7e5e44ed28d0..f05684db10700adbcbf8a3178b153128fc4ad8c1 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -31,7 +31,7 @@
              left="0"
              mouse_opaque="true"
              name="favorites_list"
-             start_folder="favorite"
+             start_folder="Favorite"
              width="380"/>
         </accordion_tab>
         <accordion_tab
@@ -47,7 +47,7 @@
              left="0"
              mouse_opaque="true"
              name="landmarks_list"
-             start_folder="landmark"
+             start_folder="Landmarks"
              width="380"/>
         </accordion_tab>
         <accordion_tab
@@ -63,13 +63,13 @@
              left="0"
              mouse_opaque="true"
              name="my_inventory_list"
-             start_folder="inventory"
+             start_folder="INVENTORY"
              width="380"/>
-        </accordion_tab>
-        <accordion_tab
-         layout="topleft"
-         name="tab_library"
-         title="Library">
+          </accordion_tab>
+          <accordion_tab
+           layout="topleft"
+           name="tab_library"
+           title="Library">
             <inventory_subtree_panel
              allow_multi_select="true"
              border="true"
@@ -79,7 +79,7 @@
              left="0"
              mouse_opaque="true"
              name="library_list"
-             start_folder="library"
+             start_folder="LIBRARY"
              width="380"/>
         </accordion_tab>
     </accordion>
@@ -103,7 +103,6 @@
          layout="topleft"
          left="10"
          name="options_gear_btn"
-         picture_style="true"
          top="6"
          width="18" />
         <button
@@ -115,7 +114,6 @@
          layout="topleft"
          left_pad="5"
          name="add_btn"
-         picture_style="true"
          tool_tip="Add new landmark"
          width="18" />
         <dnd_button
@@ -126,7 +124,6 @@
          layout="topleft"
          right="-5"
          name="trash_btn"
-         picture_style="true"
          tool_tip="Remove selected landmark"
          top="6"
          width="18" />
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index afe00271f7ccb3e21bc5c7fc7d45272d6d1a1ae9..1646cba0a730b4cba09f85fdb3f02cc12e154ad8 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -15,27 +15,34 @@
      name="real_url">
         http://secondlife.com/app/login/
     </panel.string>
+    <string name="reg_in_client_url">
+      http://secondlife.eniac15.lindenlab.com/reg-in-client/
+    </string>
     <panel.string
      name="forgot_password_url">
         http://secondlife.com/account/request.php
     </panel.string>
+  <!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp -->
     <web_browser
      border_visible="false"
      bottom="600"
      follows="all"
-     layout="topleft"
      left="0"
      name="login_html"
-     right="-1"
      start_url=""
-     top="1" />
+     top="0"
+     height="600"
+     width="800"/>
+    <panel
+     follows="left|bottom|right"
+     name="login_widgets"
+     layout="topleft"
+     left="0"
+     top="0">
     <text
-     type="string"
-     length="1"
      follows="left|bottom"
      font="SansSerif"
      height="16"
-     layout="topleft"
      left="32"
      name="first_name_text"
      top="530"
@@ -46,7 +53,6 @@
      follows="left|bottom"
      handle_edit_keys_directly="true"
      height="20"
-     layout="topleft"
      left_delta="0"
      max_length="31"
      name="first_name_edit"
@@ -55,12 +61,9 @@
      top_pad="2"
      width="120" />
     <text
-     type="string"
-     length="1"
      follows="left|bottom"
      font="SansSerif"
      height="16"
-     layout="topleft"
      left="164"
      name="last_name_text"
      top="530"
@@ -72,7 +75,6 @@
      font="SansSerif"
      handle_edit_keys_directly="true"
      height="20"
-     layout="topleft"
      left_delta="0"
      max_length="31"
      name="last_name_edit"
@@ -81,12 +83,9 @@
      top_pad="2"
      width="120" />
     <text
-     type="string"
-     length="1"
      follows="left|bottom"
      font="SansSerif"
      height="16"
-     layout="topleft"
      left="296"
      name="password_text"
      top="530"
@@ -98,7 +97,6 @@
      font="SansSerif"
      handle_edit_keys_directly="true"
      height="20"
-     layout="topleft"
      left_delta="0"
      max_length="16"
      name="password_edit"
@@ -124,12 +122,9 @@
      name="server_combo"
      width="100" />
     <text
-     type="string"
-     length="1"
      follows="left|bottom"
      font="SansSerif"
      height="16"
-     layout="topleft"
      left="32"
      name="start_location_text"
      top="576"
@@ -141,7 +136,6 @@
      control_name="LoginLocation"
      follows="left|bottom"
      height="23"
-     layout="topleft"
      left_pad="0"
      max_chars="128"
      name="start_location_combo"
@@ -165,20 +159,14 @@
      follows="left|bottom"
      height="16"
      label="Remember password"
-     layout="topleft"
      left_pad="10"
      name="remember_check"
      top_delta="3"
      width="138" />
     <text
-     type="string"
-     length="1"
      follows="right|bottom"
      halign="right"
      height="16"
-     hover="true"
-     hover_color="0.2 0.45 0.72 1"
-     layout="topleft"
      left="-210"
      name="create_new_account_text"
      top="539"
@@ -186,14 +174,9 @@
         Create a new account
     </text>
     <text
-     type="string"
-     length="1"
      follows="right|bottom"
      halign="right"
      height="16"
-     hover="true"
-     hover_color="0.2 0.45 0.72 1"
-     layout="topleft"
      left_delta="0"
      name="forgot_password_text"
      top_pad="4"
@@ -201,18 +184,14 @@
         Forgot your name or password?
     </text>
     <text
-     type="string"
-     length="1"
      follows="right|bottom"
      halign="right"
      height="16"
-     hover="true"
-     hover_color="0.2 0.45 0.72 1"
-     layout="topleft"
      left="-310"
      name="channel_text"
      top="579"
      width="300">
         [VERSION]
     </text>
+  </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9a3fdcc327b103750fc94a687ea8650ef829a116
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="400"
+ label="Things"
+ layout="topleft"
+ min_height="350"
+ min_width="240"
+ name="inventory panel"
+ width="330">
+    <panel.string
+     name="Title">
+        Things
+    </panel.string>
+    <filter_editor
+     text_pad_left="12"
+     follows="left|top|right"
+	 font="SanSerif"
+     height="20"
+     label="Filter"
+     layout="topleft"
+     left="15"
+     name="inventory search editor"
+     top="34"
+     width="300" />
+    <tab_container
+     follows="left|top|right|bottom"
+     height="300"
+     layout="topleft"
+     left_delta="-4"
+     name="inventory filter tabs"
+     tab_position="top"
+     top_pad="4"
+     width="305">
+        <inventory_panel
+         follows="left|top|right|bottom"
+         height="295"
+         label="All Items"
+         layout="topleft"
+         left="1"
+         name="All Items"
+         top="16"
+         width="290" />
+        <inventory_panel
+         follows="left|top|right|bottom"
+         height="295"
+         label="Recent Items"
+         layout="topleft"
+         left_delta="0"
+         name="Recent Items"
+         top_delta="0"
+         width="290" />
+    </tab_container>
+    <menu_bar
+     bg_visible="false"
+     follows="left|top|right"
+     height="18"
+     layout="topleft"
+     left_delta="0"
+     mouse_opaque="false"
+     name="Inventory Menu"
+     top_delta="-45"
+     width="290">
+        <menu
+         height="101"
+         label="File"
+         layout="topleft"
+         left="0"
+         mouse_opaque="false"
+         name="File"
+         tear_off="true"
+         top="-117"
+         width="128">
+            <menu_item_call
+             label="Open"
+             layout="topleft"
+             name="Open">
+                <menu_item_call.on_click
+                 function="Inventory.DoToSelected"
+                 parameter="open" />
+            </menu_item_call>
+            <menu
+             create_jump_keys="true"
+             label="Upload"
+             layout="topleft"
+             name="upload"
+             tear_off="true">
+                <menu_item_call
+                 label="Image (L$[COST])..."
+                 layout="topleft"
+                 name="Upload Image"
+                 shortcut="control|U">
+                    <menu_item_call.on_click
+                     function="File.UploadImage"
+                     parameter="" />
+                    <menu_item_call.on_enable
+                     function="File.EnableUpload" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Sound (L$[COST])..."
+                 layout="topleft"
+                 name="Upload Sound">
+                    <menu_item_call.on_click
+                     function="File.UploadSound"
+                     parameter="" />
+                    <menu_item_call.on_enable
+                     function="File.EnableUpload" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Animation (L$[COST])..."
+                 layout="topleft"
+                 name="Upload Animation">
+                    <menu_item_call.on_click
+                     function="File.UploadAnim"
+                     parameter="" />
+                    <menu_item_call.on_enable
+                     function="File.EnableUpload" />
+                </menu_item_call>
+                <menu_item_call
+                 label="Bulk (L$[COST] per file)..."
+                 layout="topleft"
+                 name="Bulk Upload">
+                    <menu_item_call.on_click
+                     function="File.UploadBulk"
+                     parameter="" />
+                </menu_item_call>
+                <menu_item_separator
+                 layout="topleft" />
+            </menu>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_call
+             label="New Window"
+             layout="topleft"
+             name="New Window">
+                <menu_item_call.on_click
+                 function="Inventory.NewWindow" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft"
+             name="separator2" />
+            <menu_item_call
+             label="Show Filters"
+             layout="topleft"
+             name="Show Filters">
+                <menu_item_call.on_click
+                 function="Inventory.ShowFilters" />
+            </menu_item_call>
+            <menu_item_call
+             label="Reset Filters"
+             layout="topleft"
+             name="Reset Current">
+                <menu_item_call.on_click
+                 function="Inventory.ResetFilter" />
+            </menu_item_call>
+            <menu_item_call
+             label="Close All Folders"
+             layout="topleft"
+             name="Close All Folders">
+                <menu_item_call.on_click
+                 function="Inventory.CloseAllFolders" />
+            </menu_item_call>
+            <menu_item_separator
+             layout="topleft"
+             name="separator3" />
+            <menu_item_call
+             label="Empty Trash"
+             layout="topleft"
+             name="Empty Trash">
+                <menu_item_call.on_click
+                 function="Inventory.EmptyTrash" />
+            </menu_item_call>
+            <menu_item_call
+             label="Empty Lost And Found"
+             layout="topleft"
+             name="Empty Lost And Found">
+                <menu_item_call.on_click
+                 function="Inventory.EmptyLostAndFound" />
+            </menu_item_call>
+        </menu>
+        <menu
+         height="121"
+         label="Create"
+         layout="topleft"
+         left="0"
+         mouse_opaque="false"
+         name="Create"
+         tear_off="true"
+         top="-201"
+         width="121">
+            <menu_item_call
+             label="New Folder"
+             layout="topleft"
+             name="New Folder">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="category" />
+            </menu_item_call>
+            <menu_item_call
+             label="New Script"
+             layout="topleft"
+             name="New Script">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="lsl" />
+            </menu_item_call>
+            <menu_item_call
+             label="New Note"
+             layout="topleft"
+             name="New Note">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="notecard" />
+            </menu_item_call>
+            <menu_item_call
+             label="New Gesture"
+             layout="topleft"
+             name="New Gesture">
+                <menu_item_call.on_click
+                 function="Inventory.DoCreate"
+                 parameter="gesture" />
+            </menu_item_call>
+            <menu
+             height="175"
+             label="New Clothes"
+             layout="topleft"
+             left_delta="0"
+             mouse_opaque="false"
+             name="New Clothes"
+             top_pad="514"
+             width="125">
+                <menu_item_call
+                 label="New Shirt"
+                 layout="topleft"
+                 name="New Shirt">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="shirt" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Pants"
+                 layout="topleft"
+                 name="New Pants">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="pants" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Shoes"
+                 layout="topleft"
+                 name="New Shoes">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="shoes" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Socks"
+                 layout="topleft"
+                 name="New Socks">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="socks" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Jacket"
+                 layout="topleft"
+                 name="New Jacket">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="jacket" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Skirt"
+                 layout="topleft"
+                 name="New Skirt">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="skirt" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Gloves"
+                 layout="topleft"
+                 name="New Gloves">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="gloves" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Undershirt"
+                 layout="topleft"
+                 name="New Undershirt">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="undershirt" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Underpants"
+                 layout="topleft"
+                 name="New Underpants">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="underpants" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Alpha"
+                 layout="topleft"
+                 name="New Alpha">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="alpha" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Tattoo"
+                 layout="topleft"
+                 name="New Tattoo">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="tattoo" />
+                </menu_item_call>
+            </menu>
+            <menu
+             height="85"
+             label="New Body Parts"
+             layout="topleft"
+             left_delta="0"
+             mouse_opaque="false"
+             name="New Body Parts"
+             top_pad="514"
+             width="118">
+                <menu_item_call
+                 label="New Shape"
+                 layout="topleft"
+                 name="New Shape">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="shape" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Skin"
+                 layout="topleft"
+                 name="New Skin">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="skin" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Hair"
+                 layout="topleft"
+                 name="New Hair">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="hair" />
+                </menu_item_call>
+                <menu_item_call
+                 label="New Eyes"
+                 layout="topleft"
+                 name="New Eyes">
+                    <menu_item_call.on_click
+                     function="Inventory.DoCreate"
+                     parameter="eyes" />
+                </menu_item_call>
+            </menu>
+        </menu>
+        <menu
+         height="49"
+         label="Sort"
+         layout="topleft"
+         left="0"
+         mouse_opaque="false"
+         name="Sort"
+         tear_off="true"
+         top="-113"
+         width="118">
+            <menu_item_check
+             control_name="Inventory.SortByName"
+             label="By Name"
+             layout="topleft"
+             name="By Name">
+                <menu_item_check.on_click
+                 function="Inventory.SetSortBy"
+                 parameter="name" />
+            </menu_item_check>
+            <menu_item_check
+             control_name="Inventory.SortByDate"
+             label="By Date"
+             layout="topleft"
+             name="By Date">
+                <menu_item_check.on_click
+                 function="Inventory.SetSortBy"
+                 parameter="date" />
+            </menu_item_check>
+            <menu_item_separator
+             layout="topleft" />
+            <menu_item_check
+             control_name="Inventory.FoldersAlwaysByName"
+             label="Folders Always By Name"
+             layout="topleft"
+             name="Folders Always By Name">
+                <menu_item_check.on_click
+                 function="Inventory.SetSortBy"
+                 parameter="foldersalwaysbyname" />
+            </menu_item_check>
+            <menu_item_check
+             control_name="Inventory.SystemFoldersToTop"
+             label="System Folders To Top"
+             layout="topleft"
+             name="System Folders To Top">
+                <menu_item_check.on_click
+                 function="Inventory.SetSortBy"
+                 parameter="systemfolderstotop" />
+            </menu_item_check>
+        </menu>
+    </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index 4175d21639b500c7b273fef43835dc571f550b75..ddfa6e72a3912198e05bfe32e76a4c6896d5a520 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -51,7 +51,6 @@
 	     layout="topleft"
 	     left="10"
 	     name="back_btn"
-	     picture_style="true"
 	     tool_tip="Go back to previous location"
 	     top="3"
 	     width="31" />
@@ -69,7 +68,6 @@
 	     layout="topleft"
 	     left_pad="0"
 	     name="forward_btn"
-	     picture_style="true"
 	     tool_tip="Go forward one location"
 	     top_delta="0"
 	     width="31" />
@@ -86,7 +84,6 @@
 	     layout="topleft"
 	     left_pad="7"
 	     name="home_btn"
-	     picture_style="true"
 	     tool_tip="Teleport to my home location"
 	     top_delta="0"
 	     width="32" />
@@ -127,7 +124,6 @@
 	<!--      left_pad="5" -->
 	<!--      mouse_opaque="false" -->
 	<!--      name="search_bg" -->
-	<!--      picture_style="true" -->
 	<!--      top_delta="0" -->
 	<!--      width="168" /> -->
 
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 2182163da5bd88dd2826d379028751758cfed9f3..555fedb1ffbbd8cb2d76e2b82899a7b2eb3c01ec 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -42,13 +42,17 @@
      width="20" />
     <button
      follows="right"
+     is_toggle="true"
      width="45"
      top="0"
      layout="topleft"
      left_pad="8"
      label="Log"
      height="23"
+     name="show_nearby_chat"
      tool_tip="Show/hide nearby chat log">
-    <button.commit_callback function="Floater.Toggle" parameter="nearby_chat"/>
+        <button.init_callback
+           function="Button.SetDockableFloaterToggle"
+           parameter="nearby_chat" />
     </button>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml
index c67ae4167732f54afb73d669672bffe75593feac..7b6c0f33da8586e89166774c641bad99972fabb6 100644
--- a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml
+++ b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml
@@ -71,7 +71,6 @@
      layout="topleft"
      left_delta="0"
      name="header"
-     picture_style="true"
      top_delta="-20"
      width="100" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index e234a7b358ebbfd9a0d38a14516a10f23f5d4cc0..c8194a286b80fc36ed3e0bcab0372ad5f9dbc1df 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -95,7 +95,6 @@ background_visible="true"
              layout="topleft"
              left="10"
              name="nearby_view_sort_btn"
-             picture_style="true"
              top="5"
              width="18" />
              <button
@@ -107,7 +106,6 @@ background_visible="true"
                  layout="topleft"
                  left_pad="5"
                  name="add_friend_btn"
-                 picture_style="true"
                  top_delta="0"
                  tool_tip="Add selected resident to your friends List"
                  width="18" />
@@ -183,7 +181,6 @@ background_visible="true"
                layout="topleft"
                left="10"
                name="friends_viewsort_btn"
-               picture_style="true"
                top="5"
                width="18" />
                 <button
@@ -195,7 +192,6 @@ background_visible="true"
                  layout="topleft"
                  left_pad="5"
                  name="add_btn"
-                 picture_style="true"
                  tool_tip="Offer friendship to a resident"
                  top_delta="0"
                  width="18" />
@@ -209,7 +205,6 @@ background_visible="true"
                  left_pad="10"
                  right="-10"
                  name="del_btn"
-                 picture_style="true"
                  tool_tip="Remove selected person from your Friends list"
                  top_delta="0"
                  width="18" />
@@ -252,7 +247,6 @@ background_visible="true"
                layout="topleft"
                left="10"
                name="groups_viewsort_btn"
-               picture_style="true"
                top="7"
                width="18" />
                 <button
@@ -264,7 +258,6 @@ background_visible="true"
                  layout="topleft"
                  left_pad="5"
                  name="plus_btn"
-                 picture_style="true"
                  tool_tip="Join group/Create new group"
                  top_delta="0"
                  width="18" />
@@ -277,7 +270,6 @@ background_visible="true"
                  layout="topleft"
                  left_pad="24"
                  name="activate_btn"
-                 picture_style="true"
                  tool_tip="Activate selected group"
                  top_delta="5"
                  width="10" />
@@ -290,7 +282,6 @@ background_visible="true"
                 left_pad="10"
                  right="-10"
                  name="minus_btn"
-                 picture_style="true"
                  tool_tip="Leave selected group"
                  top_delta="-5"
                  width="18" />
@@ -336,7 +327,6 @@ background_visible="true"
                layout="topleft"
                left="10"
                name="recent_viewsort_btn"
-               picture_style="true"
                top="7"
                width="18" />
               <button
@@ -348,7 +338,6 @@ background_visible="true"
                  layout="topleft"
                  left_pad="5"
                  name="add_friend_btn"
-                 picture_style="true"
                  top_delta="0"
                  tool_tip="Add selected resident to your friends List"
                  width="18" />
diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml
index a67ae59b4a40bf7df50eadca4d586e0476980f7c..cf18aa2d393746bc90feb0f25e441cc208885669 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -15,7 +15,6 @@
      image_overlay="BackArrow_Off"
      layout="topleft"
      name="back_btn"
-     picture_style="true"
      left="10"
      tab_stop="false"
      top="2"
@@ -30,7 +29,7 @@
      text_color="white"
      top="0"
      value="Pick Info"
-     use_elipsis="true"
+     use_ellipses="true"
      width="275" />
     <scroll_container
      color="DkGray2"
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
index 38ea6b6196e4665a30e78bd22f13890d41385782..7ff227ecb608a6aafe388ad98b7d9d279267e553 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -75,7 +75,6 @@
      image_unselected="BuyArrow_Press"
      layout="topleft"
      name="info_chevron"
-     picture_style="true"
      right="-7"
      tab_stop="false"
      top="27"
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index cbe1f11e3d7e90a7d1b6d7d5d5c2e0bec6101e39..ae61852f68d256d7045be78e02bf50ca6943ae29 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -41,7 +41,6 @@
              layout="topleft"
              left="0"
              name="gear_menu_btn"
-             picture_style="true"
              top="5"
              width="18" />
             <button
@@ -53,7 +52,6 @@
              layout="topleft"
              left_pad="15"
              name="new_btn"
-             picture_style="true"
              tool_tip="Create new pick at current location"
              top="5"
              width="18" />
@@ -65,7 +63,6 @@
              image_unselected="TrashItem_Off"
              layout="topleft"
              name="trash_btn"
-             picture_style="true"
              right="-10"
              top="5"
              width="18" />
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7e073f064d76646390b3f0a9c11df6c2f99390a6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -0,0 +1,979 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="place_profile"
+ top="20"
+ width="330">
+    <string
+     name="on"
+     value="On" />
+    <string
+     name="off"
+     value="Off" />
+    <string
+     name="anyone"
+     value="Anyone" />
+    <string
+     name="available"
+     value="available" />
+    <string
+     name="allocated"
+     value="allocated" />
+    <string
+     name="title_place"
+     value="Place Profile" />
+    <string
+     name="title_teleport_history"
+     value="Teleport History Location" />
+    <string
+     name="not_available"
+     value="(N\A)" />
+    <string
+     name="unknown"
+     value="(unknown)" />
+    <string
+     name="public"
+     value="(public)" />
+    <string
+     name="none_text"
+     value="(none)" />
+    <string
+     name="sale_pending_text"
+     value="(Sale Pending)" />
+    <string
+     name="group_owned_text"
+     value="(Group Owned)" />
+    <string
+     name="price_text"
+     value="L$" />
+    <string
+     name="area_text"
+     value="m²" />
+    <string
+     name="all_residents_text"
+     value="All Residents" />
+    <string
+     name="group_text"
+     value="Group" />
+    <string
+     name="can_resell">
+        Purchased land in this region may be resold.
+    </string>
+    <string
+     name="can_not_resell">
+        Purchased land in this region may not be resold.
+    </string>
+    <string
+     name="can_change">
+        Purchased land in this region may be joined or subdivided.
+    </string>
+    <string
+     name="can_not_change">
+        Purchased land in this region may not be joined or subdivided.
+    </string>
+    <string
+     name="server_update_text">
+        Place information not available without server update.
+    </string>
+    <string
+     name="server_error_text">
+        Information about this location is unavailable at this time, please try again later.
+    </string>
+    <string
+     name="server_forbidden_text">
+        Information about this location is unavailable due to access restrictions.  Please check your permissions with the parcel owner.
+    </string>
+    <string
+     name="acquired_date">
+        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+    </string>
+    <button
+     follows="top|right"
+     height="23"
+     image_overlay="BackArrow_Off"
+     layout="topleft"
+     left="10"
+     name="back_btn"
+     picture_style="true"
+     tab_stop="false"
+     top="0"
+     width="23" />
+    <text
+     follows="top|left|right"
+     font="SansSerifHugeBold"
+     height="26"
+     layout="topleft"
+     left_pad="10"
+     name="title"
+     text_color="white"
+     top="0"
+     use_ellipses="true"
+     value="Place Profile"
+     width="275" />
+    <scroll_container
+     color="DkGray2"
+     follows="all"
+     height="533"
+     layout="topleft"
+     left="10"
+     name="place_scroll"
+     opaque="true"
+     top_pad="5"
+     width="313">
+        <panel
+         bg_alpha_color="DkGray2"
+         follows="all"
+         height="533"
+         layout="topleft"
+         left="0"
+         min_height="300"
+         name="scrolling_panel"
+         top="0"
+         value="&gt;"
+         width="313">
+            <texture_picker
+             enabled="false"
+             follows="top|left"
+             height="190"
+             layout="topleft"
+             left="10"
+             name="logo"
+             top="10"
+             width="290" />
+            <layout_stack
+             border_size="0"
+             clip="false"
+             follows="all"
+             height="50"
+             layout="topleft"
+             mouse_opaque="false"
+             name="panel_stack"
+             orientation="horizontal"
+             top_pad="-65"
+             width="100">
+                <layout_panel
+                 follows="left|right"
+                 height="50"
+                 layout="topleft"
+                 left="0"
+                 min_height="50"
+                 min_width="50"
+                 mouse_opaque="false"
+                 name="here_panel"
+                 top="0"
+                 user_resize="false"
+                 width="60">
+                    <icon
+                     follows="top|left"
+                     height="50"
+                     image_name="YouAreHere_Badge"
+                     layout="topleft"
+                     left="0"
+                     name="icon_you_are_here"
+                     top="0"
+                     width="50" />
+                </layout_panel>
+                <layout_panel
+                 follows="left|right"
+                 height="60"
+                 layout="topleft"
+                 min_height="50"
+                 min_width="60"
+                 mouse_opaque="false"
+                 name="for_sale_panel"
+                 top="0"
+                 user_resize="false"
+                 width="60">
+                    <icon
+                     follows="top|left"
+                     height="50"
+                     image_name="ForSale_Badge"
+                     layout="topleft"
+                     left="10"
+                     name="icon_for_sale"
+                     top="0"
+                     width="50" />
+                </layout_panel>
+            </layout_stack>
+            <text
+             follows="left|top|right"
+             font="SansSerifLarge"
+             height="14"
+             layout="topleft"
+             left="10"
+             name="region_title"
+             text_color="white"
+             top_pad="5"
+             use_ellipses="true"
+             value="SampleRegion"
+             width="290" />
+       <!-- <icon
+             follows="top|right"
+             height="16"
+             image_name="Icon_For_Sale"
+             layout="topleft"
+             left="3"
+             mouse_opaque="true"
+             name="icon_for_sale"
+             width="16" />-->
+            <text
+             follows="left|top|right"
+             height="14"
+             layout="topleft"
+             left="10"
+             name="parcel_title"
+             top_pad="4"
+             use_ellipses="true"
+             value="SampleParcel, Name Long (145, 228, 26)"
+             width="285" />
+            <expandable_text
+             follows="left|top|right"
+             height="50"
+             layout="topleft"
+             left="5"
+             name="description"
+             top_pad="10"
+             value="Du waltz die spritz"
+             width="300" />
+            <text
+             follows="left|top"
+             height="14"
+             layout="topleft"
+             left="10"
+             name="owner_label"
+             text_color="White"
+             top_pad="0"
+             value="Owner:"
+             width="90" />
+         <!--TODO: HOOK THIS NAME UP WITH AN INSPECTOR  -->
+            <text
+             follows="left|top|right"
+             height="14"
+             layout="topleft"
+             left_pad="1"
+             name="owner_value"
+             top_delta="0"
+             value="Alex Superduperlongenamenton"
+             width="205" />
+            <accordion
+             follows="all"
+             height="230"
+             layout="topleft"
+             left="0"
+             name="advanced_info_accordion"
+             top_pad="10"
+             width="313">
+                <accordion_tab
+                 layout="topleft"
+                 name="parcel_characteristics_tab"
+                 title="Parcel">
+                    <scroll_container
+                     color="DkGray2"
+                     follows="all"
+                     height="132"
+                     layout="topleft"
+                     left="0"
+                     name="parcel_scroll"
+                     opaque="true"
+                     top="0"
+                     width="290">
+                        <panel
+                         follows="all"
+                         height="165"
+                         layout="topleft"
+                         left="0"
+                         top="0"
+                         width="275">
+                            <icon
+                             follows="top|left"
+                             height="16"
+                             image_name="parcel_drk_M"
+                             layout="topleft"
+                             left="20"
+                             name="icon_M"
+                             top="0"
+                             width="18" />
+                            <icon
+                             follows="top|left"
+                             height="16"
+                             image_name="parcel_drk_R"
+                             layout="topleft"
+                             left="20"
+                             name="icon_R"
+                             top="0"
+                             width="18" />
+                            <icon
+                             follows="top|left"
+                             height="16"
+                             image_name="parcel_drk_PG"
+                             layout="topleft"
+                             left="20"
+                             name="icon_PG"
+                             top="0"
+                             visible="false"
+                             width="18" />
+                            <text
+                             follows="left|top"
+                             height="16"
+                             layout="topleft"
+                             left_pad="8"
+                             name="rating_label"
+                             value="Rating:"
+                             width="80" />
+                            <text
+                             follows="right|top"
+                             height="16"
+                             layout="topleft"
+                             left_pad="0"
+                             name="rating_value"
+                             top_delta="0"
+                             value="Mature"
+                             width="120" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_Voice"
+                             layout="topleft"
+                             left="20"
+                             name="icon_Voice"
+                             top_pad="5"
+                             width="22" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_VoiceNo"
+                             layout="topleft"
+                             left="20"
+                             name="icon_VoiceNo"
+                             top_delta="0"
+                             visible="false"
+                             width="22" />
+                            <text
+                             follows="left|top"
+                             height="18"
+                             layout="topleft"
+                             left_pad="8"
+                             name="voice_label"
+                             top_delta="0"
+                             value="Voice:"
+                             width="76" />
+                            <text
+                             follows="right|top"
+                             height="18"
+                             layout="topleft"
+                             left_pad="0"
+                             name="voice_value"
+                             top_delta="0"
+                             value="On"
+                             width="60" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_Fly"
+                             layout="topleft"
+                             left="20"
+                             name="icon_Fly"
+                             top_pad="3"
+                             width="22" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_FlyNo"
+                             layout="topleft"
+                             left="20"
+                             name="icon_FlyNo"
+                             top_delta="0"
+                             visible="false"
+                             width="22" />
+                            <text
+                             follows="left|top"
+                             height="16"
+                             layout="topleft"
+                             left_pad="8"
+                             name="fly_label"
+                             value="Fly:"
+                             width="76" />
+                            <text
+                             follows="right|top"
+                             height="16"
+                             layout="topleft"
+                             left_pad="0"
+                             name="fly_value"
+                             top_delta="0"
+                             value="On"
+                             width="60" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_Push"
+                             layout="topleft"
+                             left="20"
+                             name="icon_Push"
+                             top_pad="3"
+                             visible="false"
+                             width="22" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_PushNo"
+                             layout="topleft"
+                             left="20"
+                             name="icon_PushNo"
+                             top_delta="0"
+                             width="22" />
+                            <text
+                             follows="left|top"
+                             height="14"
+                             layout="topleft"
+                             left_pad="8"
+                             name="push_label"
+                             value="Push:"
+                             width="76" />
+                            <text
+                             follows="right|top"
+                             height="14"
+                             layout="topleft"
+                             left_pad="0"
+                             name="push_value"
+                             top_delta="0"
+                             value="Off"
+                             width="60" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_Build"
+                             layout="topleft"
+                             left="20"
+                             name="icon_Build"
+                             top_pad="3"
+                             width="22" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_BuildNo"
+                             layout="topleft"
+                             left="20"
+                             name="icon_BuildNo"
+                             top_delta="0"
+                             visible="false" />
+                            <text
+                             follows="left|top"
+                             height="14"
+                             layout="topleft"
+                             left_pad="8"
+                             name="build_label"
+                             value="Build:"
+                             width="76" />
+                            <text
+                             follows="right|top"
+                             height="15"
+                             layout="topleft"
+                             left_pad="0"
+                             name="build_value"
+                             top_delta="0"
+                             value="On"
+                             width="60" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_Scripts"
+                             layout="topleft"
+                             left="20"
+                             name="icon_Scripts"
+                             top_pad="3"
+                             width="22" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_ScriptsNo"
+                             layout="topleft"
+                             left="20"
+                             name="icon_ScriptsNo"
+                             top_delta="0"
+                             visible="false" />
+                            <text
+                             follows="left|top"
+                             height="14"
+                             layout="topleft"
+                             left_pad="8"
+                             name="scripts_label"
+                             value="Scripts:"
+                             width="76" />
+                            <text
+                             follows="right|top"
+                             height="14"
+                             layout="topleft"
+                             left_pad="0"
+                             name="scripts_value"
+                             top_delta="0"
+                             value="On"
+                             width="60" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_Damage"
+                             layout="topleft"
+                             left="20"
+                             name="icon_Damage"
+                             top_pad="7"
+                             visible="false"
+                             width="22" />
+                            <icon
+                             follows="top|left"
+                             height="18"
+                             image_name="parcel_drk_DamageNo"
+                             layout="topleft"
+                             left="20"
+                             name="icon_DamageNo"
+                             top_delta="0" />
+                            <text
+                             follows="left|top"
+                             height="14"
+                             layout="topleft"
+                             left_pad="8"
+                             name="damage_label"
+                             value="Damage:"
+                             width="76" />
+                            <text
+                             follows="right|top"
+                             height="14"
+                             layout="topleft"
+                             left_pad="0"
+                             name="damage_value"
+                             top_delta="0"
+                             value="Off"
+                             width="60" />
+                            <button
+                             follows="bottom|right"
+                             height="19"
+                             label="About Land"
+                             layout="topleft"
+                             name="about_land_btn"
+                             right="-5"
+                             tab_stop="false"
+                             top="138"
+                             width="90">
+                                <click_callback
+                                 function="ShowFloater"
+                                 parameter="about_land" />
+                            </button>
+                        </panel>
+                    </scroll_container>
+                </accordion_tab>
+                <accordion_tab
+                 expanded="false"
+                 layout="topleft"
+                 name="region_information_tab"
+                 title="Region">
+                    <panel
+                     follows="all"
+                     height="125"
+                     layout="topleft"
+                     left="0"
+                     top="0"
+                     width="290">
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="region_name_label"
+                         top_pad="5"
+                         value="Region:"
+                         width="80" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left_pad="0"
+                         name="region_name"
+                         top_delta="0"
+                         value="Mooseland"
+                         width="195" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="region_type_label"
+                         top_pad="5"
+                         value="Type:"
+                         width="80" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left_pad="0"
+                         name="region_type"
+                         top_delta="0"
+                         value="Moose"
+                         width="195" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="region_rating_label"
+                         top_pad="7"
+                         value="Rating:"
+                         width="80" />
+                        <icon
+                         follows="top|left"
+                         height="16"
+                         image_name="parcel_drk_M"
+                         layout="topleft"
+                         left_pad="0"
+                         name="icon_M"
+                         width="18" />
+                        <icon
+                         follows="top|left"
+                         height="16"
+                         image_name="parcel_drk_R"
+                         layout="topleft"
+                         left_delta="0"
+                         name="icon_R"
+                         top_delta="0"
+                         visible="false"
+                         width="18" />
+                        <icon
+                         follows="top|left"
+                         height="16"
+                         image_name="parcel_drk_PG"
+                         layout="topleft"
+                         left_delta="0"
+                         name="icon_PG"
+                         top_delta="0"
+                         visible="false"
+                         width="18" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left_pad="10"
+                         name="region_rating"
+                         value="Explicit"
+                         width="100" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="region_owner_label"
+                         top_pad="5"
+                         value="Owner:"
+                         width="80" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left_pad="0"
+                         name="region_owner"
+                         top_delta="0"
+                         value="moose Van Moose"
+                         width="195" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="region_group_label"
+                         top_pad="5"
+                         value="Group:"
+                         width="80" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left_pad="0"
+                         name="region_group"
+                         top_delta="0"
+                         use_ellipses="true"
+                         width="195">
+                            The Mighty Moose of mooseville soundvillemoose
+                        </text>
+                        <button
+                         follows="bottom|right"
+                         height="19"
+                         label="Region/Estate"
+                         layout="topleft"
+                         name="region_info_btn"
+                         right="-5"
+                         tab_stop="false"
+                         width="105">
+                            <click_callback
+                             function="ShowFloater"
+                             parameter="region_info" />
+                        </button>
+                    </panel>
+                </accordion_tab>
+                <accordion_tab
+                 expanded="false"
+                 layout="topleft"
+                 name="estate_information_tab"
+                 title="Estate">
+                    <panel
+                     follows="all"
+                     height="189"
+                     layout="topleft"
+                     left="0"
+                     top="0"
+                     width="290">
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="estate_name_label"
+                         top_pad="5"
+                         value="Estate:"
+                         width="80" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="90"
+                         name="estate_name"
+                         top_delta="0"
+                         width="160" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="estate_rating_label"
+                         top_pad="5"
+                         value="Rating:"
+                         width="80" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="90"
+                         name="estate_rating"
+                         top_delta="0"
+                         width="160" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="estate_owner_label"
+                         top_pad="5"
+                         value="Owner:"
+                         width="80" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="90"
+                         name="estate_owner"
+                         top_delta="0"
+                         width="160" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="covenant_label"
+                         top_pad="5"
+                         value="Covenant:"
+                         width="220" />
+                        <text_editor
+                         bg_focus_color="DkGray2"
+                         bg_readonly_color="DkGray2"
+                         follows="left|top|right"
+                         handle_edit_keys_directly="true"
+                         height="90"
+                         layout="topleft"
+                         left="10"
+                         max_length="65535"
+                         name="covenant"
+                         read_only="true"
+                         top_pad="0"
+                         width="280" />
+                    </panel>
+                </accordion_tab>
+                <accordion_tab
+                 expanded="false"
+                 layout="topleft"
+                 name="sales_tab"
+                 title="For Sale">
+                    <panel
+                     follows="all"
+                     height="300"
+                     layout="topleft"
+                     left="0"
+                     top="0"
+                     width="290">
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="sales_price_label"
+                         top_pad="5"
+                         value="Price:"
+                         width="100" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="110"
+                         name="sales_price"
+                         top_delta="0"
+                         width="140" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="area_label"
+                         top_pad="5"
+                         value="Area:"
+                         width="100" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="110"
+                         name="area"
+                         top_delta="0"
+                         width="140" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="traffic_label"
+                         top_pad="5"
+                         value="Traffic:"
+                         width="100" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="110"
+                         name="traffic"
+                         top_delta="0"
+                         width="140" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="primitives_label"
+                         top_pad="5"
+                         value="Primitives:"
+                         width="100" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="110"
+                         name="primitives"
+                         top_delta="0"
+                         width="140" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="parcel_scripts_label"
+                         top_pad="5"
+                         value="Scripts:"
+                         width="100" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="110"
+                         name="parcel_scripts"
+                         top_delta="0"
+                         width="140" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="terraform_limits_label"
+                         top_pad="5"
+                         value="Terraform limits:"
+                         width="100" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="110"
+                         name="terraform_limits"
+                         top_delta="0"
+                         width="140" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="subdivide_label"
+                         top_pad="5"
+                         value="Subdivide/Join ability:"
+                         width="220" />
+                        <text_editor
+                         bg_focus_color="DkGray2"
+                         bg_readonly_color="DkGray2"
+                         follows="left|top|right"
+                         height="45"
+                         layout="topleft"
+                         left="10"
+                         max_length="65535"
+                         name="subdivide"
+                         read_only="true"
+                         top_pad="5"
+                         width="245" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="resale_label"
+                         top_pad="5"
+                         value="ReSale ability:"
+                         width="80" />
+                        <text_editor
+                         bg_focus_color="DkGray2"
+                         bg_readonly_color="DkGray2"
+                         follows="left|top|right"
+                         height="45"
+                         layout="topleft"
+                         left="10"
+                         max_length="65535"
+                         name="resale"
+                         read_only="true"
+                         top_pad="5"
+                         width="245" />
+                        <text
+                         follows="left|top"
+                         height="15"
+                         layout="topleft"
+                         left="10"
+                         name="sale_to_label"
+                         top_pad="5"
+                         value="For sale to:"
+                         width="80" />
+                        <text
+                         follows="left|top|right"
+                         height="15"
+                         layout="topleft"
+                         left="90"
+                         name="sale_to"
+                         top_delta="0"
+                         width="160" />
+                    </panel>
+                </accordion_tab>
+            </accordion>
+        </panel>
+    </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index 5aa53ab46b1049a5328516a7072a7d6b21098e46..4b5bde690c0478dafc838c078782cae50868dda0 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -40,14 +40,26 @@ background_visible="true"
      top_pad="10"
      width="313" />
     <panel
-     class="panel_place_info"
-     filename="panel_place_info.xml"
+     class="panel_place_profile"
+     filename="panel_place_profile.xml"
      follows="all"
      height="533"
      layout="topleft"
      left="0"
      help_topic="places_info_tab"
-     name="panel_place_info"
+     name="panel_place_profile"
+     top="5"
+     visible="false"
+     width="313" />
+    <panel
+     class="panel_landmark_info"
+     filename="panel_landmark_info.xml"
+     follows="all"
+     height="533"
+     layout="topleft"
+     left="0"
+     help_topic="places_info_tab"
+     name="panel_landmark_info"
      top="5"
      visible="false"
      width="313" />
@@ -106,7 +118,6 @@ background_visible="true"
          image_disabled="ForwardArrow_Disabled"
          image_selected="ForwardArrow_Press"
          image_unselected="ForwardArrow_Off"
-         picture_style="true"
          layout="topleft"
          name="overflow_btn"
          right="-10"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 91dcdce23bb8bc44165f72e9584f21d49d50ba55..f98f3a08503b0e7f88c3ec2b3979702e5d2af8a6 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -28,7 +28,19 @@
      top="10"
      name="bubble_text_chat"
      width="150" />
-
+    <color_swatch
+     border_color="0.45098 0.517647 0.607843 1"
+     can_apply_immediately="true"
+     color="0 0 0 1"
+     control_name="BackgroundChatColor"
+     follows="left|top"
+     height="47"
+     layout="topleft"
+     left_delta="280"
+     name="background"
+     tool_tip="Choose color for bubble chat"
+     top_delta="1"
+     width="44" />
     <slider
      control_name="ChatBubbleOpacity"
      follows="left|top"
@@ -37,8 +49,8 @@
      initial_value="1"
      label="Opacity"
      layout="topleft"
-     left_delta="50"
-     top_pad="5"
+     left_delta="-230"
+     top_pad="-28"
      label_width="50"
      name="bubble_chat_opacity"
      width="200" />
@@ -240,8 +252,8 @@ Avatars:
      width="256"
      top_pad="5"/>
     <radio_group
-	 enabled_control="ShowScriptErrors"
-	 control_name="ShowScriptErrorsLocation"
+     enabled_control="ShowScriptErrors"
+     control_name="ShowScriptErrorsLocation"
      follows="top|left"
      draw_border="false"
      height="40"
@@ -269,6 +281,8 @@ Avatars:
     </radio_group>
      <check_box
      follows="top|left"
+     enabled_control="EnableVoiceChat"
+     control_name="PushToTalkToggle"
      height="20"
      label="Use Push-to-talk in toggle mode"
      layout="topleft"
@@ -279,6 +293,9 @@ Avatars:
      tool_tip="When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down."/>
     <line_editor
      follows="top|left"
+     control_name="PushToTalkButton"
+     enabled="false" 
+     enabled_control="EnableVoiceChat"
      height="19"
      left_delta="50"
      max_length="254"
@@ -287,22 +304,30 @@ Avatars:
      top_pad="0"
      width="280" />
     <button
-	follows="top|left"
-	height="20"
-	label="Set Key"
-	left_delta="0"
-        name="set_voice_hotkey_button"
-	width="115"
-	top_pad="5" />
+     follows="top|left"
+     enabled_control="EnableVoiceChat"
+     height="20"
+     label="Set Key"
+     left_delta="0"
+     name="set_voice_hotkey_button"
+     width="115"
+     top_pad="5">
+          <button.commit_callback
+          function="Pref.VoiceSetKey" />
+    </button>
     <button
-        bottom_delta="0"
-	follows="left"
-	font="SansSerif"
-	halign="center"
-	height="20"
-	label="Middle Mouse Button"
-	left_delta="120"
-	mouse_opaque="true"
-	name="set_voice_middlemouse_button"
-	width="160" />
+     bottom_delta="0"
+     enabled_control="EnableVoiceChat"
+     follows="left"
+     font="SansSerif"
+     halign="center"
+     height="20"
+     label="Middle Mouse Button"
+     left_delta="120"
+     mouse_opaque="true"
+     name="set_voice_middlemouse_button"
+     width="160">
+          <button.commit_callback
+          function="Pref.VoiceSetMiddleMouse" />
+    </button>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
index 159323538ca89a87ae5b4f64367ef92bb11199df..a94df4150da43eacfce0a30c66b15106dc3e931d 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
@@ -73,7 +73,6 @@
      layout="topleft"
      left_delta="137"
      name="enable_this_popup"
-     picture_style="true"
      top_pad="10"
      width="43">
         <button.commit_callback
@@ -92,7 +91,6 @@
      layout="topleft"
      left_pad="50"
      name="disable_this_popup"
-     picture_style="true"
      top_delta="0"
      width="43">
         <button.commit_callback
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 051cb51d25c63ddb8b68ce4db3ad5e84d69ea15b..645863e7a4ac804e53f4097eade5f44950ee4430 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -217,31 +217,6 @@
      width="95">
         Owner
     </text>
-    <color_swatch
-     border_color="0.45098 0.517647 0.607843 1"
-     can_apply_immediately="true"
-     color="0 0 0 1"
-     control_name="BackgroundChatColor"
-     follows="left|top"
-     height="47"
-     layout="topleft"
-     left="180"
-     name="background"
-     top_pad="-17"
-     width="44" />
-    <text
-     type="string"
-     length="1"
-     follows="left|top"
-     height="10"
-     layout="topleft"
-     left_pad="5"
-     mouse_opaque="false"
-     name="text_box8"
-     top_delta="5"
-     width="95">
-        Bubble
-    </text>
     <color_swatch
      border_color="0.45098 0.517647 0.607843 1"
      can_apply_immediately="true"
@@ -250,7 +225,7 @@
      follows="left|top"
      height="47"
      layout="topleft"
-     left="350"
+     left="180"
      name="links"
      top_pad="-17"
      width="44" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 832c9775ce2fbc6880d14b97f14ef172682676bf..78ae9a82240b458feecfba8c354bcd73c5b338e6 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -40,7 +40,6 @@
      layout="topleft"
      left_pad="16"
      name="mute_audio"
-     picture_style="true"
      tab_stop="false"
      top_delta="-2"
      width="22" />
@@ -86,7 +85,6 @@
      layout="topleft"
      left_pad="16"
      name="mute_wind"
-     picture_style="true"
      tab_stop="false"
      top_delta="-2"
      width="22" />
@@ -122,7 +120,6 @@
      layout="topleft"
      left_pad="16"
      name="mute_ui"
-     picture_style="true"
      tab_stop="false"
      top_delta="-2"
      width="22" />
@@ -158,7 +155,6 @@
      layout="topleft"
      left_pad="16"
      name="mute_media"
-     picture_style="true"
      tab_stop="false"
      top_delta="-2"
      width="22" />
@@ -194,7 +190,6 @@
      layout="topleft"
      left_pad="16"
      name="mute_sfx"
-     picture_style="true"
      tab_stop="false"
      top_delta="-2"
      width="22" />
@@ -230,7 +225,6 @@
      layout="topleft"
      left_pad="16"
      name="mute_music"
-     picture_style="true"
      tab_stop="false"
      top_delta="-2"
      width="22" />
@@ -278,7 +272,6 @@
      layout="topleft"
      left_pad="16"
      name="mute_voice"
-     picture_style="true"
      tab_stop="false"
      top_delta="-2"
      width="22" />
@@ -336,19 +329,20 @@
          top_delta="19"
          width="200" />
     </radio_group>
-    <button
-     control_name="ShowDeviceSettings"
-     follows="left|bottom"
-     height="19"
-     is_toggle="true"
-     label="Input / Output  Devices"
-     layout="topleft"
-     left="165"
-     top_pad="12"
-     name="device_settings_btn"
-     width="190" />
+  <button
+   control_name="ShowDeviceSettings"
+   follows="left|bottom"
+   height="19"
+   is_toggle="true"
+   label="Input / Output  Devices"
+   layout="topleft"
+   left="165"
+   top_pad="12"
+   name="device_settings_btn"
+   width="190">
+  </button>
     <panel
-    background_visible="true"
+     background_visible="true"
      bg_alpha_color="DkGray"
      visiblity_control="ShowDeviceSettings"
      border="false"
@@ -357,8 +351,13 @@
      label="DeviceSettings"
      layout="topleft"
      left="0"
-     name="Device Settings"
+     name="device_settings_panel"
+     class="panel_voice_device_settings"
      width="501">
+      <panel.string
+        name="default_text">
+        Default
+      </panel.string>
       <icon
              height="18"
              image_name="Microphone_On"
@@ -382,6 +381,7 @@
     </text>
     <combo_box
      height="19"
+     control_name="VoiceInputAudioDevice"
      layout="topleft"
      left="165"
      max_chars="128"
@@ -400,7 +400,8 @@
      width="200">
         My volume:
     </text>
-      <slider
+      <slider_bar
+        control_name="AudioLevelMic" 
      follows="left|top"
      height="17"
      increment="0.05"
@@ -492,6 +493,7 @@
         Output
     </text>
     <combo_box
+     control_name="VoiceOutputAudioDevice"
      height="19"
      layout="topleft"
      left="165"
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index b21fbc1795fe05e2dd8b1989f97745668e9b4b7c..d384abf038a25a81a0f9296b2f127e628cd70c4a 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -82,7 +82,6 @@
 		  image_unselected="media_btn_back.png"
 		  layout="topleft"
 		  tool_tip="Step back"
-		  picture_style="true"
 		  width="22"
 		  top_delta="4">
 		<button.commit_callback
@@ -103,7 +102,6 @@
 		  image_unselected="media_btn_forward.png"
 		  layout="topleft"
 		  tool_tip="Step forward"
-		  picture_style="true"
 		  top_delta="0"
 		  min_width="17"
 		  width="17">
@@ -141,7 +139,6 @@
 		  image_unselected="media_btn_home.png"
 		  layout="topleft"
 		  tool_tip="Home page"
-		  picture_style="true"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -162,7 +159,6 @@
 		  image_unselected="button_anim_stop.tga"
 		  layout="topleft"
 		  tool_tip="Stop media"
-		  picture_style="true"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -199,7 +195,6 @@
 		  image_unselected="media_btn_reload.png"
 		  layout="topleft"
 		  tool_tip="Reload"
-		  picture_style="true"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -219,7 +214,6 @@
 		  image_selected="media_btn_stoploading.png"
 		  image_unselected="media_btn_stoploading.png"
 		  layout="topleft"
-		  picture_style="true"
 		  tool_tip = "Stop loading"
 		  min_width="22"
 		  width="22">
@@ -241,7 +235,6 @@
 		  image_unselected="button_anim_play.tga"
 		  layout="topleft"
 		  tool_tip = "Play media"
-		  picture_style="true"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -261,8 +254,7 @@
 		  image_selected="button_anim_pause.tga"
 		  image_unselected="button_anim_pause.tga"
 		  layout="topleft"
-		  tool_tip = "Pause media"
-		  picture_style="true">
+		  tool_tip = "Pause media">
 		<button.commit_callback
 			function="MediaCtrl.Pause" />
 	  </button>
@@ -367,7 +359,6 @@ function="MediaCtrl.CommitURL" />
 		  is_toggle="true"
 		  layout="topleft"
 		  scale_image="false" 
-		  picture_style="true"
 		  tool_tip="Mute This Media"
 		  top_delta="22"
 		  min_width="24"
@@ -391,7 +382,6 @@ function="MediaCtrl.CommitURL" />
 		  image_unselected="media_btn_scrollup.png"
 		  layout="topleft"
 		  tool_tip="Volume up"
-		  picture_style="true"
 		  scale_image="true"
 		  min_width="20"
 		  width="20" >
@@ -414,7 +404,6 @@ function="MediaCtrl.CommitURL" />
 		  image_unselected="media_btn_scrolldown.png"
 		  layout="topleft"
 		  tool_tip="Volume down"
-		  picture_style="true"
 		  scale_image="true"
 		  min_width="20"
 		  width="20">
@@ -446,7 +435,6 @@ function="MediaCtrl.CommitURL" />
 		  image_unselected="media_btn_scrollup.png"
 		  layout="topleft"
 		  tool_tip="Scroll up"
-		  picture_style="true"
 		  scale_image="false"
 		  left="12"
 		  top_delta="4"
@@ -460,7 +448,6 @@ function="MediaCtrl.CommitURL" />
 		  layout="topleft"
 		  left="3"
 		  tool_tip="Scroll left"
-		  picture_style="true"
 		  scale_image="false"
 		  top="12"
 		  min_width="8"
@@ -473,7 +460,6 @@ function="MediaCtrl.CommitURL" />
 		  layout="topleft"
 		  left_pad="9"
 		  tool_tip="Scroll right"
-		  picture_style="true"
 		  scale_image="false"
 		  top_delta="0"
 		  min_width="8"
@@ -486,7 +472,6 @@ function="MediaCtrl.CommitURL" />
 		  layout="topleft"
 		  left="12"
 		  tool_tip="Scroll down"
-		  picture_style="true"
 		  scale_image="false"
 		  top="20"
 		  min_width="8"
@@ -506,7 +491,6 @@ function="MediaCtrl.CommitURL" />
 		  image_unselected="media_btn_optimalzoom.png"
 		  layout="topleft"
 		  tool_tip="Zoom"
-		  picture_style="true"
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
@@ -542,7 +526,6 @@ function="MediaCtrl.CommitURL" />
 		  image_unselected="media_btn_newwindow.png"
 		  layout="topleft"
 		  tool_tip = "Open URL in browser"
-		  picture_style="true"
 		  top_delta="-3"
 		  min_width="24"
 		  width="24" >
@@ -579,7 +562,6 @@ function="MediaCtrl.CommitURL" />
 		  image_unselected="media_btn_done.png"
 		  layout="topleft"
 		  tool_tip ="Close media control"
-		  picture_style="true"
 		  top_delta="-4"
 		  width="21" >
 		<button.commit_callback
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 5af7d7d6744164ec208c26e39f6e7970dbadda1a..c3a92f9d9ae0508991395d025a199eca124a0b41 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -157,7 +157,7 @@
          value="http://librarianavengers.org"
          width="280"
          word_wrap="false"
-         use_elipsis="true"
+         use_ellipses="true"
          />
         <text
          follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
index 195b7315313e6d9479f06dc09a0c9f933adb59cf..b015346a799e9981d7af002b07f7dbca563d7f4f 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -21,7 +21,6 @@
      image_overlay="BackArrow_Off"
      layout="topleft"
      name="back"
-     picture_style="true"
      left="10"
      tab_stop="false"
      top="2"
@@ -36,7 +35,7 @@
      text_color="white"
      top="0"
      value="(Loading...)"
-     use_elipsis="true"
+     use_ellipses="true"
      width="275" />
     <text
      follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml
index a312e4cf13fd4e20e15d18bfed12218ec171d050..18c2228906296b8958c7f602ff93ef398b6c85ad 100644
--- a/indra/newview/skins/default/xui/en/panel_progress.xml
+++ b/indra/newview/skins/default/xui/en/panel_progress.xml
@@ -129,7 +129,6 @@
      layout="topleft"
      left="-106"
      name="cancel_btn"
-     picture_style="true"
      top="700"
      width="90" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
index b3147f5e6bafd51ace1c6e3841c467fd5bdaf2e6..49fc930cd8ae1ba18225cf3fbd683e082b45e174 100644
--- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
@@ -103,17 +103,6 @@
      width="308">
         Last Modified Wed Dec 31 16:00:00 1969
     </text>
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="5"
-     name="covenant_help"
-     top_delta="-2"
-     width="18" />
-
     <text_editor
      enabled="false"
      follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml
index 25e1171688c7a89c7c35050bae7cdb2fad4a5686..a1bca4229dcfa2cf309ad46a369d0a254b0199ac 100644
--- a/indra/newview/skins/default/xui/en/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml
@@ -40,16 +40,6 @@
      tool_tip="Disable all scripts in this region"
      top="30"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="70"
-     name="disable_scripts_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Disable Collisions"
@@ -59,16 +49,6 @@
      tool_tip="Disable non-avatar collisions in this region"
      top="50"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="70"
-     name="disable_collisions_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Disable Physics"
@@ -78,16 +58,6 @@
      tool_tip="Disable all physics in this region"
      top="70"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="70"
-     name="disable_physics_help"
-     top_delta="2"
-     width="18" />
     <button
      enabled="false"
      follows="left|top"
@@ -204,16 +174,6 @@
      tool_tip="List of objects experiencing the most potential collisions"
      top="313"
      width="150" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="10"
-     name="top_colliders_help"
-     top_delta="2"
-     width="18" />
     <button
      follows="left|top"
      font="SansSerifSmall"
@@ -225,16 +185,6 @@
      tool_tip="List of objects spending the most time running scripts"
      top_pad="5"
      width="150" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="10"
-     name="top_scripts_help"
-     top_delta="2"
-     width="18" />
     <button
      follows="left|top"
      font="SansSerifSmall"
@@ -246,16 +196,6 @@
      tool_tip="Give 2 minute countdown and restart region"
      top_pad="5"
      width="130" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="10"
-     name="restart_help"
-     top_delta="2"
-     width="18" />
     <button
      follows="left|top"
      font="SansSerifSmall"
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index c7a60ed2e48d196acbb601abbe3015f7f493946b..add1476179191b8e1e3b021b91fddc1f275cb4b4 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -94,16 +94,6 @@ regions in the estate.
      name="use_global_time_check"
      top="132"
      width="200" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="20"
-     name="use_global_time_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Fixed Sun"
@@ -112,16 +102,6 @@ regions in the estate.
      name="fixed_sun_check"
      top="152"
      width="100" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="120"
-     name="fixed_sun_help"
-     top_delta="2"
-     width="18" />
     <icon
      height="20"
      image_name="icon_day_cycle.tga"
@@ -151,16 +131,6 @@ regions in the estate.
      name="externally_visible_check"
      top_pad="6"
      width="200" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="20"
-     name="externally_visible_help"
-     top_delta="2"
-     width="18" />
     <text
      type="string"
      length="1"
@@ -201,16 +171,6 @@ regions in the estate.
      name="voice_chat_check"
      top="304"
      width="200" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="20"
-     name="voice_chat_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Allow Direct Teleport"
@@ -219,16 +179,6 @@ regions in the estate.
      name="allow_direct_teleport"
      top_pad="4"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="140"
-     name="allow_direct_teleport_help"
-     top_delta="2"
-     width="18" />
     <text
      type="string"
      length="1"
@@ -249,16 +199,6 @@ regions in the estate.
      name="abuse_email_address"
      top_pad="5"
      width="205" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="12"
-     name="abuse_email_address_help"
-     top_dekta="0"
-     width="18" />
     <button
      enabled="false"
      follows="left|top"
@@ -300,16 +240,6 @@ regions in the estate.
      width="200">
         Estate Managers:
     </text>
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_delta="182"
-     name="estate_manager_help"
-     top_delta="-1"
-     width="18" />
     <view_border
      bevel_style="none"
      follows="top|left"
@@ -357,16 +287,6 @@ regions in the estate.
      width="200">
         Allowed Residents:
     </text>
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_delta="182"
-     name="allow_resident_help"
-     top_delta="-1"
-     width="18" />
     <view_border
      bevel_style="none"
      follows="top|left"
@@ -414,16 +334,6 @@ regions in the estate.
      width="200">
         Allowed Groups:
     </text>
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_delta="182"
-     name="allow_group_help"
-     top_delta="-1"
-     width="18" />
     <view_border
      bevel_style="none"
      follows="top|left"
@@ -471,16 +381,6 @@ regions in the estate.
      width="200">
         Banned Residents:
     </text>
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_delta="182"
-     name="ban_resident_help"
-     top_delta="-1"
-     width="18" />
     <view_border
      bevel_style="none"
      follows="top|left"
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 160ae96fc4e0b66d7b17bd5c8052a8ff7206a52d..42c63196995b2901496c0046ec964e082c453d73 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -83,16 +83,6 @@
      name="block_terraform_check"
      top="70"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="terraform_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Block Fly"
@@ -101,16 +91,6 @@
      name="block_fly_check"
      top="90"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="fly_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Allow Damage"
@@ -119,16 +99,6 @@
      name="allow_damage_check"
      top="110"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="damage_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Restrict Pushing"
@@ -137,16 +107,6 @@
      name="restrict_pushobject"
      top="130"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="restrict_pushobject_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Allow Land Resell"
@@ -155,16 +115,6 @@
      name="allow_land_resell_check"
      top="160"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="land_resell_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Allow Land Join/Divide"
@@ -173,16 +123,6 @@
      name="allow_parcel_changes_check"
      top="180"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="parcel_changes_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Block Land Show in Search"
@@ -192,16 +132,6 @@
      tool_tip="Let people see this region and its parcels in search results"
      top="200"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="parcel_search_help"
-     top_delta="2"
-     width="18" />
     <spinner
      follows="left|top"
      height="20"
@@ -215,16 +145,6 @@
      name="agent_limit_spin"
      top="240"
      width="170" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="25"
-     name="agent_limit_help"
-     top_delta="2"
-     width="18" />
     <spinner
      follows="left|top"
      height="20"
@@ -238,16 +158,6 @@
      name="object_bonus_spin"
      top="260"
      width="170" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="25"
-     name="object_bonus_help"
-     top_delta="2"
-     width="18" />
     <text
      follows="left|top"
      height="20"
@@ -280,16 +190,6 @@
          name="PG"
          value="13" />
     </combo_box>
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="10"
-     name="access_help"
-     top_delta="2"
-     width="18" />
     <button
      enabled="false"
      follows="left|top"
@@ -299,10 +199,7 @@
      left="108"
      name="apply_btn"
      top="320"
-     width="100">
-    <button.commit_callback
-         function="RegionInfo.Cancel" />
-    </button>
+     width="100"/> 
     <button
      follows="left|top"
      height="20"
@@ -338,5 +235,8 @@
      left="250"
      name="manage_telehub_btn"
      top="70"
-     width="150" />
+     width="150">
+		<button.commit_callback
+         function="RegionInfo.ManageTelehub" />
+    </button>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml
index 9b9c62dbf9d6d9928b4f60937813d8b780513233..bffd84877f701bb2ef4745d05326ca666e73084c 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml
@@ -83,16 +83,6 @@
      name="block_terraform_check"
      top="70"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="terraform_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Block Fly"
@@ -101,16 +91,6 @@
      name="block_fly_check"
      top="90"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="fly_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Allow Damage"
@@ -119,16 +99,6 @@
      name="allow_damage_check"
      top="110"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="damage_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Restrict Pushing"
@@ -137,16 +107,6 @@
      name="restrict_pushobject"
      top="130"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="restrict_pushobject_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Allow Land Resell"
@@ -155,16 +115,6 @@
      name="allow_land_resell_check"
      top="160"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="land_resell_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Allow Land Join/Divide"
@@ -173,16 +123,6 @@
      name="allow_parcel_changes_check"
      top="180"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="parcel_changes_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Block Land Show in Search"
@@ -192,16 +132,6 @@
      tool_tip="Let people see this region and its parcels in search results"
      top="200"
      width="80" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="115"
-     name="parcel_search_help"
-     top_delta="2"
-     width="18" />
     <spinner
      follows="left|top"
      height="20"
@@ -215,16 +145,6 @@
      name="agent_limit_spin"
      top="240"
      width="170" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="25"
-     name="agent_limit_help"
-     top_delta="2"
-     width="18" />
     <spinner
      follows="left|top"
      height="20"
@@ -238,16 +158,6 @@
      name="object_bonus_spin"
      top="260"
      width="170" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="25"
-     name="object_bonus_help"
-     top_delta="2"
-     width="18" />
     <text
      follows="left|top"
      height="20"
@@ -280,16 +190,6 @@
          name="PG"
          value="13" />
     </combo_box> 
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="10"
-     name="access_help"
-     top_delta="2"
-     width="18" />
     <button
      enabled="false"
      follows="left|top"
@@ -299,10 +199,7 @@
      left="108"
      name="apply_btn"
      top="320"
-     width="100">
-        <button.commit_callback
-         function="RegionInfo.Cancel" />
-    </button>
+     width="100"/>
    <button
      follows="left|top"
      height="20"
@@ -338,5 +235,8 @@
      left_delta="0"
      name="manage_telehub_btn"
      top_pad="20"
-     width="150" /> 
+     width="150" >
+		<button.commit_callback
+         function="RegionInfo.ManageTelehub" />
+    </button> 
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_terrain.xml b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
index 148d9500bb8324e8289a0ceacaf6252357502aac..ffd51bf510fc1e60195f15cd00cbeed374fe75ac 100644
--- a/indra/newview/skins/default/xui/en/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_terrain.xml
@@ -42,16 +42,6 @@
      name="water_height_spin"
      top="40"
      width="180" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="5"
-     name="water_height_help"
-     top_delta="2"
-     width="18" />
     <spinner
      follows="left|top"
      height="20"
@@ -64,16 +54,6 @@
      name="terrain_raise_spin"
      top="60"
      width="180" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="5"
-     name="terrain_raise_help"
-     top_delta="2"
-     width="18" />
     <spinner
      follows="left|top"
      height="20"
@@ -87,16 +67,6 @@
      name="terrain_lower_spin"
      top="80"
      width="180" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="5"
-     name="terrain_lower_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Use Estate Sun"
@@ -105,16 +75,6 @@
      name="use_estate_sun_check"
      top="35"
      width="100" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="70"
-     name="use_estate_sun_help"
-     top_delta="2"
-     width="18" />
     <check_box
      height="20"
      label="Fixed Sun"
@@ -123,16 +83,6 @@
      name="fixed_sun_check"
      top="55"
      width="100" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="70"
-     name="fixed_sun_help"
-     top_delta="2"
-     width="18" />
     <icon
      height="20"
      image_name="icon_day_cycle.tga"
@@ -182,16 +132,6 @@
      tool_tip="Available only to estate owners, not managers"
      top_pad="60"
      width="170" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="10"
-     name="download_raw_help"
-     top_delta="2"
-     width="18" />
     <button
      follows="left|top"
      height="20"
@@ -202,16 +142,6 @@
      tool_tip="Available only to estate owners, not managers"
      top="243"
      width="170" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="10"
-     name="upload_raw_help"
-     top_delta="2"
-     width="18" />
     <button
      follows="left|top"
      height="20"
@@ -222,14 +152,4 @@
      tool_tip="Set current terrain as mid-point for raise/lower limits"
      top="283"
      width="100" />
-    <button
-     follows="left|top"
-     font="SansSerifSmall"
-     height="18"
-     label="?"
-     layout="topleft"
-     left_pad="10"
-     name="bake_terrain_help"
-     top_delta="2"
-     width="18" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
index 21ecd0183977bd1c87fb4d5bda0c9b8728c19e0b..44afadf65a6df9a077e0d0c06121d6e39780b1c7 100644
--- a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
+++ b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
@@ -56,7 +56,6 @@
      layout="topleft"
      left="2"
      name="less"
-     picture_style="true"
      tab_stop="false"
      top="0"
      width="132" />
@@ -70,7 +69,6 @@
      layout="topleft"
      left_pad="2"
      name="more"
-     picture_style="true"
      tab_stop="false"
      top_delta="0"
      width="132" />
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index 3f64c9c633f4ff4e714e9337f6a84abd1616698d..3582de1c711f0c4f8f594d7f3a855a7f26427ca7 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -128,4 +128,23 @@
       />
   </sidetray_tab>
 
+  <sidetray_tab
+    name="sidebar_inventory"
+    help_topic="sidebar_inventory"
+    tab_title="Inventory"
+    description="Browse your inventory."
+    image="TabIcon_Inventory_Off"
+    image_selected="TabIcon_Inventory_Selected"
+    mouse_opaque="false"
+    background_visible="true"
+  >
+      <panel
+        class="sidepanel_inventory"
+        name="sidepanel_inventory"
+        filename="sidepanel_inventory.xml"
+        label="Edit Inventory"
+        font="SansSerifBold"
+      />
+  </sidetray_tab>
+
 </side_tray>
diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
index 247054772e1f1a74dd7c90382ac070ceb69b59eb..9636e321870a9edab4944ca0df262dc0ba893e81 100644
--- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
@@ -12,7 +12,7 @@
      bg_alpha_color="DkGray2"
      class="panel_sidetray_home_info"
      follows="left|top|right"
-     height="120"
+     height="90"
      layout="topleft"
      left="15"
      top="17"
@@ -42,7 +42,7 @@
          width="20" />
         <text
          follows="left|right|bottom"
-         height="120"
+         height="90"
          layout="topleft"
          left="10"
          mouse_opaque="false"
@@ -59,7 +59,7 @@
      bg_alpha_color="DkGray2"
      class="panel_sidetray_home_info"
      follows="left|top|right"
-     height="120"
+     height="90"
      layout="topleft"
      left="15"
      top_pad="15"
@@ -89,7 +89,7 @@
          image_name="TabIcon_Places_Selected"/>
         <text
          follows="all"
-         height="120"
+         height="90"
          layout="topleft"
          left="10"
          mouse_opaque="false"
@@ -106,7 +106,7 @@
      bg_alpha_color="DkGray2"
      class="panel_sidetray_home_info"
      follows="left|top|right"
-     height="120"
+     height="90"
      layout="topleft"
      left="15"
      top_pad="15"
@@ -136,7 +136,7 @@
          image_name="TabIcon_Me_Selected"/>
         <text
          follows="all"
-         height="120"
+         height="90"
          layout="topleft"
          left="10"
          mouse_opaque="false"
@@ -153,7 +153,7 @@
      bg_alpha_color="DkGray2"
      class="panel_sidetray_home_info"
      follows="left|top|right"
-     height="120"
+     height="90"
      layout="topleft"
      left="15"
      top_pad="15"
@@ -183,7 +183,7 @@
          image_name="TabIcon_Appearance_Selected"/>
         <text
          follows="all"
-         height="120"
+         height="90"
          layout="topleft"
          left="10"
          mouse_opaque="false"
@@ -195,4 +195,51 @@
             Change your appearance and current look.
         </text>
     </panel>
+    <panel
+     background_visible="true"
+     bg_alpha_color="DkGray2"
+     class="panel_sidetray_home_info"
+     follows="left|top|right"
+     height="90"
+     layout="topleft"
+     left="15"
+     top_pad="15"
+     name="sidebar_inventory"
+     width="303">
+        <text
+         follows="left|right|top"
+         font="SansSerifBigBold"
+         height="30"
+         layout="topleft"
+         left="10"
+         mouse_opaque="false"
+         name="tab_name"
+         text_color="EmphasisColor"
+         top="10"
+         value="My Inventory"
+         width="200"
+         word_wrap="true" />
+        <icon
+         follows="top|right"
+         height="20"
+         layout="topleft"
+         name="tab_icon"
+         right="-10"
+         top="10"
+         width="20"
+         image_name="TabIcon_Inventory_Selected"/>
+        <text
+         follows="all"
+         height="90"
+         layout="topleft"
+         left="10"
+         mouse_opaque="false"
+         name="tab_description"
+         right="-10"
+         text_color="white"
+         top="40"
+         word_wrap="true">
+            Browse your inventory.
+        </text>
+    </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index 4169c6245b18837245480f4ee1e869109002445f..bbfffe7babaeb71814a11bdf4b17bab24a720583 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -176,7 +176,6 @@
          layout="topleft"
          left="10"
          name="gear_btn"
-         picture_style="true"
          top="5"
          width="18" />
     </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
index f559343b34a6d2c4c2571dc9719a6dec93fc4595..0073a1f1a0d0325c1b9e17881a79af83e79e8255 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
@@ -55,7 +55,6 @@
      left_pad="3"
      right="-31"
      name="info_btn"
-     picture_style="true"
      top_delta="-2"
      width="16" />
     <button
@@ -66,7 +65,6 @@
      left_pad="5"
      right="-3"
      name="profile_btn"
-     picture_style="true"
      top_delta="-2"
      width="20" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d0c3cdfafcf1289f0d40d4d1e0f9a4f451a262f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="400"
+ label="Things"
+ layout="topleft"
+ min_height="350"
+ min_width="240"
+ name="objects panel"
+ width="333">
+    <tab_container
+     follows="all"
+     height="390"
+     layout="topleft"
+     left="9"
+     name="Inventory Tabs"
+     tab_position="top"
+     top="0"
+     width="313"
+	 tab_height="0"
+	 visible="true">
+	 <panel
+	      class="panel_main_inventory"
+		  filename="panel_main_inventory.xml"
+		  follows="all"
+		  layout="topleft"
+		  left="0"
+		  name="panel_main_inventory"
+		  top="15"
+		  label=""
+		  height="330"
+		  width="467">
+    <panel
+     height="25"
+     layout="bottomright"
+     left="0"
+     help_topic="objects_button_tab"
+     name="button_panel"
+	 bottom="0"
+     width="313">
+        <button
+         enabled="true"
+         follows="bottom|left"
+         font="SansSerifSmallBold"
+         height="25"
+         label="Info"
+         layout="topleft"
+         left="0"
+         name="info_btn"
+         top="0"
+         width="60" />
+        <button
+         enabled="true"
+         follows="bottom|left"
+         font="SansSerifSmallBold"
+         height="25"
+         label="Share"
+         layout="topleft"
+         left_pad="5"
+         name="share_btn"
+         top="0"
+         width="60" />
+        <button
+         enabled="false"
+         follows="bottom|left"
+         font="SansSerifSmallBold"
+         height="25"
+         label="Wear"
+         layout="topleft"
+         left="130"
+         name="wear_btn"
+         top="0"
+         width="60" />
+        <button
+         enabled="false"
+         follows="bottom|left"
+         font="SansSerifSmallBold"
+         height="25"
+         label="Play"
+         layout="topleft"
+         name="play_btn"
+         left="130"
+         top="0"
+         width="50" />
+        <button
+         enabled="false"
+         follows="bottom|left"
+         font="SansSerifSmallBold"
+         height="25"
+         label="Teleport"
+         layout="topleft"
+         left="130"
+         name="teleport_btn"
+         top="0"
+         width="77" />
+        <button
+         follows="bottom|right"
+         font="SansSerifSmallBold"
+         height="25"
+         label="v"
+         layout="topleft"
+         name="overflow_btn"
+         right="-10"
+         top="0"
+         width="30" />
+    </panel>
+    </panel>
+   </tab_container>
+
+    <panel
+     class="sidepanel_object_info"
+     filename="sidepanel_object_info.xml"
+     follows="all"
+     height="360"
+     layout="topleft"
+     left="0"
+     help_topic="objects_info_tab"
+     name="sidepanel_object_info"
+     top="30"
+     visible="false" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index e842517853dd421577584b88b0b89884b9e0e7b4..ec2673644f0af2150a2e28fcda686ed14df43330 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -73,8 +73,13 @@
 	<string name="TooltipParcelUrl">Click to view this parcel's description</string>
 	<string name="TooltipTeleportUrl">Click to teleport to this location</string>
 	<string name="TooltipObjectIMUrl">Click to view this object's description</string>
+	<string name="TooltipMapUrl">Click to view this location on a map</string>
 	<string name="TooltipSLAPP">Click to run the secondlife:// command</string>
 	<string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
+
+	<!-- text for SLURL labels -->
+	<string name="SLurlLabelTeleport">Teleport to</string>
+	<string name="SLurlLabelShowOnMap">Show Map for</string>
 	
 	<!-- ButtonToolTips, llfloater.cpp -->
 	<string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
@@ -2042,9 +2047,6 @@ this texture in your inventory
 	<!-- panel contents -->
 	<string name="PanelContentsNewScript">New Script</string>
 	
-	<!-- panel avatar -->
-	<!-- <string name="None">None</string>	Duplicate-->
-	
 	<!-- Mute -->
 	<string name="MuteByName">(by name)</string>
 	<string name="MuteAgent">(resident)</string>
@@ -2301,9 +2303,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Body Thick">Body Thick</string>
 <string name="Body Thickness">Body Thickness</string>
 <string name="Body Thin">Body Thin</string>
-<string name="Bottom">Bottom</string>
-<string name="Bottom Left">Bottom Left</string>
-<string name="Bottom Right">Bottom Right</string>
 
 <string name="Bow Legged">Bow Legged</string>
 <string name="Breast Buoyancy">Breast Buoyancy</string>
@@ -2325,13 +2324,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="no bustle">No Bustle</string>
 <string name="more bustle">More Bustle</string>
 
-<string name="Center">Center</string>
-<string name="Center 2">Center 2</string>
 <string name="Chaplin">Chaplin</string>
 <string name="Cheek Bones">Cheek Bones</string>
-<string name="Chest">Chest</string>
 <string name="Chest Size">Chest Size</string>
-<string name="Chin">Chin</string>
 <string name="Chin Angle">Chin Angle</string>
 <string name="Chin Cleft">Chin Cleft</string>
 <string name="Chin Curtains">Chin Curtains</string>
@@ -2495,22 +2490,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Jowls">Jowls</string>
 <string name="Knee Angle">Knee Angle</string>
 <string name="Knock Kneed">Knock Kneed</string>
-<string name="L Forearm">L Forearm</string>
-<string name="L Lower Leg">L Lower Leg</string>
-<string name="L Upper Arm">L Upper Arm</string>
-<string name="L Upper Leg">L Upper Leg</string>
 
 <string name="Large">Large</string>
 <string name="Large Hands">Large Hands</string>
-<string name="Left">Left</string>
-<string name="Left Ear">Left Ear</string>
-<string name="Left Eyeball">Left Eyeball</string>
-<string name="Left Foot">Left Foot</string>
-<string name="Left Hand">Left Hand</string>
-<string name="Left Hip">Left Hip</string>
 <string name="Left Part">Left Part</string>
-<string name="Left Pec">Left Pec</string>
-<string name="Left Shoulder">Left Shoulder</string>
 <string name="Leg Length">Leg Length</string>
 <string name="Leg Muscles">Leg Muscles</string>
 <string name="Less">Less</string>
@@ -2528,7 +2511,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Less Square">Less Square</string>
 <string name="Less Volume">Less Volume</string>
 <string name="Less soul">Less soul</string>
-<string name="Light">Light</string>
 <string name="Lighter">Lighter</string>
 <string name="Lip Cleft">Lip Cleft</string>
 <string name="Lip Cleft Depth">Lip Cleft Depth</string>
@@ -2591,7 +2573,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="More soul">More soul</string>
 <string name="Moustache">Moustache</string>
 
-<string name="Mouth">Mouth</string>
 <string name="Mouth Corner">Mouth Corner</string>
 <string name="Mouth Position">Mouth Position</string>
 <string name="Mowhawk">Mowhawk</string>
@@ -2619,10 +2600,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="No Spikes">No Spikes</string>
 <string name="No White">No White</string>
 <string name="No Wrinkles">No Wrinkles</string>
-<string name="None">None</string>
 <string name="Normal Lower">Normal Lower</string>
 <string name="Normal Upper">Normal Upper</string>
-<string name="Nose">Nose</string>
 <string name="Nose Left">Nose Left</string>
 <string name="Nose Right">Nose Right</string>
 <string name="Nose Size">Nose Size</string>
@@ -2662,7 +2641,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Part">Part</string>
 <string name="Part Bangs">Part Bangs</string>
 <string name="Pectorals">Pectorals</string>
-<string name="Pelvis">Pelvis</string>
 <string name="Pigment">Pigment</string>
 <string name="Pigtails">Pigtails</string>
 <string name="Pink">Pink</string>
@@ -2678,24 +2656,12 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Pop Right Eye">Pop Right Eye</string>
 <string name="Puffy">Puffy</string>
 <string name="Puffy Eyelids">Puffy Eyelids</string>
-<string name="R Forearm">R Forearm</string>
-<string name="R Lower Leg">R Lower Leg</string>
-<string name="R Upper Arm">R Upper Arm</string>
-<string name="R Upper Leg">R Upper Leg</string>
 <string name="Rainbow Color">Rainbow Color</string>
 <string name="Red Hair">Red Hair</string>
 <string name="Red Skin">Red Skin</string>
 <string name="Regular">Regular</string>
 <string name="Regular Muscles">Regular Muscles</string>
-<string name="Right">Right</string>
-<string name="Right Ear">Right Ear</string>
-<string name="Right Eyeball">Right Eyeball</string>
-<string name="Right Foot">Right Foot</string>
-<string name="Right Hand">Right Hand</string>
-<string name="Right Hip">Right Hip</string>
 <string name="Right Part">Right Part</string>
-<string name="Right Pec">Right Pec</string>
-<string name="Right Shoulder">Right Shoulder</string>
 <string name="Rosy Complexion">Rosy Complexion</string>
 <string name="Round">Round</string>
 <string name="Round Forehead">Round Forehead</string>
@@ -2752,7 +2718,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Skinny Neck">Skinny Neck</string>
 <string name="Skirt Fit">Skirt Fit</string>
 <string name="Skirt Length">Skirt Length</string>
-<string name="Skull">Skull</string>
 <string name="Slanted Forehead">Slanted Forehead</string>
 <string name="Sleeve Length">Sleeve Length</string>
 
@@ -2775,12 +2740,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 
 <string name="Sparse">Sparse</string>
 <string name="Spiked Hair">Spiked Hair</string>
-<string name="Spine">Spine</string>
 <string name="Square">Square</string>
 <string name="Square Toe">Square Toe</string>
 <string name="Squash Head">Squash Head</string>
 <string name="Squash/Stretch Head">Squash/Stretch Head</string>
-<string name="Stomach">Stomach</string>
 <string name="Stretch Head">Stretch Head</string>
 <string name="Sunken">Sunken</string>
 <string name="Sunken Chest">Sunken Chest</string>
@@ -2812,9 +2775,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Tilt Right">Tilt Right</string>
 <string name="Toe Shape">Toe Shape</string>
 <string name="Toe Thickness">Toe Thickness</string>
-<string name="Top">Top</string>
-<string name="Top Left">Top Left</string>
-<string name="Top Right">Top Right</string>
 <string name="Torso Length">Torso Length</string>
 <string name="Torso Muscles">Torso Muscles</string>
 <string name="Torso Scrawny">Torso Scrawny</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/combo_box.xml b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
index 9ed3749308bfdbbedecc8d5670417e58af06e35b..fa3cb9275ec9afb9f9f76c386811fbe86a139686 100644
--- a/indra/newview/skins/default/xui/en/widgets/combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
@@ -4,7 +4,6 @@
            max_chars="20"
            follows="right|top">
   <combo_box.combo_button name="Combobox Button"
-                          label=""
                           hover_glow_amount="0.15"
                           font="SansSerifSmall"
                           scale_image="false"
@@ -12,7 +11,6 @@
                           image_selected="ComboButton_Selected"
                           image_disabled="ComboButton_Disabled" />
   <combo_box.drop_down_button name="Drop Down Button"
-                              label=""
                               hover_glow_amount="0.15"
                               font="SansSerifSmall"
                               scale_image="true"
diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
index ab4ad940893a8819ad6e0f585ee0a29ecfd1f2d9..6171be034f4b440171101213fe9fae9879089a33 100644
--- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml
@@ -15,14 +15,14 @@
                           image_disabled_selected="ComboButton_Disabled_Selected" />
   <gesture_combo_box.drop_down_button name="Drop Down Button"
                               label=""
+                              halign="center"
                               hover_glow_amount="0.15"
                               font="SansSerif"
                               scale_image="true"
-                              pad_right="24"
-                              image_unselected="DropDown_Off"
-                              image_selected="DropDown_Selected"
-                              image_disabled="DropDown_Disabled"
-                              image_disabled_selected="DropDown_Disabled_Selected" />
+                              image_unselected="PushButton_Off"
+                              image_selected="PushButton_Selected"
+                              image_disabled="PushButton_Disabled"
+                              image_disabled_selected="PushButton_Selected_Disabled" />
   <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
                                 scroll_bar_bg_visible="true" />
   <gesture_combo_box.combo_editor name="Combo Text Entry"
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index f2e48c517d8a9797ab5ffb11328e74faf990da4f..d88bcfab1d7b6445f114247b1d8f9c204534a3e5 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -20,7 +20,6 @@
                 allow_new_values="true"
                 >
   <info_button name="Place Information"
-                          label=""
                           width="16"
                           height="16"
                           follows="left|top"
@@ -30,7 +29,6 @@
                           image_disabled_selected="Info_Off"
                           image_disabled="Info_Off" />
   <add_landmark_button name="Add Landmark"
-                          label=""
                           hover_glow_amount="0.15"
                           image_hover_selected="Favorite_Star_Over"
                           image_hover_unselected="Favorite_Star_Over"
diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
index f482ff3b894d7b504959571ce0d2c58520f45a77..9a79243b0335dfdcf17c7a3274703bfe72714ffe 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
@@ -7,14 +7,14 @@
   background_image="TextField_Search_Off"
   background_image_disabled="TextField_Search_Disabled"
   background_image_focused="TextField_Search_Active" >
-  <search_button label=""
+  <search_button 
     top_pad="4"
     left_pad="4" 
     width="13"
     height="13" 
 	  image_unselected="Search"
 	  image_selected="Search" />
-  <clear_button label=""
+  <clear_button 
    image_unselected="Icon_Close_Foreground"
    image_selected="Icon_Close_Press" />
 </search_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index fe2f1423b74a284c8a0c7adc507d30ff840a76ad..f1401140deba3b7d952e38a176a54d690769ecd6 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -2,6 +2,7 @@
 <tab_container tab_min_width="60"
                tab_max_width="150"
                font_halign="center"
+               font="SansSerif" 
                tab_height="21">
   <first_tab tab_top_image_unselected="TabTop_Left_Off"
                tab_top_image_selected="TabTop_Left_Selected"
diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
new file mode 100644
index 0000000000000000000000000000000000000000..725492052ca3fc7a4544e15739549370fa9af40b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Derives from LLUICtrl -->
+<talk_button>
+  <!-- To make speak button look green when selected set:
+    image_selected="SegmentedBtn_Left_Selected"
+    image_unselected="SegmentedBtn_Left_Off"
+  -->
+  <speak_button
+    name="left"
+    label="Speak"
+    label_selected="Speak"
+    font="SansSerifSmall"
+    tab_stop="false"
+    is_toggle="true"
+    picture_style="true"
+    />
+  <show_button
+    name="right"
+    label=""
+    left="0"
+    top="0"
+    right="20"
+    bottom="0"
+    tab_stop="false"
+    is_toggle="true"
+    picture_style="true"
+    image_selected="ComboButton_Selected"
+    image_unselected="ComboButton_Off"
+    />
+  <monitor
+    name="monitor"
+    left="0"
+    top="18"
+    right="18"
+    bottom="0"
+    />
+</talk_button>
diff --git a/indra/newview/skins/default/xui/es/floater_script_debug.xml b/indra/newview/skins/default/xui/es/floater_script_debug.xml
index e33ffb7d96ec28736837582b4c7d81b8aa1701a8..e9b66c74d20a71938846633b79efb772e6182dc4 100644
--- a/indra/newview/skins/default/xui/es/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/es/floater_script_debug.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <multi_floater name="script debug floater" title="Alerta/Error de los scripts">
 	<tab_container name="Preview Tabs">
-		<floater label="Script" name="all_scripts" title="[Todos los scripts]"/>
+		<floater label="Script" name="all_scripts" title="[All scripts]"/>
 	</tab_container>
 </multi_floater>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_profile.xml b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
index bcf4128e01ff20b0531174fc5032f3954b748809..c12dd8d58c1dab2d93e3f65294d0908f72ae52e7 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Residente" />
-   <string name="AcctTypeTrial"
-    value="Prueba" />
-   <string name="AcctTypeCharterMember"
-    value="Miembro fundador" />
-   <string name="AcctTypeEmployee"
-    value="Empleado de Linden Lab" />
-   <string name="PaymentInfoUsed"
-    value="Ha usado una forma de pago" />
-   <string name="PaymentInfoOnFile"
-    value="Hay infor. de la forma de pago" />
-   <string name="NoPaymentInfoOnFile"
-    value="Sin infor. de la forma de pago" />
-   <string name="AgeVerified"
-    value="Edad verificada" />
-   <string name="NotAgeVerified"
-    value="Edad no verificada" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=es
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Compañero/a:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Mensaje en el estado ocupado:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Residente" />
+   <string name="AcctTypeTrial"
+    value="Prueba" />
+   <string name="AcctTypeCharterMember"
+    value="Miembro fundador" />
+   <string name="AcctTypeEmployee"
+    value="Empleado de Linden Lab" />
+   <string name="PaymentInfoUsed"
+    value="Ha usado una forma de pago" />
+   <string name="PaymentInfoOnFile"
+    value="Hay infor. de la forma de pago" />
+   <string name="NoPaymentInfoOnFile"
+    value="Sin infor. de la forma de pago" />
+   <string name="AgeVerified"
+    value="Edad verificada" />
+   <string name="NotAgeVerified"
+    value="Edad no verificada" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=es
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Compañero/a:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Mensaje en el estado ocupado:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
index f62ea7c80fb753f1b377ddf34288d223a024dd5f..3a1585bce297a350826ce695b52a559d9e5de370 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Résident" />
-   <string name="AcctTypeTrial"
-    value="Essai" />
-   <string name="AcctTypeCharterMember"
-    value="Membre originaire" />
-   <string name="AcctTypeEmployee"
-    value="Employé(e) de Linden Lab" />
-   <string name="PaymentInfoUsed"
-    value="Infos de paiement utilisées" />
-   <string name="PaymentInfoOnFile"
-    value="Infos de paiement enregistrées" />
-   <string name="NoPaymentInfoOnFile"
-    value="Aucune info de paiement" />
-   <string name="AgeVerified"
-    value="Âge vérifié" />
-   <string name="NotAgeVerified"
-    value="Âge non vérifié" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=fr
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partenaire :"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Réponse si occupé(e) :
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Résident" />
+   <string name="AcctTypeTrial"
+    value="Essai" />
+   <string name="AcctTypeCharterMember"
+    value="Membre originaire" />
+   <string name="AcctTypeEmployee"
+    value="Employé(e) de Linden Lab" />
+   <string name="PaymentInfoUsed"
+    value="Infos de paiement utilisées" />
+   <string name="PaymentInfoOnFile"
+    value="Infos de paiement enregistrées" />
+   <string name="NoPaymentInfoOnFile"
+    value="Aucune info de paiement" />
+   <string name="AgeVerified"
+    value="Âge vérifié" />
+   <string name="NotAgeVerified"
+    value="Âge non vérifié" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=fr
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partenaire :"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Réponse si occupé(e) :
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/floater_script_debug.xml b/indra/newview/skins/default/xui/it/floater_script_debug.xml
index 39736dde673fe194b5b4fb404687e2a70a8e1815..66e0af264f0dde9c86b2c3112d2499898ca4b60a 100644
--- a/indra/newview/skins/default/xui/it/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/it/floater_script_debug.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <multi_floater name="script debug floater" title="Avvisi/Errori Script">
 	<tab_container name="Preview Tabs">
-		<floater label="Script" name="all_scripts" title="[Tutti gli script]"/>
+		<floater label="Script" name="all_scripts" title="[All scripts]"/>
 	</tab_container>
 </multi_floater>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_profile.xml b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
index 0eba7bf3b69d43b70e41ed5e9f5f1a5c16152e6b..33f3c367c2e8eb7e8cc635035a94e642d14ad1cf 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Residente" />
-   <string name="AcctTypeTrial"
-    value="Prova" />
-   <string name="AcctTypeCharterMember"
-    value="Membro privilegiato" />
-   <string name="AcctTypeEmployee"
-    value="Impiegato della Linden Lab" />
-   <string name="PaymentInfoUsed"
-    value="Info. di pagamento usate" />
-   <string name="PaymentInfoOnFile"
-    value="Info. di pagamento in archivio" />
-   <string name="NoPaymentInfoOnFile"
-    value="Nessuna info. di pagamento" />
-   <string name="AgeVerified"
-    value="Età verificata" />
-   <string name="NotAgeVerified"
-    value="Età non verificata" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=it
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partner:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Risposta agli IM quando sono in &apos;Occupato&apos;:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Residente" />
+   <string name="AcctTypeTrial"
+    value="Prova" />
+   <string name="AcctTypeCharterMember"
+    value="Membro privilegiato" />
+   <string name="AcctTypeEmployee"
+    value="Impiegato della Linden Lab" />
+   <string name="PaymentInfoUsed"
+    value="Info. di pagamento usate" />
+   <string name="PaymentInfoOnFile"
+    value="Info. di pagamento in archivio" />
+   <string name="NoPaymentInfoOnFile"
+    value="Nessuna info. di pagamento" />
+   <string name="AgeVerified"
+    value="Età verificata" />
+   <string name="NotAgeVerified"
+    value="Età non verificata" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=it
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partner:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Risposta agli IM quando sono in &apos;Occupato&apos;:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
index ca4ab3e773f09869bfb79424b2272b227009991c..2cf8456187f9d69f6fa168bdd35dd09a5a89290c 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="住人" />
-   <string name="AcctTypeTrial"
-    value="トライアル" />
-   <string name="AcctTypeCharterMember"
-    value="特権メンバー" />
-   <string name="AcctTypeEmployee"
-    value="Linden Lab従業員" />
-   <string name="PaymentInfoUsed"
-    value="支払い情報登録済" />
-   <string name="PaymentInfoOnFile"
-    value="支払い情報登録済み" />
-   <string name="NoPaymentInfoOnFile"
-    value="支払い情報未登録" />
-   <string name="AgeVerified"
-    value="年齢確認済み" />
-   <string name="NotAgeVerified"
-    value="年齢未確認" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=ja
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="パートナー:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	取り込み中応答メッセージ:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="住人" />
+   <string name="AcctTypeTrial"
+    value="トライアル" />
+   <string name="AcctTypeCharterMember"
+    value="特権メンバー" />
+   <string name="AcctTypeEmployee"
+    value="Linden Lab従業員" />
+   <string name="PaymentInfoUsed"
+    value="支払い情報登録済" />
+   <string name="PaymentInfoOnFile"
+    value="支払い情報登録済み" />
+   <string name="NoPaymentInfoOnFile"
+    value="支払い情報未登録" />
+   <string name="AgeVerified"
+    value="年齢確認済み" />
+   <string name="NotAgeVerified"
+    value="年齢未確認" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=ja
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="パートナー:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	取り込み中応答メッセージ:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/nl/floater_script_debug.xml b/indra/newview/skins/default/xui/nl/floater_script_debug.xml
index 306ad5d1a3d1e08c9095625d45d3d4f21fe1e179..df9531473e41fa487ede250eea9d32eacbdfdfa6 100644
--- a/indra/newview/skins/default/xui/nl/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/nl/floater_script_debug.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <multi_floater name="script debug floater" title="Script waarschuwing/fout">
 	<tab_container name="Preview Tabs">
-		<floater label="Script" name="all_scripts" title="[Alle scripts]"/>
+		<floater label="Script" name="all_scripts" title="[All scripts]"/>
 	</tab_container>
 </multi_floater>
diff --git a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
index 00f8c087de94185cc423c228fe2d6e4476ddfa1c..172395e20a27b6ca938f09d58240b33ee8ac636e 100644
--- a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Inwoner" />
-   <string name="AcctTypeTrial"
-    value="Proef" />
-   <string name="AcctTypeCharterMember"
-    value="Charter lid" />
-   <string name="AcctTypeEmployee"
-    value="Linden Lab werknemer" />
-   <string name="PaymentInfoUsed"
-    value="Betalingsinformatie gebruikt" />
-   <string name="PaymentInfoOnFile"
-    value="Betalingsinformatie aanwezig" />
-   <string name="NoPaymentInfoOnFile"
-    value="Geen betalingsinfo aanwezig" />
-   <string name="AgeVerified"
-    value="Leeftijd geverifieerd" />
-   <string name="NotAgeVerified"
-    value="Leeftijd niet geverifieerd" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=nl
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partner:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Antwoord bij Niet Storen:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Inwoner" />
+   <string name="AcctTypeTrial"
+    value="Proef" />
+   <string name="AcctTypeCharterMember"
+    value="Charter lid" />
+   <string name="AcctTypeEmployee"
+    value="Linden Lab werknemer" />
+   <string name="PaymentInfoUsed"
+    value="Betalingsinformatie gebruikt" />
+   <string name="PaymentInfoOnFile"
+    value="Betalingsinformatie aanwezig" />
+   <string name="NoPaymentInfoOnFile"
+    value="Geen betalingsinfo aanwezig" />
+   <string name="AgeVerified"
+    value="Leeftijd geverifieerd" />
+   <string name="NotAgeVerified"
+    value="Leeftijd niet geverifieerd" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=nl
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partner:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Antwoord bij Niet Storen:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
index e449a92d7e58796c1339edb9b4d6afa48f3b3768..97fa3118f8fd4c45c57c3f863e1adbfdfc933b7e 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Rezydent" />
-   <string name="AcctTypeTrial"
-    value="Próbne" />
-   <string name="AcctTypeCharterMember"
-    value="Członek-zalożyciel" />
-   <string name="AcctTypeEmployee"
-    value="Pracownik Linden Lab" />
-   <string name="PaymentInfoUsed"
-    value="Dane Konta Używane" />
-   <string name="PaymentInfoOnFile"
-    value="Dane Konta Dostępne" />
-   <string name="NoPaymentInfoOnFile"
-    value="Brak Danych Konta" />
-   <string name="AgeVerified"
-    value="Wiek Zweryfikowany" />
-   <string name="NotAgeVerified"
-    value="Brak Weryfikacji Wieku" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=pl
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Partner:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Pracuś Mówi:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Rezydent" />
+   <string name="AcctTypeTrial"
+    value="Próbne" />
+   <string name="AcctTypeCharterMember"
+    value="Członek-zalożyciel" />
+   <string name="AcctTypeEmployee"
+    value="Pracownik Linden Lab" />
+   <string name="PaymentInfoUsed"
+    value="Dane Konta Używane" />
+   <string name="PaymentInfoOnFile"
+    value="Dane Konta Dostępne" />
+   <string name="NoPaymentInfoOnFile"
+    value="Brak Danych Konta" />
+   <string name="AgeVerified"
+    value="Wiek Zweryfikowany" />
+   <string name="NotAgeVerified"
+    value="Brak Weryfikacji Wieku" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=pl
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Partner:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Pracuś Mówi:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_debug.xml b/indra/newview/skins/default/xui/pt/floater_script_debug.xml
index 48c73b93a3e9b26ce977045e1e25e44269b96921..d7a9bc6f879136b26212cf048a0cdbf48da48a25 100644
--- a/indra/newview/skins/default/xui/pt/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/pt/floater_script_debug.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <multi_floater name="script debug floater" title="Aviso de script/erro">
 	<tab_container name="Preview Tabs">
-		<floater label="Script" name="all_scripts" title="[Todos os scripts]"/>
+		<floater label="Script" name="all_scripts" title="[All scripts]"/>
 	</tab_container>
 </multi_floater>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
index e97e77cfe6f69cbe1fd9f6da732f0e9f216ccc60..a989cab16718680136f46cdac23e7ab24f6354f9 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
-   <string name="CaptionTextAcctInfo">
-       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
-   </string>
-   <string name="AcctTypeResident"
-    value="Residente" />
-   <string name="AcctTypeTrial"
-    value="Teste" />
-   <string name="AcctTypeCharterMember"
-    value="Estatuto do membro" />
-   <string name="AcctTypeEmployee"
-    value="Contratado da Linden Lab" />
-   <string name="PaymentInfoUsed"
-    value="Infor. de pagamento utilizadas" />
-   <string name="PaymentInfoOnFile"
-    value="Infor. de pagamento no arquivo" />
-   <string name="NoPaymentInfoOnFile"
-    value="Sem infor. de pagamento no arquivo" />
-   <string name="AgeVerified"
-    value="Idade Verificada" />
-   <string name="NotAgeVerified"
-    value="Idade não Verificada" />
-   <string name="partner_edit_link_url">
-       http://www.secondlife.com/account/partners.php?lang=pt
-   </string>
-    <panel name="scroll_content_panel">
-    <panel name="data_panel" >
-     <panel name="lifes_images_panel">
-          <panel name="second_life_image_panel">
-              <text name="second_life_photo_title_text">
-			[SECOND_LIFE]:
-              </text>
-          </panel>
-      </panel>
-        <text name="title_partner_text" value="Parceiro:"/>
-        <panel name="partner_data_panel">
-            <text name="partner_text" value="[FIRST] [LAST]"/>
-         </panel>
-      <text name="text_box3">
-	Resposta no Modo Ocupado:
-      </text>
-    </panel>
-    </panel>
-</panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel name="edit_profile_panel">
+   <string name="CaptionTextAcctInfo">
+       [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+   </string>
+   <string name="AcctTypeResident"
+    value="Residente" />
+   <string name="AcctTypeTrial"
+    value="Teste" />
+   <string name="AcctTypeCharterMember"
+    value="Estatuto do membro" />
+   <string name="AcctTypeEmployee"
+    value="Contratado da Linden Lab" />
+   <string name="PaymentInfoUsed"
+    value="Infor. de pagamento utilizadas" />
+   <string name="PaymentInfoOnFile"
+    value="Infor. de pagamento no arquivo" />
+   <string name="NoPaymentInfoOnFile"
+    value="Sem infor. de pagamento no arquivo" />
+   <string name="AgeVerified"
+    value="Idade Verificada" />
+   <string name="NotAgeVerified"
+    value="Idade não Verificada" />
+   <string name="partner_edit_link_url">
+       http://www.secondlife.com/account/partners.php?lang=pt
+   </string>
+    <panel name="scroll_content_panel">
+    <panel name="data_panel" >
+     <panel name="lifes_images_panel">
+          <panel name="second_life_image_panel">
+              <text name="second_life_photo_title_text">
+			[SECOND_LIFE]:
+              </text>
+          </panel>
+      </panel>
+        <text name="title_partner_text" value="Parceiro:"/>
+        <panel name="partner_data_panel">
+            <text name="partner_text" value="[FIRST] [LAST]"/>
+         </panel>
+      <text name="text_box3">
+	Resposta no Modo Ocupado:
+      </text>
+    </panel>
+    </panel>
+</panel>
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index 009be35f641390be0b032aaee9355d0c85694733..d31a81e1280ae0f5be8087fee28d218cf56db24a 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -1,423 +1,423 @@
-/**
- * @file   lllogininstance_test.cpp
- * @brief  Test for lllogininstance.cpp.
- * 
- * $LicenseInfo:firstyear=2008&license=internal$
- * Copyright (c) 2008, Linden Research, Inc.
- * $/LicenseInfo$
- */
-
-// Precompiled header
-#include "../llviewerprecompiledheaders.h"
-// Own header
-#include "../lllogininstance.h"
-// STL headers
-// std headers
-// external library headers
-// other Linden headers
-#include "../test/lltut.h"
-#include "llevents.h"
-
-#if defined(LL_WINDOWS)
-#pragma warning(disable: 4355)      // using 'this' in base-class ctor initializer expr
-#endif
-
-// Constants
-const std::string VIEWERLOGIN_URI("viewerlogin_uri");
-const std::string VIEWERLOGIN_GRIDLABEL("viewerlogin_grid");
-
-const std::string APPVIEWER_SERIALNUMBER("appviewer_serialno");
-
-// Link seams.
-
-//-----------------------------------------------------------------------------
-static LLEventStream gTestPump("test_pump");
-
-#include "lllogin.h"
-static std::string gLoginURI;
-static LLSD gLoginCreds;
-static bool gDisconnectCalled = false;
-class LLLogin::Impl
-{
-};
-LLLogin::LLLogin() {}
-LLLogin::~LLLogin() {}
-LLEventPump& LLLogin::getEventPump() { return gTestPump; }
-void LLLogin::connect(const std::string& uri, const LLSD& credentials) 
-{
-	gLoginURI = uri;
-	gLoginCreds = credentials;
-}
-
-void LLLogin::disconnect() 
-{
-	gDisconnectCalled = true;
-}
-
-//-----------------------------------------------------------------------------
-#include "../llviewernetwork.h"
-unsigned char gMACAddress[MAC_ADDRESS_BYTES] = {'1','2','3','4','5','6'};		/* Flawfinder: ignore */
-
-LLViewerLogin::LLViewerLogin() {}
-LLViewerLogin::~LLViewerLogin() {}
-void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const 
-{
-	uris.push_back(VIEWERLOGIN_URI);
-}
-std::string LLViewerLogin::getGridLabel() const { return VIEWERLOGIN_GRIDLABEL; }
-
-//-----------------------------------------------------------------------------
-#include "../llviewercontrol.h"
-LLControlGroup gSavedSettings("Global");
-std::string gCurrentVersion = "invalid_version";
-
-LLControlGroup::LLControlGroup(const std::string& name) :
-	LLInstanceTracker<LLControlGroup, std::string>(name){}
-LLControlGroup::~LLControlGroup() {}
-void LLControlGroup::setBOOL(const std::string& name, BOOL val) {}
-BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; }
-U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only) { return 1; }
-void LLControlGroup::setString(const std::string& name, const std::string& val) {}
-std::string LLControlGroup::getString(const std::string& name) { return "test_string"; }
-BOOL LLControlGroup::declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, BOOL persist) { return TRUE; }
-BOOL LLControlGroup::declareString(const std::string& name, const std::string &initial_val, const std::string& comment, BOOL persist) { return TRUE; }
-
-#include "lluicolortable.h"
-void LLUIColorTable::saveUserSettings(void)const {}
-
-//-----------------------------------------------------------------------------
-#include "../llurlsimstring.h"
-LLURLSimString LLURLSimString::sInstance;
-bool LLURLSimString::parse() { return true; }
-
-//-----------------------------------------------------------------------------
-#include "llnotifications.h"
-#include "llfloaterreg.h"
-static std::string gTOSType;
-static LLEventPump * gTOSReplyPump = NULL;
-
-//static
-LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus)
-{
-	gTOSType = name;
-	gTOSReplyPump = &LLEventPumps::instance().obtain(key["reply_pump"]);
-	return NULL;
-}
-
-//-----------------------------------------------------------------------------
-// LLNotifications
-class MockNotifications : public LLNotificationsInterface
-{
-	boost::function<void (const LLSD&, const LLSD&)> mResponder;
-	int mAddedCount;
-
-public: 
-	MockNotifications() :
-		mResponder(0),
-		mAddedCount(0)
-	{
-	}
-
-	virtual ~MockNotifications() {}
-
-	/* virtual */ LLNotificationPtr add(
-					const std::string& name,
-					const LLSD& substitutions,
-					const LLSD& payload, 
-					LLNotificationFunctorRegistry::ResponseFunctor functor)
-	{
-		mResponder = functor;
-		mAddedCount++;
-		return LLNotificationPtr((LLNotification*)NULL);
-	}
-
-	void sendYesResponse()
-	{
-		LLSD notification;
-		LLSD response;
-		response = 1;
-		mResponder(notification, response);
-	}
-
-	void sendNoResponse()
-	{
-		LLSD notification;
-		LLSD response;
-		response = 2;
-		mResponder(notification, response);
-	}
-
-	void sendBogusResponse()
-	{
-		LLSD notification;
-		LLSD response;
-		response = 666;
-		mResponder(notification, response);
-	}
-
-	int addedCount() { return mAddedCount; }
-};
-
-S32 LLNotification::getSelectedOption(const LLSD& notification, const LLSD& response)
-{
-	return response.asInteger();
-}
-
-// misc
-std::string xml_escape_string(const std::string& in)
-{
-	return in;
-}
-
-/*****************************************************************************
-*   TUT
-*****************************************************************************/
-namespace tut
-{
-    struct lllogininstance_data
-    {
-		lllogininstance_data() : logininstance(LLLoginInstance::getInstance())
-		{
-			// Global initialization
-			gLoginURI.clear();
-			gLoginCreds.clear();
-			gDisconnectCalled = false;
-
-			gTOSType = ""; // Set to invalid value.
-			gTOSReplyPump = 0; // clear the callback.
-
-
-			gSavedSettings.declareBOOL("NoInventoryLibrary", FALSE, "", FALSE);
-			gSavedSettings.declareBOOL("ConnectAsGod", FALSE, "", FALSE);
-			gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "", FALSE);
-			gSavedSettings.declareBOOL("ForceMandatoryUpdate", FALSE, "", FALSE);
-			gSavedSettings.declareString("ClientSettingsFile", "test_settings.xml", "", FALSE);
-			gSavedSettings.declareString("VersionChannelName", "test_version_string", "", FALSE);
-			gSavedSettings.declareString("NextLoginLocation", "", "", FALSE);
-			gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", FALSE);
-
-			credentials["first"] = "testfirst";
-			credentials["last"] = "testlast";
-			credentials["passwd"] = "testpass";
-
-			logininstance->setNotificationsInterface(&notifications);
-		}
-
-		LLLoginInstance* logininstance;
-		LLSD credentials;
-		MockNotifications notifications;
-    };
-
-    typedef test_group<lllogininstance_data> lllogininstance_group;
-    typedef lllogininstance_group::object lllogininstance_object;
-    lllogininstance_group llsdmgr("lllogininstance");
-
-    template<> template<>
-    void lllogininstance_object::test<1>()
-    {
-		set_test_name("Test Simple Success And Disconnect");
-
-		// Test default connect.
-		logininstance->connect(credentials);
-
-		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
-
-		// Dummy success response.
-		LLSD response;
-		response["state"] = "online";
-		response["change"] = "connect";
-		response["progress"] = 1.0;
-		response["transfer_rate"] = 7;
-		response["data"] = "test_data";
-
-		gTestPump.post(response);
-
-		ensure("Success response", logininstance->authSuccess());
-		ensure_equals("Test Response Data", logininstance->getResponse().asString(), "test_data");
-
-		logininstance->disconnect();
-
-		ensure_equals("Called Login Module Disconnect", gDisconnectCalled, true);
-
-		response.clear();
-		response["state"] = "offline";
-		response["change"] = "disconnect";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 0;
-		response["data"] = "test_data";
-
-		gTestPump.post(response);
-
-		ensure("Disconnected", !(logininstance->authSuccess()));
-    }
-
-    template<> template<>
-    void lllogininstance_object::test<2>()
-    {
-		set_test_name("Test User TOS/Critical message Interaction");
-
-		const std::string test_uri = "testing-uri";
-
-		// Test default connect.
-		logininstance->connect(test_uri, credentials);
-
-		// connect should call LLLogin::connect to init gLoginURI and gLoginCreds.
-		ensure_equals("Default connect uri", gLoginURI, "testing-uri"); 
-		ensure_equals("Default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false);
-		ensure_equals("Default for read critical", gLoginCreds["params"]["read_critical"].asBoolean(), false);
-
-		// TOS failure response.
-		LLSD response;
-		response["state"] = "offline";
-		response["change"] = "fail.login";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 7;
-		response["data"]["reason"] = "tos";
-		gTestPump.post(response);
-
-		ensure_equals("TOS Dialog type", gTOSType, "message_tos");
-		ensure("TOS callback given", gTOSReplyPump != 0);
-		gTOSReplyPump->post(false); // Call callback denying TOS.
-		ensure("No TOS, failed auth", logininstance->authFailure());
-
-		// Start again.
-		logininstance->connect(test_uri, credentials);
-		gTestPump.post(response); // Fail for tos again.
-		gTOSReplyPump->post(true); // Accept tos, should reconnect w/ agree_to_tos.
-		ensure_equals("Accepted agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), true);
-		ensure("Incomplete login status", !logininstance->authFailure() && !logininstance->authSuccess());
-	
-		// Fail connection, attempt connect again.
-		// The new request should have reset agree to tos to default.
-		response["data"]["reason"] = "key"; // bad creds.
-		gTestPump.post(response);
-		ensure("TOS auth failure", logininstance->authFailure());
-
-		logininstance->connect(test_uri, credentials);
-		ensure_equals("Reset to default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false);
-
-		// Critical Message failure response.
-		logininstance->connect(test_uri, credentials);
-		response["data"]["reason"] = "critical"; // Change response to "critical message"
-		gTestPump.post(response);
-
-		ensure_equals("TOS Dialog type", gTOSType, "message_critical");
-		ensure("TOS callback given", gTOSReplyPump != 0);
-		gTOSReplyPump->post(true); 
-		ensure_equals("Accepted read critical message", gLoginCreds["params"]["read_critical"].asBoolean(), true);
-		ensure("Incomplete login status", !logininstance->authFailure() && !logininstance->authSuccess());
-
-		// Fail then attempt new connection
-		response["data"]["reason"] = "key"; // bad creds.
-		gTestPump.post(response);
-		ensure("TOS auth failure", logininstance->authFailure());
-		logininstance->connect(test_uri, credentials);
-		ensure_equals("Default for agree to tos", gLoginCreds["params"]["read_critical"].asBoolean(), false);
-	}
-
-    template<> template<>
-    void lllogininstance_object::test<3>()
-    {
-		set_test_name("Test Mandatory Update User Accepts");
-
-		// Part 1 - Mandatory Update, with User accepts response.
-		// Test connect with update needed.
-		logininstance->connect(credentials);
-
-		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
-
-		// Update needed failure response.
-		LLSD response;
-		response["state"] = "offline";
-		response["change"] = "fail.login";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 7;
-		response["data"]["reason"] = "update";
-		gTestPump.post(response);
-
-		ensure_equals("Notification added", notifications.addedCount(), 1);
-
-		notifications.sendYesResponse();
-
-		ensure("Disconnected", !(logininstance->authSuccess()));
-	}
-
-	template<> template<>
-    void lllogininstance_object::test<4>()
-    {
-		set_test_name("Test Mandatory Update User Decline");
-
-		// Test connect with update needed.
-		logininstance->connect(credentials);
-
-		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
-
-		// Update needed failure response.
-		LLSD response;
-		response["state"] = "offline";
-		response["change"] = "fail.login";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 7;
-		response["data"]["reason"] = "update";
-		gTestPump.post(response);
-
-		ensure_equals("Notification added", notifications.addedCount(), 1);
-		notifications.sendNoResponse();
-
-		ensure("Disconnected", !(logininstance->authSuccess()));
-	}
-
-	template<> template<>
-    void lllogininstance_object::test<6>()
-    {
-		set_test_name("Test Optional Update User Accept");
-
-		// Part 3 - Mandatory Update, with bogus response.
-		// Test connect with update needed.
-		logininstance->connect(credentials);
-
-		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
-
-		// Update needed failure response.
-		LLSD response;
-		response["state"] = "offline";
-		response["change"] = "fail.login";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 7;
-		response["data"]["reason"] = "optional";
-		gTestPump.post(response);
-
-		ensure_equals("Notification added", notifications.addedCount(), 1);
-		notifications.sendYesResponse();
-
-		ensure("Disconnected", !(logininstance->authSuccess()));
-	}
-
-	template<> template<>
-    void lllogininstance_object::test<7>()
-    {
-		set_test_name("Test Optional Update User Denies");
-
-		// Part 3 - Mandatory Update, with bogus response.
-		// Test connect with update needed.
-		logininstance->connect(credentials);
-
-		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
-
-		// Update needed failure response.
-		LLSD response;
-		response["state"] = "offline";
-		response["change"] = "fail.login";
-		response["progress"] = 0.0;
-		response["transfer_rate"] = 7;
-		response["data"]["reason"] = "optional";
-		gTestPump.post(response);
-
-		ensure_equals("Notification added", notifications.addedCount(), 1);
-		notifications.sendNoResponse();
-
-		// User skips, should be reconnecting.
-		ensure_equals("reconnect uri", gLoginURI, VIEWERLOGIN_URI); 
-		ensure_equals("skipping optional update", gLoginCreds["params"]["skipoptional"].asBoolean(), true); 
-	}
-}
+/**
+ * @file   lllogininstance_test.cpp
+ * @brief  Test for lllogininstance.cpp.
+ * 
+ * $LicenseInfo:firstyear=2008&license=internal$
+ * Copyright (c) 2008, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "../llviewerprecompiledheaders.h"
+// Own header
+#include "../lllogininstance.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "../test/lltut.h"
+#include "llevents.h"
+
+#if defined(LL_WINDOWS)
+#pragma warning(disable: 4355)      // using 'this' in base-class ctor initializer expr
+#endif
+
+// Constants
+const std::string VIEWERLOGIN_URI("viewerlogin_uri");
+const std::string VIEWERLOGIN_GRIDLABEL("viewerlogin_grid");
+
+const std::string APPVIEWER_SERIALNUMBER("appviewer_serialno");
+
+// Link seams.
+
+//-----------------------------------------------------------------------------
+static LLEventStream gTestPump("test_pump");
+
+#include "lllogin.h"
+static std::string gLoginURI;
+static LLSD gLoginCreds;
+static bool gDisconnectCalled = false;
+class LLLogin::Impl
+{
+};
+LLLogin::LLLogin() {}
+LLLogin::~LLLogin() {}
+LLEventPump& LLLogin::getEventPump() { return gTestPump; }
+void LLLogin::connect(const std::string& uri, const LLSD& credentials) 
+{
+	gLoginURI = uri;
+	gLoginCreds = credentials;
+}
+
+void LLLogin::disconnect() 
+{
+	gDisconnectCalled = true;
+}
+
+//-----------------------------------------------------------------------------
+#include "../llviewernetwork.h"
+unsigned char gMACAddress[MAC_ADDRESS_BYTES] = {'1','2','3','4','5','6'};		/* Flawfinder: ignore */
+
+LLViewerLogin::LLViewerLogin() {}
+LLViewerLogin::~LLViewerLogin() {}
+void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const 
+{
+	uris.push_back(VIEWERLOGIN_URI);
+}
+std::string LLViewerLogin::getGridLabel() const { return VIEWERLOGIN_GRIDLABEL; }
+
+//-----------------------------------------------------------------------------
+#include "../llviewercontrol.h"
+LLControlGroup gSavedSettings("Global");
+std::string gCurrentVersion = "invalid_version";
+
+LLControlGroup::LLControlGroup(const std::string& name) :
+	LLInstanceTracker<LLControlGroup, std::string>(name){}
+LLControlGroup::~LLControlGroup() {}
+void LLControlGroup::setBOOL(const std::string& name, BOOL val) {}
+BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; }
+U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only) { return 1; }
+void LLControlGroup::setString(const std::string& name, const std::string& val) {}
+std::string LLControlGroup::getString(const std::string& name) { return "test_string"; }
+BOOL LLControlGroup::declareBOOL(const std::string& name, BOOL initial_val, const std::string& comment, BOOL persist) { return TRUE; }
+BOOL LLControlGroup::declareString(const std::string& name, const std::string &initial_val, const std::string& comment, BOOL persist) { return TRUE; }
+
+#include "lluicolortable.h"
+void LLUIColorTable::saveUserSettings(void)const {}
+
+//-----------------------------------------------------------------------------
+#include "../llurlsimstring.h"
+LLURLSimString LLURLSimString::sInstance;
+bool LLURLSimString::parse() { return true; }
+
+//-----------------------------------------------------------------------------
+#include "llnotifications.h"
+#include "llfloaterreg.h"
+static std::string gTOSType;
+static LLEventPump * gTOSReplyPump = NULL;
+
+//static
+LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus)
+{
+	gTOSType = name;
+	gTOSReplyPump = &LLEventPumps::instance().obtain(key["reply_pump"]);
+	return NULL;
+}
+
+//-----------------------------------------------------------------------------
+// LLNotifications
+class MockNotifications : public LLNotificationsInterface
+{
+	boost::function<void (const LLSD&, const LLSD&)> mResponder;
+	int mAddedCount;
+
+public: 
+	MockNotifications() :
+		mResponder(0),
+		mAddedCount(0)
+	{
+	}
+
+	virtual ~MockNotifications() {}
+
+	/* virtual */ LLNotificationPtr add(
+					const std::string& name,
+					const LLSD& substitutions,
+					const LLSD& payload, 
+					LLNotificationFunctorRegistry::ResponseFunctor functor)
+	{
+		mResponder = functor;
+		mAddedCount++;
+		return LLNotificationPtr((LLNotification*)NULL);
+	}
+
+	void sendYesResponse()
+	{
+		LLSD notification;
+		LLSD response;
+		response = 1;
+		mResponder(notification, response);
+	}
+
+	void sendNoResponse()
+	{
+		LLSD notification;
+		LLSD response;
+		response = 2;
+		mResponder(notification, response);
+	}
+
+	void sendBogusResponse()
+	{
+		LLSD notification;
+		LLSD response;
+		response = 666;
+		mResponder(notification, response);
+	}
+
+	int addedCount() { return mAddedCount; }
+};
+
+S32 LLNotification::getSelectedOption(const LLSD& notification, const LLSD& response)
+{
+	return response.asInteger();
+}
+
+// misc
+std::string xml_escape_string(const std::string& in)
+{
+	return in;
+}
+
+/*****************************************************************************
+*   TUT
+*****************************************************************************/
+namespace tut
+{
+    struct lllogininstance_data
+    {
+		lllogininstance_data() : logininstance(LLLoginInstance::getInstance())
+		{
+			// Global initialization
+			gLoginURI.clear();
+			gLoginCreds.clear();
+			gDisconnectCalled = false;
+
+			gTOSType = ""; // Set to invalid value.
+			gTOSReplyPump = 0; // clear the callback.
+
+
+			gSavedSettings.declareBOOL("NoInventoryLibrary", FALSE, "", FALSE);
+			gSavedSettings.declareBOOL("ConnectAsGod", FALSE, "", FALSE);
+			gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "", FALSE);
+			gSavedSettings.declareBOOL("ForceMandatoryUpdate", FALSE, "", FALSE);
+			gSavedSettings.declareString("ClientSettingsFile", "test_settings.xml", "", FALSE);
+			gSavedSettings.declareString("VersionChannelName", "test_version_string", "", FALSE);
+			gSavedSettings.declareString("NextLoginLocation", "", "", FALSE);
+			gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", FALSE);
+
+			credentials["first"] = "testfirst";
+			credentials["last"] = "testlast";
+			credentials["passwd"] = "testpass";
+
+			logininstance->setNotificationsInterface(&notifications);
+		}
+
+		LLLoginInstance* logininstance;
+		LLSD credentials;
+		MockNotifications notifications;
+    };
+
+    typedef test_group<lllogininstance_data> lllogininstance_group;
+    typedef lllogininstance_group::object lllogininstance_object;
+    lllogininstance_group llsdmgr("lllogininstance");
+
+    template<> template<>
+    void lllogininstance_object::test<1>()
+    {
+		set_test_name("Test Simple Success And Disconnect");
+
+		// Test default connect.
+		logininstance->connect(credentials);
+
+		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
+
+		// Dummy success response.
+		LLSD response;
+		response["state"] = "online";
+		response["change"] = "connect";
+		response["progress"] = 1.0;
+		response["transfer_rate"] = 7;
+		response["data"] = "test_data";
+
+		gTestPump.post(response);
+
+		ensure("Success response", logininstance->authSuccess());
+		ensure_equals("Test Response Data", logininstance->getResponse().asString(), "test_data");
+
+		logininstance->disconnect();
+
+		ensure_equals("Called Login Module Disconnect", gDisconnectCalled, true);
+
+		response.clear();
+		response["state"] = "offline";
+		response["change"] = "disconnect";
+		response["progress"] = 0.0;
+		response["transfer_rate"] = 0;
+		response["data"] = "test_data";
+
+		gTestPump.post(response);
+
+		ensure("Disconnected", !(logininstance->authSuccess()));
+    }
+
+    template<> template<>
+    void lllogininstance_object::test<2>()
+    {
+		set_test_name("Test User TOS/Critical message Interaction");
+
+		const std::string test_uri = "testing-uri";
+
+		// Test default connect.
+		logininstance->connect(test_uri, credentials);
+
+		// connect should call LLLogin::connect to init gLoginURI and gLoginCreds.
+		ensure_equals("Default connect uri", gLoginURI, "testing-uri"); 
+		ensure_equals("Default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false);
+		ensure_equals("Default for read critical", gLoginCreds["params"]["read_critical"].asBoolean(), false);
+
+		// TOS failure response.
+		LLSD response;
+		response["state"] = "offline";
+		response["change"] = "fail.login";
+		response["progress"] = 0.0;
+		response["transfer_rate"] = 7;
+		response["data"]["reason"] = "tos";
+		gTestPump.post(response);
+
+		ensure_equals("TOS Dialog type", gTOSType, "message_tos");
+		ensure("TOS callback given", gTOSReplyPump != 0);
+		gTOSReplyPump->post(false); // Call callback denying TOS.
+		ensure("No TOS, failed auth", logininstance->authFailure());
+
+		// Start again.
+		logininstance->connect(test_uri, credentials);
+		gTestPump.post(response); // Fail for tos again.
+		gTOSReplyPump->post(true); // Accept tos, should reconnect w/ agree_to_tos.
+		ensure_equals("Accepted agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), true);
+		ensure("Incomplete login status", !logininstance->authFailure() && !logininstance->authSuccess());
+	
+		// Fail connection, attempt connect again.
+		// The new request should have reset agree to tos to default.
+		response["data"]["reason"] = "key"; // bad creds.
+		gTestPump.post(response);
+		ensure("TOS auth failure", logininstance->authFailure());
+
+		logininstance->connect(test_uri, credentials);
+		ensure_equals("Reset to default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false);
+
+		// Critical Message failure response.
+		logininstance->connect(test_uri, credentials);
+		response["data"]["reason"] = "critical"; // Change response to "critical message"
+		gTestPump.post(response);
+
+		ensure_equals("TOS Dialog type", gTOSType, "message_critical");
+		ensure("TOS callback given", gTOSReplyPump != 0);
+		gTOSReplyPump->post(true); 
+		ensure_equals("Accepted read critical message", gLoginCreds["params"]["read_critical"].asBoolean(), true);
+		ensure("Incomplete login status", !logininstance->authFailure() && !logininstance->authSuccess());
+
+		// Fail then attempt new connection
+		response["data"]["reason"] = "key"; // bad creds.
+		gTestPump.post(response);
+		ensure("TOS auth failure", logininstance->authFailure());
+		logininstance->connect(test_uri, credentials);
+		ensure_equals("Default for agree to tos", gLoginCreds["params"]["read_critical"].asBoolean(), false);
+	}
+
+    template<> template<>
+    void lllogininstance_object::test<3>()
+    {
+		set_test_name("Test Mandatory Update User Accepts");
+
+		// Part 1 - Mandatory Update, with User accepts response.
+		// Test connect with update needed.
+		logininstance->connect(credentials);
+
+		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
+
+		// Update needed failure response.
+		LLSD response;
+		response["state"] = "offline";
+		response["change"] = "fail.login";
+		response["progress"] = 0.0;
+		response["transfer_rate"] = 7;
+		response["data"]["reason"] = "update";
+		gTestPump.post(response);
+
+		ensure_equals("Notification added", notifications.addedCount(), 1);
+
+		notifications.sendYesResponse();
+
+		ensure("Disconnected", !(logininstance->authSuccess()));
+	}
+
+	template<> template<>
+    void lllogininstance_object::test<4>()
+    {
+		set_test_name("Test Mandatory Update User Decline");
+
+		// Test connect with update needed.
+		logininstance->connect(credentials);
+
+		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
+
+		// Update needed failure response.
+		LLSD response;
+		response["state"] = "offline";
+		response["change"] = "fail.login";
+		response["progress"] = 0.0;
+		response["transfer_rate"] = 7;
+		response["data"]["reason"] = "update";
+		gTestPump.post(response);
+
+		ensure_equals("Notification added", notifications.addedCount(), 1);
+		notifications.sendNoResponse();
+
+		ensure("Disconnected", !(logininstance->authSuccess()));
+	}
+
+	template<> template<>
+    void lllogininstance_object::test<6>()
+    {
+		set_test_name("Test Optional Update User Accept");
+
+		// Part 3 - Mandatory Update, with bogus response.
+		// Test connect with update needed.
+		logininstance->connect(credentials);
+
+		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
+
+		// Update needed failure response.
+		LLSD response;
+		response["state"] = "offline";
+		response["change"] = "fail.login";
+		response["progress"] = 0.0;
+		response["transfer_rate"] = 7;
+		response["data"]["reason"] = "optional";
+		gTestPump.post(response);
+
+		ensure_equals("Notification added", notifications.addedCount(), 1);
+		notifications.sendYesResponse();
+
+		ensure("Disconnected", !(logininstance->authSuccess()));
+	}
+
+	template<> template<>
+    void lllogininstance_object::test<7>()
+    {
+		set_test_name("Test Optional Update User Denies");
+
+		// Part 3 - Mandatory Update, with bogus response.
+		// Test connect with update needed.
+		logininstance->connect(credentials);
+
+		ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI); 
+
+		// Update needed failure response.
+		LLSD response;
+		response["state"] = "offline";
+		response["change"] = "fail.login";
+		response["progress"] = 0.0;
+		response["transfer_rate"] = 7;
+		response["data"]["reason"] = "optional";
+		gTestPump.post(response);
+
+		ensure_equals("Notification added", notifications.addedCount(), 1);
+		notifications.sendNoResponse();
+
+		// User skips, should be reconnecting.
+		ensure_equals("reconnect uri", gLoginURI, VIEWERLOGIN_URI); 
+		ensure_equals("skipping optional update", gLoginCreds["params"]["skipoptional"].asBoolean(), true); 
+	}
+}
diff --git a/indra/tools/vstool/README.txt b/indra/tools/vstool/README.txt
index e4191800312f49e8906997534d3ed4ac603d2341..6f64aa41df08c227e0ef421d53fc260b83bf8293 100644
--- a/indra/tools/vstool/README.txt
+++ b/indra/tools/vstool/README.txt
@@ -1,9 +1,9 @@
-VSTool is a command line utility to manipulate VisualStudio settings. 
-
-The windows cmake project configuration uses VSTool.exe
-
-A handy upgrade:
- figure out how to make cmake build this csharp app
- - or write the app using script (jscript?!?) so it doesn't need to be built.
-
-
+VSTool is a command line utility to manipulate VisualStudio settings. 
+
+The windows cmake project configuration uses VSTool.exe
+
+A handy upgrade:
+ figure out how to make cmake build this csharp app
+ - or write the app using script (jscript?!?) so it doesn't need to be built.
+
+
diff --git a/indra/tools/vstool/VSTool.csproj b/indra/tools/vstool/VSTool.csproj
index 24f1031f81b6151db8ea20628ee974ff35d18626..5d8764b6bffde9415aa5d0fb326ea949bc4d884c 100644
--- a/indra/tools/vstool/VSTool.csproj
+++ b/indra/tools/vstool/VSTool.csproj
@@ -1,95 +1,95 @@
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup>
-    <ProjectType>Local</ProjectType>
-    <ProductVersion>8.0.50727</ProductVersion>
-    <SchemaVersion>2.0</SchemaVersion>
-    <ProjectGuid>{96943E2D-1373-4617-A117-D0F997A94919}</ProjectGuid>
-    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
-    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ApplicationIcon>
-    </ApplicationIcon>
-    <AssemblyKeyContainerName>
-    </AssemblyKeyContainerName>
-    <AssemblyName>VSTool</AssemblyName>
-    <AssemblyOriginatorKeyFile>
-    </AssemblyOriginatorKeyFile>
-    <DefaultClientScript>JScript</DefaultClientScript>
-    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
-    <DefaultTargetSchema>IE50</DefaultTargetSchema>
-    <DelaySign>false</DelaySign>
-    <OutputType>Exe</OutputType>
-    <RootNamespace>VSTool</RootNamespace>
-    <RunPostBuildEvent>Always</RunPostBuildEvent>
-    <StartupObject>VSTool.VSToolMain</StartupObject>
-    <FileUpgradeFlags>
-    </FileUpgradeFlags>
-    <UpgradeBackupLocation>
-    </UpgradeBackupLocation>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
-    <OutputPath>.\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>DEBUG;TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>true</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>false</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>full</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
-    <OutputPath>.\</OutputPath>
-    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
-    <BaseAddress>285212672</BaseAddress>
-    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
-    <ConfigurationOverrideFile>
-    </ConfigurationOverrideFile>
-    <DefineConstants>TRACE</DefineConstants>
-    <DocumentationFile>
-    </DocumentationFile>
-    <DebugSymbols>false</DebugSymbols>
-    <FileAlignment>4096</FileAlignment>
-    <NoStdLib>false</NoStdLib>
-    <NoWarn>
-    </NoWarn>
-    <Optimize>true</Optimize>
-    <RegisterForComInterop>false</RegisterForComInterop>
-    <RemoveIntegerChecks>false</RemoveIntegerChecks>
-    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
-    <WarningLevel>4</WarningLevel>
-    <DebugType>none</DebugType>
-    <ErrorReport>prompt</ErrorReport>
-  </PropertyGroup>
-  <ItemGroup>
-    <Reference Include="System">
-      <Name>System</Name>
-    </Reference>
-    <Reference Include="System.Data">
-      <Name>System.Data</Name>
-    </Reference>
-  </ItemGroup>
-  <ItemGroup>
-    <Compile Include="main.cs">
-      <SubType>Code</SubType>
-    </Compile>
-  </ItemGroup>
-  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
-  <PropertyGroup>
-    <PreBuildEvent>
-    </PreBuildEvent>
-    <PostBuildEvent>
-    </PostBuildEvent>
-  </PropertyGroup>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectType>Local</ProjectType>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{96943E2D-1373-4617-A117-D0F997A94919}</ProjectGuid>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ApplicationIcon>
+    </ApplicationIcon>
+    <AssemblyKeyContainerName>
+    </AssemblyKeyContainerName>
+    <AssemblyName>VSTool</AssemblyName>
+    <AssemblyOriginatorKeyFile>
+    </AssemblyOriginatorKeyFile>
+    <DefaultClientScript>JScript</DefaultClientScript>
+    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
+    <DefaultTargetSchema>IE50</DefaultTargetSchema>
+    <DelaySign>false</DelaySign>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>VSTool</RootNamespace>
+    <RunPostBuildEvent>Always</RunPostBuildEvent>
+    <StartupObject>VSTool.VSToolMain</StartupObject>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <OutputPath>.\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>true</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>false</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>full</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <OutputPath>.\</OutputPath>
+    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>
+    <BaseAddress>285212672</BaseAddress>
+    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
+    <ConfigurationOverrideFile>
+    </ConfigurationOverrideFile>
+    <DefineConstants>TRACE</DefineConstants>
+    <DocumentationFile>
+    </DocumentationFile>
+    <DebugSymbols>false</DebugSymbols>
+    <FileAlignment>4096</FileAlignment>
+    <NoStdLib>false</NoStdLib>
+    <NoWarn>
+    </NoWarn>
+    <Optimize>true</Optimize>
+    <RegisterForComInterop>false</RegisterForComInterop>
+    <RemoveIntegerChecks>false</RemoveIntegerChecks>
+    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+    <WarningLevel>4</WarningLevel>
+    <DebugType>none</DebugType>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System">
+      <Name>System</Name>
+    </Reference>
+    <Reference Include="System.Data">
+      <Name>System.Data</Name>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="main.cs">
+      <SubType>Code</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <PropertyGroup>
+    <PreBuildEvent>
+    </PreBuildEvent>
+    <PostBuildEvent>
+    </PostBuildEvent>
+  </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/indra/tools/vstool/VSTool.sln b/indra/tools/vstool/VSTool.sln
index 88596718028cca0ba134e2b2cf11ba6c5a81cbdf..543a0a2efcfaea9bc9fc14f8bc93ce0f07f8b56d 100644
--- a/indra/tools/vstool/VSTool.sln
+++ b/indra/tools/vstool/VSTool.sln
@@ -1,19 +1,19 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual Studio 2005
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSTool", "VSTool.csproj", "{96943E2D-1373-4617-A117-D0F997A94919}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
+Microsoft Visual Studio Solution File, Format Version 9.00
+# Visual Studio 2005
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSTool", "VSTool.csproj", "{96943E2D-1373-4617-A117-D0F997A94919}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{96943E2D-1373-4617-A117-D0F997A94919}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{96943E2D-1373-4617-A117-D0F997A94919}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/indra/tools/vstool/main.cs b/indra/tools/vstool/main.cs
index cc268d59d98f5b8a9b5be55d6dfa39bc3e0b0d73..5c41c916e2e34bcab3859a37b25f5204cad71789 100644
--- a/indra/tools/vstool/main.cs
+++ b/indra/tools/vstool/main.cs
@@ -1,711 +1,711 @@
-// Code about getting running instances visual studio
-// was borrowed from 
-// http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx
-
-
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Reflection;
-using System.Runtime.InteropServices;
-using System.Runtime.InteropServices.ComTypes;
-using Microsoft.CSharp;
-
-namespace VSTool
-{
-    // The MessageFilter class comes from:
-    // http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx
-    // It allows vstool to get timing error messages from 
-    // visualstudio and handle them.
-    public class MessageFilter : IOleMessageFilter
-    {
-        //
-        // Class containing the IOleMessageFilter
-        // thread error-handling functions.
-
-        // Start the filter.
-        public static void Register()
-        {
-            IOleMessageFilter newFilter = new MessageFilter(); 
-            IOleMessageFilter oldFilter = null; 
-            CoRegisterMessageFilter(newFilter, out oldFilter);
-        }
-
-        // Done with the filter, close it.
-        public static void Revoke()
-        {
-            IOleMessageFilter oldFilter = null; 
-            CoRegisterMessageFilter(null, out oldFilter);
-        }
-
-        //
-        // IOleMessageFilter functions.
-        // Handle incoming thread requests.
-        int IOleMessageFilter.HandleInComingCall(int dwCallType, 
-          System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr 
-          lpInterfaceInfo) 
-        {
-            //Return the flag SERVERCALL_ISHANDLED.
-            return 0;
-        }
-
-        // Thread call was rejected, so try again.
-        int IOleMessageFilter.RetryRejectedCall(System.IntPtr 
-          hTaskCallee, int dwTickCount, int dwRejectType)
-        {
-            if (dwRejectType == 2)
-            // flag = SERVERCALL_RETRYLATER.
-            {
-                // Retry the thread call immediately if return >=0 & 
-                // <100.
-                return 99;
-            }
-            // Too busy; cancel call.
-            return -1;
-        }
-
-        int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee, 
-          int dwTickCount, int dwPendingType)
-        {
-            //Return the flag PENDINGMSG_WAITDEFPROCESS.
-            return 2; 
-        }
-
-        // Implement the IOleMessageFilter interface.
-        [DllImport("Ole32.dll")]
-        private static extern int 
-          CoRegisterMessageFilter(IOleMessageFilter newFilter, out 
-          IOleMessageFilter oldFilter);
-    }
-
-    [ComImport(), Guid("00000016-0000-0000-C000-000000000046"), 
-    InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
-    interface IOleMessageFilter 
-    {
-        [PreserveSig]
-        int HandleInComingCall( 
-            int dwCallType, 
-            IntPtr hTaskCaller, 
-            int dwTickCount, 
-            IntPtr lpInterfaceInfo);
-
-        [PreserveSig]
-        int RetryRejectedCall( 
-            IntPtr hTaskCallee, 
-            int dwTickCount,
-            int dwRejectType);
-
-        [PreserveSig]
-        int MessagePending( 
-            IntPtr hTaskCallee, 
-            int dwTickCount,
-            int dwPendingType);
-    }
-
-    class ViaCOM
-    {
-        public static object GetProperty(object from_obj, string prop_name)
-        {
-            try
-            {
-                Type objType = from_obj.GetType();
-                return objType.InvokeMember(
-                    prop_name,
-                    BindingFlags.GetProperty, null,
-                    from_obj,
-                    null);
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine("Error getting property: \"{0}\"", prop_name);
-                Console.WriteLine(e.Message);
-                throw e;
-            }
-        }
-
-        public static object SetProperty(object from_obj, string prop_name, object new_value)
-        {
-            try
-            {
-                object[] args = { new_value };
-                Type objType = from_obj.GetType();
-                return objType.InvokeMember(
-                    prop_name,
-                    BindingFlags.DeclaredOnly |
-                    BindingFlags.Public |
-                    BindingFlags.NonPublic |
-                    BindingFlags.Instance |
-                    BindingFlags.SetProperty,
-                    null,
-                    from_obj,
-                    args);
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine("Error setting property: \"{0}\"", prop_name);
-                Console.WriteLine(e.Message);
-                throw e;
-            }
-        }
-
-        public static object CallMethod(object from_obj, string method_name, params object[] args)
-        {
-            try
-            {
-                Type objType = from_obj.GetType();
-                return objType.InvokeMember(
-                    method_name,
-                    BindingFlags.DeclaredOnly |
-                    BindingFlags.Public |
-                    BindingFlags.NonPublic |
-                    BindingFlags.Instance |
-                    BindingFlags.InvokeMethod,
-                    null,
-                    from_obj,
-                    args);
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine("Error calling method \"{0}\"", method_name);
-                Console.WriteLine(e.Message);
-                throw e;
-            }
-        }
-    };
-
-    /// <summary>
-	/// The main entry point class for VSTool.
-	/// </summary>
-    class VSToolMain
-    {
-        #region Interop imports
-        [DllImport("ole32.dll")]  
-        public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); 
- 
-        [DllImport("ole32.dll")]  
-        public static extern int  CreateBindCtx(int reserved, out IBindCtx ppbc);
-        #endregion 
-
-        static System.Boolean ignore_case = true;
-
-        static string solution_name = null;
-        static bool use_new_vs = false;
-        static Hashtable projectDict = new Hashtable();
-        static string startup_project = null;
-        static string config = null;
-
-        static object dte = null;
-        static object solution = null;
-
-        /// <summary>
-		/// The main entry point for the application.
-		/// </summary>
-		[STAThread]
-		static int Main(string[] args)
-		{
-            int retVal = 0;
-            bool need_save = false;
-
-            try
-            {
-                parse_command_line(args);
-
-                Console.WriteLine("Editing solution: {0}", solution_name);
-
-                bool found_open_solution = GetDTEAndSolution();
-
-                if (dte == null || solution == null)
-                {
-                    retVal = 1;
-                }
-                else
-                {
-                    MessageFilter.Register();
-
-                    // Walk through all of the projects in the solution
-                    // and list the type of each project.
-                    foreach (DictionaryEntry p in projectDict)
-                    {
-                        string project_name = (string)p.Key;
-                        string working_dir = (string)p.Value;
-                        if (SetProjectWorkingDir(solution, project_name, working_dir))
-                        {
-                            need_save = true;
-                        }
-                    }
-
-                    if (config != null)
-                    {
-                        need_save = SetActiveConfig(config);
-                    }
-
-                    if (startup_project != null)
-                    {
-                        need_save = SetStartupProject(startup_project);
-                    }
-
-                    if (need_save)
-                    {
-                        if (found_open_solution == false)
-                        {
-                            ViaCOM.CallMethod(solution, "Close", null);
-                        }
-                    }
-                }
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine(e.Message);
-                retVal = 1;
-            }
-            finally
-            {
-                if (solution != null)
-                {
-                    Marshal.ReleaseComObject(solution);
-                    solution = null;
-                }
-
-                if (dte != null)
-                {
-                    Marshal.ReleaseComObject(dte);
-                    dte = null;
-                }
-
-                MessageFilter.Revoke();
-            }
-            return retVal;
-        }
-
-        public static bool parse_command_line(string[] args)
-        {
-            string options_desc = 
-                "--solution <solution_name>   : MSVC solution name. (required)\n" +
-                "--use_new_vs                 : Ignore running versions of visual studio.\n" +
-                "--workingdir <project> <dir> : Set working dir of a VC project.\n" +
-                "--config <config>            : Set the active config for the solution.\n" +
-                "--startup <project>          : Set the startup project for the solution.\n";
-
-            try
-            {
-                // Command line param parsing loop.
-                int i = 0;
-                for (; i < args.Length; ++i)
-                {
-                    if ("--solution" == args[i])
-                    {
-                        if (solution_name != null)
-                        {
-                            throw new ApplicationException("Found second --solution option");
-                        }
-                        solution_name = args[++i];
-                    }
-                    else if ("--use_new_vs" == args[i])
-                    {
-                        use_new_vs = true;
-                    }
-
-                    else if ("--workingdir" == args[i])
-                    {
-                        string project_name = args[++i];
-                        string working_dir = args[++i];
-                        projectDict.Add(project_name, working_dir);
-                    }
-                    else if ("--config" == args[i])
-                    {
-                        if (config != null)
-                        {
-                            throw new ApplicationException("Found second --config option");
-                        }
-                        config = args[++i];
-                    }
-                    else if ("--startup" == args[i])
-                    {
-                        if (startup_project != null)
-                        {
-                            throw new ApplicationException("Found second --startup option");
-                        }
-                        startup_project = args[++i];
-                    }
-                    else
-                    {
-                        throw new ApplicationException("Found unrecognized token on command line: " + args[i]);
-                    }
-                }
-
-                if (solution_name == null)
-                {
-                    throw new ApplicationException("The --solution option is required.");
-                }
-            }
-            catch(ApplicationException e)
-            {
-
-                Console.WriteLine("Oops! " + e.Message);
-                Console.Write("Command line:");
-                foreach (string arg in args)
-                {
-                    Console.Write(" " + arg);
-                }
-                Console.Write("\n\n");
-                Console.WriteLine("VSTool command line usage");
-                Console.Write(options_desc);
-                throw e;
-            }
-            return true;
-        }
-
-        public static bool GetDTEAndSolution()
-        {
-            bool found_open_solution = true;
-
-            Console.WriteLine("Looking for existing VisualStudio instance...");
-
-            // Get an instance of the currently running Visual Studio .NET IDE.
-            // dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.7.1");
-            string full_solution_name = System.IO.Path.GetFullPath(solution_name);
-            if (false == use_new_vs)
-            {
-                dte = GetIDEInstance(full_solution_name);
-            }
-
-            if (dte == null)
-            {
-                try
-                {
-                    Console.WriteLine("  Didn't find open solution, starting new background VisualStudio instance...");
-                    Console.WriteLine("  Reading .sln file version...");
-                    string version = GetSolutionVersion(full_solution_name);
-
-                    Console.WriteLine("  Using version: {0}...", version);
-                    string progid = GetVSProgID(version);
-
-                    Type objType = Type.GetTypeFromProgID(progid);
-                    dte = System.Activator.CreateInstance(objType);
-                    Console.WriteLine("  Reading solution: \"{0}\"", full_solution_name);
-
-                    solution = ViaCOM.GetProperty(dte, "Solution");
-                    object[] openArgs = { full_solution_name };
-                    ViaCOM.CallMethod(solution, "Open", openArgs);
-                }
-                catch (Exception e)
-                {
-                    Console.WriteLine(e.Message);
-                    Console.WriteLine("Quitting do to error opening: {0}", full_solution_name);
-                    solution = null;
-                    dte = null;
-                    return found_open_solution;
-                }
-                found_open_solution = false;
-            }
-
-            if (solution == null)
-            {
-                solution = ViaCOM.GetProperty(dte, "Solution");
-            }
-
-            return found_open_solution;
-        }
-
-        /// <summary>
-        /// Get the DTE object for the instance of Visual Studio IDE that has 
-        /// the specified solution open.
-        /// </summary>
-        /// <param name="solutionFile">The absolute filename of the solution</param>
-        /// <returns>Corresponding DTE object or null if no such IDE is running</returns>
-        public static object GetIDEInstance( string solutionFile )
-        {
-            Hashtable runningInstances = GetIDEInstances( true );
-            IDictionaryEnumerator enumerator = runningInstances.GetEnumerator();
-
-            while ( enumerator.MoveNext() )
-            {
-                try
-                {
-                    object ide = enumerator.Value;
-                    if (ide != null)
-                    {
-                        object sol = ViaCOM.GetProperty(ide, "Solution");
-                        if (0 == string.Compare((string)ViaCOM.GetProperty(sol, "FullName"), solutionFile, ignore_case))
-                        {
-                            return ide;
-                        }
-                    }
-                } 
-                catch{}
-            }
-
-            return null;
-        }
-
-        /// <summary>
-        /// Get a table of the currently running instances of the Visual Studio .NET IDE.
-        /// </summary>
-        /// <param name="openSolutionsOnly">Only return instances that have opened a solution</param>
-        /// <returns>A hashtable mapping the name of the IDE in the running object table to the corresponding DTE object</returns>
-        public static Hashtable GetIDEInstances( bool openSolutionsOnly )
-        {
-            Hashtable runningIDEInstances = new Hashtable();
-            Hashtable runningObjects = GetRunningObjectTable();
-
-            IDictionaryEnumerator rotEnumerator = runningObjects.GetEnumerator();
-            while ( rotEnumerator.MoveNext() )
-            {
-                string candidateName = (string) rotEnumerator.Key;
-                if (!candidateName.StartsWith("!VisualStudio.DTE"))
-                    continue;
-
-                object ide = rotEnumerator.Value;
-                if (ide == null)
-                    continue;
-
-                if (openSolutionsOnly)
-                {
-                    try
-                    {
-                        object sol = ViaCOM.GetProperty(ide, "Solution");
-                        string solutionFile = (string)ViaCOM.GetProperty(sol, "FullName");
-                        if (solutionFile != String.Empty)
-                        {
-                            runningIDEInstances[ candidateName ] = ide;
-                        }
-                    } 
-                    catch {}
-                }
-                else
-                {
-                    runningIDEInstances[ candidateName ] = ide;
-                }                       
-            }
-            return runningIDEInstances;
-        }
-
-        /// <summary>
-        /// Get a snapshot of the running object table (ROT).
-        /// </summary>
-        /// <returns>A hashtable mapping the name of the object in the ROT to the corresponding object</returns>
-        [STAThread]
-        public static Hashtable GetRunningObjectTable()
-        {
-            Hashtable result = new Hashtable();
-
-            int numFetched = 0;
-            IRunningObjectTable runningObjectTable;   
-            IEnumMoniker monikerEnumerator;
-            IMoniker[] monikers = new IMoniker[1];
-
-            GetRunningObjectTable(0, out runningObjectTable);    
-            runningObjectTable.EnumRunning(out monikerEnumerator);
-            monikerEnumerator.Reset();          
-            
-            while (monikerEnumerator.Next(1, monikers, new IntPtr(numFetched)) == 0)
-            {     
-                IBindCtx ctx;
-                CreateBindCtx(0, out ctx);     
-                    
-                string runningObjectName;
-                monikers[0].GetDisplayName(ctx, null, out runningObjectName);
-
-                object runningObjectVal;  
-                runningObjectTable.GetObject( monikers[0], out runningObjectVal); 
-
-                result[ runningObjectName ] = runningObjectVal;
-            } 
-
-            return result;
-        }
-
-        public static string GetSolutionVersion(string solutionFullFileName) 
-        {
-            string version;
-            System.IO.StreamReader solutionStreamReader = null;
-            string firstLine;
-            string format;
-            
-            try
-            {
-                solutionStreamReader = new System.IO.StreamReader(solutionFullFileName);
-                do
-                {
-                    firstLine = solutionStreamReader.ReadLine();
-                }
-                while (firstLine == "");
-                
-                format = firstLine.Substring(firstLine.LastIndexOf(" ")).Trim();
-        
-                switch(format)
-                {
-                    case "7.00":
-                        version = "VC70";
-                        break;
-
-                    case "8.00":
-                        version = "VC71";
-                        break;
-
-                    case "9.00":
-                        version = "VC80";
-                        break;
-                
-                    case "10.00":
-                        version = "VC90";
-                        break;
-                    default:
-                        throw new ApplicationException("Unknown .sln version: " + format);
-                }
-            }
-            finally
-            {
-                if(solutionStreamReader != null) 
-                {
-                    solutionStreamReader.Close();
-                }
-            }
-            
-            return version;
-        }
-
-        public static string GetVSProgID(string version)
-        {
-            string progid = null;
-            switch(version)
-            {
-                case "VC70":
-                    progid = "VisualStudio.DTE.7";
-                    break;
-
-                case "VC71":
-                    progid = "VisualStudio.DTE.7.1";
-                    break;
-
-                case "VC80":
-                    progid = "VisualStudio.DTE.8.0";
-                    break;
-                
-                case "VC90":
-                    progid = "VisualStudio.DTE.9.0";
-                    break;
-                default:
-                    throw new ApplicationException("Can't handle VS version: " + version);
-            }
-
-            return progid;
-        }
-
-        public static bool SetProjectWorkingDir(object sol, string project_name, string working_dir)
-        {
-            bool made_change = false;
-            Console.WriteLine("Looking for project {0}...", project_name);
-            try
-            {
-                object prjs = ViaCOM.GetProperty(sol, "Projects");
-                object count = ViaCOM.GetProperty(prjs, "Count");
-                for(int i = 1; i <= (int)count; ++i)
-                {
-                    object[] prjItemArgs = { (object)i };
-                    object prj = ViaCOM.CallMethod(prjs, "Item", prjItemArgs);
-                    string name = (string)ViaCOM.GetProperty(prj, "Name");
-                    if (0 == string.Compare(name, project_name, ignore_case))
-                    {
-                        Console.WriteLine("Found project: {0}", project_name);
-                        Console.WriteLine("Setting working directory");
-
-                        string full_project_name = (string)ViaCOM.GetProperty(prj, "FullName");
-                        Console.WriteLine(full_project_name);
-
-                        // *NOTE:Mani Thanks to incompatibilities between different versions of the 
-                        // VCProjectEngine.dll assembly, we can't cast the objects recevied from the DTE to
-                        // the VCProjectEngine types from a different version than the one built 
-                        // with. ie, VisualStudio.DTE.7.1 objects can't be converted in a project built 
-                        // in VS 8.0. To avoid this problem, we can use the com object interfaces directly, 
-                        // without the type casting. Its tedious code, but it seems to work.
-
-                        // oCfgs should be assigned to a 'Project.Configurations' collection.
-                        object oCfgs = ViaCOM.GetProperty(ViaCOM.GetProperty(prj, "Object"), "Configurations");
-
-                        // oCount will be assigned to the number of configs present in oCfgs.
-                        object oCount = ViaCOM.GetProperty(oCfgs, "Count");
-
-                        for (int cfgIndex = 1; cfgIndex <= (int)oCount; ++cfgIndex)
-                        {
-                            object[] itemArgs = {(object)cfgIndex};
-                            object oCfg = ViaCOM.CallMethod(oCfgs, "Item", itemArgs);
-                            object oDebugSettings = ViaCOM.GetProperty(oCfg, "DebugSettings");
-                            ViaCOM.SetProperty(oDebugSettings, "WorkingDirectory", (object)working_dir);
-                        }
-
-                        break;
-                    }
-                }
-                made_change = true;
-            }
-            catch( Exception e )
-            {
-                Console.WriteLine(e.Message);
-                Console.WriteLine("Failed to set working dir for project, {0}.", project_name);
-            }
-
-            return made_change;
-        }
-
-        public static bool SetStartupProject(string startup_project)
-        {
-            bool result = false;
-            try
-            {
-                // You need the 'unique name of the project to set StartupProjects.
-                // find the project by generic name.
-                Console.WriteLine("Trying to set \"{0}\" to the startup project", startup_project);
-                object prjs = ViaCOM.GetProperty(solution, "Projects");
-                object count = ViaCOM.GetProperty(prjs, "Count");
-                for (int i = 1; i <= (int)count; ++i)
-                {
-                    object[] itemArgs = { (object)i };
-                    object prj = ViaCOM.CallMethod(prjs, "Item", itemArgs);
-                    object prjName = ViaCOM.GetProperty(prj, "Name");
-                    if (0 == string.Compare((string)prjName, startup_project, ignore_case))
-                    {
-                        object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
-                        ViaCOM.SetProperty(solBuild, "StartupProjects", ViaCOM.GetProperty(prj, "UniqueName"));
-                        Console.WriteLine("  Success!");
-                        result = true;
-                        break;
-                    }
-                }
-
-                if (result == false)
-                {
-                    Console.WriteLine("  Could not find project \"{0}\" in the solution.", startup_project);
-                }
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine("  Failed to set the startup project!");
-                Console.WriteLine(e.Message);
-            }
-            return result;
-        }
-
-        public static bool SetActiveConfig(string config)
-        {
-            bool result = false;
-            try
-            {
-                Console.WriteLine("Trying to set active config to \"{0}\"", config);
-                object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
-                object solCfgs = ViaCOM.GetProperty(solBuild, "SolutionConfigurations");
-                object[] itemArgs = { (object)config };
-                object solCfg = ViaCOM.CallMethod(solCfgs, "Item", itemArgs);
-                ViaCOM.CallMethod(solCfg, "Activate", null);
-                Console.WriteLine("  Success!");
-                result = true;
-            }
-            catch (Exception e)
-            {
-                Console.WriteLine("  Failed to set \"{0}\" as the active config.", config);
-                Console.WriteLine(e.Message);
-            }
-            return result;
-        }
-    }
-}
+// Code about getting running instances visual studio
+// was borrowed from 
+// http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx
+
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.ComTypes;
+using Microsoft.CSharp;
+
+namespace VSTool
+{
+    // The MessageFilter class comes from:
+    // http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx
+    // It allows vstool to get timing error messages from 
+    // visualstudio and handle them.
+    public class MessageFilter : IOleMessageFilter
+    {
+        //
+        // Class containing the IOleMessageFilter
+        // thread error-handling functions.
+
+        // Start the filter.
+        public static void Register()
+        {
+            IOleMessageFilter newFilter = new MessageFilter(); 
+            IOleMessageFilter oldFilter = null; 
+            CoRegisterMessageFilter(newFilter, out oldFilter);
+        }
+
+        // Done with the filter, close it.
+        public static void Revoke()
+        {
+            IOleMessageFilter oldFilter = null; 
+            CoRegisterMessageFilter(null, out oldFilter);
+        }
+
+        //
+        // IOleMessageFilter functions.
+        // Handle incoming thread requests.
+        int IOleMessageFilter.HandleInComingCall(int dwCallType, 
+          System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr 
+          lpInterfaceInfo) 
+        {
+            //Return the flag SERVERCALL_ISHANDLED.
+            return 0;
+        }
+
+        // Thread call was rejected, so try again.
+        int IOleMessageFilter.RetryRejectedCall(System.IntPtr 
+          hTaskCallee, int dwTickCount, int dwRejectType)
+        {
+            if (dwRejectType == 2)
+            // flag = SERVERCALL_RETRYLATER.
+            {
+                // Retry the thread call immediately if return >=0 & 
+                // <100.
+                return 99;
+            }
+            // Too busy; cancel call.
+            return -1;
+        }
+
+        int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee, 
+          int dwTickCount, int dwPendingType)
+        {
+            //Return the flag PENDINGMSG_WAITDEFPROCESS.
+            return 2; 
+        }
+
+        // Implement the IOleMessageFilter interface.
+        [DllImport("Ole32.dll")]
+        private static extern int 
+          CoRegisterMessageFilter(IOleMessageFilter newFilter, out 
+          IOleMessageFilter oldFilter);
+    }
+
+    [ComImport(), Guid("00000016-0000-0000-C000-000000000046"), 
+    InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
+    interface IOleMessageFilter 
+    {
+        [PreserveSig]
+        int HandleInComingCall( 
+            int dwCallType, 
+            IntPtr hTaskCaller, 
+            int dwTickCount, 
+            IntPtr lpInterfaceInfo);
+
+        [PreserveSig]
+        int RetryRejectedCall( 
+            IntPtr hTaskCallee, 
+            int dwTickCount,
+            int dwRejectType);
+
+        [PreserveSig]
+        int MessagePending( 
+            IntPtr hTaskCallee, 
+            int dwTickCount,
+            int dwPendingType);
+    }
+
+    class ViaCOM
+    {
+        public static object GetProperty(object from_obj, string prop_name)
+        {
+            try
+            {
+                Type objType = from_obj.GetType();
+                return objType.InvokeMember(
+                    prop_name,
+                    BindingFlags.GetProperty, null,
+                    from_obj,
+                    null);
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine("Error getting property: \"{0}\"", prop_name);
+                Console.WriteLine(e.Message);
+                throw e;
+            }
+        }
+
+        public static object SetProperty(object from_obj, string prop_name, object new_value)
+        {
+            try
+            {
+                object[] args = { new_value };
+                Type objType = from_obj.GetType();
+                return objType.InvokeMember(
+                    prop_name,
+                    BindingFlags.DeclaredOnly |
+                    BindingFlags.Public |
+                    BindingFlags.NonPublic |
+                    BindingFlags.Instance |
+                    BindingFlags.SetProperty,
+                    null,
+                    from_obj,
+                    args);
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine("Error setting property: \"{0}\"", prop_name);
+                Console.WriteLine(e.Message);
+                throw e;
+            }
+        }
+
+        public static object CallMethod(object from_obj, string method_name, params object[] args)
+        {
+            try
+            {
+                Type objType = from_obj.GetType();
+                return objType.InvokeMember(
+                    method_name,
+                    BindingFlags.DeclaredOnly |
+                    BindingFlags.Public |
+                    BindingFlags.NonPublic |
+                    BindingFlags.Instance |
+                    BindingFlags.InvokeMethod,
+                    null,
+                    from_obj,
+                    args);
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine("Error calling method \"{0}\"", method_name);
+                Console.WriteLine(e.Message);
+                throw e;
+            }
+        }
+    };
+
+    /// <summary>
+	/// The main entry point class for VSTool.
+	/// </summary>
+    class VSToolMain
+    {
+        #region Interop imports
+        [DllImport("ole32.dll")]  
+        public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); 
+ 
+        [DllImport("ole32.dll")]  
+        public static extern int  CreateBindCtx(int reserved, out IBindCtx ppbc);
+        #endregion 
+
+        static System.Boolean ignore_case = true;
+
+        static string solution_name = null;
+        static bool use_new_vs = false;
+        static Hashtable projectDict = new Hashtable();
+        static string startup_project = null;
+        static string config = null;
+
+        static object dte = null;
+        static object solution = null;
+
+        /// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		static int Main(string[] args)
+		{
+            int retVal = 0;
+            bool need_save = false;
+
+            try
+            {
+                parse_command_line(args);
+
+                Console.WriteLine("Editing solution: {0}", solution_name);
+
+                bool found_open_solution = GetDTEAndSolution();
+
+                if (dte == null || solution == null)
+                {
+                    retVal = 1;
+                }
+                else
+                {
+                    MessageFilter.Register();
+
+                    // Walk through all of the projects in the solution
+                    // and list the type of each project.
+                    foreach (DictionaryEntry p in projectDict)
+                    {
+                        string project_name = (string)p.Key;
+                        string working_dir = (string)p.Value;
+                        if (SetProjectWorkingDir(solution, project_name, working_dir))
+                        {
+                            need_save = true;
+                        }
+                    }
+
+                    if (config != null)
+                    {
+                        need_save = SetActiveConfig(config);
+                    }
+
+                    if (startup_project != null)
+                    {
+                        need_save = SetStartupProject(startup_project);
+                    }
+
+                    if (need_save)
+                    {
+                        if (found_open_solution == false)
+                        {
+                            ViaCOM.CallMethod(solution, "Close", null);
+                        }
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine(e.Message);
+                retVal = 1;
+            }
+            finally
+            {
+                if (solution != null)
+                {
+                    Marshal.ReleaseComObject(solution);
+                    solution = null;
+                }
+
+                if (dte != null)
+                {
+                    Marshal.ReleaseComObject(dte);
+                    dte = null;
+                }
+
+                MessageFilter.Revoke();
+            }
+            return retVal;
+        }
+
+        public static bool parse_command_line(string[] args)
+        {
+            string options_desc = 
+                "--solution <solution_name>   : MSVC solution name. (required)\n" +
+                "--use_new_vs                 : Ignore running versions of visual studio.\n" +
+                "--workingdir <project> <dir> : Set working dir of a VC project.\n" +
+                "--config <config>            : Set the active config for the solution.\n" +
+                "--startup <project>          : Set the startup project for the solution.\n";
+
+            try
+            {
+                // Command line param parsing loop.
+                int i = 0;
+                for (; i < args.Length; ++i)
+                {
+                    if ("--solution" == args[i])
+                    {
+                        if (solution_name != null)
+                        {
+                            throw new ApplicationException("Found second --solution option");
+                        }
+                        solution_name = args[++i];
+                    }
+                    else if ("--use_new_vs" == args[i])
+                    {
+                        use_new_vs = true;
+                    }
+
+                    else if ("--workingdir" == args[i])
+                    {
+                        string project_name = args[++i];
+                        string working_dir = args[++i];
+                        projectDict.Add(project_name, working_dir);
+                    }
+                    else if ("--config" == args[i])
+                    {
+                        if (config != null)
+                        {
+                            throw new ApplicationException("Found second --config option");
+                        }
+                        config = args[++i];
+                    }
+                    else if ("--startup" == args[i])
+                    {
+                        if (startup_project != null)
+                        {
+                            throw new ApplicationException("Found second --startup option");
+                        }
+                        startup_project = args[++i];
+                    }
+                    else
+                    {
+                        throw new ApplicationException("Found unrecognized token on command line: " + args[i]);
+                    }
+                }
+
+                if (solution_name == null)
+                {
+                    throw new ApplicationException("The --solution option is required.");
+                }
+            }
+            catch(ApplicationException e)
+            {
+
+                Console.WriteLine("Oops! " + e.Message);
+                Console.Write("Command line:");
+                foreach (string arg in args)
+                {
+                    Console.Write(" " + arg);
+                }
+                Console.Write("\n\n");
+                Console.WriteLine("VSTool command line usage");
+                Console.Write(options_desc);
+                throw e;
+            }
+            return true;
+        }
+
+        public static bool GetDTEAndSolution()
+        {
+            bool found_open_solution = true;
+
+            Console.WriteLine("Looking for existing VisualStudio instance...");
+
+            // Get an instance of the currently running Visual Studio .NET IDE.
+            // dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.7.1");
+            string full_solution_name = System.IO.Path.GetFullPath(solution_name);
+            if (false == use_new_vs)
+            {
+                dte = GetIDEInstance(full_solution_name);
+            }
+
+            if (dte == null)
+            {
+                try
+                {
+                    Console.WriteLine("  Didn't find open solution, starting new background VisualStudio instance...");
+                    Console.WriteLine("  Reading .sln file version...");
+                    string version = GetSolutionVersion(full_solution_name);
+
+                    Console.WriteLine("  Using version: {0}...", version);
+                    string progid = GetVSProgID(version);
+
+                    Type objType = Type.GetTypeFromProgID(progid);
+                    dte = System.Activator.CreateInstance(objType);
+                    Console.WriteLine("  Reading solution: \"{0}\"", full_solution_name);
+
+                    solution = ViaCOM.GetProperty(dte, "Solution");
+                    object[] openArgs = { full_solution_name };
+                    ViaCOM.CallMethod(solution, "Open", openArgs);
+                }
+                catch (Exception e)
+                {
+                    Console.WriteLine(e.Message);
+                    Console.WriteLine("Quitting do to error opening: {0}", full_solution_name);
+                    solution = null;
+                    dte = null;
+                    return found_open_solution;
+                }
+                found_open_solution = false;
+            }
+
+            if (solution == null)
+            {
+                solution = ViaCOM.GetProperty(dte, "Solution");
+            }
+
+            return found_open_solution;
+        }
+
+        /// <summary>
+        /// Get the DTE object for the instance of Visual Studio IDE that has 
+        /// the specified solution open.
+        /// </summary>
+        /// <param name="solutionFile">The absolute filename of the solution</param>
+        /// <returns>Corresponding DTE object or null if no such IDE is running</returns>
+        public static object GetIDEInstance( string solutionFile )
+        {
+            Hashtable runningInstances = GetIDEInstances( true );
+            IDictionaryEnumerator enumerator = runningInstances.GetEnumerator();
+
+            while ( enumerator.MoveNext() )
+            {
+                try
+                {
+                    object ide = enumerator.Value;
+                    if (ide != null)
+                    {
+                        object sol = ViaCOM.GetProperty(ide, "Solution");
+                        if (0 == string.Compare((string)ViaCOM.GetProperty(sol, "FullName"), solutionFile, ignore_case))
+                        {
+                            return ide;
+                        }
+                    }
+                } 
+                catch{}
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// Get a table of the currently running instances of the Visual Studio .NET IDE.
+        /// </summary>
+        /// <param name="openSolutionsOnly">Only return instances that have opened a solution</param>
+        /// <returns>A hashtable mapping the name of the IDE in the running object table to the corresponding DTE object</returns>
+        public static Hashtable GetIDEInstances( bool openSolutionsOnly )
+        {
+            Hashtable runningIDEInstances = new Hashtable();
+            Hashtable runningObjects = GetRunningObjectTable();
+
+            IDictionaryEnumerator rotEnumerator = runningObjects.GetEnumerator();
+            while ( rotEnumerator.MoveNext() )
+            {
+                string candidateName = (string) rotEnumerator.Key;
+                if (!candidateName.StartsWith("!VisualStudio.DTE"))
+                    continue;
+
+                object ide = rotEnumerator.Value;
+                if (ide == null)
+                    continue;
+
+                if (openSolutionsOnly)
+                {
+                    try
+                    {
+                        object sol = ViaCOM.GetProperty(ide, "Solution");
+                        string solutionFile = (string)ViaCOM.GetProperty(sol, "FullName");
+                        if (solutionFile != String.Empty)
+                        {
+                            runningIDEInstances[ candidateName ] = ide;
+                        }
+                    } 
+                    catch {}
+                }
+                else
+                {
+                    runningIDEInstances[ candidateName ] = ide;
+                }                       
+            }
+            return runningIDEInstances;
+        }
+
+        /// <summary>
+        /// Get a snapshot of the running object table (ROT).
+        /// </summary>
+        /// <returns>A hashtable mapping the name of the object in the ROT to the corresponding object</returns>
+        [STAThread]
+        public static Hashtable GetRunningObjectTable()
+        {
+            Hashtable result = new Hashtable();
+
+            int numFetched = 0;
+            IRunningObjectTable runningObjectTable;   
+            IEnumMoniker monikerEnumerator;
+            IMoniker[] monikers = new IMoniker[1];
+
+            GetRunningObjectTable(0, out runningObjectTable);    
+            runningObjectTable.EnumRunning(out monikerEnumerator);
+            monikerEnumerator.Reset();          
+            
+            while (monikerEnumerator.Next(1, monikers, new IntPtr(numFetched)) == 0)
+            {     
+                IBindCtx ctx;
+                CreateBindCtx(0, out ctx);     
+                    
+                string runningObjectName;
+                monikers[0].GetDisplayName(ctx, null, out runningObjectName);
+
+                object runningObjectVal;  
+                runningObjectTable.GetObject( monikers[0], out runningObjectVal); 
+
+                result[ runningObjectName ] = runningObjectVal;
+            } 
+
+            return result;
+        }
+
+        public static string GetSolutionVersion(string solutionFullFileName) 
+        {
+            string version;
+            System.IO.StreamReader solutionStreamReader = null;
+            string firstLine;
+            string format;
+            
+            try
+            {
+                solutionStreamReader = new System.IO.StreamReader(solutionFullFileName);
+                do
+                {
+                    firstLine = solutionStreamReader.ReadLine();
+                }
+                while (firstLine == "");
+                
+                format = firstLine.Substring(firstLine.LastIndexOf(" ")).Trim();
+        
+                switch(format)
+                {
+                    case "7.00":
+                        version = "VC70";
+                        break;
+
+                    case "8.00":
+                        version = "VC71";
+                        break;
+
+                    case "9.00":
+                        version = "VC80";
+                        break;
+                
+                    case "10.00":
+                        version = "VC90";
+                        break;
+                    default:
+                        throw new ApplicationException("Unknown .sln version: " + format);
+                }
+            }
+            finally
+            {
+                if(solutionStreamReader != null) 
+                {
+                    solutionStreamReader.Close();
+                }
+            }
+            
+            return version;
+        }
+
+        public static string GetVSProgID(string version)
+        {
+            string progid = null;
+            switch(version)
+            {
+                case "VC70":
+                    progid = "VisualStudio.DTE.7";
+                    break;
+
+                case "VC71":
+                    progid = "VisualStudio.DTE.7.1";
+                    break;
+
+                case "VC80":
+                    progid = "VisualStudio.DTE.8.0";
+                    break;
+                
+                case "VC90":
+                    progid = "VisualStudio.DTE.9.0";
+                    break;
+                default:
+                    throw new ApplicationException("Can't handle VS version: " + version);
+            }
+
+            return progid;
+        }
+
+        public static bool SetProjectWorkingDir(object sol, string project_name, string working_dir)
+        {
+            bool made_change = false;
+            Console.WriteLine("Looking for project {0}...", project_name);
+            try
+            {
+                object prjs = ViaCOM.GetProperty(sol, "Projects");
+                object count = ViaCOM.GetProperty(prjs, "Count");
+                for(int i = 1; i <= (int)count; ++i)
+                {
+                    object[] prjItemArgs = { (object)i };
+                    object prj = ViaCOM.CallMethod(prjs, "Item", prjItemArgs);
+                    string name = (string)ViaCOM.GetProperty(prj, "Name");
+                    if (0 == string.Compare(name, project_name, ignore_case))
+                    {
+                        Console.WriteLine("Found project: {0}", project_name);
+                        Console.WriteLine("Setting working directory");
+
+                        string full_project_name = (string)ViaCOM.GetProperty(prj, "FullName");
+                        Console.WriteLine(full_project_name);
+
+                        // *NOTE:Mani Thanks to incompatibilities between different versions of the 
+                        // VCProjectEngine.dll assembly, we can't cast the objects recevied from the DTE to
+                        // the VCProjectEngine types from a different version than the one built 
+                        // with. ie, VisualStudio.DTE.7.1 objects can't be converted in a project built 
+                        // in VS 8.0. To avoid this problem, we can use the com object interfaces directly, 
+                        // without the type casting. Its tedious code, but it seems to work.
+
+                        // oCfgs should be assigned to a 'Project.Configurations' collection.
+                        object oCfgs = ViaCOM.GetProperty(ViaCOM.GetProperty(prj, "Object"), "Configurations");
+
+                        // oCount will be assigned to the number of configs present in oCfgs.
+                        object oCount = ViaCOM.GetProperty(oCfgs, "Count");
+
+                        for (int cfgIndex = 1; cfgIndex <= (int)oCount; ++cfgIndex)
+                        {
+                            object[] itemArgs = {(object)cfgIndex};
+                            object oCfg = ViaCOM.CallMethod(oCfgs, "Item", itemArgs);
+                            object oDebugSettings = ViaCOM.GetProperty(oCfg, "DebugSettings");
+                            ViaCOM.SetProperty(oDebugSettings, "WorkingDirectory", (object)working_dir);
+                        }
+
+                        break;
+                    }
+                }
+                made_change = true;
+            }
+            catch( Exception e )
+            {
+                Console.WriteLine(e.Message);
+                Console.WriteLine("Failed to set working dir for project, {0}.", project_name);
+            }
+
+            return made_change;
+        }
+
+        public static bool SetStartupProject(string startup_project)
+        {
+            bool result = false;
+            try
+            {
+                // You need the 'unique name of the project to set StartupProjects.
+                // find the project by generic name.
+                Console.WriteLine("Trying to set \"{0}\" to the startup project", startup_project);
+                object prjs = ViaCOM.GetProperty(solution, "Projects");
+                object count = ViaCOM.GetProperty(prjs, "Count");
+                for (int i = 1; i <= (int)count; ++i)
+                {
+                    object[] itemArgs = { (object)i };
+                    object prj = ViaCOM.CallMethod(prjs, "Item", itemArgs);
+                    object prjName = ViaCOM.GetProperty(prj, "Name");
+                    if (0 == string.Compare((string)prjName, startup_project, ignore_case))
+                    {
+                        object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
+                        ViaCOM.SetProperty(solBuild, "StartupProjects", ViaCOM.GetProperty(prj, "UniqueName"));
+                        Console.WriteLine("  Success!");
+                        result = true;
+                        break;
+                    }
+                }
+
+                if (result == false)
+                {
+                    Console.WriteLine("  Could not find project \"{0}\" in the solution.", startup_project);
+                }
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine("  Failed to set the startup project!");
+                Console.WriteLine(e.Message);
+            }
+            return result;
+        }
+
+        public static bool SetActiveConfig(string config)
+        {
+            bool result = false;
+            try
+            {
+                Console.WriteLine("Trying to set active config to \"{0}\"", config);
+                object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild");
+                object solCfgs = ViaCOM.GetProperty(solBuild, "SolutionConfigurations");
+                object[] itemArgs = { (object)config };
+                object solCfg = ViaCOM.CallMethod(solCfgs, "Item", itemArgs);
+                ViaCOM.CallMethod(solCfg, "Activate", null);
+                Console.WriteLine("  Success!");
+                result = true;
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine("  Failed to set \"{0}\" as the active config.", config);
+                Console.WriteLine(e.Message);
+            }
+            return result;
+        }
+    }
+}