diff --git a/indra/llcommon/llfasttimer_class.h b/indra/llcommon/llfasttimer_class.h
index 2a645315c9bcb6131024e358e9ee3356a1b4472c..038a2d246ad21634e646f307d449dc91f7f17575 100644
--- a/indra/llcommon/llfasttimer_class.h
+++ b/indra/llcommon/llfasttimer_class.h
@@ -31,16 +31,14 @@
 
 #define FAST_TIMER_ON 1
 #define TIME_FAST_TIMERS 0
-#define DEBUG_FAST_TIMER_THREADS 0
+#define DEBUG_FAST_TIMER_THREADS 1
 
 class LLMutex;
 
 #include <queue>
 #include "llsd.h"
 
-#if DEBUG_FAST_TIMER_THREADS
-void assert_main_thread();
-#endif
+LL_COMMON_API void assert_main_thread();
 
 class LL_COMMON_API LLFastTimer
 {
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index f0b7ac5def3bc973dc115257c6449def7676384c..b4617c545349c6667637d3b849a9502385c73348 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -62,7 +62,7 @@ U32 ll_thread_local sThreadID = 0;
 
 U32 LLThread::sIDIter = 0;
 
-void assert_main_thread()
+LL_COMMON_API void assert_main_thread()
 {
 	static U32 s_thread_id = LLThread::currentID();
 	if (LLThread::currentID() != s_thread_id)
diff --git a/indra/llmath/llsimdmath.h b/indra/llmath/llsimdmath.h
index b6ac5190a7172aa617c2678556b61ac51654b694..c7cdf7b32cb5d8d729fb42f7ef383424e9923268 100644
--- a/indra/llmath/llsimdmath.h
+++ b/indra/llmath/llsimdmath.h
@@ -35,7 +35,9 @@
 #error SSE2 not enabled. LLVector4a and related class will not compile.
 #endif
 
+#if !LL_WINDOWS
 #include <stdint.h>
+#endif
 
 template <typename T> T* LL_NEXT_ALIGNED_ADDRESS(T* address) 
 { 
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index c0b50b606e10e7fe37defaa3db2dddef284ac8e6..8a7b19800c1d2e1d2f0ebde76c6ddc409f973e3e 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -29,7 +29,9 @@
 #include "llmath.h"
 
 #include <set>
+#if !LL_WINDOWS
 #include <stdint.h>
+#endif
 
 #include "llerror.h"
 #include "llmemtype.h"
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 80734b0d41ae5231d670a03cf50c2bb5ef8f5868..0e080e713bb159e58961281df51e023bf5eef841 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -2759,75 +2759,6 @@ BOOL LLAppearanceMgr::getIsProtectedCOFItem(const LLUUID& obj_id) const
 	*/
 }
 
-// Shim class to allow arbitrary boost::bind
-// expressions to be run as one-time idle callbacks.
-//
-// TODO: rework idle function spec to take a boost::function in the first place.
-class OnIdleCallbackOneTime
-{
-public:
-	OnIdleCallbackOneTime(nullary_func_t callable):
-		mCallable(callable)
-	{
-	}
-	static void onIdle(void *data)
-	{
-		gIdleCallbacks.deleteFunction(onIdle, data);
-		OnIdleCallbackOneTime* self = reinterpret_cast<OnIdleCallbackOneTime*>(data);
-		self->call();
-		delete self;
-	}
-	void call()
-	{
-		mCallable();
-	}
-private:
-	nullary_func_t mCallable;
-};
-
-void doOnIdleOneTime(nullary_func_t callable)
-{
-	OnIdleCallbackOneTime* cb_functor = new OnIdleCallbackOneTime(callable);
-	gIdleCallbacks.addFunction(&OnIdleCallbackOneTime::onIdle,cb_functor);
-}
-
-// Shim class to allow generic boost functions to be run as
-// recurring idle callbacks.  Callable should return true when done,
-// false to continue getting called.
-//
-// TODO: rework idle function spec to take a boost::function in the first place.
-class OnIdleCallbackRepeating
-{
-public:
-	OnIdleCallbackRepeating(bool_func_t callable):
-		mCallable(callable)
-	{
-	}
-	// Will keep getting called until the callable returns true.
-	static void onIdle(void *data)
-	{
-		OnIdleCallbackRepeating* self = reinterpret_cast<OnIdleCallbackRepeating*>(data);
-		bool done = self->call();
-		if (done)
-		{
-			gIdleCallbacks.deleteFunction(onIdle, data);
-			delete self;
-		}
-	}
-	bool call()
-	{
-		return mCallable();
-	}
-private:
-	bool_func_t mCallable;
-};
-
-void doOnIdleRepeating(bool_func_t callable)
-{
-	OnIdleCallbackRepeating* cb_functor = new OnIdleCallbackRepeating(callable);
-	gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor);
-}
-
 class CallAfterCategoryFetchStage2: public LLInventoryFetchItemsObserver
 {
 public:
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index c65d9dc9eeda8448d3c3042fb336a14d2d095fa4..4b1d95cf2541bb3655b2c2ab500447b27fabc62e 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -248,15 +248,6 @@ class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
 
 LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name);
 
-typedef boost::function<void ()> nullary_func_t;
-typedef boost::function<bool ()> bool_func_t;
-
-// Call a given callable once in idle loop.
-void doOnIdleOneTime(nullary_func_t callable);
-
-// Repeatedly call a callable in idle loop until it returns true.
-void doOnIdleRepeating(bool_func_t callable);
-
 // Invoke a given callable after category contents are fully fetched.
 void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb);
 
diff --git a/indra/newview/llcallbacklist.cpp b/indra/newview/llcallbacklist.cpp
index a54c77b4a0d0cfa7253719fabbb7d78ac07e3b67..357a6582d162b582eef2561ca7fdc471c45d0bc0 100644
--- a/indra/newview/llcallbacklist.cpp
+++ b/indra/newview/llcallbacklist.cpp
@@ -115,6 +115,71 @@ void LLCallbackList::callFunctions()
 	}
 }
 
