diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 7d361e4f6a0b331a0c7c1eecd9743c99cbbfa7e6..9caff9e0384d89517ca5d9d76b952ae767faf6dc 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -188,6 +188,7 @@ set(viewer_SOURCE_FILES
     lleventnotifier.cpp
     lleventpoll.cpp
     llexpandabletextbox.cpp
+	llexperienceassociationresponder.cpp
     llexternaleditor.cpp
     llface.cpp
     llfasttimerview.cpp
@@ -773,6 +774,7 @@ set(viewer_HEADER_FILES
     lleventnotifier.h
     lleventpoll.h
     llexpandabletextbox.h
+	llexperienceassociationresponder.h
     llexternaleditor.h
     llface.h
     llfasttimerview.h
diff --git a/indra/newview/llexperienceassociationresponder.cpp b/indra/newview/llexperienceassociationresponder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..69451bc054fb7e127bc65281b03e991010809241
--- /dev/null
+++ b/indra/newview/llexperienceassociationresponder.cpp
@@ -0,0 +1,80 @@
+/** 
+ * @file llexperienceassociationresponder.cpp
+ * @brief llexperienceassociationresponder implementation
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2013, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llexperienceassociationresponder.h"
+#include "llexperiencecache.h"
+
+ExperienceAssociationResponder::ExperienceAssociationResponder(ExperienceAssociationResponder::callback_t callback):mCallback(callback)
+{
+    ref();
+}
+
+void ExperienceAssociationResponder::error( U32 status, const std::string& reason )
+{
+    LLSD msg;
+    msg["error"]=(LLSD::Integer)status;
+    msg["message"]=reason;
+    LL_INFOS("ExperienceAssociation") << "Failed to look up associated experience: " << status << ": " << reason << LL_ENDL;
+
+    sendResult(msg);
+  
+}
+void ExperienceAssociationResponder::result( const LLSD& content )
+{
+    if(!content.has("experience"))
+    {
+
+        LLSD msg;
+        msg["message"]="no experience";
+        msg["error"]=-1;
+        sendResult(msg);
+        LL_ERRS("ExperienceAssociation")  << "Associated experience missing" << LL_ENDL;
+    }
+
+    LLExperienceCache::get(content["experience"].asUUID(), boost::bind(&ExperienceAssociationResponder::sendResult, this, _1));
+
+    /* LLLiveLSLEditor* scriptCore = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", mParent);
+
+    if(!scriptCore)
+        return;
+
+    LLUUID id;
+    if(content.has("experience"))
+    {
+        id=content["experience"].asUUID();
+    }
+    scriptCore->setAssociatedExperience(id);*/
+}
+
+void ExperienceAssociationResponder::sendResult( const LLSD& experience )
+{
+    mCallback(experience);
+    unref();
+}
+
+
+
diff --git a/indra/newview/llexperienceassociationresponder.h b/indra/newview/llexperienceassociationresponder.h
new file mode 100644
index 0000000000000000000000000000000000000000..aa0c51abb546c9912b3940d1b87b3f8816d87cd3
--- /dev/null
+++ b/indra/newview/llexperienceassociationresponder.h
@@ -0,0 +1,53 @@
+#include "llhttpclient.h"
+#include "llsd.h"
+/** 
+ * @file llexperienceassociationresponder.h
+ * @brief llexperienceassociationresponder and related class definitions
+ *
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2013, Linden Research, Inc.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ * 
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+ * $/LicenseInfo$
+ */
+
+
+
+#ifndef LL_LLEXPERIENCEASSOCIATIONRESPONDER_H
+#define LL_LLEXPERIENCEASSOCIATIONRESPONDER_H
+
+#include "llhttpclient.h"
+#include "llsd.h"
+
+class ExperienceAssociationResponder : public LLHTTPClient::Responder
+{
+public:
+    typedef boost::function<void(const LLSD& experience)> callback_t;
+
+    ExperienceAssociationResponder(callback_t callback);
+    virtual void result(const LLSD& content);
+    virtual void error(U32 status, const std::string& reason);
+
+private:
+    void sendResult(const LLSD& experience);
+
+    callback_t mCallback;
+
+};
+
+#endif // LL_LLEXPERIENCEASSOCIATIONRESPONDER_H
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index bd8f65e7678031450455c8914308fe1b9076f2ca..09152ac060437cce4f2c9cf859651447b1fd4292 100755
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -87,6 +87,7 @@
 #include "llviewercontrol.h"
 #include "llappviewer.h"
 #include "llexperiencecache.h"
+#include "llexperienceassociationresponder.h"
 
 const std::string HELLO_LSL =
 	"default\n"
@@ -119,54 +120,23 @@ static bool have_script_upload_cap(LLUUID& object_id)
 	return object && (! object->getRegion()->getCapability("UpdateScriptTask").empty());
 }
 
-class ExperienceAssociationResponder : public LLHTTPClient::Responder
-{
-public:
-    ExperienceAssociationResponder(const LLUUID& parent):mParent(parent)
-    {
-    }
-
-    LLUUID mParent;
-
-    virtual void result(const LLSD& content)
-    {
-
-        LLLiveLSLEditor* scriptCore = LLFloaterReg::findTypedInstance<LLLiveLSLEditor>("preview_scriptedit", mParent);
-
-        if(!scriptCore)
-            return;
-
-        LLUUID id;
-        if(content.has("experience"))
-        {
-            id=content["experience"].asUUID();
-        }
-        scriptCore->setAssociatedExperience(id);
-    }
-
-    virtual void error(U32 status, const std::string& reason)
-    {
-        llinfos << "Failed to look up associated script: " << status << ": " << reason << llendl;
-    }
-
-};
 
 class ExperienceResponder : public LLHTTPClient::Responder
 {
 public:
-    ExperienceResponder(const LLHandle<LLScriptEdCore>& parent):mParent(parent)
+    ExperienceResponder(const LLHandle<LLLiveLSLEditor>& parent):mParent(parent)
     {
     }
 
-    LLHandle<LLScriptEdCore> mParent;
+    LLHandle<LLLiveLSLEditor> mParent;
 
     virtual void result(const LLSD& content)
     {
-        LLScriptEdCore* scriptCore = mParent.get();
-        if(!scriptCore)
+        LLLiveLSLEditor* parent = mParent.get();
+        if(!parent)
             return;
 
-        scriptCore->setExperienceIds(content["experience_ids"]);		
+        parent->setExperienceIds(content["experience_ids"]);		
     }
 };
 
@@ -426,34 +396,37 @@ LLScriptEdCore::~LLScriptEdCore()
 	delete mLiveFile;
 }
 
-void LLScriptEdCore::experienceChanged()
+void LLLiveLSLEditor::experienceChanged()
 {
-    if(mAssociatedExperience != mExperiences->getSelectedValue().asUUID())
+    if(mScriptEd->getAssociatedExperience() != mExperiences->getSelectedValue().asUUID())
     {
-        enableSave(TRUE);
-        getChildView("Save_btn")->setEnabled(TRUE);
-        mAssociatedExperience = mExperiences->getSelectedValue().asUUID();
+        mScriptEd->enableSave(getIsModifiable());
+        //getChildView("Save_btn")->setEnabled(TRUE);
+        mScriptEd->setAssociatedExperience(mExperiences->getSelectedValue().asUUID());
+        updateExperiencePanel();
     }
 }
 
