diff --git a/indra/newview/llfloatervfsexplorer.cpp b/indra/newview/llfloatervfsexplorer.cpp
new file mode 100644
index 000000000..395d7c280
--- /dev/null
+++ b/indra/newview/llfloatervfsexplorer.cpp
@@ -0,0 +1,172 @@
+//
+#include "llviewerprecompiledheaders.h"
+#include "llfloatervfsexplorer.h"
+#include "lluictrlfactory.h"
+#include "llscrolllistctrl.h"
+#include "llcheckboxctrl.h"
+#include "llfilepicker.h"
+#include "llvfs.h"
+#include "lllocalinventory.h"
+#include "llviewerwindow.h"
+#include "llassetconverter.h"
+
+LLFloaterVFSExplorer* LLFloaterVFSExplorer::sInstance;
+std::map LLFloaterVFSExplorer::sVFSFileMap;
+
+LLFloaterVFSExplorer::LLFloaterVFSExplorer()
+: LLFloater(),
+ mEditID(LLUUID::null)
+{
+ LLUICtrlFactory::getInstance()->buildFloater(this, "floater_vfs_explorer.xml");
+}
+LLFloaterVFSExplorer::~LLFloaterVFSExplorer()
+{
+ sInstance = NULL;
+}
+// static
+void LLFloaterVFSExplorer::show()
+{
+ if(sInstance)
+ sInstance->open();
+ else
+ {
+ sInstance = new LLFloaterVFSExplorer();
+ sInstance->open();
+ }
+}
+BOOL LLFloaterVFSExplorer::postBuild()
+{
+ childSetCommitCallback("file_list", onCommitFileList, this);
+ childSetAction("remove_btn", onClickRemove, this);
+ childSetAction("reload_all_btn", onClickReload, this);
+ childSetAction("copy_uuid_btn", onClickCopyUUID, this);
+ refresh();
+ return TRUE;
+}
+void LLFloaterVFSExplorer::refresh()
+{
+ LLScrollListCtrl* list = getChild("file_list");
+ list->clearRows();
+ sVFSFileMap = gVFS->getFileList();
+ std::map::iterator end = sVFSFileMap.end();
+ for(std::map::iterator iter = sVFSFileMap.begin(); iter != end; ++iter)
+ {
+ LLVFSFileSpecifier file_spec = iter->first;
+ LLSD element;
+ element["id"] = file_spec.mFileID;
+ LLSD& name_column = element["columns"][0];
+ name_column["column"] = "name";
+ name_column["value"] = file_spec.mFileID.asString();
+ LLSD& type_column = element["columns"][1];
+ type_column["column"] = "type";
+ type_column["value"] = std::string(LLAssetType::lookup(file_spec.mFileType));
+ list->addElement(element, ADD_BOTTOM);
+ }
+ setEditID(mEditID);
+}
+void LLFloaterVFSExplorer::reloadAll()
+{
+ //get our magic from gvfs here
+ refresh();
+}
+void LLFloaterVFSExplorer::setEditID(LLUUID edit_id)
+{
+ LLScrollListCtrl* list = getChild("file_list");
+ bool found_in_list = (list->getItemIndex(edit_id) != -1);
+ bool found_in_files = false;
+ LLVFSFileSpecifier file;
+ std::map::iterator end = sVFSFileMap.end();
+ for(std::map::iterator iter = sVFSFileMap.begin(); iter != end; ++iter)
+ {
+ if((*iter).first.mFileID == edit_id)
+ {
+ found_in_files = true;
+ file = (*iter).first;
+ break;
+ }
+ }
+ if(found_in_files && found_in_list)
+ {
+ mEditID = edit_id;
+ list->selectByID(edit_id);
+ setEditEnabled(true);
+ childSetText("name_edit", file.mFileID.asString());
+ childSetText("id_edit", file.mFileID.asString());
+ childSetValue("type_combo", std::string(LLAssetType::lookup(file.mFileType)));
+ }
+ else
+ {
+ mEditID = LLUUID::null;
+ list->deselectAllItems(TRUE);
+ setEditEnabled(false);
+ childSetText("name_edit", std::string(""));
+ childSetText("id_edit", std::string(""));
+ childSetValue("type_combo", std::string("animatn"));
+ }
+}
+LLVFSFileSpecifier LLFloaterVFSExplorer::getEditEntry()
+{
+ LLVFSFileSpecifier file;
+ std::map::iterator end = sVFSFileMap.end();
+ for(std::map::iterator iter = sVFSFileMap.begin(); iter != end; ++iter)
+ {
+ if((*iter).first.mFileID == mEditID)
+ return (*iter).first;
+ }
+ file.mFileID = LLUUID::null;
+ return file;
+}
+
+void LLFloaterVFSExplorer::removeEntry()
+{
+ std::map::iterator end = sVFSFileMap.end();
+ for(std::map::iterator iter = sVFSFileMap.begin(); iter != end; ++iter)
+ {
+ if((*iter).first.mFileID == mEditID)
+ {
+ gVFS->removeFile((*iter).first.mFileID, (*iter).first.mFileType);
+ sVFSFileMap.erase(iter);
+ break;
+ }
+ else ++iter;
+ }
+ refresh();
+}
+void LLFloaterVFSExplorer::setEditEnabled(bool enabled)
+{
+ childSetEnabled("name_edit", false);
+ childSetEnabled("id_edit", false);
+ childSetEnabled("type_combo", false);
+ childSetEnabled("remove_btn", enabled);
+ childSetEnabled("copy_uuid_btn", enabled);
+}
+// static
+void LLFloaterVFSExplorer::onCommitFileList(LLUICtrl* ctrl, void* user_data)
+{
+ LLFloaterVFSExplorer* floaterp = (LLFloaterVFSExplorer*)user_data;
+ LLScrollListCtrl* list = floaterp->getChild("file_list");
+ LLUUID selected_id(LLUUID::null);
+ if(list->getFirstSelected())
+ selected_id = list->getFirstSelected()->getUUID();
+ floaterp->setEditID(selected_id);
+}
+// static
+void LLFloaterVFSExplorer::onClickCopyUUID(void* user_data)
+{
+ LLFloaterVFSExplorer* floaterp = (LLFloaterVFSExplorer*)user_data;
+ LLVFSFileSpecifier file = floaterp->getEditEntry();
+ gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(file.mFileID.asString()));
+}
+// static
+void LLFloaterVFSExplorer::onClickRemove(void* user_data)
+{
+ LLFloaterVFSExplorer* floaterp = (LLFloaterVFSExplorer*)user_data;
+ floaterp->removeEntry();
+}
+// static
+void LLFloaterVFSExplorer::onClickReload(void* user_data)
+{
+ LLFloaterVFSExplorer* floaterp = (LLFloaterVFSExplorer*)user_data;
+ floaterp->reloadAll();
+}
+//
diff --git a/indra/newview/llfloatervfsexplorer.h b/indra/newview/llfloatervfsexplorer.h
new file mode 100644
index 000000000..aa92de7c9
--- /dev/null
+++ b/indra/newview/llfloatervfsexplorer.h
@@ -0,0 +1,39 @@
+//
+#ifndef LL_LLFLOATERVFSEXPLORER_H
+#define LL_LLFLOATERVFSEXPLORER_H
+
+#include "llfloater.h"
+#include "llassettype.h"
+#include "llvfs.h"
+
+class LLFloaterVFSExplorer : LLFloater
+{
+typedef struct
+{
+ std::string mFilename;
+ std::string mName;
+ LLUUID mID;
+ LLAssetType::EType mType;
+} entry;
+public:
+ LLFloaterVFSExplorer();
+ ~LLFloaterVFSExplorer();
+ static void show();
+ BOOL postBuild();
+ void refresh();
+ void reloadAll();
+ void removeEntry();
+ void setEditID(LLUUID edit_id);
+ LLVFSFileSpecifier getEditEntry();
+ static void onCommitFileList(LLUICtrl* ctrl, void* user_data);
+ static void onClickCopyUUID(void* user_data);
+ static void onClickRemove(void* user_data);
+ static void onClickReload(void* user_data);
+private:
+ static LLFloaterVFSExplorer* sInstance;
+ static std::map sVFSFileMap;
+ LLUUID mEditID;
+ void setEditEnabled(bool enabled);
+};
+#endif
+//
diff --git a/indra/newview/skins/default/xui/en-us/floater_vfs_explorer.xml b/indra/newview/skins/default/xui/en-us/floater_vfs_explorer.xml
new file mode 100644
index 000000000..5fd408622
--- /dev/null
+++ b/indra/newview/skins/default/xui/en-us/floater_vfs_explorer.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+ texture
+
+
+ sound
+
+
+ callcard
+
+
+ landmark
+
+
+ script
+
+
+ clothing
+
+
+ object
+
+
+ notecard
+
+
+ category
+
+
+ root
+
+
+ lsltext
+
+
+ lslbyte
+
+
+ txtr_tga
+
+
+ bodypart
+
+
+ trash
+
+
+ snapshot
+
+
+ lstndfnd
+
+
+ snd_wav
+
+
+ img_tga
+
+
+ jpeg
+
+
+ animatn
+
+
+ gesture
+
+
+ simstate
+
+
+
+
+