+// Shim class to allow arbitrary boost::bind
+// expressions to be run as one-time idle callbacks.
+class OnIdleCallbackOneTime
+{
+public:
+	OnIdleCallbackOneTime(nullary_func_t callable):
+		mCallable(callable)
+	{
+	}
+	static void onIdle(void *data)
+	{
+		gIdleCallbacks.deleteFunction(onIdle, data);
+		OnIdleCallbackOneTime* self = reinterpret_cast<OnIdleCallbackOneTime*>(data);
+		self->call();
+		delete self;
+	}
+	void call()
+	{
+		mCallable();
+	}
+private:
+	nullary_func_t mCallable;
+};
+
+void doOnIdleOneTime(nullary_func_t callable)
+{
+	OnIdleCallbackOneTime* cb_functor = new OnIdleCallbackOneTime(callable);
+	gIdleCallbacks.addFunction(&OnIdleCallbackOneTime::onIdle,cb_functor);
+}
+
+// Shim class to allow generic boost functions to be run as
+// recurring idle callbacks.  Callable should return true when done,
+// false to continue getting called.
+class OnIdleCallbackRepeating
+{
+public:
+	OnIdleCallbackRepeating(bool_func_t callable):
+		mCallable(callable)
+	{
+	}
+	// Will keep getting called until the callable returns true.
+	static void onIdle(void *data)
+	{
+		OnIdleCallbackRepeating* self = reinterpret_cast<OnIdleCallbackRepeating*>(data);
+		bool done = self->call();
+		if (done)
+		{
+			gIdleCallbacks.deleteFunction(onIdle, data);
+			delete self;
+		}
+	}
+	bool call()
+	{
+		return mCallable();
+	}
+private:
+	bool_func_t mCallable;
+};
+
+void doOnIdleRepeating(bool_func_t callable)
+{
+	OnIdleCallbackRepeating* cb_functor = new OnIdleCallbackRepeating(callable);
+	gIdleCallbacks.addFunction(&OnIdleCallbackRepeating::onIdle,cb_functor);
+}
+
 #ifdef _DEBUG
 
 void test1(void *data)
diff --git a/indra/newview/llcallbacklist.h b/indra/newview/llcallbacklist.h
index 07ac21f5e93762ac7f3fda255e1ba42e971e4d95..97f3bfd9ee29b6f061c76d0d4a21cb5d800da616 100644
--- a/indra/newview/llcallbacklist.h
+++ b/indra/newview/llcallbacklist.h
@@ -52,6 +52,15 @@ class LLCallbackList
 	callback_list_t	mCallbackList;
 };
 
+typedef boost::function<void ()> nullary_func_t;
+typedef boost::function<bool ()> bool_func_t;
+
+// Call a given callable once in idle loop.
+void doOnIdleOneTime(nullary_func_t callable);
+
+// Repeatedly call a callable in idle loop until it returns true.
+void doOnIdleRepeating(bool_func_t callable);
+
 extern LLCallbackList gIdleCallbacks;
 
 #endif
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index 660157df1e8fa806e145ce3a2757550d9c4e51be..85d0ae02cfe9c8a364e16e91832023b67101c900 100755
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -94,8 +94,7 @@
 #include "lltoggleablemenu.h"
 #include "llvfile.h"
 #include "llvfs.h"
-
-
+#include "llcallbacklist.h"
 
 #include "glod/glod.h"
 
@@ -108,7 +107,6 @@ const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PRE
 const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
 const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
 const S32 PREVIEW_TEXTURE_HEIGHT = 300;
-const S32 NUM_LOD = 4;
 
 void drawBoxOutline(const LLVector3& pos, const LLVector3& size);
 
@@ -477,12 +475,10 @@ void LLFloaterModelPreview::onPreviewLODCommit(LLUICtrl* ctrl, void* userdata)
 	
 	S32 which_mode = 0;
 	
-	LLCtrlSelectionInterface* iface = fp->childGetSelectionInterface("preview_lod_combo");
-	if (iface)
-	{
-		which_mode = iface->getFirstSelectedIndex();
-	}
-	which_mode = (NUM_LOD-1)-which_mode; // combo box list of lods is in reverse order
+	LLComboBox* combo = (LLComboBox*) ctrl;
+	
+	which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order
+
 	fp->mModelPreview->setPreviewLOD(which_mode);
 }
 
@@ -1600,8 +1596,8 @@ void LLModelLoader::run()
 		}
 		
 		processElement(scene);
-		
-		mPreview->loadModelCallback(mLod);
+
+		doOnIdleOneTime(boost::bind(&LLModelPreview::loadModelCallback,mPreview,mLod));
 	}
 }
 