-void LLScriptEdCore::onToggleExperience( LLUICtrl *ui, void* userdata )
+void LLLiveLSLEditor::onToggleExperience( LLUICtrl *ui, void* userdata )
 {
-    LLScriptEdCore* self = (LLScriptEdCore*)userdata;
+    LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata;
 
     LLUUID id;
     if(self->mExperienceEnabled->get())
     {
-        if(self->mAssociatedExperience.isNull())
+        if(self->mScriptEd->getAssociatedExperience().isNull())
         {
             id=self->mExperienceIds.beginArray()->asUUID();
         }
     }
 
-    if(id != self->mAssociatedExperience)
+    if(id != self->mScriptEd->getAssociatedExperience())
     {
-        self->enableSave(TRUE);
+        self->mScriptEd->enableSave(self->getIsModifiable());
     }
-    self->setAssociatedExperience(id);
+    self->mScriptEd->setAssociatedExperience(id);
+
+    self->updateExperiencePanel();
 }
 
 BOOL LLScriptEdCore::postBuild()
@@ -462,12 +435,6 @@ BOOL LLScriptEdCore::postBuild()
 
 	mFunctions = getChild<LLComboBox>( "Insert...");
 
-	mExperiences = getChild<LLComboBox>("Experiences...");
-	mExperiences->setCommitCallback(boost::bind(&LLScriptEdCore::experienceChanged, this));
-
-    mExperienceEnabled = getChild<LLCheckBoxCtrl>("enable_xp");
- 
-    childSetCommitCallback("enable_xp", onToggleExperience, this);
 
    
 	childSetCommitCallback("Insert...", &LLScriptEdCore::onBtnInsertFunction, this);
@@ -482,8 +449,6 @@ BOOL LLScriptEdCore::postBuild()
 	
 
 
-	requestExperiences();
-
 
 	std::vector<std::string> funcs;
 	std::vector<std::string> tooltips;
@@ -1290,18 +1255,18 @@ LLUUID LLScriptEdCore::getAssociatedExperience()const
     return mAssociatedExperience;
 }
 
-void LLScriptEdCore::setExperienceIds( const LLSD& experience_ids )
+void LLLiveLSLEditor::setExperienceIds( const LLSD& experience_ids )
 {
     mExperienceIds=experience_ids;
     updateExperiencePanel();
 }
 
 
-void LLScriptEdCore::updateExperiencePanel()
+void LLLiveLSLEditor::updateExperiencePanel()
 {
-    BOOL editable = mEditor->getEnabled();
+    BOOL editable = getIsModifiable();
 
-    if(mAssociatedExperience.isNull())
+    if(mScriptEd->getAssociatedExperience().isNull())
     {
         mExperienceEnabled->set(FALSE);
         mExperiences->setVisible(FALSE);
@@ -1328,10 +1293,10 @@ void LLScriptEdCore::updateExperiencePanel()
     }
 }
 
-void LLScriptEdCore::addExperienceInfo(const LLSD& experience, BOOL enabled)
+void LLLiveLSLEditor::addExperienceInfo(const LLSD& experience, BOOL enabled)
 {  
     LLUUID id = experience[LLExperienceCache::EXPERIENCE_ID].asUUID();
-    EAddPosition position = (id == mAssociatedExperience)?ADD_TOP:ADD_BOTTOM;
+    EAddPosition position = (id == mScriptEd->getAssociatedExperience())?ADD_TOP:ADD_BOTTOM;
     LLScrollListItem* item=mExperiences->add(experience[LLExperienceCache::NAME], id, position );
     if(!enabled)
     {
@@ -1339,20 +1304,20 @@ void LLScriptEdCore::addExperienceInfo(const LLSD& experience, BOOL enabled)
     }
 }
 
-void LLScriptEdCore::buildExperienceList()
+void LLLiveLSLEditor::buildExperienceList()
 {
     mExperiences->clear();
     bool foundAssociated=false;
     for(LLSD::array_const_iterator it = mExperienceIds.beginArray(); it != mExperienceIds.endArray(); ++it)
     {
         LLUUID id = it->asUUID();
-        foundAssociated |= (id == mAssociatedExperience);
-        LLExperienceCache::get(id, boost::bind(&LLScriptEdCore::addExperienceInfo, this, _1, TRUE));  
+        foundAssociated |= (id == mScriptEd->getAssociatedExperience());
+        LLExperienceCache::get(id, boost::bind(&LLLiveLSLEditor::addExperienceInfo, this, _1, TRUE));  
     }
 
     if(!foundAssociated )
     {
-        LLExperienceCache::get(mAssociatedExperience, boost::bind(&LLScriptEdCore::addExperienceInfo, this, _1, FALSE));  
+        LLExperienceCache::get(mScriptEd->getAssociatedExperience(), boost::bind(&LLLiveLSLEditor::addExperienceInfo, this, _1, FALSE));  
     }
 
 }
@@ -1361,14 +1326,13 @@ void LLScriptEdCore::buildExperienceList()
 void LLScriptEdCore::setAssociatedExperience( const LLUUID& experience_id )
 {
     mAssociatedExperience = experience_id;
-    updateExperiencePanel();
 }
 
 
 
-void LLScriptEdCore::requestExperiences()
+void LLLiveLSLEditor::requestExperiences()
 {
-    if (!mEditor->getEnabled())
+    if (!getIsModifiable())
     {
         return;
     }
@@ -1379,7 +1343,7 @@ void LLScriptEdCore::requestExperiences()
         std::string lookup_url=region->getCapability("GetCreatorExperiences"); 
         if(!lookup_url.empty())
         {
-            LLHTTPClient::get(lookup_url, new ExperienceResponder(getDerivedHandle<LLScriptEdCore>()));
+            LLHTTPClient::get(lookup_url, new ExperienceResponder(getDerivedHandle<LLLiveLSLEditor>()));
         }
     }
 }
@@ -1945,6 +1909,15 @@ BOOL LLLiveLSLEditor::postBuild()
 	mScriptEd->mEditor->makePristine();
 	mScriptEd->mEditor->setFocus(TRUE);
 
+
+    mExperiences = getChild<LLComboBox>("Experiences...");
+    mExperiences->setCommitCallback(boost::bind(&LLLiveLSLEditor::experienceChanged, this));
+
+    mExperienceEnabled = getChild<LLCheckBoxCtrl>("enable_xp");
+
+    childSetCommitCallback("enable_xp", onToggleExperience, this);
+    
+
 	return LLPreview::postBuild();
 }
 
@@ -2078,6 +2051,8 @@ void LLLiveLSLEditor::loadAsset()
 										  time_corrected());
 		mAssetStatus = PREVIEW_ASSET_LOADED;
 	}
+
+    requestExperiences();
 }
 
 // static
@@ -2556,7 +2531,11 @@ void LLLiveLSLEditor::fetchAssociatedExperience(const LLUUID& asset_id)
             LLSD fields;
             fields.append("experience");
             request["fields"] = fields;
