diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index d485dc3bb9b116d6e803dcb15bf504db3c5f2344..3a7ffbf9a3aa3f3215f5c48accf062032d6a58af 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -265,6 +265,7 @@ set(viewer_SOURCE_FILES
     llfloaterfacebook.cpp
     llfloaterflickr.cpp
     llfloaterfonttest.cpp
+    llfloatergenerictext.cpp
     llfloatergesture.cpp
     llfloatergodtools.cpp
     llfloatergotoline.cpp
@@ -907,6 +908,7 @@ set(viewer_HEADER_FILES
     llfloaterfacebook.h
     llfloaterflickr.h
     llfloaterfonttest.h
+    llfloatergenerictext.h
     llfloatergesture.h
     llfloatergodtools.h
     llfloatergotoline.h
diff --git a/indra/newview/llfloatergenerictext.cpp b/indra/newview/llfloatergenerictext.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6cd6118ec4adae9f5dbf6095bcec672116c92305
--- /dev/null
+++ b/indra/newview/llfloatergenerictext.cpp
@@ -0,0 +1,61 @@
+/**
+ * @file llfloatergenerictext.cpp
+ * @brief A generic text floater for dumping info (usually debug info)
+ *
+ * Copyright (c) 2015, Cinder Roxley <cinder@sdf.org>
+ *
+ * Permission is hereby granted, free of charge, to any person or organization
+ * obtaining a copy of the software and accompanying documentation covered by
+ * this license (the "Software") to use, reproduce, display, distribute,
+ * execute, and transmit the Software, and to prepare derivative works of the
+ * Software, and to permit third-parties to whom the Software is furnished to
+ * do so, all subject to the following:
+ *
+ * The copyright notices in the Software and this entire statement, including
+ * the above license grant, this restriction and the following disclaimer,
+ * must be included in all copies of the Software, in whole or in part, and
+ * all derivative works of the Software, unless such copies or derivative
+ * works are solely in the form of machine-executable object code generated by
+ * a source language processor.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+ * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+ * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfloatergenerictext.h"
+#include "llclipboard.h"
+#include "lltexteditor.h"
+
+LLFloaterGenericText::LLFloaterGenericText(const LLSD& key)
+:	LLFloater(key)
+{
+	mTitle = key["title"].asString();
+	mContents = key["data"].asString();
+	
+	mCommitCallbackRegistrar.add("GenericText.Close", boost::bind(&LLFloaterGenericText::onClickClose, this));
+	mCommitCallbackRegistrar.add("GenericText.Copy", boost::bind(&LLFloaterGenericText::onClickCopy, this));
+}
+
+BOOL LLFloaterGenericText::postBuild()
+{
+	setTitle(mTitle);
+	getChild<LLTextEditor>("payload")->setText(mContents);
+	return TRUE;
+}
+
+void LLFloaterGenericText::onClickClose()
+{
+	closeFloater();
+}
+
+void LLFloaterGenericText::onClickCopy()
+{
+	LLClipboard::instance().copyToClipboard(utf8str_to_wstring(mContents, mContents.length()), 0, mContents.length());
+}
diff --git a/indra/newview/llfloatergenerictext.h b/indra/newview/llfloatergenerictext.h
new file mode 100644
index 0000000000000000000000000000000000000000..e738e6c8a1c07ab93e7fe35c444d5c9ae878cb31
--- /dev/null
+++ b/indra/newview/llfloatergenerictext.h
@@ -0,0 +1,51 @@
+/**
+ * @file llfloatergenerictext.h
+ * @brief A generic text floater for dumping info (usually debug info)
+ *
+ * Copyright (c) 2015, Cinder Roxley <cinder@sdf.org>
+ *
+ * Permission is hereby granted, free of charge, to any person or organization
+ * obtaining a copy of the software and accompanying documentation covered by
+ * this license (the "Software") to use, reproduce, display, distribute,
+ * execute, and transmit the Software, and to prepare derivative works of the
+ * Software, and to permit third-parties to whom the Software is furnished to
+ * do so, all subject to the following:
+ *
+ * The copyright notices in the Software and this entire statement, including
+ * the above license grant, this restriction and the following disclaimer,
+ * must be included in all copies of the Software, in whole or in part, and
+ * all derivative works of the Software, unless such copies or derivative
+ * works are solely in the form of machine-executable object code generated by
+ * a source language processor.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+ * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+ * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef LL_FLOATERGENERICTEXT_H
+#define LL_FLOATERGENERICTEXT_H
+
+#include "llfloater.h"
+
+class LLFloaterGenericText : public LLFloater
+{
+public:
+	LLFloaterGenericText(const LLSD& key);
+	BOOL postBuild() override;
+private:
+	~LLFloaterGenericText() {};
+	void onClickClose();
+	void onClickCopy();
+	
+	std::string mTitle;
+	std::string mContents;
+	
+};
+
+#endif // LL_FLOATERGENERICTEXT_H
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 9916f6064571f0ed699b71888003f9cee3f65c2f..3459c32e071424f66b85418e24d0674302415607 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -98,6 +98,7 @@
 #include "llui.h"
 #include "llviewernetwork.h"
 #include "llviewerobjectlist.h"
+#include "llviewerregion.h"
 #include "llvoavatar.h"
 #include "llvovolume.h"
 #include "llwindow.h"
@@ -379,6 +380,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	mCommitCallbackRegistrar.add("Pref.AddGrid", boost::bind(&LLFloaterPreference::onClickAddGrid, this));
 	mCommitCallbackRegistrar.add("Pref.RemoveGrid", boost::bind(&LLFloaterPreference::onClickRemoveGrid, this));
 	mCommitCallbackRegistrar.add("Pref.RefreshGrid", boost::bind(&LLFloaterPreference::onClickRefreshGrid, this));
+	mCommitCallbackRegistrar.add("Pref.DebugGrid", boost::bind(&LLFloaterPreference::onClickDebugGrid, this));
 	mCommitCallbackRegistrar.add("Pref.SelectGrid", boost::bind(&LLFloaterPreference::onSelectGrid, this, _2));
 }
 
@@ -573,7 +575,14 @@ void LLFloaterPreference::onClickRefreshGrid()
 
 void LLFloaterPreference::onClickDebugGrid()
 {
-	// no-op for now
+	LLSD args;
+	std::stringstream data_str;
+	const std::string& grid = getChild<LLScrollListCtrl>("grid_list")->getSelectedValue().asString().c_str();
+	LLSD gridInfo = LLGridManager::getInstance()->getGridInfo(grid);
+	LLSDSerialize::toPrettyXML(gridInfo, data_str);
+	args["title"] = llformat("%s - %s", LLTrans::getString("GridInfoTitle").c_str(), grid.c_str());
+	args["data"] = data_str.str();
+	LLFloaterReg::showInstance("generic_text", args);
 }
 
 void LLFloaterPreference::onSelectGrid(const LLSD& data)
@@ -581,6 +590,7 @@ void LLFloaterPreference::onSelectGrid(const LLSD& data)
 	getChild<LLUICtrl>("remove_grid")->setEnabled(LLGridManager::getInstance()->getGrid() != data.asString()
 												  && !LLGridManager::getInstance()->isSystemGrid(data.asString()));
 	getChild<LLUICtrl>("refresh_grid")->setEnabled(!LLGridManager::getInstance()->isSystemGrid(data.asString()));
+	getChild<LLUICtrl>("debug_grid")->setEnabled(!data.asString().empty());
 }
 
 bool LLFloaterPreference::handleRemoveGridCB(const LLSD& notification, const LLSD& response)
@@ -904,6 +914,7 @@ void LLFloaterPreference::onOpenHardwareSettings()
 	LLFloater* floater = LLFloaterReg::showInstance("prefs_hardware_settings");
 	addDependentFloater(floater, FALSE);
 }
+
 // static 
 void LLFloaterPreference::onBtnOK()
 {
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 72ed388bd651fb44916d9d4f8748a79d662c7e15..d870da54afc3abc271222f0200f87b080dc6fa1f 100755
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -70,6 +70,7 @@
 #include "llfloaterfacebook.h"
 #include "llfloaterflickr.h"
 #include "llfloaterfonttest.h"
+#include "llfloatergenerictext.h"
 #include "llfloatergesture.h"
 #include "llfloatergodtools.h"
 #include "llfloatergroups.h"
@@ -233,7 +234,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("experience_search", "floater_experience_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterExperiencePicker>);
 
 	LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>);
-
+	LLFloaterReg::add("generic_text", "floater_generic_text.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGenericText>);
 	LLFloaterReg::add("gestures", "floater_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGesture>);
 	LLFloaterReg::add("god_tools", "floater_god_tools.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGodTools>);
 	LLFloaterReg::add("group_picker", "floater_choose_group.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGroupPicker>);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index ad2bb5988fee35b8ffd21aabab4c96ea7bf6c8a6..022c7d61d4c7ab33e13d3c9aed542a99c42bfb85 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -3279,6 +3279,24 @@ class LLEditParticleSource : public view_listener_t
 	}
 };
 
+class LLSpawnDebugSimFeatures : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		if (LLViewerRegion* regionp = gAgent.getRegion())
+		{
+			LLSD sim_features, args;
+			std::stringstream features_str;
+			regionp->getSimulatorFeatures(sim_features);
+			LLSDSerialize::toPrettyXML(sim_features, features_str);
+			args["title"] = llformat("%s - %s", LLTrans::getString("SimulatorFeaturesTitle").c_str(), regionp->getName().c_str());
+			args["data"] = features_str.str();
+			LLFloaterReg::showInstance("generic_text", args);
+		}
+		return true;
+	}
+};
+
 class LLSyncAnimations : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -9401,6 +9419,7 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLRefreshTexturesObject(), "Object.RefreshTex");
     view_listener_t::addMenu(new LLEditParticleSource(), "Object.EditParticles");
     view_listener_t::addMenu(new LLEnableEditParticleSource(), "Object.EnableEditParticles");
+    view_listener_t::addMenu(new LLSpawnDebugSimFeatures(), "Advanced.DebugSimFeatures");
 	view_listener_t::addMenu(new LLSyncAnimations(), "Tools.ResyncAnimations");
 	view_listener_t::addMenu(new ALMarkViewerEffectsDead(), "Tools.AllVEDead");
 
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 9273fb1febd48dfa07cc27379c69dddc971a5eb0..e1e7a0d92fa30e8666ef585783c560a9a1e8d082 100755
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -882,6 +882,11 @@ std::string LLGridManager::getUpdateServiceURL() const
 	return update_url_base;
 }
 
+LLSD LLGridManager::getGridInfo(const std::string& grid) const
+{
+	return mGridList.has(grid) ? mGridList[grid] : LLSD();
+}
+
 void LLGridManager::updateIsInProductionGrid()
 {
 	// *NOTE:Mani This used to compare GRID_INFO_AGNI to gGridChoice,
diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h
index 13d165ad6f8731e61d22ae497826984203024362..5c8aacd21ad5fd64bc3b2baaf9b7ef66a37e710e 100755
--- a/indra/newview/llviewernetwork.h
+++ b/indra/newview/llviewernetwork.h
@@ -107,6 +107,9 @@ class LLGridManager : public LLSingleton<LLGridManager>
 	
 	/// Get the user-friendly long form descriptor for the selected grid
 	std::string getGridLabel() const { return getGridLabel(mGrid); }
+	
+	/// Returns gridInfo for a given grid as an LLSD map
+	LLSD getGridInfo(const std::string& grid) const;
 
 	/// Retrieve a map of grid-name -> label
 	std::map<std::string, std::string> getKnownGrids() const;
diff --git a/indra/newview/skins/default/xui/en/floater_generic_text.xml b/indra/newview/skins/default/xui/en/floater_generic_text.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c0f6ed0b045ae3a2d6f87884d29b90ef0dbfff0a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_generic_text.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater can_close="true"
+ single_instance="false"
+ can_drag_on_left="false"
+ can_minimize="true"
+ can_resize="true"
+ height="258"
+ width="258"
+ min_width="214"
+ min_height="100"
+ name="floater_generic_text"
+ title="INFO">
+  <text_editor
+   type="string"
+   length="1"
+   enabled="false"
+   follows="left|top|right|bottom"
+   font="SansSerif"
+   height="200"
+   layout="topleft"
+   top="4"
+   bottom="-32"
+   left="4"
+   right="-4"
+   max_length="65536"
+   name="payload"
+   word_wrap="true">
+It doesn't matter what comes, fresh goes better in life, with Mentos fresh and full of Life! Nothing gets to you, stayin' fresh, stayin' cool, with Mentos fresh and full of life! Fresh goes better! Mentos freshness! Fresh goes better with Mentos, fresh and full of life! Mentos! The Freshmaker!
+  </text_editor>
+  <button
+   follows="right|bottom"
+   label="Copy"
+   name="copy_btn"
+   left="49"
+   top_pad="2"
+   height="26"
+   width="100">
+    <button.commit_callback
+     function="GenericText.Copy" />
+  </button>
+  <button
+   follows="right|bottom"
+   label="Close"
+   name="close_btn"
+   left_pad="4"
+   top_delta="0"
+   height="26"
+   width="100">
+    <button.commit_callback
+     function="GenericText.Close" />
+  </button>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index ea5c4236256146c937f693848d6cb1a795d17cae..b1966e43a984cb1ad05f2ebc4695bdc131f7b863 100755
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2403,6 +2403,12 @@
                  function="Advanced.DumpInfoToConsole"
                  parameter="capabilities" />
             </menu_item_call>
+            <menu_item_call
+             label="View Simulator Features"
+             name="View Simulator Features">
+                <menu_item_call.on_click
+                 function="Advanced.DebugSimFeatures" />
+            </menu_item_call>
 
             <menu_item_separator/>
 
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_grids.xml b/indra/newview/skins/default/xui/en/panel_preferences_grids.xml
index bfdbc1c8cfedd55ba1e6d2091a40d64e1d2b2494..7ec804f30544e50a9638c3d2af380683960da190 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_grids.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_grids.xml
@@ -103,7 +103,7 @@
     <button.commit_callback
      function="Pref.RemoveGrid" />
   </button>
-  <!--<button
+  <button
    enabled="false"
    follows="left|top"
    height="19"
@@ -115,5 +115,5 @@
    width="75">
     <button.commit_callback
      function="Pref.DebugGrid" />
-  </button>-->
+  </button>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 232153dbbdcdfdaf15299ffbb89019d414f9bf5e..ba515dbf21aab596cce42864719ba420ff6c9a5d 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -4243,6 +4243,8 @@ Try enclosing path to the editor with double quotes.
   <string name="NotifyIncomingMessage">Incoming message from [NAME]...</string>
   <string name="NearbyChatTitleChannel">Nearby chat (on channel [CHANNEL])</string>
   <string name="NowPlaying">Now Playing</string>
+  <string name="SimulatorFeaturesTitle">SIMULATOR FEATURES</string>
+  <string name="GridInfoTitle">GRID INFO</string>
   <string name="AvatarTyping">Typing</string>