@@ -2053,6 +2049,8 @@ LLModelPreview::~LLModelPreview()
 
 U32 LLModelPreview::calcResourceCost()
 {
+	assert_main_thread();
+	
 	rebuildUploadData();
 
 	if ( mModelLoader->getLoadState() != LLModelLoader::ERROR_PARSING )
@@ -2134,6 +2132,8 @@ U32 LLModelPreview::calcResourceCost()
 
 void LLModelPreview::rebuildUploadData()
 {
+	assert_main_thread();
+	
 	mUploadData.clear();
 	mTextureSet.clear();
 	
@@ -2256,6 +2256,8 @@ void LLModelPreview::clearModel(S32 lod)
 
 void LLModelPreview::loadModel(std::string filename, S32 lod)
 {
+	assert_main_thread();
+	
 	LLMutexLock lock(this);
 	
 	if (mModelLoader)
@@ -2311,6 +2313,8 @@ void LLModelPreview::loadModel(std::string filename, S32 lod)
 
 void LLModelPreview::setPhysicsFromLOD(S32 lod)
 {
+	assert_main_thread();
+	
 	if (lod >= 0 && lod <= 3)
 	{
 		mModel[LLModel::LOD_PHYSICS] = mModel[lod];
@@ -2366,7 +2370,9 @@ void LLModelPreview::clearGLODGroup()
 }
 
 void LLModelPreview::loadModelCallback(S32 lod)
-{ //NOT the main thread
+{
+	assert_main_thread();
+
 	LLMutexLock lock(this);
 	if (!mModelLoader)
 	{
@@ -2421,6 +2427,8 @@ void LLModelPreview::resetPreviewTarget()
 
 void LLModelPreview::generateNormals()
 {
+	assert_main_thread();
+	
 	S32 which_lod = mPreviewLOD;
 	
 	
@@ -2688,7 +2696,7 @@ bool LLModelPreview::containsRiggedAsset( void )
 	}
 	return false;
 }
-void LLModelPreview::genLODs(S32 which_lod)
+void LLModelPreview::genLODs(S32 which_lod, U32 decimation)
 {
 	if (mBaseModel.empty())
 	{
@@ -2905,7 +2913,7 @@ void LLModelPreview::genLODs(S32 which_lod)
 		{
 			if (lod < start)
 			{
-				triangle_count /= 3;
+				triangle_count /= decimation;
 			}
 		}
 		else
@@ -3063,6 +3071,8 @@ void LLModelPreview::genLODs(S32 which_lod)
 
 void LLModelPreview::updateStatusMessages()
 {
+	assert_main_thread();
+	
 	//triangle/vertex/submesh count for each mesh asset for each lod
 	std::vector<S32> tris[LLModel::NUM_LODS];
 	std::vector<S32> verts[LLModel::NUM_LODS];
@@ -3576,6 +3586,8 @@ void LLModelPreview::update()
 //-----------------------------------------------------------------------------
 BOOL LLModelPreview::render()
 {
+	assert_main_thread();
+	
 	LLMutexLock lock(this);
 	mNeedsUpdate = FALSE;
 	
@@ -4141,6 +4153,8 @@ void LLModelPreview::setPreviewLOD(S32 lod)
 //static 
 void LLFloaterModelPreview::onBrowseLOD(void* data)
 {
+	assert_main_thread();
+	
 	LLFloaterModelPreview* mp = (LLFloaterModelPreview*) data;
 	mp->loadModel(mp->mModelPreview->mPreviewLOD);
 }
@@ -4148,6 +4162,8 @@ void LLFloaterModelPreview::onBrowseLOD(void* data)
 //static
 void LLFloaterModelPreview::onUpload(void* user_data)
 {
+	assert_main_thread();
+	
 	LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data;
 
 	mp->mModelPreview->rebuildUploadData();
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index e233f3672a1cc7df6bedc1de5f5336a4421926c3..64b220d86bf31eb3a0f1482a92cdde1aaedb9fdf 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -52,6 +52,8 @@ class domTranslate;
 class LLMenuButton;
 class LLToggleableMenu;
 
+const S32 NUM_LOD = 4;
+
 class LLModelLoader : public LLThread
 {
 public:
@@ -258,7 +260,7 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	void clearModel(S32 lod);
 	void loadModel(std::string filename, S32 lod);
 	void loadModelCallback(S32 lod);
-	void genLODs(S32 which_lod = -1);
+	void genLODs(S32 which_lod = -1, U32 decimation = 3);
 	void generateNormals();
 	void consolidate();
 	void clearMaterials();
@@ -278,7 +280,7 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
 	friend class LLFloaterModelPreview::DecompRequest;
 	friend class LLPhysicsDecomp;
 
-	LLFloater* mFMP;
+	LLFloater*  mFMP;
 
 	BOOL        mNeedsUpdate;
 	bool		mDirty;
diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp
index 79c29ef017409e758de18aaccb58a4b9019d761c..6a92e43d1a01c5c6a3853de9f31bd1446f0e0204 100644
--- a/indra/newview/llfloatermodelwizard.cpp
+++ b/indra/newview/llfloatermodelwizard.cpp
@@ -28,19 +28,71 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llbutton.h"
 #include "lldrawable.h"
+#include "llcombobox.h"
 #include "llfloater.h"
 #include "llfloatermodelwizard.h"
 #include "llfloatermodelpreview.h"
 #include "llfloaterreg.h"
+#include "llslider.h"
 
 
+static	const std::string stateNames[]={
+	"choose_file",
+	"optimize",
+	"physics",
+	"review",
+	"upload"};
 
 LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key)
 	: LLFloater(key)
 {
 }
 
+void LLFloaterModelWizard::setState(int state)
+{
+	mState = state;
+	setButtons(state);
+
+	for(size_t t=0; t<LL_ARRAY_SIZE(stateNames); ++t)
+	{
+		LLView *view = getChild<LLView>(stateNames[t]+"_panel");
+		if (view) 
+		{
+			view->setVisible(state == (int) t ? TRUE : FALSE);
+		}
+	}
+
+	if (state == OPTIMIZE)
+	{
+		mModelPreview->genLODs(-1);
+	}
+}
+
+void LLFloaterModelWizard::setButtons(int state)
+{
+	for(size_t i=0; i<LL_ARRAY_SIZE(stateNames); ++i)
+	{
+		LLButton *button = getChild<LLButton>(stateNames[i]+"_btn");
+
+		if (i < state)
+		{
+			button->setEnabled(TRUE);
+			button->setToggleState(FALSE);
+		}
+		else if (i == state)
+		{
+			button->setEnabled(TRUE);
+			button->setToggleState(TRUE);
+		}
+		else
+		{
+			button->setEnabled(FALSE);
+		}
+	}
+}
+
 void LLFloaterModelWizard::loadModel()
 {
 	 mModelPreview->mLoading = TRUE;
@@ -48,6 +100,30 @@ void LLFloaterModelWizard::loadModel()
 	(new LLMeshFilePicker(mModelPreview, 3))->getFile();
 }
 
+void LLFloaterModelWizard::onClickCancel()
+{
+	closeFloater();
+}
+
+void LLFloaterModelWizard::onClickBack()
+{
+	setState(llmax((int) CHOOSE_FILE, mState-1));
+}
+
+void LLFloaterModelWizard::onClickNext()
+{
+	setState(llmin((int) UPLOAD, mState+1));
+}
+
+bool LLFloaterModelWizard::onEnableNext()
+{
+	return true;
+}
+
+bool LLFloaterModelWizard::onEnableBack()
+{
+	return true;
+}
 
 BOOL LLFloaterModelWizard::postBuild()
 {
@@ -56,7 +132,20 @@ BOOL LLFloaterModelWizard::postBuild()
 	childSetValue("import_scale", (F32) 0.67335826);
 
 	getChild<LLUICtrl>("browse")->setCommitCallback(boost::bind(&LLFloaterModelWizard::loadModel, this));
+	getChild<LLUICtrl>("cancel")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickCancel, this));
+	getChild<LLUICtrl>("back")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickBack, this));
+	getChild<LLUICtrl>("next")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onClickNext, this));
+	childSetCommitCallback("preview_lod_combo", onPreviewLODCommit, this);
+	getChild<LLUICtrl>("accuracy_slider")->setCommitCallback(boost::bind(&LLFloaterModelWizard::onAccuracyPerformance, this, _2));
+
+	childSetAction("ok_btn", onUpload, this);
 
+	LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+	
+	enable_registrar.add("Next.OnEnable", boost::bind(&LLFloaterModelWizard::onEnableNext, this));
+	enable_registrar.add("Back.OnEnable", boost::bind(&LLFloaterModelWizard::onEnableBack, this));
+
+	
 	mPreviewRect = preview_panel->getRect();
 	
 	mModelPreview = new LLModelPreview(512, 512, this);
@@ -64,9 +153,55 @@ BOOL LLFloaterModelWizard::postBuild()
 
 	center();
 
+	setState(CHOOSE_FILE);
+
+	childSetTextArg("import_dimensions", "[X]", LLStringUtil::null);
+	childSetTextArg("import_dimensions", "[Y]", LLStringUtil::null);
+	childSetTextArg("import_dimensions", "[Z]", LLStringUtil::null);
+
 	return TRUE;
 }
 
+void LLFloaterModelWizard::onUpload(void* user_data)
+{
+	LLFloaterModelWizard* mp = (LLFloaterModelWizard*) user_data;
+	
+	mp->mModelPreview->rebuildUploadData();
+	
+	gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale, 
+						  mp->childGetValue("upload_textures").asBoolean(), mp->childGetValue("upload_skin"), mp->childGetValue("upload_joints"));
+	
+	mp->closeFloater(false);
+}
+
+
+void LLFloaterModelWizard::onAccuracyPerformance(const LLSD& data)
+{
+	int val = (int) data.asInteger();
+
+	mModelPreview->genLODs(-1, NUM_LOD-val);
+
+	mModelPreview->refresh();
+}
+
+void LLFloaterModelWizard::onPreviewLODCommit(LLUICtrl* ctrl, void* userdata)
+{
+	LLFloaterModelWizard *fp =(LLFloaterModelWizard *)userdata;
+	
+	if (!fp->mModelPreview)
+	{
+		return;
+	}
+	
+	S32 which_mode = 0;
+	
+	LLComboBox* combo = (LLComboBox*) ctrl;
+	
+	which_mode = (NUM_LOD-1)-combo->getFirstSelectedIndex(); // combo box list of lods is in reverse order
+
+	fp->mModelPreview->setPreviewLOD(which_mode);
+}
+
 void LLFloaterModelWizard::draw()
 {
 	LLFloater::draw();
@@ -74,14 +209,14 @@ void LLFloaterModelWizard::draw()
 	
 	mModelPreview->update();
 
-	if (mModelPreview && mModelPreview->mModelLoader)
+	if (mModelPreview)
 	{
 		gGL.color3f(1.f, 1.f, 1.f);
 		
 		gGL.getTexUnit(0)->bind(mModelPreview);
 		
-
-		LLView* preview_panel = getChild<LLView>("preview_panel");
+		LLView *view = getChild<LLView>(stateNames[mState]+"_panel");
+		LLView* preview_panel = view->getChild<LLView>("preview_panel");
 
 		LLRect rect = preview_panel->getRect();
 		if (rect != mPreviewRect)
diff --git a/indra/newview/llfloatermodelwizard.h b/indra/newview/llfloatermodelwizard.h
index c766697d47279b3bb404cc7d387dc8e4af840646..ab69d93b6352d3d39dbdba9d8edd2b466260eb55 100644
--- a/indra/newview/llfloatermodelwizard.h
+++ b/indra/newview/llfloatermodelwizard.h
@@ -35,24 +35,36 @@ class LLFloaterModelWizard : public LLFloater
 	virtual ~LLFloaterModelWizard() {};
 	/*virtual*/	BOOL	postBuild();
 	void			draw();
-	void loadModel();
-	//void onSave();
-	//void onReset();
-	//void onCancel();
-	///*virtual*/ void onOpen(const LLSD& key);
 	
 private:
-	
+	enum EWizardState
+	{
+		CHOOSE_FILE = 0,
+		OPTIMIZE,
+		PHYSICS,
+		REVIEW,
+		UPLOAD
+	};
+
+	void setState(int state);
+	void setButtons(int state);
+	void onClickCancel();
+	void onClickBack();
+	void onClickNext();
+	bool onEnableNext();
+	bool onEnableBack();
+	void loadModel();
+	static void	onPreviewLODCommit(LLUICtrl*,void*);
+	void onAccuracyPerformance(const LLSD& data);
+	static void onUpload(void* data);
+
 	LLModelPreview*	mModelPreview;
 	LLRect			mPreviewRect;
+	int mState;
+
+
+
 };
-/*
-namespace LLFloaterDisplayNameUtil
-{
-	// Register with LLFloaterReg
-	void registerFloater();
-}
-*/
 
 
 #endif
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 8991c21518bd8c04f7796e241d314a6c2d39f7ae..dadda2941629568504dd02198546b6e9c4b5f081 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -128,6 +128,45 @@ static bool handleSetShaderChanged(const LLSD& newvalue)
 	return true;
 }
 
+static bool handleRenderPerfTestChanged(const LLSD& newvalue)
+{
+       bool status = !newvalue.asBoolean();
+       if (!status)
+       {
+               gPipeline.clearRenderTypeMask(LLPipeline::RENDER_TYPE_WL_SKY,
+                                                                         LLPipeline::RENDER_TYPE_GROUND,
+                                                                        LLPipeline::RENDER_TYPE_TERRAIN,
+                                                                         LLPipeline::RENDER_TYPE_GRASS,
+                                                                         LLPipeline::RENDER_TYPE_TREE,
+                                                                         LLPipeline::RENDER_TYPE_WATER,
+                                                                         LLPipeline::RENDER_TYPE_PASS_GRASS,
+                                                                         LLPipeline::RENDER_TYPE_HUD,
+                                                                         LLPipeline::RENDER_TYPE_PARTICLES,
+                                                                         LLPipeline::RENDER_TYPE_CLOUDS,
+                                                                         LLPipeline::RENDER_TYPE_HUD_PARTICLES,
+                                                                         LLPipeline::END_RENDER_TYPES); 
+               gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_FEATURE_UI, false);
+       }
+       else 
+       {
+               gPipeline.setRenderTypeMask(LLPipeline::RENDER_TYPE_WL_SKY,
+                                                                         LLPipeline::RENDER_TYPE_GROUND,
+                                                                         LLPipeline::RENDER_TYPE_TERRAIN,
+                                                                         LLPipeline::RENDER_TYPE_GRASS,
+                                                                         LLPipeline::RENDER_TYPE_TREE,
+                                                                         LLPipeline::RENDER_TYPE_WATER,
+                                                                         LLPipeline::RENDER_TYPE_PASS_GRASS,
+                                                                         LLPipeline::RENDER_TYPE_HUD,
+                                                                         LLPipeline::RENDER_TYPE_PARTICLES,
+                                                                         LLPipeline::RENDER_TYPE_CLOUDS,
+                                                                         LLPipeline::RENDER_TYPE_HUD_PARTICLES,
+                                                                         LLPipeline::END_RENDER_TYPES);
+               gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_FEATURE_UI, true);
+       }
+
+       return true;
+}
+
 bool handleRenderTransparentWaterChanged(const LLSD& newvalue)
 {
 	LLWorld::getInstance()->updateWaterObjects();
@@ -565,6 +604,7 @@ void settings_setup_listeners()
 	gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
 	gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
+	gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2));
 	gSavedSettings.getControl("TextureMemory")->getSignal()->connect(boost::bind(&handleVideoMemoryChanged, _2));
 	gSavedSettings.getControl("AuditTexture")->getSignal()->connect(boost::bind(&handleAuditTextureChanged, _2));
 	gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&handleChatFontSizeChanged, _2));
diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
index 4a4b8075c8b91d685e6d01028fca79b92a207c9b..18dc33a23adf43cb791562f578d7adaf86bdf928 100644
--- a/indra/newview/skins/default/xui/en/floater_model_wizard.xml
+++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml
@@ -1,230 +1,602 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
- legacy_header_height="18"
- layout="topleft"
- name="Model Wizard"
- help_topic="model_wizard"
- bg_opaque_image_overlay="0.5 0.5 0.5 1"
- height="450"
- save_rect="true"
- title="UPLOAD MODEL WIZARD" 
- width="530">
-	<panel
-		   height="600">
-		<button
-	     top="30"
-		 left="410"
-		 height="32"
-		 name="upload" 
-		 enabled="false" 
-		 label="5. Upload" 
-		 border="false" 
-		 image_unselected="model_wizard/middle_button_off.png"
-		 image_selected="model_wizard/middle_button_press.png"
-		image_hover_unselected="model_wizard/middle_button_over.png"
-		image_disabled="model_wizard/middle_button_disabled.png"
-		image_disabled_selected="model_wizard/middle_button_disabled.png"
-		 width="110"/>
-		<button
-	     top="30"
-		 left="310"
-		 height="32"
-		  tab_stop="false"
-		 name="review"
-		 label="4. Review"
-		 enabled="false"
-		 border="false"
-		 image_unselected="model_wizard/middle_button_off.png"
-		 image_selected="model_wizard/middle_button_press.png"
-		image_hover_unselected="model_wizard/middle_button_over.png"
-		image_disabled="model_wizard/middle_button_disabled.png"
-		image_disabled_selected="model_wizard/middle_button_disabled.png"
-		 width="110"/>
-		<button
-	     top="30"
-		 left="210"
-		 height="32"
-		 name="physics"
-		 label="3. Physics"
-		 tab_stop="false"
-		 enabled="false"
-		 border="false"
-		 image_unselected="model_wizard/middle_button_off.png"
-		 image_selected="model_wizard/middle_button_press.png"
-		image_hover_unselected="model_wizard/middle_button_over.png"
-		image_disabled="model_wizard/middle_button_disabled.png"
-		image_disabled_selected="model_wizard/middle_button_disabled.png"
-		 width="110"/>
-		<button
-	     top="30"
-		 left="115"
-		 name="optimize"
-		 label="2. Optimize"
-		  tab_stop="false"
-		 height="32"
-		 border="false"
-		 image_unselected="model_wizard/middle_button_off.png"
-		 image_selected="model_wizard/middle_button_press.png"
-		image_hover_unselected="model_wizard/middle_button_over.png"
-		image_disabled="model_wizard/middle_button_disabled.png"
-		image_disabled_selected="model_wizard/middle_button_disabled.png"
-		 width="110"/>
-		<button
-	     top="30"
-		 left="15"
-		 name="choose_file"
-		 enabled="false"
-		 label="1. Choose File"
-		 height="32"
-		 image_unselected="model_wizard/left_button_off.png"
-		 image_selected="model_wizard/left_button_press.png"
-		image_hover_unselected="model_wizard/left_button_over.png"
-		image_disabled="model_wizard/left_button_disabled.png"
-		image_disabled_selected="model_wizard/left_button_disabled.png"
-		 width="110"/>
-		<panel
-		 top_pad="20"
-		 height="20"
-		 width="500" 
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true" 
-		 left="20">
-		<text
-		 width="200"
-		 left="10" 
-		 top="2" 
-		 height="10"
-		 font="SansSerifBig"
-		 layout="topleft"
-		 >
-			  Upload Model
-		</text></panel>
-		<text
-		 top_pad="14"
-		 width="460"
-		 height="20"
-		 font="SansSerifSmall"
-		 layout="topleft"
-		 word_wrap="true"
-		 left_delta="0">
-			This wizard will help you import mesh models to Second Life.  First specify a file containing the model you wish to import.  Second Life supports COLLADA (.dae) files.
-		</text>
-
-		<panel
-			top_delta="40"
-			left="15"
-		 height="240"
-		 width="500"
-		 bg_opaque_color="DkGray2"
-		 background_visible="true"
-		 background_opaque="true">
-
-			<text
-	 type="string"
-	 length="1"
-	 follows="left|top"
-	 top="10" 
-	 height="10"
-	 layout="topleft"
-	 left_delta="10"
-	 name="Cache location"
-	 width="300">
-				Filename:
-			</text>
-			<line_editor
-			 border_style="line"
-			 border_thickness="1"
-			 follows="left|top"
-			 font="SansSerifSmall"
-			 height="20"
-			 layout="topleft"
-	 left_delta="0"
-			 max_length="4096"
-			 name="lod_file"
-			 top_pad="5"
-			 width="220" />
-			<button
-			 follows="left|top"
-			 height="23"
-			 label="Browse..."
-			 label_selected="Browse..."
-			 layout="topleft"
-			 left_pad="10"
-			 name="browse"
-			 top_delta="-1"
-			 width="75">
-			</button>
-			<text
-	top_delta="-15"
-	width="200"
-	height="15"
-	font="SansSerifSmall"
-	layout="topleft"
-	left_pad="24">
-				Model Preview:
-			</text>
-
-			<!-- Placeholder panel for 3D preview render -->
-			
-			<panel
-					left_delta="-2"
-				   top_pad="0"
-					name="preview_panel"
-					bevel_style="none"
-				   border_style="line"
-					border="true"
-				   height="150"
-			  follows="all"
-				   width="150">
-			</panel>
-			<text
-			 top_pad="10"
-			 width="130"
-			 height="15"
-			 left="340"
-			 word_wrap="true"
-		 >
-				Dimensions (meters):
-			</text>
-			<text
-			 top_pad="5"
-			 width="150"
-			 height="15"
-			 name="import_dimensions"
-			 left_delta="0">
-				X:  [X] |  Y:  [Y] | Z: [Z]
-			</text>
-			
-			<text
-			 top="100"
-			 width="320"
-			 height="40"
-			 left="10"
-			 word_wrap="true"
-		 >
-				Note:
-Advanced users familiar with 3d content creation tools may prefer to use the Advanced Mesh Import window.
-			</text>
-		</panel>
-		<button
-		 top="410"
-		 right="-175" 
-		 width="80"
-		 height="20"
-		 label="&lt;&lt; Back" />
-		<button
-		 top="410"
-		 right="-92"
-		 width="80"
-		 height="20"
-		 label="Next &gt;&gt; " />
-		<button
-		 top="410"
-		 right="-15"
-		 width="70"
-		 height="20"
-		 label="Cancel" />
-	</panel>
-	<spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
-</floater>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ layout="topleft"
+ name="Model Wizard"
+ help_topic="model_wizard"
+ bg_opaque_image_overlay="0.5 0.5 0.5 1"
+ height="450"
+ save_rect="true"
+ title="UPLOAD MODEL WIZARD"
+ width="530">
+	<button
+	 top="30"
+	 tab_stop="false"
+	 left="410"
+	 height="32"
+	 name="upload_btn"
+	 enabled="false"
+	 label="5. Upload"
+	 border="false"
+	 image_unselected="model_wizard/middle_button_off.png"
+	 image_selected="model_wizard/middle_button_press.png"
+	 image_hover_unselected="model_wizard/middle_button_over.png"
+	 image_disabled="model_wizard/middle_button_disabled.png"
+	 image_disabled_selected="model_wizard/middle_button_disabled.png"
+	 width="110"/>
+	<button
+	 top="30"
+	 left="310"
+	 height="32"
+	 tab_stop="false"
+	 name="review_btn"
+	 label="4. Review"
+	 enabled="false"
+	 border="false"
+	 image_unselected="model_wizard/middle_button_off.png"
+	 image_selected="model_wizard/middle_button_press.png"
+	 image_hover_unselected="model_wizard/middle_button_over.png"
+	 image_disabled="model_wizard/middle_button_disabled.png"
+	 image_disabled_selected="model_wizard/middle_button_disabled.png"
+	 width="110"/>
+	<button
+	 top="30"
+	 left="210"
+	 height="32"
+	 name="physics_btn"
+	 label="3. Physics"
+	 tab_stop="false"
+	 enabled="false"
+	 border="false"
+	 image_unselected="model_wizard/middle_button_off.png"
+	 image_selected="model_wizard/middle_button_press.png"
+	 image_hover_unselected="model_wizard/middle_button_over.png"
+	 image_disabled="model_wizard/middle_button_disabled.png"
+	 image_disabled_selected="model_wizard/middle_button_disabled.png"
+	 width="110"/>
+	<button
+	 top="30"
+	 left="115"
+	 name="optimize_btn"
+	 label="2. Optimize"
+	 tab_stop="false"
+	 height="32"
+	 border="false"
+	 image_unselected="model_wizard/middle_button_off.png"
+	 image_selected="model_wizard/middle_button_press.png"
+	 image_hover_unselected="model_wizard/middle_button_over.png"
+	 image_disabled="model_wizard/middle_button_disabled.png"
+	 image_disabled_selected="model_wizard/middle_button_disabled.png"
+	 width="110"/>
+	<button
+	 top="30"
+	 left="15"
+	 name="choose_file_btn"
+	 tab_stop="false"
+	 enabled="false"
+	 label="1. Choose File"
+	 height="32"
+	 image_unselected="model_wizard/left_button_off.png"
+	 image_selected="model_wizard/left_button_press.png"
+	 image_hover_unselected="model_wizard/left_button_over.png"
+	 image_disabled="model_wizard/left_button_disabled.png"
+	 image_disabled_selected="model_wizard/left_button_disabled.png"
+	 width="110"/>
+	<panel
+		 height="388"
+		 top_pad="0"
+		 name="choose_file_panel"
+		 visible="true"
+		 width="530"
+		 left="0">
+		<panel
+		 height="20"
+		 top_pad="20"
+		 width="500"
+		 name="header_panel"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="20">
+			<text
+			 width="200"
+			 left="10"
+			 top="2"
+			 name="header_text"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Upload Model
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="460"
+		 height="20"
+		 name="description"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 word_wrap="true"
+		 left_delta="0">
+			This wizard will help you import mesh models to Second Life.  First specify a file containing the model you wish to import.  Second Life supports COLLADA (.dae) files.
+		</text>
+		<panel
+		 top_delta="40"
+		 left="15"
+		 height="240"
+		 width="500"
+		 name="content"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true">
+			<text
+			 type="string"
+			 length="1"
+			 follows="left|top"
+			 top="10"
+			 height="10"
+			 layout="topleft"
+			 left_delta="10"
+			 name="Cache location"
+			 width="300">
+				Filename:
+			</text>
+			<line_editor
+			 border_style="line"
+			 border_thickness="1"
+			 follows="left|top"
+			 font="SansSerifSmall"
+			 height="20"
+			 layout="topleft"
+			 left_delta="0"
+			 max_length="4096"
+			 name="lod_file"
+			 top_pad="5"
+			 width="220" />
+			<button
+			 follows="left|top"
+			 height="23"
+			 label="Browse..."
+			 label_selected="Browse..."
+			 layout="topleft"
+			 left_pad="10"
+			 name="browse"
+			 top_delta="-1"
+			 width="75">
+			</button>
+			<text
+			 top_delta="-15"
+			 width="200"
+			 height="15"
+			 font="SansSerifSmall"
+			 layout="topleft"
+			 left_pad="24">
+				Model Preview:
+			</text>
+			<!-- Placeholder panel for 3D preview render -->
+			<panel
+			 left_delta="-2"
+			 top_pad="0"
+			 name="preview_panel"
+			 bevel_style="none"
+			 border_style="line"
+			 border="true"
+			 height="150"
+			 follows="all"
+			 width="150">
+			</panel>
+			<text
+			 top_pad="10"
+			 width="130"
+			 height="15"
+			 left="340"
+			 word_wrap="true">
+				Dimensions (meters):
+			</text>
+			<text
+			 top_pad="5"
+			 width="160"
+			 height="15"
+			 name="import_dimensions"
+			 left_delta="0">
+				X:  [X] |  Y:  [Y] | Z: [Z]
+			</text>
+			<text
+			 top="100"
+			 width="320"
+			 height="40"
+			 left="10"
+			 word_wrap="true">
+				Note:
+				Advanced users familiar with 3d content creation tools may prefer to use the Advanced Mesh Import window.
+			</text>
+			<combo_box left_pad="0" top_delta="0"  follows="left|top" list_position="below" height="18"
+  name="preview_lod_combo_2" width="90" tool_tip="LOD to view in preview render">
+				<combo_item name="high">
+					High
+				</combo_item>
+				<combo_item name="medium">
+					Medium
+				</combo_item>
+				<combo_item name="lowest">
+					Lowest
+				</combo_item>
+				<combo_item name="low">
+					Low
+				</combo_item>
+			</combo_box>
+		</panel>
+	</panel>
+
+
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="optimize_panel"
+		 visible="false"
+		 width="530"
+		 left="0">
+		<panel
+		 height="20"
+		 top_pad="20"
+		 name="header_panel"
+		 width="500"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="20">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 top="2"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Optimize
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="460"
+		 height="20"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="0">
+			This wizard is optimizing your model. This may take several minutes. To stop the process click the back button
+		</text>
+		<panel
+		 top_delta="40"
+		 visible="false"
+		 left="15"
+		 height="240"
+		 width="500"
+		 name="content"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true">
+			<text
+			 top="20"
+			 width="300"
+			 height="12"
+			 font="SansSerifBold"
+			 left="112">Generating Level of Detail</text>
+			<progress_bar
+			  name="optimize_progress_bar"
+              image_fill="model_wizard\progress_light.png"
+			  color_bg="1 1 1 1"
+			  color_bar="1 1 1 0.96"
+			  follows="left|right|top"
+			  width="260"
+			  height="16"
+			  image_bar="model_wizard\progress_bar_bg.png"
+			  top_pad="14"
+			  left="110"/>
+			<icon
+			 top_pad="10"
+			 left_delta="0"
+			 width="13"
+			 height="12"
+			 image_name="model_wizard\check_mark.png"/>
+			<text
+			 top_delta="0"
+			 left_delta="18"
+			 name="high_detail_text"
+			 width="200"
+			 height="14">Generate Level of Detail: High</text>
+			<icon
+			 top_pad="10"
+			 left_delta="-18"
+			 width="13"
+			 height="12"
+			 image_name="model_wizard\check_mark.png"/>
+			<text
+			 top_delta="0"
+			 left_delta="18"
+			 name="medium_detail_text"
+			 width="200"
+			 height="14">Generate Level of Detail: Medium</text>
+			<icon
+			 top_pad="10"
+			 left_delta="-18"
+			 width="13"
+			 height="12"
+			 image_name="model_wizard\check_mark.png"/>
+			<text
+			 top_delta="0"
+			 left_delta="18"
+			 name="low_detail_text"
+			 width="200"
+			 height="14">Generate Level of Detail: Low</text>
+			<icon
+			 top_pad="10"
+			 left_delta="-18"
+			 width="13"
+			 height="12"
+			 image_name="model_wizard\check_mark.png"/>
+			<text
+			 top_delta="0"
+			 left_delta="18"
+			 name="lowest_detail_text"
+			 width="200"
+			 height="14">Generate Level of Detail: Lowest</text>
+		</panel>
+		<panel
+				 top_delta="0"
+				 left_delta="0"
+				 height="240"
+				 width="500"
+				 name="content2"
+				 bg_opaque_color="DkGray2"
+				 background_visible="true"
+				 background_opaque="true">
+			<text top="10" left="10" width="85"  follows="left|top" height="15" name="lod_label">
+				Model Preview:
+			</text>
+			<combo_box left_pad="5" top_delta="-2"  follows="left|top" list_position="below" height="18"
+	     name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render">
+				<combo_item name="high">
+					High
+				</combo_item>
+				<combo_item name="medium">
+					Medium
+				</combo_item>
+				<combo_item name="lowest">
+					Lowest
+				</combo_item>
+				<combo_item name="low">
+					Low
+				</combo_item>
+			</combo_box>
+			<panel
+				 left="10"
+				 top_pad="5"
+				 name="preview_panel"
+				 bevel_style="none"
+				 border_style="line"
+				 border="true"
+				 height="175"
+				 follows="all"
+				 width="175">
+			</panel>
+			<text top="50" left="210"  font="SansSerifSmallBold" width="300" height="4">Performance                            Accuracy</text>
+
+			<slider
+		   follows="left|top"
+		   height="20"
+		   increment="1"
+		   layout="topleft"
+		   left="220"
+		   max_val="2"
+		   initial_vauel="1"
+		   min_val="0"
+		   name="accuracy_slider"
+		   show_text="false"
+		   top="105"
+		   width="250" />
+			<text font="SansSerifSmall" top_pad="4"  width="300" left_delta="6" height="4">|                                      |                                      |</text>
+
+		</panel>
+	</panel>
+
+
+
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="physics_panel"
+		 visible="false"
+		 width="530"
+		 left="0">
+		<panel
+		 height="20"
+		 top_pad="20"
+		 name="header_panel"
+		 width="500"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="20">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 top="2"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Physics
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="460"
+		 height="20"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="0">
+			The wizard will create a physical shape, which determines how the object interacts with other objects and avatars. Set the slider to the detail level most appropriate for how your object will be used:
+		</text>
+		<panel
+		 top_delta="40"
+		 left="15"
+		 height="240"
+		 width="500"
+		 name="content"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"/>
+	</panel>
+
+
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="review_panel"
+		 visible="false"
+		 width="530"
+		 left="0">
+		<panel
+		 height="20"
+		 top_pad="20"
+		 name="header_panel"
+		 width="500"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="20">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 top="2"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Review
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="460"
+		 height="20"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="0">
+			Review the details below then click. Upload to upload your model. Your L$ balance will be charged when you click Upload.
+		</text>
+		<panel
+		 top_delta="40"
+		 left="15"
+		 height="240"
+		 width="500"
+		 name="content"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"/>
+	</panel>
+
+
+
+
+	<panel
+		 height="388"
+		 top_delta="0"
+		 name="upload_panel"
+		 visible="false"
+		 width="530"
+		 left="0">
+		<panel
+		 height="20"
+		 top_pad="20"
+		 name="header_panel"
+		 width="500"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true"
+		 left="20">
+			<text
+			 width="200"
+			 left="10"
+			 name="header_text"
+			 top="2"
+			 height="10"
+			 font="SansSerifBig"
+			 layout="topleft">
+				Upload Complete!
+			</text>
+		</panel>
+		<text
+		 top_pad="14"
+		 width="460"
+		 height="20"
+		 font="SansSerifSmall"
+		 layout="topleft"
+		 name="description"
+		 word_wrap="true"
+		 left_delta="0">
+			Congratulations! Your model has been sucessfully uploaded.  You will find the model in the Objects folder in your inventory.
+		</text>
+		<panel
+		 top_delta="40"
+		 left="15"
+		 height="240"
+		 width="500"
+		 name="content"
+		 bg_opaque_color="DkGray2"
+		 background_visible="true"
+		 background_opaque="true">
+			<button top="10" follows="top|left" height="20" label="Upload"
+				   left="15" width="80" name="ok_btn" tool_tip="Upload to simulator"/>
+		</panel>
+	</panel>
+
+
+
+	<button
+	 top="410"
+	 right="-245"
+	 width="90"
+	 height="20"
+	 name="back"
+	 label="&lt;&lt; Back" />
+	<button
+	 top_delta="0"
+	 right="-150"
+	 width="90"
+	 height="20"
+	 name="next"
+	 label="Next &gt;&gt; " />
+	<button
+	 top_delta="0"
+	 right="-15"
+	 width="90"
+	 height="20"
+	 name="cancel"
+	 label="Cancel" />
+	<spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/>
+
+	<string name="status_idle">Idle</string>
+	<string name="status_reading_file">Loading...</string>
+	<string name="status_generating_meshes">Generating Meshes...</string>
+	<string name="high">High</string>
+	<string name="medium">Medium</string>
+	<string name="low">Low</string>
+	<string name="lowest">Lowest</string>
+	<string name="mesh_status_good">Ship it!</string>
+	<string name="mesh_status_na">N/A</string>
+	<string name="mesh_status_none">None</string>
+	<string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string>
+	<string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string>
+	<string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string>
+	<string name="mesh_status_missing_lod">Missing required level of detail.</string>
+	<string name="layer_all">All</string>
+	<!-- Text to display in physics layer combo box for "all layers" -->
+
+</floater>