-            LLHTTPClient::post(lookup_url, request, new ExperienceAssociationResponder(getKey()));
+
+            ExperienceAssociationResponder::callback_t f = boost::bind(&LLLiveLSLEditor::setAssociatedExperience, getDerivedHandle<LLLiveLSLEditor>(), _1);
+            LLHTTPClient::post(lookup_url, request, new ExperienceAssociationResponder(f));
+
+            //test me pls
         }
     }
 }
@@ -2634,10 +2613,17 @@ BOOL LLLiveLSLEditor::monoChecked() const
 	return FALSE;
 }
 
-void LLLiveLSLEditor::setAssociatedExperience( const LLUUID& experience_id )
+void LLLiveLSLEditor::setAssociatedExperience( LLHandle<LLLiveLSLEditor> editor, const LLSD& experience )
 {
-    if(mScriptEd)
+    LLLiveLSLEditor* scriptEd = editor.get();
+    if(scriptEd)
     {
-        mScriptEd->setAssociatedExperience(experience_id);
+        LLUUID id;
+        if(experience.has(LLExperienceCache::EXPERIENCE_ID))
+        {
+            id=experience[LLExperienceCache::EXPERIENCE_ID].asUUID();
+        }
+        scriptEd->mScriptEd->setAssociatedExperience(id);
+        scriptEd->updateExperiencePanel();
     }
 }
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index 9578396f91b00d512a2eda7578cef5f8c78dfe43..bd594cdb9d67ed85ad4b4f4be366875172de6e3b 100755
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -101,19 +101,13 @@ class LLScriptEdCore : public LLPanel
 	static void		onBtnInsertFunction(LLUICtrl*, void*);
 	static void		onBtnLoadFromFile(void*);
     static void		onBtnSaveToFile(void*);
-    static void     onToggleExperience(LLUICtrl *ui, void* userdata);
 
 	static bool		enableSaveToFileMenu(void* userdata);
 	static bool		enableLoadFromFileMenu(void* userdata);
 
-	virtual bool	hasAccelerators() const { return true; }
-	void			addExperienceInfo( const LLSD& experience, BOOL enabled );
-    void            setExperienceIds(const LLSD& experience_ids);
-    void            buildExperienceList();
+    virtual bool	hasAccelerators() const { return true; }
     LLUUID 			getAssociatedExperience()const;
-
     void            setAssociatedExperience( const LLUUID& experience_id );
-    void            updateExperiencePanel();
 
 private:
 	void		onBtnHelp();
@@ -128,10 +122,6 @@ class LLScriptEdCore : public LLPanel
 	
 	void enableSave(BOOL b) {mEnableSave = b;}
 
-	void requestExperiences();
-    void experienceChanged();
-    void addAssociatedExperience(const LLSD& experience);
-
 protected:
 	void deleteBridges();
 	void setHelpPage(const std::string& help_string);
@@ -146,9 +136,7 @@ class LLScriptEdCore : public LLPanel
 	void			(*mSaveCallback)(void* userdata, BOOL close_after_save);
 	void			(*mSearchReplaceCallback) (void* userdata);
     void*			mUserdata;
-	LLComboBox		*mFunctions;
-	LLComboBox     	*mExperiences;
-    LLCheckBoxCtrl  *mExperienceEnabled;
+    LLComboBox		*mFunctions;
 	BOOL			mForceClose;
 	LLPanel*		mCodePanel;
 	LLScrollListCtrl* mErrorList;
@@ -161,7 +149,6 @@ class LLScriptEdCore : public LLPanel
 	BOOL			mHasScriptData;
 	LLLiveLSLFile*	mLiveFile;
     LLUUID          mAssociatedExperience;
-    LLSD            mExperienceIds;
 
 	LLScriptEdContainer* mContainer; // parent view
 };
@@ -244,8 +231,19 @@ class LLLiveLSLEditor : public LLScriptEdContainer
 	/*virtual*/ BOOL postBuild();
 	
     void setIsNew() { mIsNew = TRUE; }
-    void setAssociatedExperience( const LLUUID& experience_id );
+
+    static void setAssociatedExperience( LLHandle<LLLiveLSLEditor> editor, const LLSD& experience );
+    static void onToggleExperience(LLUICtrl *ui, void* userdata);
+
     void fetchAssociatedExperience(const LLUUID& asset_id);
+
+    void addExperienceInfo( const LLSD& experience, BOOL enabled );
+    void setExperienceIds(const LLSD& experience_ids);
+    void buildExperienceList();
+    void updateExperiencePanel();
+    void requestExperiences();
+    void experienceChanged();
+    void addAssociatedExperience(const LLSD& experience);
 	
 private:
 	virtual BOOL canClose();
@@ -299,6 +297,11 @@ class LLLiveLSLEditor : public LLScriptEdContainer
 
 	LLCheckBoxCtrl*	mMonoCheckbox;
 	BOOL mIsModifiable;
+
+
+    LLComboBox     	*mExperiences;
+    LLCheckBoxCtrl  *mExperienceEnabled;
+    LLSD            mExperienceIds;
 };
 
 #endif  // LL_LLPREVIEWSCRIPT_H
diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
index 562936ed805195723d2d17a156c1cd2a4329671b..d8c2a753a11f7c176f15bc71696c49c1e967d244 100755
--- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
@@ -1,71 +1,110 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
- legacy_header_height="18"
- bevel_style="none"
- border_style="line"
- can_resize="true"
- height="580"
- layout="topleft"
- min_height="271"
- min_width="328"
- name="script ed float"
- help_topic="script_ed_float"
- save_rect="true"
- title="SCRIPT: NEW SCRIPT"
- width="508">
-    <floater.string
-     name="not_allowed">
-        You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
-    </floater.string>
-    <floater.string
-     name="script_running">
-        Running
-    </floater.string>
-    <floater.string
-     name="Title">
-        SCRIPT: [NAME]
-    </floater.string>
-    <panel
-     bevel_style="none"
+  legacy_header_height="18"
+  bevel_style="none"
+  border_style="line"
+  can_resize="true"
+  height="582"
+  layout="topleft"
+  min_height="271"
+  min_width="328"
+  name="script ed float"
+  help_topic="script_ed_float"
+  save_rect="true"
+  title="SCRIPT: NEW SCRIPT"
+  width="508">
+  <floater.string
+    name="not_allowed">
+    You can not view or edit this script, since it has been set as &quot;no copy&quot;. You need full permissions to view or edit a script inside an object.
+  </floater.string>
+  <floater.string
+    name="script_running">
+    Running
+  </floater.string>
+  <floater.string
+    name="Title">
+    SCRIPT: [NAME]
+  </floater.string>
+  <floater.string
+    name="experience_enabled">
+    Uncheck to remove the current experience
+  </floater.string>
+  <floater.string
+    name="no_experiences">
+    You are not authorized for any experiences
+  </floater.string>
+  <floater.string
+    name="add_experiences">
+    Select to add an experience
+  </floater.string>
+  <panel
+    bevel_style="none"
      
-     border_style="line"
-     follows="left|top|right|bottom"
-     height="522"
-     layout="topleft"
-     left="10"
-     name="script ed panel"
-     top="20"
-     width="497" />
-    <button
-     follows="left|bottom"
-     height="23"
-     label="Reset"
-     label_selected="Reset"
-     layout="topleft"
-     name="Reset"
-     left="10"
-     width="85" />
-    <check_box
+    border_style="line"
+    follows="left|top|right|bottom"
+    height="499"
+    layout="topleft"
+    left="10"
+    name="script ed panel"
+    top="16"
+    width="501" />
+  <button
+    follows="left|bottom"
+    height="23"
+    label="Reset"
+    label_selected="Reset"
+    layout="topleft"
+    name="Reset"
+    left="10"
+    width="85" />
+  <check_box
     left_delta="90"
     top_delta="3"
-     enabled="false"
-     follows="left|bottom"
-     font="SansSerif"
-     height="18"
-     initial_value="true"
-     label="Running"
-     layout="topleft"
-     name="running"
-     width="205" />
-    <check_box
+    enabled="false"
+    follows="left|bottom"
+    font="SansSerif"
+    height="18"
+    initial_value="true"
+    label="Running"
+    layout="topleft"
+    name="running"
+    width="205" />
+  <check_box
     left_delta="140"
-     enabled="true"
-     follows="left|bottom"
-     font="SansSerif"
-     height="18"
-     initial_value="true"
-     label="Mono"
-     layout="topleft"
-     name="mono"
-     width="100" />
+    enabled="true"
+    follows="left|bottom"
+    font="SansSerif"
+    height="18"
+    initial_value="true"
+    label="Mono"
+    layout="topleft"
+    name="mono"
+    width="100" />
+  <check_box width="130"
+             height="21"
+             enabled="false"
+             left="9"
+             top_pad="10"
+             layout="topleft"
+             follows="bottom|left"
+             label="Use Experience:"
+             name="enable_xp"/>
+  <combo_box
+    label=""
+    top_pad="-21"
+    left="149"
+    right="467"
+    layout="topleft"
+    follows="left|bottom|right"
+    visible="false"
+    name="Experiences..."/>
+  <button label="&gt;"
+          name="view_profile"
+          height="23"
+          width="23"
+          right="496"
+          layout="topleft"
+          top_pad="-23"
+          follows="right"
+          visible="false"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml
index 18a8ddc1bf3890247399e35adbb703bc8a26bf72..ed99651a780c51e9c1e38d0ea171bbf140088bf9 100755
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -32,18 +32,6 @@
     name="external_editor_not_set">
     Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting.
   </panel.string>
-  <panel.string
-    name="experience_enabled">
-    Uncheck to remove the current experience
-  </panel.string>
-  <panel.string
-    name="no_experiences">
-    You are not authorized for any experiences
-  </panel.string>
-  <panel.string
-    name="add_experiences">
-    Select to add an experience
-  </panel.string>
   <menu_bar
     bg_visible="false"
     follows="left|top"
@@ -162,7 +150,7 @@
     length="1"
     follows="left|top|right|bottom"
     font="Monospace"
-    height="346"
+    height="369"
     ignore_tab="false"
     layout="topleft"
     max_length="65536"
@@ -217,32 +205,5 @@
     right="396"
     name="Edit_btn"
     width="81" />
-  <check_box width="130"
-             height="21"
-             enabled="false"
-             left="0"
-             top="490"
-             layout="topleft"
-             follows="bottom|left"
-             label="Use Experience:"
-             name="enable_xp"/>
-  <combo_box
-    label=""
-    top_pad="-23"
-    left="135"
-    right="454"
-    layout="topleft"
-    follows="left|bottom|right"
-    visible="false"
-    name="Experiences..."/>
-  <button label="&gt;"
-          name="view_profile"
-          height="23"
-          width="23"
-          right="482"
-          layout="topleft"
-          top_pad="-23"
-          follows="right"
-          visible="false"/>
 
 </panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index c5dfb703e50ccbabcc2ab455bc3c995581da0ac0..c9c19f6d579a586c918ffca96e8ce376f218785b 100755
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -1,440 +1,471 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
-     follows="all"
-	 height="570"
-	 layout="topleft"
-	 name="item properties"
-	 help_topic="item_properties"
-	 title="Item Profile"
-	 width="333">
-	<panel.string
-		 name="unknown">
-        (unknown)
-	</panel.string>
-    <panel.string
-         name="unknown_multiple">
-        (unknown / multiple)
-    </panel.string>
-	<panel.string
-		 name="public">
-        (public)
-    </panel.string>
-	<panel.string
-    	 name="you_can">
-        You can:
-    </panel.string>
-	<panel.string
-    	 name="owner_can">
-        Owner can:
-    </panel.string>
-	<panel.string
-    	 name="acquiredDate">
-        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
-	</panel.string>
-	<panel.string
-		 name="origin_inventory">
-        (Inventory)
-	</panel.string>
-	<panel.string
-		 name="origin_inworld">
-        (Inworld)
-	</panel.string>
-	<icon
-     	 follows="top|right"
-     	 height="18"
-     	 image_name="Lock"
-	     layout="topleft"
-		 right="-15"
-	     mouse_opaque="true"
-	     name="IconLocked"
-	     top="8"
-	     width="18" />
-    <button
-     follows="top|left"
-     height="24"
-     image_hover_unselected="BackButton_Over"
-     image_pressed="BackButton_Press"
-     image_unselected="BackButton_Off"
-     layout="topleft"
-     left="12"
-     name="back_btn"
-     tab_stop="false"
-     top="2"
-     width="30"
-     use_draw_context_alpha="false" />
-    <text
-     follows="top|left|right"
-     font="SansSerifHugeBold"
-     height="26"
-     layout="topleft"
-     left_pad="3"
-     name="title"
-     text_color="LtGray"
-     top="2"
-     use_ellipses="true"
-     value="Item Profile"
-     width="275" />
-    	    <text
-     follows="top|left|right"
-     height="13"
-     layout="topleft"
-     left="45"
-     name="origin"
-     text_color="LtGray_50"
-     use_ellipses="true"
-     value="(Inventory)"
-     width="275" />
-    <scroll_container
-     color="DkGray2"
-     follows="all"
-     layout="topleft"
-     left="9"
-     name="item_profile_scroll"
-     opaque="true"
-     height="493"
-     width="313"
-     top="45">
-        <panel
-             follows="left|top|right"
-             height="390"
-             help_topic=""
-             label=""
-             layout="topleft"
-             left="0"
-             name="item_profile"
-             top="0"
-             width="295">
-            <text
-                 type="string"
-                 length="1"
-                 follows="left|top"
-                 height="10"
-                 layout="topleft"
-                 left="5"
-                 name="LabelItemNameTitle"
-                 top="10"
-                 width="78">
-                Name:
-            </text>
-            <line_editor
-                 border_style="line"
-                 border_thickness="1"
-                 follows="left|top|right"
-                 height="20"
-                 layout="topleft"
-                 left_delta="78"
-                 max_length_bytes="63"
-                 name="LabelItemName"
-                 top_delta="0"
-                 width="210" />
-            <text
-                 type="string"
-                 length="1"
-                 follows="left|top"
-                 height="10"
-                 layout="topleft"
-                 left="5"
-                 name="LabelItemDescTitle"
-                 top_pad="10"
-                 width="78">
-                Description:
-            </text>
-            <line_editor
-                 border_style="line"
-                 border_thickness="1"
-                 follows="left|top|right"
-                 height="23"
-                 layout="topleft"
-                 left_delta="78"
-                 max_length_bytes="127"
-                 name="LabelItemDesc"
-                 top_delta="-5"
-                 width="210" />
-            <text
-                 type="string"
-                 length="1"
-                 follows="left|top"
-                 height="23"
-                 layout="topleft"
-                 left="5"
-                 name="LabelCreatorTitle"
-              top_pad="10"
-                 width="78">
-                Creator:
-            </text>
-                <avatar_icon
-         follows="top|left"
-         height="20"
-         default_icon_name="Generic_Person"
-         layout="topleft"
-         left_pad="0"
-         top_delta="-6"
-         mouse_opaque="true"
-         width="20" />
-            <text
-                 type="string"
-         follows="left|right|top"
-         font="SansSerifSmall"
-         height="15"
-         layout="topleft"
-         left_pad="5"
-                 name="LabelCreatorName"
-       top_delta="6"
-       use_ellipses="true"
-       width="165">
-          </text>
-          <button
-          follows="top|right"
-          height="16"
+  follows="all"
+  height="570"
+  layout="topleft"
+  name="item properties"
+  help_topic="item_properties"
+  title="Item Profile"
+  width="333">
+  <panel.string
+    name="no_experience">
+    (none)
+  </panel.string>
+  <panel.string
+    name="unknown">
+    (unknown)
+  </panel.string>
+  <panel.string
+    name="unknown_multiple">
+    (unknown / multiple)
+  </panel.string>
+  <panel.string
+    name="public">
+    (public)
+  </panel.string>
+  <panel.string
+    name="you_can">
+    You can:
+  </panel.string>
+  <panel.string
+    name="owner_can">
+    Owner can:
+  </panel.string>
+  <panel.string
+    name="acquiredDate">
+    [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+  </panel.string>
+  <panel.string
+    name="origin_inventory">
+    (Inventory)
+  </panel.string>
+  <panel.string
+    name="origin_inworld">
+    (Inworld)
+  </panel.string>
+  <icon
+    follows="top|right"
+    height="18"
+    image_name="Lock"
+    layout="topleft"
+    right="-15"
+    mouse_opaque="true"
+    name="IconLocked"
+    top="8"
+    width="18" />
+  <button
+    follows="top|left"
+    height="24"
+    image_hover_unselected="BackButton_Over"
+    image_pressed="BackButton_Press"
+    image_unselected="BackButton_Off"
+    layout="topleft"
+    left="12"
+    name="back_btn"
+    tab_stop="false"
+    top="2"
+    width="30"
+    use_draw_context_alpha="false" />
+  <text
+    follows="top|left|right"
+    font="SansSerifHugeBold"
+    height="26"
+    layout="topleft"
+    left_pad="3"
+    name="title"
+    text_color="LtGray"
+    top="2"
+    use_ellipses="true"
+    value="Item Profile"
+    width="275" />
+  <text
+    follows="top|left|right"
+    height="13"
+    layout="topleft"
+    left="45"
+    name="origin"
+    text_color="LtGray_50"
+    use_ellipses="true"
+    value="(Inventory)"
+    width="275" />
+  <scroll_container
+    color="DkGray2"
+    follows="all"
+    layout="topleft"
+    left="9"
+    name="item_profile_scroll"
+    opaque="true"
+    height="493"
+    width="313"
+    top="45">
+    <panel
+      follows="left|top|right"
+      height="390"
+      help_topic=""
+      label=""
+      layout="topleft"
+      left="0"
+      name="item_profile"
+      top="0"
+      width="295">
+      <text
+        type="string"
+        length="1"
+        follows="left|top"
+        height="10"
+        layout="topleft"
+        left="5"
+        name="LabelItemNameTitle"
+        top="10"
+        width="78">
+        Name:
+      </text>
+      <line_editor
+        border_style="line"
+        border_thickness="1"
+        follows="left|top|right"
+        height="20"
+        layout="topleft"
+        left_delta="78"
+        max_length_bytes="63"
+        name="LabelItemName"
+        top_delta="0"
+        width="210" />
+      <text
+        type="string"
+        length="1"
+        follows="left|top"
+        height="10"
+        layout="topleft"
+        left="5"
+        name="LabelItemDescTitle"
+        top_pad="10"
+        width="78">
+        Description:
+      </text>
+      <line_editor
+        border_style="line"
+        border_thickness="1"
+        follows="left|top|right"
+        height="23"
+        layout="topleft"
+        left_delta="78"
+        max_length_bytes="127"
+        name="LabelItemDesc"
+        top_delta="-5"
+        width="210" />
+      <text
+        type="string"
+        length="1"
+        follows="left|top"
+        height="23"
+        layout="topleft"
+        left="5"
+        name="LabelCreatorTitle"
+        top_pad="10"
+        width="78">
+        Creator:
+      </text>
+      <avatar_icon
+        follows="top|left"
+        height="20"
+        default_icon_name="Generic_Person"
+        layout="topleft"
+        left_pad="0"
+        top_delta="-6"
+        mouse_opaque="true"
+        width="20" />
+      <text
+        type="string"
+        follows="left|right|top"
+        font="SansSerifSmall"
+        height="15"
+        layout="topleft"
+        left_pad="5"
+        name="LabelCreatorName"
+        top_delta="6"
+        use_ellipses="true"
+        width="165">
+      </text>
+      <button
+        follows="top|right"
+        height="16"
+        image_selected="Inspector_I"
+        image_unselected="Inspector_I"
+        layout="topleft"
+        right="-5"
+        name="BtnCreator"
+        top_delta="-6"
+        width="16" />
+      <text
+        type="string"
+        length="1"
+        follows="left|top"
+        height="23"
+        layout="topleft"
+        left="5"
+        name="LabelOwnerTitle"
+        top_pad="10"
+        width="78">
+        Owner:
+      </text>
+      <avatar_icon
+        follows="top|left"
+        height="20"
+        default_icon_name="Generic_Person"
+        layout="topleft"
+        left_pad="0"
+        top_delta="-6"
+        mouse_opaque="true"
+        width="20" />
+      <text
+        type="string"
+        follows="left|right|top"
+        font="SansSerifSmall"
+        height="15"
+        layout="topleft"
+        left_pad="5"
+        name="LabelOwnerName"
+        top_delta="6"
+        use_ellipses="true"
+        width="165">
+      </text>
+      <button
+        follows="top|right"
+        height="16"
         image_selected="Inspector_I"
         image_unselected="Inspector_I"
+        layout="topleft"
+        right="-5"
+        name="BtnOwner"
+        top_delta="-3"
+        width="16" />
+      <text
+        type="string"
+        length="1"
+        follows="left|top"
+        height="23"
+        layout="topleft"
+        left="5"
+        name="LabelAcquiredTitle"
+        top_pad="10"
+        width="78">
+        Acquired:
+      </text>
+      <text
+        type="string"
+        length="1"
+        follows="left|top|right"
+        height="23"
+        layout="topleft"
+        left_delta="78"
+        name="LabelAcquiredDate"
+        top_delta="0"
+        width="210">
+      </text>
+      <panel
+        border="false"
+        follows="left|top|right"
+        layout="topleft"
+        mouse_opaque="false"
+        name="perms_inv"
+        left="0"
+        top_pad="25"
+        height="155"
+        width="313">
+        <text
+          type="string"
+          length="1"
+          left="10"
+          top_pad="13"
+          text_color="EmphasisColor"
+          height="15"
+          follows="left|top|right"
+          layout="topleft"
+          name="perm_modify"
+          width="200">
+          You can:
+        </text>
+        <check_box
+          height="18"
+          label="Modify"
+          layout="topleft"
+          left="20"
+          name="CheckOwnerModify"
+          top_pad="0"
+          width="90" />
+        <check_box
+          height="18"
+          label="Copy"
+          layout="topleft"
+          left_pad="0"
+          name="CheckOwnerCopy"
+          width="90" />
+        <check_box
+          height="18"
+          label="Transfer"
+          layout="topleft"
+          left_pad="0"
+          name="CheckOwnerTransfer"
+          width="106" />
+        <text
+          type="string"
+          length="1"
+          follows="left|top"
+          height="16"
+          layout="topleft"
+          left="10"
+          name="AnyoneLabel"
+          top_pad="8"
+          width="100">
+          Anyone:
+        </text>
+        <check_box
+          height="18"
+          label="Copy"
           layout="topleft"
-          right="-5"
-          name="BtnCreator"
-          top_delta="-6"
-          width="16" />
-          <text
+          left_pad="0"
+          name="CheckEveryoneCopy"
+          top_delta="-2"
+          width="150" />
+        <text
           type="string"
           length="1"
           follows="left|top"
-          height="23"
+          height="16"
           layout="topleft"
-            left="5"
-          name="LabelOwnerTitle"
-            top_pad="10"
-          width="78">
-            Owner:
-          </text>
-          <avatar_icon
-            follows="top|left"
-            height="20"
-            default_icon_name="Generic_Person"
-            layout="topleft"
-            left_pad="0"
-            top_delta="-6"
-            mouse_opaque="true"
-            width="20" />
-          <text
+          left="10"
+          name="GroupLabel"
+          top_pad="8"
+          width="100">
+          Group:
+        </text>
+        <check_box
+          height="18"
+          label="Share"
+          layout="topleft"
+          left_pad="0"
+          top_delta="-2"
+          name="CheckShareWithGroup"
+          tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+          width="150" />
+        <text
           type="string"
-            follows="left|right|top"
-            font="SansSerifSmall"
-            height="15"
-            layout="topleft"
-            left_pad="5"
-          name="LabelOwnerName"
-          top_delta="6"
-       use_ellipses="true"
-			 width="165">
-          </text>
-             <button
-                 follows="top|right"
-                 height="16"
-         image_selected="Inspector_I"
-         image_unselected="Inspector_I"
-                 layout="topleft"
-                 right="-5"
-                 name="BtnOwner"
-                 top_delta="-3"
-                 width="16" />
-             <text
-                 type="string"
-                 length="1"
-                 follows="left|top"
-                 height="23"
-                 layout="topleft"
-                 left="5"
-                 name="LabelAcquiredTitle"
-    top_pad="10"
-                 width="78">
-                Acquired:
-             </text>
-             <text
-                 type="string"
-                 length="1"
-                 follows="left|top|right"
-                 height="23"
-                 layout="topleft"
-                 left_delta="78"
-                 name="LabelAcquiredDate"
-                 top_delta="0"
-                 width="210">
-          </text>
-         <panel
-             border="false"
-             follows="left|top|right"
-             layout="topleft"
-             mouse_opaque="false"
-             name="perms_inv"
-             left="0"
-             top_pad="25"
-             height="155"
-             width="313">
-          <text
-                 type="string"
-                 length="1"
-                 left="10"
-                 top_pad="13"
-                 text_color="EmphasisColor"
-             height="15"
-                 follows="left|top|right"
-                 layout="topleft"
-                 name="perm_modify"
-                 width="200">
-                    You can:
-                </text>
-            <check_box
-                 height="18"
-                 label="Modify"
-                 layout="topleft"
-                 left="20"
-                 name="CheckOwnerModify"
-                 top_pad="0"
-                 width="90" />
-            <check_box
-                 height="18"
-                 label="Copy"
-                 layout="topleft"
-                 left_pad="0"
-                 name="CheckOwnerCopy"
-                 width="90" />
-            <check_box
-                 height="18"
-                 label="Transfer"
-                 layout="topleft"
-                 left_pad="0"
-                 name="CheckOwnerTransfer"
-                 width="106" />
-            <text
-                 type="string"
-                 length="1"
-                 follows="left|top"
-                 height="16"
-                 layout="topleft"
-                 left="10"
-                 name="AnyoneLabel"
-                 top_pad="8"
-                 width="100">
-                Anyone:
-            </text>
-            <check_box
-                 height="18"
-                 label="Copy"
-                 layout="topleft"
-                 left_pad="0"
-                 name="CheckEveryoneCopy"
-                 top_delta="-2"
-                 width="150" />
-            <text
-                 type="string"
-                 length="1"
-                 follows="left|top"
-                 height="16"
-                 layout="topleft"
-                 left="10"
-                 name="GroupLabel"
-                 top_pad="8"
-                 width="100">
-                Group:
-            </text>
-            <check_box
-                 height="18"
-                 label="Share"
-                 layout="topleft"
-                 left_pad="0"
-                 top_delta="-2"
-                 name="CheckShareWithGroup"
-                 tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
-                 width="150" />
-            <text
-                 type="string"
-                 length="1"
-                 follows="left|top"
-                 height="16"
-                 layout="topleft"
-                 left="10"
-                 name="NextOwnerLabel"
-                 top_pad="8"
-                 width="200"
-                 word_wrap="true">
-                Next owner:
-            </text>
-            <check_box
-                 height="18"
-                 label="Modify"
-                 layout="topleft"
-                 left="20"
-                 top_pad="0"
-                 name="CheckNextOwnerModify"
-                 width="90" />
-            <check_box
-                 height="18"
-                 label="Copy"
-                 layout="topleft"
-                 left_pad="0"
-                 name="CheckNextOwnerCopy"
-                 width="90" />
-            <check_box
-                 height="18"
-                 label="Transfer"
-                 layout="topleft"
-                 left_pad="0"
-                 name="CheckNextOwnerTransfer"
-                 tool_tip="Next owner can give away or resell this object"
-                 width="106" />
-            </panel>
+          length="1"
+          follows="left|top"
+          height="16"
+          layout="topleft"
+          left="10"
+          name="NextOwnerLabel"
+          top_pad="8"
+          width="200"
+          word_wrap="true">
+          Next owner:
+        </text>
         <check_box
-                 height="18"
-                 label="For Sale"
-                 layout="topleft"
-                 left="20"
-                 name="CheckPurchase"
-                 top_pad="20"
-                 width="100" />
-            <combo_box
-                 height="23"
-                 left_pad="0"
-                 layout="topleft"
-                 follows="left|top"
-                 name="combobox sale copy"
-                 width="170">
-                <combo_box.item
-                     label="Copy"
-                     name="Copy"
-                     value="Copy" />
-                <combo_box.item
-                     label="Original"
-                     name="Original"
-                     value="Original" />
-            </combo_box>
-            <spinner
-                    follows="left|top"
-                    decimal_digits="0"
-                    increment="1"
-                    control_name="Edit Cost"
-                    name="Edit Cost"
-                    label="Price: L$"
-                    label_width="75"
-                    left="120"
-                    width="170"
-                    min_val="0"
-                    height="23"
-                    max_val="999999999"
-                    top_pad="10"/>
-        </panel>
-    </scroll_container>
-    <panel
-		 height="30"
-		 layout="topleft"
-		 name="button_panel"
-		 left="5"
-		 top_pad="0"
-		 width="313">
-	    <button
-		     height="23"
-		     label="Cancel"
-		     layout="topleft"
-		     name="cancel_btn"
-		     right="-1"
-		     width="100" />
-	    </panel>
-	</panel>
+          height="18"
+          label="Modify"
+          layout="topleft"
+          left="20"
+          top_pad="0"
+          name="CheckNextOwnerModify"
+          width="90" />
+        <check_box
+          height="18"
+          label="Copy"
+          layout="topleft"
+          left_pad="0"
+          name="CheckNextOwnerCopy"
+          width="90" />
+        <check_box
+          height="18"
+          label="Transfer"
+          layout="topleft"
+          left_pad="0"
+          name="CheckNextOwnerTransfer"
+          tool_tip="Next owner can give away or resell this object"
+          width="106" />
+      </panel>
+      <check_box
+        height="18"
+        label="For Sale"
+        layout="topleft"
+        left="20"
+        name="CheckPurchase"
+        top_pad="20"
+        width="100" />
+      <combo_box
+        height="23"
+        left_pad="0"
+        layout="topleft"
+        follows="left|top"
+        name="combobox sale copy"
+        width="170">
+        <combo_box.item
+          label="Copy"
+          name="Copy"
+          value="Copy" />
+        <combo_box.item
+          label="Original"
+          name="Original"
+          value="Original" />
+      </combo_box>
+      <spinner
+        follows="left|top"
+        decimal_digits="0"
+        increment="1"
+        control_name="Edit Cost"
+        name="Edit Cost"
+        label="Price: L$"
+        label_width="75"
+        left="120"
+        width="170"
+        min_val="0"
+        height="23"
+        max_val="999999999"
+        top_pad="10"/>
+
+      <text
+        type="string"
+        length="1"
+        follows="left|top"
+        height="10"
+        layout="topleft"
+        left="5"
+        name="LabelItemExperienceTitle"
+        top_pad="10"
+        width="78">
+        Experience:
+      </text>
+      <text
+        type="string"
+        length="1"
+        follows="left|top|right"
+        height="10"
+        layout="topleft"
+        left_delta="78"
+        name="LabelItemExperience"
+        top_delta="0"
+         width="210" 
+        >(loading)</text>
+    </panel>
+    
+  </scroll_container>
+  <panel
+    height="30"
+    layout="topleft"
+    name="button_panel"
+    left="5"
+    top_pad="0"
+    width="313"
+    follows="top|right|left">
+    <button
+      follows="top|right"
+      height="23"
+      label="Cancel"
+      layout="topleft"
+      name="cancel_btn"
+      right="-1"
+      width="100" />
+  </panel>
+</panel>
diff --git a/indra/tools/vstool/DispatchUtility.cs b/indra/tools/vstool/DispatchUtility.cs
new file mode 100644
index 0000000000000000000000000000000000000000..6056ac55a13f0c804391c9f1facb9ffbd68eb476
--- /dev/null
+++ b/indra/tools/vstool/DispatchUtility.cs
@@ -0,0 +1,271 @@
+#region Using Directives
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Runtime.InteropServices;
+using System.Reflection;
+using System.Security.Permissions;
+
+#endregion
+
+namespace TestDispatchUtility
+{
+	/// <summary>
+	/// Provides helper methods for working with COM IDispatch objects that have a registered type library.
+	/// </summary>
+	public static class DispatchUtility
+	{
+		#region Private Constants
+
+		private const int S_OK = 0; //From WinError.h
+		private const int LOCALE_SYSTEM_DEFAULT = 2 << 10; //From WinNT.h == 2048 == 0x800
+
+		#endregion
+
+		#region Public Methods
+
+		/// <summary>
+		/// Gets whether the specified object implements IDispatch.
+		/// </summary>
+		/// <param name="obj">An object to check.</param>
+		/// <returns>True if the object implements IDispatch.  False otherwise.</returns>
+		public static bool ImplementsIDispatch(object obj)
+		{
+			bool result = obj is IDispatchInfo;
+			return result;
+		}
+
+		/// <summary>
+		/// Gets a Type that can be used with reflection.
+		/// </summary>
+		/// <param name="obj">An object that implements IDispatch.</param>
+		/// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
+		/// <returns>A .NET Type that can be used with reflection.</returns>
+		/// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
+		[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
+		public static Type GetType(object obj, bool throwIfNotFound)
+		{
+			RequireReference(obj, "obj");
+			Type result = GetType((IDispatchInfo)obj, throwIfNotFound);
+			return result;
+		}
+
+		/// <summary>
+		/// Tries to get the DISPID for the requested member name.
+		/// </summary>
+		/// <param name="obj">An object that implements IDispatch.</param>
+		/// <param name="name">The name of a member to lookup.</param>
+		/// <param name="dispId">If the method returns true, this holds the DISPID on output.
+		/// If the method returns false, this value should be ignored.</param>
+		/// <returns>True if the member was found and resolved to a DISPID.  False otherwise.</returns>
+		/// <exception cref="InvalidCastException">If <paramref name="obj"/> doesn't implement IDispatch.</exception>
+		[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
+		public static bool TryGetDispId(object obj, string name, out int dispId)
+		{
+			RequireReference(obj, "obj");
+			bool result = TryGetDispId((IDispatchInfo)obj, name, out dispId);
+			return result;
+		}
+
+		/// <summary>
+		/// Invokes a member by DISPID.
+		/// </summary>
+		/// <param name="obj">An object that implements IDispatch.</param>
+		/// <param name="dispId">The DISPID of a member.  This can be obtained using
+		/// <see cref="TryGetDispId(object, string, out int)"/>.</param>
+		/// <param name="args">The arguments to pass to the member.</param>
+		/// <returns>The member's return value.</returns>
+		/// <remarks>
+		/// This can invoke a method or a property get accessor.
+		/// </remarks>
+		public static object Invoke(object obj, int dispId, object[] args)
+		{
+			string memberName = "[DispId=" + dispId + "]";
+			object result = Invoke(obj, memberName, args);
+			return result;
+		}
+
+		/// <summary>
+		/// Invokes a member by name.
+		/// </summary>
+		/// <param name="obj">An object.</param>
+		/// <param name="memberName">The name of the member to invoke.</param>
+		/// <param name="args">The arguments to pass to the member.</param>
+		/// <returns>The member's return value.</returns>
+		/// <remarks>
+		/// This can invoke a method or a property get accessor.
+		/// </remarks>
+		public static object Invoke(object obj, string memberName, object[] args)
+		{
+			RequireReference(obj, "obj");
+			Type type = obj.GetType();
+			object result = type.InvokeMember(memberName, BindingFlags.InvokeMethod | BindingFlags.GetProperty,
+				null, obj, args, null);
+			return result;
+		}
+
+		#endregion
+
+		#region Private Methods
+
+		/// <summary>
+		/// Requires that the value is non-null.
+		/// </summary>
+		/// <typeparam name="T">The type of the value.</typeparam>
+		/// <param name="value">The value to check.</param>
+		/// <param name="name">The name of the value.</param>
+		private static void RequireReference<T>(T value, string name) where T : class
+		{
+			if (value == null)
+			{
+				throw new ArgumentNullException(name);
+			}
+		}
+
+		/// <summary>
+		/// Gets a Type that can be used with reflection.
+		/// </summary>
+		/// <param name="dispatch">An object that implements IDispatch.</param>
+		/// <param name="throwIfNotFound">Whether an exception should be thrown if a Type can't be obtained.</param>
+		/// <returns>A .NET Type that can be used with reflection.</returns>
+		private static Type GetType(IDispatchInfo dispatch, bool throwIfNotFound)
+		{
+			RequireReference(dispatch, "dispatch");
+
+			Type result = null;
+			int typeInfoCount;
+			int hr = dispatch.GetTypeInfoCount(out typeInfoCount);
+			if (hr == S_OK && typeInfoCount > 0)
+			{
+				// Type info isn't usually culture-aware for IDispatch, so we might as well pass
+				// the default locale instead of looking up the current thread's LCID each time
+				// (via CultureInfo.CurrentCulture.LCID).
+				dispatch.GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, out result);
+			}
+
+			if (result == null && throwIfNotFound)
+			{
+				// If the GetTypeInfoCount called failed, throw an exception for that.
+				Marshal.ThrowExceptionForHR(hr);
+
+				// Otherwise, throw the same exception that Type.GetType would throw.
+				throw new TypeLoadException();
+			}
+
+			return result;
+		}
+
+		/// <summary>
+		/// Tries to get the DISPID for the requested member name.
+		/// </summary>
+		/// <param name="dispatch">An object that implements IDispatch.</param>
+		/// <param name="name">The name of a member to lookup.</param>
+		/// <param name="dispId">If the method returns true, this holds the DISPID on output.
+		/// If the method returns false, this value should be ignored.</param>
+		/// <returns>True if the member was found and resolved to a DISPID.  False otherwise.</returns>
+		private static bool TryGetDispId(IDispatchInfo dispatch, string name, out int dispId)
+		{
+			RequireReference(dispatch, "dispatch");
+			RequireReference(name, "name");
+
+			bool result = false;
+
+			// Members names aren't usually culture-aware for IDispatch, so we might as well
+			// pass the default locale instead of looking up the current thread's LCID each time
+			// (via CultureInfo.CurrentCulture.LCID).
+			Guid iidNull = Guid.Empty;
+			int hr = dispatch.GetDispId(ref iidNull, ref name, 1, LOCALE_SYSTEM_DEFAULT, out dispId);
+
+			const int DISP_E_UNKNOWNNAME = unchecked((int)0x80020006); //From WinError.h
+			const int DISPID_UNKNOWN = -1; //From OAIdl.idl
+			if (hr == S_OK)
+			{
+				result = true;
+			}
+			else if (hr == DISP_E_UNKNOWNNAME && dispId == DISPID_UNKNOWN)
+			{
+				// This is the only supported "error" case because it means IDispatch
+				// is saying it doesn't know the member we asked about.
+				result = false;
+			}
+			else
+			{
+				// The other documented result codes are all errors.
+				Marshal.ThrowExceptionForHR(hr);
+			}
+
+			return result;
+		}
+
+		#endregion
+
+		#region Private Interfaces
+
+		/// <summary>
+		/// A partial declaration of IDispatch used to lookup Type information and DISPIDs.
+		/// </summary>
+		/// <remarks>
+		/// This interface only declares the first three methods of IDispatch.  It omits the
+		/// fourth method (Invoke) because there are already plenty of ways to do dynamic
+		/// invocation in .NET.  But the first three methods provide dynamic type metadata
+		/// discovery, which .NET doesn't provide normally if you have a System.__ComObject
+		/// RCW instead of a strongly-typed RCW.
+		/// <para/>
+		/// Note: The original declaration of IDispatch is in OAIdl.idl.
+		/// </remarks>
+		[ComImport]
+		[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+		[Guid("00020400-0000-0000-C000-000000000046")]
+		private interface IDispatchInfo
+		{
+			/// <summary>
+			/// Gets the number of Types that the object provides (0 or 1).
+			/// </summary>
+			/// <param name="typeInfoCount">Returns 0 or 1 for the number of Types provided by <see cref="GetTypeInfo"/>.</param>
+			/// <remarks>
+			/// http://msdn.microsoft.com/en-us/library/da876d53-cb8a-465c-a43e-c0eb272e2a12(VS.85)
+			/// </remarks>
+			[PreserveSig]
+			int GetTypeInfoCount(out int typeInfoCount);
+
+			/// <summary>
+			/// Gets the Type information for an object if <see cref="GetTypeInfoCount"/> returned 1.
+			/// </summary>
+			/// <param name="typeInfoIndex">Must be 0.</param>
+			/// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
+			/// <param name="typeInfo">Returns the object's Type information.</param>
+			/// <remarks>
+			/// http://msdn.microsoft.com/en-us/library/cc1ec9aa-6c40-4e70-819c-a7c6dd6b8c99(VS.85)
+			/// </remarks>
+			void GetTypeInfo(int typeInfoIndex, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler,
+				MarshalTypeRef = typeof(System.Runtime.InteropServices.CustomMarshalers.TypeToTypeInfoMarshaler))] out Type typeInfo);
+
+			/// <summary>
+			/// Gets the DISPID of the specified member name.
+			/// </summary>
+			/// <param name="riid">Must be IID_NULL.  Pass a copy of Guid.Empty.</param>
+			/// <param name="name">The name of the member to look up.</param>
+			/// <param name="nameCount">Must be 1.</param>
+			/// <param name="lcid">Typically, LOCALE_SYSTEM_DEFAULT (2048).</param>
+			/// <param name="dispId">If a member with the requested <paramref name="name"/>
+			/// is found, this returns its DISPID and the method's return value is 0.
+			/// If the method returns a non-zero value, then this parameter's output value is
+			/// undefined.</param>
+			/// <returns>Zero for success. Non-zero for failure.</returns>
+			/// <remarks>
+			/// http://msdn.microsoft.com/en-us/library/6f6cf233-3481-436e-8d6a-51f93bf91619(VS.85)
+			/// </remarks>
+			[PreserveSig]
+			int GetDispId(ref Guid riid, ref string name, int nameCount, int lcid, out int dispId);
+
+			// NOTE: The real IDispatch also has an Invoke method next, but we don't need it.
+			// We can invoke methods using .NET's Type.InvokeMember method with the special
+			// [DISPID=n] syntax for member "names", or we can get a .NET Type using GetTypeInfo
+			// and invoke methods on that through reflection.
+			// Type.InvokeMember: http://msdn.microsoft.com/en-us/library/de3dhzwy.aspx
+		}
+
+		#endregion
+	}
+}
diff --git a/indra/tools/vstool/app.config b/indra/tools/vstool/app.config
new file mode 100644
index 0000000000000000000000000000000000000000..8494f728ff7ce3e60da1403d2d5f47f8833bae43
--- /dev/null
+++ b/indra/tools/vstool/app.config
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<configuration>
+<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>