diff --git a/.gitignore b/.gitignore
index 49d5a3d8bb6c5d5879b041d50e249843996f2ef1..436cedbb80cdce36b53fb6b9d59266d92d9854ee 100755
--- a/.gitignore
+++ b/.gitignore
@@ -67,3 +67,4 @@ trivial_change_force_build
 web/config.*
 web/locale.*
 web/secondlife.com.*
+/Pipfile.lock
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e4ff0b1d374b07a4956a79223b5c9b5face2edd6..4e57a359e8300e2aaa194b8b26fd91fbdafe36a7 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -141,7 +141,6 @@ set(viewer_SOURCE_FILES
     altoolalign.cpp
     alunzip.cpp
     alviewermenu.cpp
-    fsfloatersearch.cpp
     groupchatlistener.cpp
     llagentwearablesfetch.cpp
     llaccountingcostmanager.cpp
@@ -274,6 +273,7 @@ set(viewer_SOURCE_FILES
     llfloatercreatelandmark.cpp
     llfloaterdeleteprefpreset.cpp
     llfloaterdestinations.cpp
+    llfloaterdirectory.cpp
     llfloaterdisplayname.cpp
     llfloatereditenvironmentbase.cpp
     llfloatereditextdaycycle.cpp
@@ -482,6 +482,7 @@ set(viewer_SOURCE_FILES
     llpaneleditwater.cpp
     llpaneleditwearable.cpp
     llpanelenvironment.cpp
+    llpaneleventinfo.cpp
     llpanelexperiencelisteditor.cpp
     llpanelexperiencelog.cpp
     llpanelexperiencepicker.cpp
@@ -532,6 +533,14 @@ set(viewer_SOURCE_FILES
     llpanelprofile.cpp
     llpanelprofileclassifieds.cpp
     llpanelprofilepicks.cpp
+    llpanelsearchbase.cpp
+    llpanelsearchclassifieds.cpp
+    llpanelsearchevents.cpp
+    llpanelsearchgroups.cpp
+    llpanelsearchlandsales.cpp
+    llpanelsearchpeople.cpp
+    llpanelsearchplaces.cpp
+    llpanelsearchweb.cpp
     llpanelsnapshot.cpp
     llpanelsnapshotinventory.cpp
     llpanelsnapshotlocal.cpp
@@ -820,7 +829,6 @@ set(viewer_HEADER_FILES
     altoolalign.h
     alunzip.h
     alviewermenu.h
-    fsfloatersearch.h
     groupchatlistener.h
     llaccountingcost.h
     llagentwearablesfetch.h
@@ -955,6 +963,7 @@ set(viewer_HEADER_FILES
     llfloatercreatelandmark.h
     llfloaterdeleteprefpreset.h
     llfloaterdestinations.h
+    llfloaterdirectory.h
     llfloaterdisplayname.h
     llfloatereditenvironmentbase.h
     llfloatereditextdaycycle.h
@@ -1155,6 +1164,7 @@ set(viewer_HEADER_FILES
     llpaneleditwater.h
     llpaneleditwearable.h
     llpanelenvironment.h
+    llpaneleventinfo.h
     llpanelexperiencelisteditor.h
     llpanelexperiencelog.h
     llpanelexperiencepicker.h
@@ -1206,6 +1216,14 @@ set(viewer_HEADER_FILES
     llpanelprofile.h
     llpanelprofileclassifieds.h
     llpanelprofilepicks.h
+    llpanelsearchbase.h
+    llpanelsearchclassifieds.h
+    llpanelsearchevents.h
+    llpanelsearchgroups.h
+    llpanelsearchlandsales.h
+    llpanelsearchpeople.h
+    llpanelsearchplaces.h
+    llpanelsearchweb.h
     llpanelsnapshot.h
     llpanelteleporthistory.h
     llpaneltiptoast.h
diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index 51033f8986d6db6cd929670435f7a83b3ae42631..dd1da4dd3ef68371568156b9fc67ec1d08c40344 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -1017,27 +1017,5 @@
       <key>Value</key>
       <string>8dcd4a48-2d37-4909-9f78-f7a9eb4ef903</string>
     </map>
-    <key>FSLastSearchTab</key>
-    <map>
-		<key>Comment</key>
-		<string>Last selected tab in search window</string>
-		<key>Persist</key>
-		<integer>1</integer>
-		<key>Type</key>
-		<string>S32</string>
-		<key>Value</key>
-		<integer>0</integer>
-    </map>
-    <key>FSLegacySearchActionOnTeleport</key>
-    <map>
-        <key>Comment</key>
-        <string>Controls what action Legacy Search should take when teleporting: 0 = No effect, 1 = Close floater, 2 Minimise floater</string>
-        <key>Persist</key>
-        <integer>1</integer>
-        <key>Type</key>
-        <string>U32</string>
-        <key>Value</key>
-        <integer>1</integer>
-    </map>
   </map>
 </llsd>
diff --git a/indra/newview/fsfloatersearch.cpp b/indra/newview/fsfloatersearch.cpp
deleted file mode 100644
index ee77453a5df694f1ac0d2134b390e98cb9bc927c..0000000000000000000000000000000000000000
--- a/indra/newview/fsfloatersearch.cpp
+++ /dev/null
@@ -1,3144 +0,0 @@
-/**
- * @file fsfloatersearch.cpp
- * @brief Firestorm Search Floater
- *
- * $LicenseInfo:firstyear=2012&license=fsviewerlgpl$
- * Phoenix Firestorm Viewer Source Code
- * Copyright (C) 2012, Cinder Roxley <cinder.roxley@phoenixviewer.com>
- *
- * 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
- *
- * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
- * http://www.firestormviewer.org
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "fsfloatersearch.h"
-
-#include "lldispatcher.h"
-#include "llagent.h"
-#include "llavataractions.h"
-#include "llavatarname.h"
-#include "llavatarnamecache.h"
-#include "llavatarpropertiesprocessor.h"
-#include "llclassifiedflags.h"
-#include "llclassifiedinfo.h"
-#include "llcombobox.h"
-#include "lldateutil.h"
-#include "lleventflags.h"
-#include "lleventnotifier.h"
-#include "llfloaterreg.h"
-#include "llfloaterworldmap.h"
-#include "llgroupactions.h"
-#include "llgroupmgr.h"
-#include "llloadingindicator.h"
-#include "lllogininstance.h"
-#include "llnotificationsutil.h"
-#include "llpanelclassified.h"
-#include "llparcel.h"
-#include "llproductinforequest.h"
-#include "llqueryflags.h"
-#include "llregionhandle.h"
-#include "llremoteparcelrequest.h"
-#include "lltimer.h"
-#include "lltrans.h"
-#include "llviewercontrol.h"
-#include "llviewergenericmessage.h"
-#include "llviewernetwork.h"
-#include "llviewerregion.h"
-#include "llworldmapmessage.h"
-#include "message.h"
-#include <boost/tokenizer.hpp>
-#include <boost/algorithm/string.hpp>
-#include <string>
-
-static const S32 MIN_SEARCH_STRING_SIZE = 2;
-static const S32 RESULT_PAGE_SIZE = 100;
-
-std::string filterShortWords(std::string query_string);
-void fillSearchComboBox(LLSearchComboBox* search_combo);
-
-////////////////////////////////////////
-//          Observer Classes          //
-////////////////////////////////////////
-
-class FSSearchRemoteParcelInfoObserver : public LLRemoteParcelInfoObserver
-{
-public:
-	FSSearchRemoteParcelInfoObserver(FSFloaterSearch* floater, bool for_events) : LLRemoteParcelInfoObserver(),
-		mParent(floater),
-		mForEvents(for_events)
-	{}
-
-	~FSSearchRemoteParcelInfoObserver()
-	{
-		// remove any in-flight observers
-		std::set<LLUUID>::iterator it;
-		for (it = mParcelIDs.begin(); it != mParcelIDs.end(); ++it)
-		{
-			const LLUUID &id = *it;
-			LLRemoteParcelInfoProcessor::getInstance()->removeObserver(id, this);
-		}
-		mParcelIDs.clear();
-	}
-
-	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data)
-	{
-		if (mParent)
-		{
-			if (mForEvents)
-			{
-				mParent->displayEventParcelImage(parcel_data);
-			}
-			else
-			{
-				mParent->displayParcelDetails(parcel_data);
-			}
-		}
-		mParcelIDs.erase(parcel_data.parcel_id);
-		LLRemoteParcelInfoProcessor::getInstance()->removeObserver(parcel_data.parcel_id, this);
-	}
-
-	/*virtual*/ void setParcelID(const LLUUID& parcel_id)
-	{
-		if (!parcel_id.isNull())
-		{
-			mParcelIDs.insert(parcel_id);
-			LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this);
-			LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id);
-		}
-	}
-
-	/*virtual*/ void setErrorStatus(S32 status, const std::string& reason)
-	{
-		LL_WARNS("Search") << "Can't complete remote parcel request. Http Status: " << status << ". Reason : " << reason << LL_ENDL;
-	}
-private:
-	std::set<LLUUID>	mParcelIDs;
-	FSFloaterSearch*	mParent;
-	bool				mForEvents;
-};
-
-///// Avatar Properties Observer /////
-
-class FSSearchAvatarPropertiesObserver : public LLAvatarPropertiesObserver
-{
-public:
-	FSSearchAvatarPropertiesObserver(FSFloaterSearch* floater) : LLAvatarPropertiesObserver(),
-	mParent(floater)
-	{}
-
-	~FSSearchAvatarPropertiesObserver()
-	{
-		// remove any in-flight observers
-		std::set<LLUUID>::iterator it;
-		for (it = mAvatarIDs.begin(); it != mAvatarIDs.end(); ++it)
-		{
-			const LLUUID &id = *it;
-			LLAvatarPropertiesProcessor::getInstance()->removeObserver(id, this);
-		}
-		mAvatarIDs.clear();
-	}
-
-	void processProperties(void* data, EAvatarProcessorType type)
-	{
-		if (APT_PROPERTIES == type)
-		{
-			LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
-			if (avatar_data)
-			{
-				mParent->displayAvatarDetails(avatar_data);
-				LLAvatarPropertiesProcessor::getInstance()->removeObserver(avatar_data->avatar_id, this);
-			}
-		}
-		if (APT_CLASSIFIED_INFO == type)
-		{
-			LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
-			if (c_info)
-			{
-				mParent->displayClassifiedDetails(c_info);
-				LLAvatarPropertiesProcessor::getInstance()->removeObserver(c_info->classified_id, this);
-				std::string url = gAgent.getRegionCapability("SearchStatRequest");
-				if (!url.empty())
-				{
-					LL_INFOS("Search") << "Classified stat request via capability" << LL_ENDL;
-					LLSD body;
-					body["classified_id"] = c_info->classified_id;
-					LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, body, boost::bind(&LLPanelClassifiedInfo::handleSearchStatResponse, c_info->classified_id, _1));
-				}
-			}
-		}
-	}
-private:
-	std::set<LLUUID>	mAvatarIDs;
-	FSFloaterSearch*	mParent;
-};
-
-///// Group Info Observer /////
-
-class FSSearchGroupInfoObserver : public LLGroupMgrObserver
-{
-public:
-	FSSearchGroupInfoObserver(const LLUUID& group_id, FSFloaterSearch* parent) :
-	LLGroupMgrObserver(group_id),
-	mParent(parent)
-	{
-		LLGroupMgr* groupmgr = LLGroupMgr::getInstance();
-		if (!group_id.isNull() && groupmgr)
-		{
-			groupmgr->addObserver(this);
-			mID = group_id;
-			groupmgr->sendGroupPropertiesRequest(group_id);
-		}
-	}
-
-	~FSSearchGroupInfoObserver()
-	{
-		LLGroupMgr::getInstance()->removeObserver(this);
-	}
-
-	void changed(LLGroupChange gc)
-	{
-		if (gc == GC_PROPERTIES)
-		{
-			LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(mID);
-			mParent->displayGroupDetails(group_data);
-			LLGroupMgr::getInstance()->removeObserver(this);
-		}
-	}
-private:
-	FSFloaterSearch*	mParent;
-	LLUUID				mID;
-};
-
-///// Silly Classified Clickthrough Class /////
-class FSDispatchClassifiedClickThrough : public LLDispatchHandler
-{
-public:
-	virtual bool operator()(
-		const LLDispatcher* dispatcher,
-		const std::string& key,
-		const LLUUID& invoice,
-		const sparam_t& strings)
-	{
-		if (strings.size() != 4) return false;
-		LLUUID classified_id(strings[0]);
-		S32 teleport_clicks = atoi(strings[1].c_str());
-		S32 map_clicks = atoi(strings[2].c_str());
-		S32 profile_clicks = atoi(strings[3].c_str());
-
-		LLPanelClassifiedInfo::setClickThrough(
-			classified_id, teleport_clicks, map_clicks, profile_clicks, false);
-
-		return true;
-	}
-};
-static FSDispatchClassifiedClickThrough sClassifiedClickThrough;
-
-SearchQuery::SearchQuery()
-: category("category", "")
-, query("query")
-{}
-
-////////////////////////////////////////
-//         The floater itself         //
-////////////////////////////////////////
-
-FSFloaterSearch::FSFloaterSearch(const Params& key)
-:	LLFloater(key)
-{
-	mRemoteParcelObserver = new FSSearchRemoteParcelInfoObserver(this, false);
-	mRemoteParcelEventLocationObserver = new FSSearchRemoteParcelInfoObserver(this, true);
-	mAvatarPropertiesObserver = new FSSearchAvatarPropertiesObserver(this);
-}
-
-FSFloaterSearch::~FSFloaterSearch()
-{
-	delete mRemoteParcelObserver;
-	delete mRemoteParcelEventLocationObserver;
-	delete mAvatarPropertiesObserver;
-	gGenericDispatcher.addHandler("classifiedclickthrough", nullptr);
-}
-
-// virtual
-void FSFloaterSearch::onOpen(const LLSD& key)
-{
-	Params p(key);
-	mPanelWeb->loadURL(p.search);
-	if (key.has("query"))
-	{
-		mTabContainer->selectTabPanel(mPanelWeb);
-	}
-	else if (key.has("tab") && key["tab"].asString() == "groups")
-	{
-		mTabContainer->selectTabPanel(mPanelGroups);
-	}
-
-	FSSearchPanelBase* current_panel = dynamic_cast<FSSearchPanelBase*>(mTabContainer->getCurrentPanel());
-	if (current_panel)
-	{
-		current_panel->focusDefaultElement();
-	}
-}
-
-//virtual
-void FSFloaterSearch::onClose(bool app_quitting)
-{
-	if (mTabContainer)
-	{
-		gSavedSettings.setS32("FSLastSearchTab", mTabContainer->getCurrentPanelIndex());
-	}
-}
-
-BOOL FSFloaterSearch::postBuild()
-{
-	childSetAction("people_profile_btn", boost::bind(&FSFloaterSearch::onBtnPeopleProfile, this));
-	childSetAction("people_message_btn", boost::bind(&FSFloaterSearch::onBtnPeopleIM, this));
-	childSetAction("people_friend_btn", boost::bind(&FSFloaterSearch::onBtnPeopleFriend, this));
-	childSetAction("group_profile_btn", boost::bind(&FSFloaterSearch::onBtnGroupProfile, this));
-	childSetAction("group_message_btn", boost::bind(&FSFloaterSearch::onBtnGroupChat, this));
-	childSetAction("group_join_btn", boost::bind(&FSFloaterSearch::onBtnGroupJoin, this));
-	childSetAction("event_reminder_btn", boost::bind(&FSFloaterSearch::onBtnEventReminder, this));
-	childSetAction("teleport_btn", boost::bind(&FSFloaterSearch::onBtnTeleport, this));
-	childSetAction("map_btn", boost::bind(&FSFloaterSearch::onBtnMap, this));
-	resetVerbs();
-
-	mPanelPeople		= findChild<FSPanelSearchPeople>("panel_ls_people");
-	mPanelGroups		= findChild<FSPanelSearchGroups>("panel_ls_groups");
-	mPanelPlaces		= findChild<FSPanelSearchPlaces>("panel_ls_places");
-	mPanelEvents		= findChild<FSPanelSearchEvents>("panel_ls_events");
-	mPanelLand			= findChild<FSPanelSearchLand>("panel_ls_land");
-	mPanelClassifieds	= findChild<FSPanelSearchClassifieds>("panel_ls_classifieds");
-	mPanelWeb			= findChild<FSPanelSearchWeb>("panel_ls_web");
-
-	mDetailsPanel =		getChild<LLPanel>("panel_ls_details");
-	mDetailTitle =		getChild<LLTextEditor>("title");
-	mDetailDesc =		getChild<LLTextEditor>("desc");
-	mDetailAux1 =		getChild<LLTextEditor>("aux1");
-	mDetailAux2 =		getChild<LLTextEditor>("aux2");
-	mDetailLocation =	getChild<LLTextEditor>("location");
-	mDetailSnapshot =	getChild<LLTextureCtrl>("snapshot");
-	mDetailSnapshotParcel = getChild<LLTextureCtrl>("snapshot_parcel");
-	mDetailMaturity =	getChild<LLIconCtrl>("maturity_icon");
-	mTabContainer =		getChild<LLTabContainer>("ls_tabs");
-
-	mTabContainer->setCommitCallback(boost::bind(&FSFloaterSearch::onTabChange, this));
-	
-	flushDetails();
-	
-	mDetailsPanel->setVisible(false);
-
-	mHasSelection = false;
-
-	if (!mTabContainer->selectTab(gSavedSettings.getS32("FSLastSearchTab")))
-	{
-		mTabContainer->selectFirstTab();
-	}
-
-	return TRUE;
-}
-
-void FSFloaterSearch::onTabChange()
-{
-	LLPanel* active_panel = mTabContainer->getCurrentPanel();
-
-	if (active_panel == mPanelWeb)
-	{
-		mDetailsPanel->setVisible(false);
-		mPanelWeb->resetFocusOnLoad();
-	}
-	else
-	{
-		mDetailsPanel->setVisible(mHasSelection);
-	}
-
-	if (active_panel == mPanelPeople || active_panel == mPanelGroups)
-	{
-		mDetailSnapshotParcel->setVisible(FALSE);
-		mDetailSnapshot->setVisible(TRUE);
-	}
-	else if (active_panel == mPanelPlaces || active_panel == mPanelLand ||
-		active_panel == mPanelEvents || active_panel == mPanelClassifieds)
-	{
-		mDetailSnapshot->setVisible(FALSE);
-		mDetailSnapshotParcel->setVisible(TRUE);
-	}
-}
-
-//static
-template <class T>
-T* FSFloaterSearch::getSearchPanel(const std::string& panel_name)
-{
-	FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search");
-	if (search_instance && search_instance->mTabContainer)
-	{
-		return dynamic_cast<T*>(search_instance->mTabContainer->getPanelByName(panel_name));
-	}
-	else
-	{
-		return nullptr;
-	}
-}
-
-void FSFloaterSearch::onSelectedItem(const LLUUID& selected_item, ESearchCategory type)
-{
-	if (!selected_item.isNull())
-	{
-		mSelectedID = selected_item;
-		resetVerbs();
-		flushDetails();
-		switch (type)
-		{
-			case SC_AVATAR:
-				{
-					{
-						LLAvatarPropertiesProcessor::getInstance()->addObserver(selected_item, mAvatarPropertiesObserver);
-						LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesRequest(selected_item);
-					}
-				}
-				break;
-			case SC_GROUP:
-				mGroupPropertiesRequest = new FSSearchGroupInfoObserver(selected_item, this);
-				break;
-			case SC_PLACE:
-				mRemoteParcelObserver->setParcelID(selected_item);
-				break;
-			case SC_CLASSIFIED:
-				LLAvatarPropertiesProcessor::getInstance()->addObserver(selected_item, mAvatarPropertiesObserver);
-				LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(selected_item);
-				gGenericDispatcher.addHandler("classifiedclickthrough", &sClassifiedClickThrough);
-				break;
-		}
-		setLoadingProgress(true);
-	}
-}
-
-void FSFloaterSearch::onSelectedEvent(const S32 selected_event)
-{
-	resetVerbs();
-	flushDetails();
-
-	gMessageSystem->newMessageFast(_PREHASH_EventInfoRequest);
-	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
-	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
-	gMessageSystem->nextBlockFast(_PREHASH_EventData);
-	gMessageSystem->addU32Fast(_PREHASH_EventID, selected_event);
-	gAgent.sendReliableMessage();
-}
-
-void FSFloaterSearch::displayParcelDetails(const LLParcelData& parcel_data)
-{
-	S32 region_x;
-	S32 region_y;
-	S32 region_z;
-	region_x = ll_round(parcel_data.global_x) % REGION_WIDTH_UNITS;
-	region_y = ll_round(parcel_data.global_y) % REGION_WIDTH_UNITS;
-	region_z = ll_round(parcel_data.global_z);
-	// HACK: Flag 0x2 == adult region,
-	// Flag 0x1 == mature region, otherwise assume PG
-	if (parcel_data.flags & 0x2)
-	{
-		mDetailMaturity->setValue("Parcel_R_Dark");
-	}
-	else if (parcel_data.flags & 0x1)
-	{
-		mDetailMaturity->setValue("Parcel_M_Dark");
-	}
-	else
-	{
-		mDetailMaturity->setValue("Parcel_PG_Dark");
-	}
-
-	LLStringUtil::format_map_t map;
-	map["DWELL"] = llformat("%.0f", (F64)parcel_data.dwell);
-	map["AREA"] = llformat("%d m²", parcel_data.actual_area);
-	map["LOCATION"] = llformat("%s (%d, %d, %d)", parcel_data.sim_name.c_str(), region_x, region_y, region_z);
-
-	mParcelGlobal = LLVector3d(parcel_data.global_x, parcel_data.global_y, parcel_data.global_z);
-	mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_places" || mTabContainer->getCurrentPanel()->getName() == "panel_ls_land");
-	mHasSelection = true;
-	mDetailMaturity->setVisible(true);
-	mDetailTitle->setValue(parcel_data.name);
-	mDetailDesc->setValue(parcel_data.desc);
-	mDetailAux1->setValue(getString("string.traffic", map));
-	mDetailAux2->setValue(getString("string.area", map));
-	mDetailLocation->setValue(getString("string.location", map));
-	mDetailSnapshotParcel->setValue(parcel_data.snapshot_id);
-	childSetVisible("teleport_btn", true);
-	childSetVisible("map_btn", true);
-	setLoadingProgress(false);
-}
-
-void FSFloaterSearch::displayAvatarDetails(LLAvatarData*& avatar_data)
-{
-	if (avatar_data)
-	{
-		LLStringUtil::format_map_t map;
-		map["AGE"] = LLDateUtil::ageFromDate(avatar_data->born_on, LLDate::now());
-		if (avatar_data->partner_id.notNull())
-		{
-			map["PARTNER"] = LLSLURL("agent", avatar_data->partner_id, "inspect").getSLURLString();
-			mDetailAux2->setValue(getString("string.partner", map));
-		}
-
-		mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_people");
-		mHasSelection = true;
-		mDetailTitle->setValue(LLTrans::getString("LoadingData"));
-		mDetailDesc->setValue(avatar_data->about_text);
-		mDetailSnapshot->setValue(avatar_data->image_id);
-		mDetailAux1->setValue(getString("string.age", map));
-		LLAvatarNameCache::get(avatar_data->avatar_id, boost::bind(&FSFloaterSearch::avatarNameUpdatedCallback,this, _1, _2));
-		childSetVisible("people_profile_btn", true);
-		childSetVisible("people_message_btn", true);
-		childSetVisible("people_friend_btn", true);
-		getChildView("people_friend_btn")->setEnabled(!LLAvatarActions::isFriend(avatar_data->avatar_id));
-	}
-}
-
-void FSFloaterSearch::displayGroupDetails(LLGroupMgrGroupData*& group_data)
-{
-	if (group_data)
-	{
-		LLStringUtil::format_map_t map;
-		map["MEMBER_COUNT"] = llformat("%d",group_data->mMemberCount);
-		map["FOUNDER"] = LLSLURL("agent", group_data->mFounderID, "inspect").getSLURLString();
-
-		mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_groups");
-		mHasSelection = true;
-		mDetailTitle->setValue(LLTrans::getString("LoadingData"));
-		mDetailDesc->setValue(group_data->mCharter);
-		mDetailSnapshot->setValue(group_data->mInsigniaID);
-		mDetailAux1->setValue(getString("string.members", map));
-		mDetailAux2->setValue(getString("string.founder", map));
-		LLGroupData agent_gdatap;
-		bool is_member = gAgent.getGroupData(getSelectedID(),agent_gdatap) || gAgent.isGodlike();
-		bool join_btn_enabled = !is_member && group_data->mOpenEnrollment;
-		childSetVisible("group_profile_btn", true);
-		childSetVisible("group_message_btn", true);
-		childSetVisible("group_join_btn", true);
-		getChildView("group_join_btn")->setEnabled(join_btn_enabled);
-		getChildView("group_message_btn")->setEnabled(is_member);
-		gCacheName->getGroup(getSelectedID(), boost::bind(&FSFloaterSearch::groupNameUpdatedCallback, this, _1, _2, _3));
-	}
-}
-
-void FSFloaterSearch::displayClassifiedDetails(LLAvatarClassifiedInfo*& c_info)
-{
-	if (c_info)
-	{
-		if (c_info->flags & CLASSIFIED_FLAG_MATURE)
-		{
-			mDetailMaturity->setValue("Parcel_M_Dark");
-		}
-		else
-		{
-			mDetailMaturity->setValue("Parcel_PG_Dark");
-		}
-
-		LLStringUtil::format_map_t map;
-		map["LISTING_PRICE"] = llformat("L$%d", c_info->price_for_listing);
-		map["SLURL"] = LLSLURL("parcel", c_info->parcel_id, "about").getSLURLString();
-
-		mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_classifieds");
-		mHasSelection = true;
-		mDetailMaturity->setVisible(true);
-		mParcelGlobal = c_info->pos_global;
-		mDetailTitle->setValue(c_info->name);
-		mDetailDesc->setValue(c_info->description);
-		mDetailSnapshotParcel->setValue(c_info->snapshot_id);
-		mDetailAux1->setValue(getString("string.listing_price", map));
-		mDetailLocation->setValue(getString("string.slurl", map));
-		childSetVisible("teleport_btn", true);
-		childSetVisible("map_btn", true);
-		setLoadingProgress(false);
-	}
-}
-
-void FSFloaterSearch::displayEventDetails(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName, const std::string &eventDesc, const std::string &simName, U32 eventDuration, U32 eventFlags, U32 eventCover, LLVector3d eventGlobalPos)
-{
-	if (eventFlags == EVENT_FLAG_ADULT)
-	{
-		mDetailMaturity->setValue("Parcel_R_Dark");
-	}
-	else if (eventFlags == EVENT_FLAG_MATURE)
-	{
-		mDetailMaturity->setValue("Parcel_M_Dark");
-	}
-	else
-	{
-		mDetailMaturity->setValue("Parcel_PG_Dark");
-	}
-
-	S32 region_x;
-	S32 region_y;
-	S32 region_z;
-	region_x = (S64)ll_round(eventGlobalPos.mdV[VX]) % REGION_WIDTH_UNITS;
-	region_y = (S64)ll_round(eventGlobalPos.mdV[VY]) % REGION_WIDTH_UNITS;
-	region_z = (S32)ll_round(eventGlobalPos.mdV[VZ]);
-	LLStringUtil::format_map_t map;
-	map["DURATION"] = llformat("%d:%.2d", eventDuration / 60, eventDuration % 60);
-	map["LOCATION"] = llformat("%s (%d, %d, %d)", simName.c_str(), region_x, region_y, region_z);
-	if (eventCover > 0)
-	{
-		map["COVERCHARGE"] = llformat("L$%d", eventCover);
-		mDetailAux2->setValue(getString("string.covercharge", map));
-	}
-
-	mParcelGlobal = eventGlobalPos;
-	mEventID = eventId;
-	mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_events");
-	mHasSelection = true;
-	mDetailMaturity->setVisible(true);
-	mDetailTitle->setValue(eventName);
-	mDetailDesc->setValue(eventDesc);
-	mDetailAux1->setValue(getString("string.duration", map));
-	mDetailLocation->setValue(getString("string.location", map));
-	mDetailSnapshotParcel->setValue(LLUUID::null);
-	childSetVisible("teleport_btn", true);
-	childSetVisible("map_btn", true);
-	childSetVisible("event_reminder_btn", true);
-
-	LLWorldMapMessage::getInstance()->sendNamedRegionRequest(simName, boost::bind(&FSFloaterSearch::regionHandleCallback, this, _1, eventGlobalPos), "", false);
-}
-
-void FSFloaterSearch::regionHandleCallback(U64 region_handle, LLVector3d pos_global)
-{
-	std::string url = gAgent.getRegionCapability("RemoteParcelRequest");
-	if (!url.empty())
-	{
-		auto region_origin = from_region_handle(region_handle);
-		LLVector3 pos_region(LLVector3(pos_global - region_origin));
-
-		LLRemoteParcelInfoProcessor::getInstance()->requestRegionParcelInfo(url,
-			LLUUID::null, pos_region, pos_global, mRemoteParcelEventLocationObserver->getObserverHandle());
-	}
-	else
-	{
-		setLoadingProgress(false);
-	}
-}
-
-void FSFloaterSearch::displayEventParcelImage(const LLParcelData& parcel_data)
-{
-	mDetailSnapshotParcel->setValue(parcel_data.snapshot_id);
-	setLoadingProgress(false);
-}
-
-void FSFloaterSearch::avatarNameUpdatedCallback(const LLUUID& id, const LLAvatarName& av_name)
-{
-	if (id == getSelectedID())
-	{
-		mDetailTitle->setValue(av_name.getCompleteName());
-		setLoadingProgress(false);
-	}
-	// Otherwise possibly a request for an older selection, ignore it.
-}
-
-void FSFloaterSearch::groupNameUpdatedCallback(const LLUUID& id, const std::string& name, bool is_group)
-{
-	if (id == getSelectedID())
-	{
-		mDetailTitle->setValue( LLSD(name) );
-		setLoadingProgress(false);
-	}
-	// Otherwise possibly a request for an older selection, ignore it.
-}
-
-void FSFloaterSearch::setLoadingProgress(bool started)
-{
-	LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("loading");
-
-	indicator->setVisible(started);
-
-	if (started)
-	{
-		indicator->start();
-	}
-	else
-	{
-		indicator->stop();
-	}
-}
-
-void FSFloaterSearch::resetVerbs()
-{
-	childSetVisible("people_profile_btn", false);
-	childSetVisible("people_message_btn", false);
-	childSetVisible("people_friend_btn", false);
-	childSetVisible("group_profile_btn", false);
-	childSetVisible("group_message_btn", false);
-	childSetVisible("group_join_btn", false);
-	childSetVisible("event_reminder_btn", false);
-	childSetVisible("teleport_btn", false);
-	childSetVisible("map_btn", false);
-}
-
-void FSFloaterSearch::flushDetails()
-{
-	mDetailTitle->setValue("");
-	mDetailDesc->setValue("");
-	mDetailAux1->setValue("");
-	mDetailAux2->setValue("");
-	mDetailLocation->setValue("");
-	mDetailSnapshot->setValue(LLSD());
-	mDetailMaturity->setVisible(false);
-	mParcelGlobal.setZero();
-}
-
-void FSFloaterSearch::onBtnPeopleProfile()
-{
-	LLAvatarActions::showProfile(getSelectedID());
-}
-
-void FSFloaterSearch::onBtnPeopleIM()
-{
-	LLAvatarActions::startIM(getSelectedID());
-}
-
-void FSFloaterSearch::onBtnPeopleFriend()
-{
-	LLAvatarActions::requestFriendshipDialog(getSelectedID());
-}
-
-void FSFloaterSearch::onBtnGroupProfile()
-{
-	LLGroupActions::show(getSelectedID());
-}
-
-void FSFloaterSearch::onBtnGroupChat()
-{
-	LLGroupActions::startIM(getSelectedID());
-}
-
-void FSFloaterSearch::onBtnGroupJoin()
-{
-	LLGroupActions::join(getSelectedID());
-}
-
-void FSFloaterSearch::onBtnTeleport()
-{
-	if (!mParcelGlobal.isExactlyZero())
-	{
-		gAgent.teleportViaLocation(mParcelGlobal);
-		LLFloaterWorldMap::getInstance()->trackLocation(mParcelGlobal);
-		/// <FS:CR> What should we do when when we teleport? The default (1) is to close the floater,
-		/// the user may elect to minimize the floater (2), or to do nothing (any other setting)
-		static LLCachedControl<U32> teleport_action(gSavedSettings, "FSLegacySearchActionOnTeleport");
-		if (teleport_action == 1)
-		{
-			closeFloater();
-		}
-		else if (teleport_action == 2)
-		{
-			setMinimized(TRUE);
-		}
-	}
-}
-
-void FSFloaterSearch::onBtnMap()
-{
-	if (!mParcelGlobal.isExactlyZero())
-	{
-		LLFloaterWorldMap::getInstance()->trackLocation(mParcelGlobal);
-		LLFloaterReg::showInstance("world_map", "center");
-	}
-}
-
-void FSFloaterSearch::onBtnEventReminder()
-{
-	gEventNotifier.add(mEventID);
-}
-
-////////////////////////////////////////
-//         People Search Panel        //
-////////////////////////////////////////
-
-static LLPanelInjector<FSPanelSearchPeople> t_panel_fs_search_people("panel_ls_people");
-
-FSPanelSearchPeople::FSPanelSearchPeople() : FSSearchPanelBase()
-, mQueryID(nullptr)
-, mStartSearch(0)
-, mResultsReceived(0)
-, mResultsContent()
-, mAvatarNameCallbackConnection()
-{
-}
-
-FSPanelSearchPeople::~FSPanelSearchPeople()
-{
-	if (mAvatarNameCallbackConnection.connected())
-	{
-		mAvatarNameCallbackConnection.disconnect();
-	}
-}
-
-BOOL FSPanelSearchPeople::postBuild()
-{
-	mSearchComboBox =	findChild<LLSearchComboBox>("people_edit");
-	mSearchResults =	findChild<LLScrollListCtrl>("search_results_people");
-	if (mSearchComboBox)
-	{
-		mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchPeople::onBtnFind, this));
-		fillSearchComboBox(mSearchComboBox);
-	}
-	if (mSearchResults)
-	{
-		mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchPeople::onSelectItem, this));
-		mSearchResults->setEnabled(FALSE);
-		mSearchResults->setCommentText(LLTrans::getString("no_results"));
-		mSearchResults->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
-	}
-
-	childSetAction("people_next", boost::bind(&FSPanelSearchPeople::onBtnNext, this));
-	childSetAction("people_back", boost::bind(&FSPanelSearchPeople::onBtnBack, this));
-	getChildView("people_next")->setEnabled(FALSE);
-	getChildView("people_back")->setEnabled(FALSE);
-
-	return TRUE;
-}
-
-void FSPanelSearchPeople::focusDefaultElement()
-{
-	mSearchComboBox->focusTextEntry();
-}
-
-void FSPanelSearchPeople::find()
-{
-	std::string text = mSearchComboBox->getSimple();
-	boost::trim(text);
-	if (text.size() <= MIN_SEARCH_STRING_SIZE)
-	{
-		mSearchResults->setCommentText(LLTrans::getString("search_short"));
-		return;
-	}
-
-	if (LLUUID::validate(text))
-	{
-		LLUUID id(text);
-
-		mSearchResults->deleteAllItems();
-		mSearchResults->setCommentText(LLTrans::getString("searching"));
-		mResultsReceived = 0;
-		mNumResultsReturned = 0;
-
-		if (mAvatarNameCallbackConnection.connected())
-		{
-			mAvatarNameCallbackConnection.disconnect();
-		}
-		mAvatarNameCallbackConnection = LLAvatarNameCache::get(id, boost::bind(&FSPanelSearchPeople::onAvatarNameCallback, this, _1, _2));
-
-		return;
-	}
-
-	LLStringUtil::replaceChar(text, '.', ' ');
-
-	mResultsReceived = 0;
-	if (mQueryID.notNull())
-	{
-		mQueryID.setNull();
-	}
-	mQueryID.generate();
-
-	if (mStartSearch < 0)
-	{
-		mStartSearch = 0;
-	}
-
-	gMessageSystem->newMessage("DirFindQuery");
-	gMessageSystem->nextBlock("AgentData");
-	gMessageSystem->addUUID("AgentID", gAgentID);
-	gMessageSystem->addUUID("SessionID", gAgentSessionID);
-	gMessageSystem->nextBlock("QueryData");
-	gMessageSystem->addUUID("QueryID", getQueryID());
-	gMessageSystem->addString("QueryText", text);
-	gMessageSystem->addU32("QueryFlags", DFQ_PEOPLE);
-	gMessageSystem->addS32("QueryStart", mStartSearch);
-	gAgent.sendReliableMessage();
-	LL_DEBUGS("Search") << "Firing off search request: " << getQueryID() << LL_ENDL;
-
-	mSearchResults->deleteAllItems();
-	mSearchResults->setCommentText(LLTrans::getString("searching"));
-	mNumResultsReturned = 0;
-}
-
-void FSPanelSearchPeople::onBtnFind()
-{
-	std::string text = mSearchComboBox->getSimple();
-	if (!text.empty())
-	{
-		LLSearchHistory::getInstance()->addEntry(text);
-	}
-
-	resetSearch();
-	
-	find();
-}
-
-void FSPanelSearchPeople::onBtnNext()
-{
-	mStartSearch += RESULT_PAGE_SIZE;
-	getChildView("people_back")->setEnabled(TRUE);
-
-	find();
-}
-
-void FSPanelSearchPeople::onBtnBack()
-{
-	mStartSearch -= RESULT_PAGE_SIZE;
-	getChildView("people_back")->setEnabled(mStartSearch > 0);
-
-	find();
-}
-
-void FSPanelSearchPeople::resetSearch()
-{
-	mStartSearch = 0;
-	getChildView("people_back")->setEnabled(FALSE);
-	getChildView("people_next")->setEnabled(FALSE);
-}
-
-S32 FSPanelSearchPeople::showNextButton(S32 rows)
-{
-	bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE);
-	getChildView("people_next")->setEnabled(show_next_button);
-	if (show_next_button)
-	{
-		rows -= (mResultsReceived - RESULT_PAGE_SIZE);
-	}
-	return rows;
-}
-
-void FSPanelSearchPeople::onSelectItem()
-{
-	if (!mSearchResults)
-	{
-		return;
-	}
-	FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search");
-	if (search_instance)
-	{
-		search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_AVATAR);
-	}
-}
-
-// static
-void FSPanelSearchPeople::processSearchReply(LLMessageSystem* msg, void**)
-{
-	LLUUID query_id;
-	std::string first_name;
-	std::string last_name;
-	LLUUID agent_id;
-
-	msg->getUUIDFast(_PREHASH_QueryData,	_PREHASH_QueryID,	query_id);
-	msg->getUUIDFast(_PREHASH_AgentData,	_PREHASH_AgentID,	agent_id);
-
-	// This result is not for us.
-	if (agent_id != gAgentID)
-	{
-		return;
-	}
-	LL_DEBUGS("Search") << "received search results - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL;
-
-	FSPanelSearchPeople* self = FSFloaterSearch::getSearchPanel<FSPanelSearchPeople>("panel_ls_people");
-
-	// floater is closed or these are not results from our last request
-	if (!self || query_id != self->getQueryID())
-	{
-		return;
-	}
-
-	LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_people");
-
-	if (self->mNumResultsReturned++ == 0)
-	{
-		search_results->deleteAllItems();
-	}
-
-	// Check for status messages
-	if (msg->getNumberOfBlocks("StatusData"))
-	{
-		U32 status;
-		msg->getU32("StatusData", "Status", status);
-		if (status & STATUS_SEARCH_PLACES_FOUNDNONE)
-		{
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = self->getChild<LLUICtrl>("people_edit")->getValue().asString();
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("not_found", map));
-			return;
-		}
-		else if (status & STATUS_SEARCH_PLACES_SHORTSTRING)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_short"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_PLACES_BANNEDWORD)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_banned"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_disabled"));
-			return;
-		}
-	}
-
-	bool found_one = false;
-	S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies);
-	if (num_new_rows == 0 && self->mResultsReceived == 0)
-	{
-		LLStringUtil::format_map_t map;
-		map["[TEXT]"] = self->getChild<LLUICtrl>("people_edit")->getValue().asString();
-		search_results->setEnabled(FALSE);
-		search_results->setCommentText(LLTrans::getString("not_found", map));
-	}
-
-	self->mResultsReceived += num_new_rows;
-	num_new_rows = self->showNextButton(num_new_rows);
-
-	for (S32 i = 0; i < num_new_rows; i++)
-	{
-		msg->getStringFast(	_PREHASH_QueryReplies,	_PREHASH_FirstName,	first_name, i);
-		msg->getStringFast(	_PREHASH_QueryReplies,	_PREHASH_LastName,	last_name, i);
-		msg->getUUIDFast(	_PREHASH_QueryReplies,	_PREHASH_AgentID,	agent_id, i);
-		//msg->getU8Fast(	_PREHASH_QueryReplies,	_PREHASH_Online,	online, i);
-		
-		if (agent_id.isNull())
-		{
-			LL_INFOS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL;
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = self->getChild<LLUICtrl>("people_edit")->getValue().asString();
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("not_found", map));
-		}
-		else
-		{
-			LL_DEBUGS("Search") << "Got: " << first_name << " " << last_name << " AgentID: " << agent_id << LL_ENDL;
-			search_results->setEnabled(TRUE);
-			found_one = true;
-			
-			std::string avatar_name;
-			avatar_name = LLCacheName::buildFullName(first_name, last_name);
-
-			LLSD content;
-			LLSD element;
-
-			element["id"] = agent_id;
-
-			element["columns"][0]["column"]	= "icon";
-			element["columns"][0]["type"]	= "icon";
-			element["columns"][0]["value"]	= "icon_avatar_offline.tga";
-
-			element["columns"][1]["column"]	= "username";
-			element["columns"][1]["value"]	= avatar_name;
-
-			content["name"] = avatar_name;
-
-			search_results->addElement(element, ADD_BOTTOM);
-			self->mResultsContent[agent_id.asString()] = content;
-		}
-	}
-	if (found_one)
-	{
-		search_results->selectFirstItem();
-		search_results->setFocus(TRUE);
-		self->onSelectItem();
-	}
-}
-
-void FSPanelSearchPeople::onAvatarNameCallback(const LLUUID& id, const LLAvatarName& av_name)
-{
-	if (mAvatarNameCallbackConnection.connected())
-	{
-		mAvatarNameCallbackConnection.disconnect();
-	}
-
-	LLScrollListCtrl* search_results = getChild<LLScrollListCtrl>("search_results_people");
-
-	if (av_name.getAccountName() != "(?\?\?).(?\?\?)")
-	{
-		LLSD content;
-		LLSD data;
-		data["id"] = id;
-
-		data["columns"][0]["column"] = "icon";
-		data["columns"][0]["type"] = "icon";
-		data["columns"][0]["value"] = "icon_avatar_offline.tga";
-
-		data["columns"][1]["name"] = "username";
-		data["columns"][1]["value"] = av_name.getUserName();
-
-		content["name"] = av_name.getUserName();
-
-		search_results->addElement(data);
-
-		mResultsContent[id.asString()] = content;
-		mResultsReceived = 1;
-		mNumResultsReturned = 1;
-
-		search_results->setEnabled(TRUE);
-		search_results->selectFirstItem();
-		search_results->setFocus(TRUE);
-		onSelectItem();
-	}
-	else
-	{
-		LLStringUtil::format_map_t map;
-		map["[TEXT]"] = getChild<LLUICtrl>("people_edit")->getValue().asString();
-		search_results->setEnabled(FALSE);
-		search_results->setCommentText(LLTrans::getString("not_found", map));
-	}
-}
-
-////////////////////////////////////////
-//         Groups Search Panel        //
-////////////////////////////////////////
-
-static LLPanelInjector<FSPanelSearchGroups> t_panel_fs_search_groups("panel_ls_groups");
-
-FSPanelSearchGroups::FSPanelSearchGroups() : FSSearchPanelBase()
-, mQueryID(nullptr)
-, mStartSearch(0)
-, mResultsReceived(0)
-, mResultsContent()
-{
-}
-
-FSPanelSearchGroups::~FSPanelSearchGroups()
-{
-}
-
-BOOL FSPanelSearchGroups::postBuild()
-{
-	mSearchComboBox =	findChild<LLSearchComboBox>("groups_edit");
-	mSearchResults =	findChild<LLScrollListCtrl>("search_results_groups");
-	if (mSearchComboBox)
-	{
-		mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchGroups::onBtnFind, this));
-		fillSearchComboBox(mSearchComboBox);
-	}
-	if (mSearchResults)
-	{
-		mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchGroups::onSelectItem, this));
-		mSearchResults->setEnabled(FALSE);
-		mSearchResults->setCommentText(LLTrans::getString("no_results"));
-	}
-
-	childSetAction("groups_next", boost::bind(&FSPanelSearchGroups::onBtnNext, this));
-	childSetAction("groups_back", boost::bind(&FSPanelSearchGroups::onBtnBack, this));
-	getChildView("groups_next")->setEnabled(FALSE);
-	getChildView("groups_back")->setEnabled(FALSE);
-
-	return TRUE;
-}
-
-void FSPanelSearchGroups::focusDefaultElement()
-{
-	mSearchComboBox->focusTextEntry();
-}
-
-void FSPanelSearchGroups::find()
-{
-	std::string text = filterShortWords(mSearchComboBox->getSimple());
-	if (text.size() == 0)
-	{
-		mSearchResults->setCommentText(LLTrans::getString("search_short"));
-		return;
-	}
-
-	static LLUICachedControl<bool> inc_pg("ShowPGSims", 1);
-	static LLUICachedControl<bool> inc_mature("ShowMatureSims", 0);
-	static LLUICachedControl<bool> inc_adult("ShowAdultSims", 0);
-	if (!(inc_pg || inc_mature || inc_adult))
-	{
-		LLNotificationsUtil::add("NoContentToSearch");
-		return;
-	}
-	U32 scope = 0;
-	if (gAgent.wantsPGOnly())
-	{
-		scope |= DFQ_PG_SIMS_ONLY;
-	}
-	bool adult_enabled = gAgent.canAccessAdult();
-	bool mature_enabled = gAgent.canAccessMature();
-	if (inc_pg)
-	{
-		scope |= DFQ_INC_PG;
-	}
-	if (inc_mature && mature_enabled)
-	{
-		scope |= DFQ_INC_MATURE;
-	}
-	if (inc_adult && adult_enabled)
-	{
-		scope |= DFQ_INC_ADULT;
-	}
-	scope |= DFQ_GROUPS;
-
-	mResultsReceived = 0;
-	if (mQueryID.notNull())
-	{
-		mQueryID.setNull();
-	}
-	mQueryID.generate();
-
-	if (mStartSearch < 0)
-	{
-		mStartSearch = 0;
-	}
-
-	gMessageSystem->newMessage("DirFindQuery");
-	gMessageSystem->nextBlock("AgentData");
-	gMessageSystem->addUUID("AgentID", gAgentID);
-	gMessageSystem->addUUID("SessionID", gAgentSessionID);
-	gMessageSystem->nextBlock("QueryData");
-	gMessageSystem->addUUID("QueryID", getQueryID());
-	gMessageSystem->addString("QueryText", text);
-	gMessageSystem->addU32("QueryFlags", scope);
-	gMessageSystem->addS32("QueryStart", mStartSearch);
-	gAgent.sendReliableMessage();
-	LL_DEBUGS("Search") << "Firing off search request: " << getQueryID() << LL_ENDL;
-
-	mSearchResults->deleteAllItems();
-	mSearchResults->setCommentText(LLTrans::getString("searching"));
-	mNumResultsReturned = 0;
-}
-
-void FSPanelSearchGroups::onBtnFind()
-{
-	std::string text = mSearchComboBox->getSimple();
-	if (!text.empty())
-	{
-		LLSearchHistory::getInstance()->addEntry(text);
-	}
-
-	resetSearch();
-	
-	find();
-}
-
-void FSPanelSearchGroups::onBtnNext()
-{
-	mStartSearch += RESULT_PAGE_SIZE;
-	getChildView("groups_back")->setEnabled(TRUE);
-
-	find();
-}
-
-void FSPanelSearchGroups::onBtnBack()
-{
-	mStartSearch -= RESULT_PAGE_SIZE;
-	getChildView("groups_back")->setEnabled(mStartSearch > 0);
-
-	find();
-}
-
-void FSPanelSearchGroups::resetSearch()
-{
-	mStartSearch = 0;
-	getChildView("groups_back")->setEnabled(FALSE);
-	getChildView("groups_next")->setEnabled(FALSE);
-}
-
-S32 FSPanelSearchGroups::showNextButton(S32 rows)
-{
-	bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE);
-	getChildView("groups_next")->setEnabled(show_next_button);
-	if (show_next_button)
-	{
-		rows -= (mResultsReceived - RESULT_PAGE_SIZE);
-	}
-	return rows;
-}
-
-void FSPanelSearchGroups::onSelectItem()
-{
-	if (!mSearchResults)
-	{
-		return;
-	}
-	FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search");
-	if (search_instance)
-	{
-		search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_GROUP);
-	}
-}
-
-// static
-void FSPanelSearchGroups::processSearchReply(LLMessageSystem* msg, void**)
-{
-	LLUUID query_id;
-	LLUUID group_id;
-	LLUUID agent_id;
-	std::string group_name;
-	S32 members;
-	F32 search_order;
-
-	msg->getUUIDFast(	_PREHASH_QueryData,	_PREHASH_QueryID,	query_id);
-	msg->getUUIDFast(	_PREHASH_AgentData,	_PREHASH_AgentID,	agent_id);
-
-	// Not for us
-	if (agent_id != gAgentID)
-	{
-		return;
-	}
-	LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL;
-
-	FSPanelSearchGroups* self = FSFloaterSearch::getSearchPanel<FSPanelSearchGroups>("panel_ls_groups");
-
-	// floater is closed or these are not results from our last request
-	if (!self || query_id != self->mQueryID)
-	{
-		return;
-	}
-
-	LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_groups");
-
-	// Clear "Searching" label on first results
-	if (self->mNumResultsReturned++ == 0)
-	{
-		search_results->deleteAllItems();
-	}
-
-	// Check for status messages
-	if (msg->getNumberOfBlocks("StatusData"))
-	{
-		U32 status;
-		msg->getU32("StatusData", "Status", status);
-		if (status & STATUS_SEARCH_PLACES_FOUNDNONE)
-		{
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = self->getChild<LLUICtrl>("groups_edit")->getValue().asString();
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("not_found", map));
-			return;
-		}
-		else if(status & STATUS_SEARCH_PLACES_SHORTSTRING)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_short"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_PLACES_BANNEDWORD)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_banned"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_disabled"));
-			return;
-		}
-	}
-
-	bool found_one = false;
-	S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies);
-	if (num_new_rows == 0 && self->mResultsReceived == 0)
-	{
-		LLStringUtil::format_map_t map;
-		map["[TEXT]"] = self->getChild<LLUICtrl>("groups_edit")->getValue().asString();
-		search_results->setEnabled(FALSE);
-		search_results->setCommentText(LLTrans::getString("not_found", map));
-	}
-
-	self->mResultsReceived += num_new_rows;
-	num_new_rows = self->showNextButton(num_new_rows);
-
-	for (S32 i = 0; i < num_new_rows; i++)
-	{
-		msg->getUUIDFast(	_PREHASH_QueryReplies,	_PREHASH_GroupID,		group_id,	i);
-		msg->getStringFast(	_PREHASH_QueryReplies,	_PREHASH_GroupName,		group_name,	i);
-		msg->getS32Fast(	_PREHASH_QueryReplies,	_PREHASH_Members,		members,	i);
-		msg->getF32Fast(	_PREHASH_QueryReplies,	_PREHASH_SearchOrder,	search_order,i);
-		if (group_id.isNull())
-		{
-			LL_DEBUGS("Search") << "No results returned for QueryID: " << query_id << LL_ENDL;
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = self->getChild<LLUICtrl>("groups_edit")->getValue().asString();
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("not_found", map));
-		}
-		else
-		{
-			LL_DEBUGS("Search") << "Got: " << group_name << " GroupID: " << group_id << LL_ENDL;
-			search_results->setEnabled(TRUE);
-			found_one = true;
-
-			LLSD content;
-			LLSD element;
-
-			element["id"] = group_id;
-
-			element["columns"][0]["column"]	= "icon";
-			element["columns"][0]["type"]	= "icon";
-			element["columns"][0]["value"]	= "Icon_Group";
-
-			element["columns"][1]["column"]	= "group_name";
-			element["columns"][1]["value"]	= group_name;
-
-			element["columns"][2]["column"]	= "members";
-			element["columns"][2]["value"]	= members;
-
-			element["columns"][3]["column"]	= "score";
-			element["columns"][3]["value"]	= search_order;
-
-			content["name"] = group_name;
-
-			search_results->addElement(element, ADD_BOTTOM);
-			self->mResultsContent[group_id.asString()] = content;
-		}
-	}
-	if (found_one)
-	{
-		search_results->selectFirstItem();
-		search_results->setFocus(TRUE);
-		self->onSelectItem();
-	}
-}
-
-////////////////////////////////////////
-//         Places Search Panel        //
-////////////////////////////////////////
-
-static LLPanelInjector<FSPanelSearchPlaces> t_panel_fs_search_places("panel_ls_places");
-
-FSPanelSearchPlaces::FSPanelSearchPlaces() : FSSearchPanelBase()
-, mQueryID(nullptr)
-, mStartSearch(0)
-, mResultsReceived(0)
-, mResultsContent()
-{
-	mCommitCallbackRegistrar.add("CommitSearch", boost::bind(&FSPanelSearchPlaces::find, this));
-}
-
-FSPanelSearchPlaces::~FSPanelSearchPlaces()
-{
-}
-
-BOOL FSPanelSearchPlaces::postBuild()
-{
-	mSearchComboBox =	findChild<LLSearchComboBox>("places_edit");
-	mSearchResults =	findChild<LLScrollListCtrl>("search_results_places");
-	mPlacesCategory =	findChild<LLComboBox>("places_category");
-	if (mSearchComboBox)
-	{
-		mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchPlaces::onBtnFind, this));
-		fillSearchComboBox(mSearchComboBox);
-	}
-	if (mSearchResults)
-	{
-		mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchPlaces::onSelectItem, this));
-		mSearchResults->setEnabled(FALSE);
-		mSearchResults->setCommentText(LLTrans::getString("no_results"));
-	}
-	if (mPlacesCategory)
-	{
-		mPlacesCategory->add(LLTrans::getString("all_categories"), LLSD("any"));
-		mPlacesCategory->addSeparator();
-		for (int category = LLParcel::C_LINDEN; category < LLParcel::C_COUNT; category++)
-		{
-			LLParcel::ECategory eCategory = (LLParcel::ECategory)category;
-			mPlacesCategory->add(LLTrans::getString(LLParcel::getCategoryUIString(eCategory)), LLParcel::getCategoryString(eCategory));
-		}
-	}
-	childSetAction("places_next", boost::bind(&FSPanelSearchPlaces::onBtnNext, this));
-	childSetAction("places_back", boost::bind(&FSPanelSearchPlaces::onBtnBack, this));
-	getChildView("places_next")->setEnabled(FALSE);
-	getChildView("places_back")->setEnabled(FALSE);
-
-	return TRUE;
-}
-
-void FSPanelSearchPlaces::focusDefaultElement()
-{
-	mSearchComboBox->focusTextEntry();
-}
-
-void FSPanelSearchPlaces::find()
-{
-	std::string text = filterShortWords(mSearchComboBox->getSimple());
-	if (text.empty())
-	{
-		mSearchResults->setCommentText(LLTrans::getString("search_short"));
-		return;
-	}
-
-	static LLUICachedControl<bool> inc_pg("ShowPGSims", 1);
-	static LLUICachedControl<bool> inc_mature("ShowMatureSims", 0);
-	static LLUICachedControl<bool> inc_adult("ShowAdultSims", 0);
-	if (!(inc_pg || inc_mature || inc_adult))
-	{
-		LLNotificationsUtil::add("NoContentToSearch");
-		return;
-	}
-	S8 category;
-	std::string category_string = mPlacesCategory->getSelectedValue();
-	if (category_string == "any")
-	{
-		category = LLParcel::C_ANY;
-	}
-	else
-	{
-		category = LLParcel::getCategoryFromString(category_string);
-	}
-	U32 scope = 0;
-	if (gAgent.wantsPGOnly())
-	{
-		scope |= DFQ_PG_SIMS_ONLY;
-	}
-	bool adult_enabled = gAgent.canAccessAdult();
-	bool mature_enabled = gAgent.canAccessMature();
-	if (inc_pg)
-	{
-		scope |= DFQ_INC_PG;
-	}
-	if (inc_mature && mature_enabled)
-	{
-		scope |= DFQ_INC_MATURE;
-	}
-	if (inc_adult && adult_enabled)
-	{
-		scope |= DFQ_INC_ADULT;
-	}
-	scope |= DFQ_DWELL_SORT;
-
-	mResultsReceived = 0;
-	if (mQueryID.notNull())
-	{
-		mQueryID.setNull();
-	}
-	mQueryID.generate();
-
-	if (mStartSearch < 0)
-	{
-		mStartSearch = 0;
-	}
-
-	gMessageSystem->newMessage("DirPlacesQuery");
-	gMessageSystem->nextBlock("AgentData");
-	gMessageSystem->addUUID("AgentID", gAgentID);
-	gMessageSystem->addUUID("SessionID", gAgentSessionID);
-	gMessageSystem->nextBlock("QueryData");
-	gMessageSystem->addUUID("QueryID", getQueryID());
-	gMessageSystem->addString("QueryText", text);
-	gMessageSystem->addU32("QueryFlags", scope);
-	gMessageSystem->addS8("Category", category);
-	// TODO: Search filter by region name.
-	gMessageSystem->addString("SimName", "");
-	gMessageSystem->addS32("QueryStart", mStartSearch);
-	gAgent.sendReliableMessage();
-	LL_DEBUGS("Search") << "Firing off places search request: " << getQueryID() << LL_ENDL;
-
-	mSearchResults->deleteAllItems();
-	mSearchResults->setCommentText(LLTrans::getString("searching"));
-	mNumResultsReturned = 0;
-}
-
-void FSPanelSearchPlaces::onBtnFind()
-{
-	std::string text = mSearchComboBox->getSimple();
-	if (!text.empty())
-	{
-		LLSearchHistory::getInstance()->addEntry(text);
-	}
-
-	resetSearch();
-
-	find();
-}
-
-void FSPanelSearchPlaces::onBtnNext()
-{
-	mStartSearch += RESULT_PAGE_SIZE;
-	getChildView("places_back")->setEnabled(TRUE);
-
-	find();
-}
-
-void FSPanelSearchPlaces::onBtnBack()
-{
-	mStartSearch -= RESULT_PAGE_SIZE;
-	getChildView("places_back")->setEnabled(mStartSearch > 0);
-
-	find();
-}
-
-void FSPanelSearchPlaces::resetSearch()
-{
-	mStartSearch = 0;
-	getChildView("places_back")->setEnabled(FALSE);
-	getChildView("places_next")->setEnabled(FALSE);
-}
-
-S32 FSPanelSearchPlaces::showNextButton(S32 rows)
-{
-	bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE);
-	getChildView("places_next")->setEnabled(show_next_button);
-	if (show_next_button)
-	{
-		rows -= (mResultsReceived - RESULT_PAGE_SIZE);
-	}
-	return rows;
-}
-
-void FSPanelSearchPlaces::onSelectItem()
-{
-	if (!mSearchResults)
-	{
-		return;
-	}
-	FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search");
-	if (search_instance)
-	{
-		search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_PLACE);
-	}
-}
-
-// static
-void FSPanelSearchPlaces::processSearchReply(LLMessageSystem* msg, void**)
-{
-	LLUUID		agent_id;
-	LLUUID		query_id;
-	LLUUID		parcel_id;
-	std::string	name;
-	BOOL		for_sale;
-	BOOL		auction;
-	F32			dwell;
-
-	msg->getUUID("AgentData", "AgentID", agent_id);
-	msg->getUUID("QueryData", "QueryID", query_id);
-
-	// Not for us
-	if (agent_id != gAgentID)
-	{
-		return;
-	}
-	LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL;
-
-	FSPanelSearchPlaces* self = FSFloaterSearch::getSearchPanel<FSPanelSearchPlaces>("panel_ls_places");
-
-	// floater is closed or these are not results from our last request
-	if (!self || query_id != self->getQueryID())
-	{
-		return;
-	}
-
-	LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_places");
-
-	// Clear "Searching" label on first results
-	if (self->mNumResultsReturned++ == 0)
-	{
-		search_results->deleteAllItems();
-	}
-
-	// Check for status messages
-	if (msg->getNumberOfBlocks("StatusData"))
-	{
-		U32 status;
-		msg->getU32("StatusData", "Status", status);
-		if (status & STATUS_SEARCH_PLACES_FOUNDNONE)
-		{
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = self->getChild<LLUICtrl>("places_edit")->getValue().asString();
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("not_found", map));
-			return;
-		}
-		else if(status & STATUS_SEARCH_PLACES_SHORTSTRING)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_short"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_PLACES_BANNEDWORD)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_banned"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_disabled"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_PLACES_ESTATEEMPTY)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_disabled"));
-			return;
-		}
-	}
-
-	bool found_one = false;
-	S32 num_new_rows = msg->getNumberOfBlocks("QueryReplies");
-	if (num_new_rows == 0 && self->mResultsReceived == 0)
-	{
-		LLStringUtil::format_map_t map;
-		map["[TEXT]"] = self->getChild<LLUICtrl>("places_edit")->getValue().asString();
-		search_results->setEnabled(FALSE);
-		search_results->setCommentText(LLTrans::getString("not_found", map));
-	}
-
-	self->mResultsReceived += num_new_rows;
-	num_new_rows = self->showNextButton(num_new_rows);
-
-	for (S32 i = 0; i < num_new_rows; i++)
-	{
-		msg->getUUID(	"QueryReplies",	"ParcelID",	parcel_id,	i);
-		msg->getString(	"QueryReplies",	"Name",		name,		i);
-		msg->getBOOL(	"QueryReplies",	"ForSale",	for_sale,i);
-		msg->getBOOL(	"QueryReplies",	"Auction",	auction,	i);
-		msg->getF32(	"QueryReplies",	"Dwell",	dwell,		i);
-		if (parcel_id.isNull())
-		{
-			LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL;
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = self->getChild<LLUICtrl>("places_edit")->getValue().asString();
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("not_found", map));
-		}
-		else
-		{
-			LL_DEBUGS("Search") << "Got: " << name << " ParcelID: " << parcel_id << LL_ENDL;
-			search_results->setEnabled(TRUE);
-			found_one = true;
-
-			LLSD content;
-			LLSD element;
-
-			element["id"] = parcel_id;
-
-			if (auction)
-			{
-				element["columns"][0]["column"]	= "icon";
-				element["columns"][0]["type"]	= "icon";
-				element["columns"][0]["value"]	= "Icon_Auction";
-			}
-			else if (for_sale)
-			{
-				element["columns"][0]["column"]	= "icon";
-				element["columns"][0]["type"]	= "icon";
-				element["columns"][0]["value"]	= "Icon_For_Sale";
-			}
-			else
-			{
-				element["columns"][0]["column"]	= "icon";
-				element["columns"][0]["type"]	= "icon";
-				element["columns"][0]["value"]	= "Icon_Place";
-			}
-
-			element["columns"][1]["column"]	= "place_name";
-			element["columns"][1]["value"]	= name;
-
-			content["name"] = name;
-
-			std::string buffer = llformat("%.0f", (F64)dwell);
-			element["columns"][2]["column"]	= "dwell";
-			element["columns"][2]["value"]	= buffer;
-
-			search_results->addElement(element, ADD_BOTTOM);
-			self->mResultsContent[parcel_id.asString()] = content;
-		}
-	}
-	if (found_one)
-	{
-		search_results->selectFirstItem();
-		search_results->setFocus(TRUE);
-		self->onSelectItem();
-	}
-}
-
-////////////////////////////////////////
-//          Land Search Panel         //
-////////////////////////////////////////
-
-static LLPanelInjector<FSPanelSearchLand> t_panel_fs_search_land("panel_ls_land");
-
-FSPanelSearchLand::FSPanelSearchLand() : FSSearchPanelBase()
-, mQueryID(nullptr)
-, mStartSearch(0)
-, mResultsReceived(0)
-, mResultsContent()
-{
-	mCommitCallbackRegistrar.add("CommitSearch", boost::bind(&FSPanelSearchLand::find, this));
-}
-
-FSPanelSearchLand::~FSPanelSearchLand()
-{
-}
-
-BOOL FSPanelSearchLand::postBuild()
-{
-	mSearchResults	= getChild<LLScrollListCtrl>("search_results_land");
-	mPriceEditor	= findChild<LLLineEditor>("price_edit");
-	mAreaEditor		= findChild<LLLineEditor>("area_edit");
-	if (mSearchResults)
-	{
-		mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchLand::onSelectItem, this));
-		mSearchResults->setEnabled(FALSE);
-		mSearchResults->setCommentText(LLTrans::getString("no_results"));
-	}
-	if (mPriceEditor)
-	{
-		mPriceEditor->setCommitOnFocusLost(false);
-		mPriceEditor->setCommitCallback(boost::bind(&FSPanelSearchLand::onBtnFind, this));
-	}
-	if (mAreaEditor)
-	{
-		mAreaEditor->setCommitOnFocusLost(false);
-		mAreaEditor->setCommitCallback(boost::bind(&FSPanelSearchLand::find, this));
-	}
-	childSetAction("land_find", boost::bind(&FSPanelSearchLand::onBtnFind, this));
-	childSetAction("land_next", boost::bind(&FSPanelSearchLand::onBtnNext, this));
-	childSetAction("land_back", boost::bind(&FSPanelSearchLand::onBtnBack, this));
-
-	getChildView("land_next")->setEnabled(FALSE);
-	getChildView("land_back")->setEnabled(FALSE);
-	
-	return TRUE;
-}
-
-void FSPanelSearchLand::find()
-{
-	static LLUICachedControl<bool> inc_pg("ShowPGLand", 1);
-	static LLUICachedControl<bool> inc_mature("ShowMatureLand", 0);
-	static LLUICachedControl<bool> inc_adult("ShowAdultLand", 0);
-	static LLUICachedControl<bool> limit_price("FindLandPrice", 1);
-	static LLUICachedControl<bool> limit_area("FindLandArea", 1);
-	if (!(inc_pg || inc_mature || inc_adult))
-	{
-		LLNotificationsUtil::add("NoContentToSearch");
-		return;
-	}
-
-	U32 category = ST_ALL;
-	const std::string& selection = findChild<LLComboBox>("land_category")->getSelectedValue().asString();
-	if (!selection.empty())
-	{
-		if (selection == "Auction")
-		{
-			category = ST_AUCTION;
-		}
-		else if (selection == "Mainland")
-		{
-			category = ST_MAINLAND;
-		}
-		else if (selection == "Estate")
-		{
-			category = ST_ESTATE;
-		}
-	}
-
-	U32 scope = 0;
-	if (gAgent.wantsPGOnly())
-	{
-		scope |= DFQ_PG_SIMS_ONLY;
-	}
-	bool mature_enabled = gAgent.canAccessMature();
-	bool adult_enabled = gAgent.canAccessAdult();
-	if (inc_pg)
-	{
-		scope |= DFQ_INC_PG;
-	}
-	if (inc_mature && mature_enabled)
-	{
-		scope |= DFQ_INC_MATURE;
-	}
-	if (inc_adult && adult_enabled)
-	{
-		scope |= DFQ_INC_ADULT;
-	}
-	const std::string& sort = findChild<LLComboBox>("land_sort_combo")->getSelectedValue().asString();
-	if (!sort.empty())
-	{
-		if (sort == "Name")
-		{
-			scope |= DFQ_NAME_SORT;
-		}
-		else if (sort == "Price")
-		{
-			scope |= DFQ_PRICE_SORT;
-		}
-		else if (sort == "PPM")
-		{
-			scope |= DFQ_PER_METER_SORT;
-		}
-		else if (sort == "Area")
-		{
-			scope |= DFQ_AREA_SORT;
-		}
-	}
-	else
-	{
-		scope |= DFQ_PRICE_SORT;
-	}
-	if (childGetValue("ascending_check").asBoolean())
-	{
-		scope |= DFQ_SORT_ASC;
-	}
-	if (limit_price)
-	{
-		scope |= DFQ_LIMIT_BY_PRICE;
-	}
-	if (limit_area)
-	{
-		scope |= DFQ_LIMIT_BY_AREA;
-	}
-	S32 price = childGetValue("edit_price").asInteger();
-	S32 area = childGetValue("edit_area").asInteger();
-
-	mResultsReceived = 0;
-	if (mQueryID.notNull())
-	{
-		mQueryID.setNull();
-	}
-	mQueryID.generate();
-
-	if (mStartSearch < 0)
-	{
-		mStartSearch = 0;
-	}
-
-	gMessageSystem->newMessage("DirLandQuery");
-	gMessageSystem->nextBlock("AgentData");
-	gMessageSystem->addUUID("AgentID", gAgentID);
-	gMessageSystem->addUUID("SessionID", gAgentSessionID);
-	gMessageSystem->nextBlock("QueryData");
-	gMessageSystem->addUUID("QueryID", getQueryID());
-	gMessageSystem->addU32("QueryFlags", scope);
-	gMessageSystem->addU32("SearchType", category);
-	gMessageSystem->addS32("Price", price);
-	gMessageSystem->addS32("Area", area);
-	gMessageSystem->addS32("QueryStart", mStartSearch);
-	gAgent.sendReliableMessage();
-	LL_DEBUGS("Search") << "Firing off places search request: " << getQueryID() << category << LL_ENDL;
-
-	mSearchResults->deleteAllItems();
-	mSearchResults->setCommentText(LLTrans::getString("searching"));
-	mNumResultsReturned = 0;
-}
-
-void FSPanelSearchLand::onBtnFind()
-{
-	resetSearch();
-
-	find();
-}
-
-void FSPanelSearchLand::onBtnNext()
-{
-	mStartSearch += RESULT_PAGE_SIZE;
-	getChildView("land_back")->setEnabled(TRUE);
-
-	find();
-}
-
-void FSPanelSearchLand::onBtnBack()
-{
-	mStartSearch -= RESULT_PAGE_SIZE;
-	getChildView("land_back")->setEnabled(mStartSearch > 0);
-
-	find();
-}
-
-void FSPanelSearchLand::resetSearch()
-{
-	mStartSearch = 0;
-	getChildView("land_back")->setEnabled(FALSE);
-	getChildView("land_next")->setEnabled(FALSE);
-}
-
-S32 FSPanelSearchLand::showNextButton(S32 rows)
-{
-	bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE);
-	getChildView("land_next")->setEnabled(show_next_button);
-	if (show_next_button)
-	{
-		rows -= (mResultsReceived - RESULT_PAGE_SIZE);
-	}
-	return rows;
-}
-
-void FSPanelSearchLand::onSelectItem()
-{
-	if (!mSearchResults)
-	{
-		return;
-	}
-	FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search");
-	if (search_instance)
-	{
-		search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_PLACE);
-	}
-}
-
-// static
-void FSPanelSearchLand::processSearchReply(LLMessageSystem* msg, void**)
-{
-	LLUUID		agent_id;
-	LLUUID		query_id;
-	LLUUID		parcel_id;
-	std::string	name;
-	std::string	land_sku;
-	std::string	land_type;
-	BOOL		auction;
-	BOOL		for_sale;
-	S32			price;
-	S32			area;
-
-	msg->getUUID("AgentData", "AgentID", agent_id);
-	msg->getUUID("QueryData", "QueryID", query_id);
-
-	// Not for us
-	if (agent_id != gAgentID)
-	{
-		return;
-	}
-	LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL;
-
-	FSPanelSearchLand* self = FSFloaterSearch::getSearchPanel<FSPanelSearchLand>("panel_ls_land");
-
-	// floater is closed or these are not results from our last request
-	if (!self || query_id != self->mQueryID)
-	{
-		return;
-	}
-
-	LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_land");
-	// clear "Searching" label on first results
-	if (self->mNumResultsReturned++ == 0)
-	{
-		search_results->deleteAllItems();
-	}
-
-	static LLUICachedControl<bool> use_price("FindLandPrice", 1);
-	static LLUICachedControl<bool> use_area("FindLandArea", 1);
-	S32 limit_price = self->childGetValue("edit_price").asInteger();
-	S32 limit_area = self->childGetValue("edit_area").asInteger();
-
-	bool found_one = false;
-	S32 num_new_rows = msg->getNumberOfBlocks("QueryReplies");
-	if (num_new_rows == 0 && self->mResultsReceived == 0)
-	{
-		LLStringUtil::format_map_t map;
-		map["[TEXT]"] = self->getChild<LLUICtrl>("events_edit")->getValue().asString();
-		search_results->setEnabled(FALSE);
-		search_results->setCommentText(LLTrans::getString("not_found", map));
-	}
-	self->mResultsReceived += num_new_rows;
-
-	S32 not_auction = 0;
-	for (S32 i = 0; i < num_new_rows; i++)
-	{
-		msg->getUUID(	"QueryReplies", "ParcelID",		parcel_id,	i);
-		msg->getString(	"QueryReplies", "Name",			name,		i);
-		msg->getBOOL(	"QueryReplies", "Auction",		auction,	i);
-		msg->getBOOL(	"QueryReplies", "ForSale",		for_sale,	i);
-		msg->getS32(	"QueryReplies", "SalePrice",	price,		i);
-		msg->getS32(	"QueryReplies", "ActualArea",	area,		i);
-		if (parcel_id.isNull())
-		{
-			LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL;
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("no_results"));
-		}
-		else
-		{
-			LL_DEBUGS("Search") << "Got: " << name << " ClassifiedID: " << parcel_id << LL_ENDL;
-			search_results->setEnabled(TRUE);
-			found_one = true;
-			if (msg->getSizeFast(_PREHASH_QueryReplies, i, _PREHASH_ProductSKU) > 0)
-			{
-				msg->getStringFast(	_PREHASH_QueryReplies, _PREHASH_ProductSKU, land_sku, i);
-				land_type = LLProductInfoRequestManager::instance().getDescriptionForSku(land_sku);
-			}
-			else
-			{
-				land_sku.clear();
-				land_type = LLTrans::getString("land_type_unknown");
-			}
-			if (parcel_id.isNull())
-			{
-				continue;
-			}
-			if (use_price && (price > limit_price))
-			{
-				continue;
-			}
-			if (use_area && (area < limit_area))
-			{
-				continue;
-			}
-
-			LLSD content;
-			LLSD element;
-
-			element["id"] = parcel_id;
-			if (auction)
-			{
-				element["columns"][0]["column"]	= "icon";
-				element["columns"][0]["type"]	= "icon";
-				element["columns"][0]["value"]	= "Icon_Auction";
-			}
-			else if (for_sale)
-			{
-				element["columns"][0]["column"]	= "icon";
-				element["columns"][0]["type"]	= "icon";
-				element["columns"][0]["value"]	= "Icon_For_Sale";
-			}
-			else
-			{
-				element["columns"][0]["column"]	= "icon";
-				element["columns"][0]["type"]	= "icon";
-				element["columns"][0]["value"]	= "Icon_Place";
-			}
-
-			element["columns"][1]["column"]	= "land_name";
-			element["columns"][1]["value"]	= name;
-
-			content["place_name"] = name;
-
-			std::string buffer = "Auction";
-			if (!auction)
-			{
-				buffer = llformat("%d", price);
-				not_auction++;
-			}
-			element["columns"][2]["column"]	= "price";
-			element["columns"][2]["value"]	= price;
-
-			element["columns"][3]["column"]	= "area";
-			element["columns"][3]["value"]	= area;
-			if (!auction)
-			{
-				F32 ppm;
-				if (area > 0)
-				{
-					ppm = (F32)price / (F32)area;
-				}
-				else
-				{
-					ppm = 0.f;
-				}
-				std::string ppm_buffer = llformat("%.1f", ppm);
-				element["columns"][4]["column"]	= "ppm";
-				element["columns"][4]["value"] = ppm_buffer;
-			}
-			else
-			{
-				element["columns"][4]["column"]	= "ppm";
-				element["columns"][4]["value"]	= "1.0";
-			}
-
-			element["columns"][5]["column"]	= "land_type";
-			element["columns"][5]["value"]	= land_type;
-
-			search_results->addElement(element, ADD_BOTTOM);
-			self->mResultsContent[parcel_id.asString()] = content;
-		}
-		// We test against non-auction properties because they don't count towards the page limit.
-		self->showNextButton(not_auction);
-	}
-	if (found_one)
-	{
-		search_results->selectFirstItem();
-		search_results->setFocus(TRUE);
-		self->onSelectItem();
-	}
-}
-
-////////////////////////////////////////
-//      Classifieds Search Panel      //
-////////////////////////////////////////
-
-static LLPanelInjector<FSPanelSearchClassifieds> t_panel_fs_search_classifieds("panel_ls_classifieds");
-
-FSPanelSearchClassifieds::FSPanelSearchClassifieds() : FSSearchPanelBase()
-, mQueryID(nullptr)
-, mStartSearch(0)
-, mResultsReceived(0)
-, mResultsContent()
-{
-	mCommitCallbackRegistrar.add("CommitSearch", boost::bind(&FSPanelSearchClassifieds::find, this));
-}
-
-FSPanelSearchClassifieds::~FSPanelSearchClassifieds()
-{
-}
-
-BOOL FSPanelSearchClassifieds::postBuild()
-{
-	mSearchComboBox = findChild<LLSearchComboBox>("classifieds_edit");
-	mSearchResults = getChild<LLScrollListCtrl>("search_results_classifieds");
-	if (mSearchComboBox)
-	{
-		mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchClassifieds::onBtnFind, this));
-		fillSearchComboBox(mSearchComboBox);
-	}
-	if (mSearchResults)
-	{
-		mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchClassifieds::onSelectItem, this));
-		mSearchResults->setEnabled(FALSE);
-		mSearchResults->setCommentText(LLTrans::getString("no_results"));
-	}
-
-	mClassifiedsCategory = getChild<LLComboBox>("classifieds_category");
-	if (mClassifiedsCategory)
-	{
-		LLClassifiedInfo::cat_map::iterator iter;
-		mClassifiedsCategory->add(LLTrans::getString("all_categories"), LLSD(0));
-		mClassifiedsCategory->addSeparator();
-		for (iter = LLClassifiedInfo::sCategories.begin();
-			 iter != LLClassifiedInfo::sCategories.end();
-			 iter++)
-		{
-			mClassifiedsCategory->add(LLTrans::getString(iter->second), LLSD((S32)iter->first));
-		}
-	}
-	childSetAction("classifieds_next", boost::bind(&FSPanelSearchClassifieds::onBtnNext, this));
-	childSetAction("classifieds_back", boost::bind(&FSPanelSearchClassifieds::onBtnBack, this));
-
-	getChildView("classifieds_next")->setEnabled(FALSE);
-	getChildView("classifieds_back")->setEnabled(FALSE);
-	
-	return TRUE;
-}
-
-void FSPanelSearchClassifieds::focusDefaultElement()
-{
-	mSearchComboBox->focusTextEntry();
-}
-
-void FSPanelSearchClassifieds::find()
-{
-	std::string text = filterShortWords(mSearchComboBox->getSimple());
-	if (text.size() == 0)
-	{
-		mSearchResults->setCommentText(LLTrans::getString("search_short"));
-		return;
-	}
-
-	static LLUICachedControl<bool> inc_pg("ShowPGClassifieds", 1);
-	static LLUICachedControl<bool> inc_mature("ShowMatureClassifieds", 0);
-	static LLUICachedControl<bool> inc_adult("ShowAdultClassifieds", 0);
-	if (!(inc_pg || inc_mature || inc_adult))
-	{
-		LLNotificationsUtil::add("NoContentToSearch");
-		return;
-	}
-	U32 category = mClassifiedsCategory->getValue().asInteger();
-	BOOL auto_renew = FALSE;
-	U32 flags = pack_classified_flags_request(auto_renew, inc_pg, inc_mature, inc_adult);
-
-	mResultsReceived = 0;
-	if (mQueryID.notNull())
-	{
-		mQueryID.setNull();
-	}
-	mQueryID.generate();
-
-	if (mStartSearch < 0)
-	{
-		mStartSearch = 0;
-	}
-
-	gMessageSystem->newMessageFast(_PREHASH_DirClassifiedQuery);
-	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
-	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
-	gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
-	gMessageSystem->nextBlockFast(_PREHASH_QueryData);
-	gMessageSystem->addUUIDFast(_PREHASH_QueryID, getQueryID());
-	gMessageSystem->addStringFast(_PREHASH_QueryText, text);
-	gMessageSystem->addU32Fast(_PREHASH_QueryFlags, flags);
-	gMessageSystem->addU32Fast(_PREHASH_Category, category);
-	gMessageSystem->addS32Fast(_PREHASH_QueryStart, mStartSearch);
-	gAgent.sendReliableMessage();
-	LL_DEBUGS("Search") << "Firing off classified ad search request: " << getQueryID() << LL_ENDL;
-
-	mSearchResults->deleteAllItems();
-	mSearchResults->setCommentText(LLTrans::getString("searching"));
-	mNumResultsReturned = 0;
-}
-
-void FSPanelSearchClassifieds::onBtnFind()
-{
-	std::string text = mSearchComboBox->getSimple();
-	if (!text.empty())
-	{
-		LLSearchHistory::getInstance()->addEntry(text);
-	}
-
-	resetSearch();
-
-	find();
-}
-
-void FSPanelSearchClassifieds::onBtnNext()
-{
-	mStartSearch += RESULT_PAGE_SIZE;
-	getChildView("classifieds_back")->setEnabled(TRUE);
-
-	find();
-}
-
-void FSPanelSearchClassifieds::onBtnBack()
-{
-	mStartSearch -= RESULT_PAGE_SIZE;
-	getChildView("classifieds_back")->setEnabled(mStartSearch > 0);
-
-	find();
-}
-
-void FSPanelSearchClassifieds::resetSearch()
-{
-	mStartSearch = 0;
-	getChildView("classifieds_back")->setEnabled(FALSE);
-	getChildView("classifieds_next")->setEnabled(FALSE);
-}
-
-S32 FSPanelSearchClassifieds::showNextButton(S32 rows)
-{
-	bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE);
-	getChildView("classifieds_next")->setEnabled(show_next_button);
-	if (show_next_button)
-	{
-		rows -= (mResultsReceived - RESULT_PAGE_SIZE);
-	}
-	return rows;
-}
-
-void FSPanelSearchClassifieds::onSelectItem()
-{
-	if (!mSearchResults)
-	{
-		return;
-	}
-	FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search");
-	if (search_instance)
-	{
-		search_instance->FSFloaterSearch::onSelectedItem(mSearchResults->getSelectedValue(), FSFloaterSearch::SC_CLASSIFIED);
-	}
-}
-
-// static
-void FSPanelSearchClassifieds::processSearchReply(LLMessageSystem* msg, void**)
-{
-	LLUUID		agent_id;
-	LLUUID		query_id;
-	LLUUID		classified_id;
-	std::string	name;
-	U32			creation_date;
-	U32			expiration_date;
-	S32			price_for_listing;
-
-	msg->getUUID("AgentData", "AgentID", agent_id);
-	msg->getUUID("QueryData", "QueryID", query_id);
-
-	// Not for us
-	if (agent_id != gAgentID)
-	{
-		return;
-	}
-	LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL;
-
-	FSPanelSearchClassifieds* self = FSFloaterSearch::getSearchPanel<FSPanelSearchClassifieds>("panel_ls_classifieds");
-
-	if (msg->getNumberOfBlocks("StatusData"))
-	{
-		U32 status;
-		msg->getU32("StatusData", "Status", status);
-		if (status & STATUS_SEARCH_CLASSIFIEDS_BANNEDWORD)
-		{
-			LLNotificationsUtil::add("SearchWordBanned");
-		}
-	}
-
-	// floater is closed or these are not results from our last request
-	if (!self || query_id != self->mQueryID)
-	{
-		return;
-	}
-
-	LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_classifieds");
-
-	// Clear "Searching" label on first results
-	if (self->mNumResultsReturned++ == 0)
-	{
-		search_results->deleteAllItems();
-	}
-
-	// Check for status messages
-	if (msg->getNumberOfBlocks("StatusData"))
-	{
-		U32 status;
-		msg->getU32("StatusData", "Status", status);
-		if (status & STATUS_SEARCH_PLACES_FOUNDNONE)
-		{
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = self->getChild<LLUICtrl>("classifieds_edit")->getValue().asString();
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("not_found", map));
-			return;
-		}
-		else if(status & STATUS_SEARCH_PLACES_SHORTSTRING)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_short"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_CLASSIFIEDS_BANNEDWORD)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_banned"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_disabled"));
-			return;
-		}
-	}
-
-	bool found_one = false;
-	S32 num_new_rows = msg->getNumberOfBlocks("QueryReplies");
-	if (num_new_rows == 0 && self->mResultsReceived == 0)
-	{
-		LLStringUtil::format_map_t map;
-		map["[TEXT]"] = self->getChild<LLUICtrl>("classifieds_edit")->getValue().asString();
-		search_results->setEnabled(FALSE);
-		search_results->setCommentText(LLTrans::getString("not_found", map));
-	}
-	self->mResultsReceived += num_new_rows;
-	num_new_rows = self->showNextButton(num_new_rows);
-
-	for (S32 i = 0; i < num_new_rows; i++)
-	{
-		msg->getUUID(	"QueryReplies", "ClassifiedID",		classified_id,	i);
-		msg->getString(	"QueryReplies", "Name",				name,			i);
-		msg->getU32(	"QueryReplies", "CreationDate",		creation_date,	i);
-		msg->getU32(	"QueryReplies", "ExpirationDate",	expiration_date,i);
-		msg->getS32(	"QueryReplies", "PriceForListing",	price_for_listing,i);
-		if (classified_id.isNull())
-		{
-			LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL;
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = self->getChild<LLUICtrl>("classifieds_edit")->getValue().asString();
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("not_found", map));
-		}
-		else
-		{
-			LL_DEBUGS("Search") << "Got: " << name << " ClassifiedID: " << classified_id << LL_ENDL;
-			search_results->setEnabled(TRUE);
-			found_one = true;
-
-			LLSD content;
-			LLSD element;
-
-			element["id"] = classified_id;
-
-			element["columns"][0]["column"]	= "icon";
-			element["columns"][0]["type"]	= "icon";
-			element["columns"][0]["value"]	= "icon_top_pick.tga";
-
-			element["columns"][1]["column"]	= "classified_name";
-			element["columns"][1]["value"]	= name;
-
-			element["columns"][2]["column"]	= "price";
-			element["columns"][2]["value"]	= price_for_listing;
-
-			content["name"] = name;
-
-			search_results->addElement(element, ADD_BOTTOM);
-			self->mResultsContent[classified_id.asString()] = content;
-		}
-	}
-	if (found_one)
-	{
-		search_results->selectFirstItem();
-		search_results->setFocus(TRUE);
-		self->onSelectItem();
-	}
-}
-
-////////////////////////////////////////
-//        Events Search Panel         //
-////////////////////////////////////////
-
-static LLPanelInjector<FSPanelSearchEvents> t_panel_fs_search_events("panel_ls_events");
-
-FSPanelSearchEvents::FSPanelSearchEvents() : FSSearchPanelBase()
-, mQueryID(nullptr)
-, mResultsReceived(0)
-, mStartSearch(0)
-, mDay(0)
-, mResultsContent()
-{
-	mCommitCallbackRegistrar.add("CommitSearch", boost::bind(&FSPanelSearchEvents::find, this));
-}
-
-FSPanelSearchEvents::~FSPanelSearchEvents()
-{
-}
-
-BOOL FSPanelSearchEvents::postBuild()
-{
-	mSearchComboBox = findChild<LLSearchComboBox>("events_edit");
-	mSearchResults = getChild<LLScrollListCtrl>("search_results_events");
-	mEventsMode = findChild<LLRadioGroup>("events_search_mode");
-	if (mSearchComboBox)
-	{
-		mSearchComboBox->setCommitCallback(boost::bind(&FSPanelSearchEvents::onBtnFind, this));
-		fillSearchComboBox(mSearchComboBox);
-	}
-	if (mSearchResults)
-	{
-		mSearchResults->setCommitCallback(boost::bind(&FSPanelSearchEvents::onSelectItem, this));
-		mSearchResults->setEnabled(FALSE);
-		mSearchResults->setCommentText(LLTrans::getString("no_results"));
-	}
-	if (mEventsMode)
-	{
-		mEventsMode->setCommitCallback(boost::bind(&FSPanelSearchEvents::onSearchModeChanged, this));
-		mEventsMode->selectFirstItem();
-	}
-
-	childSetAction("events_next", boost::bind(&FSPanelSearchEvents::onBtnNext, this));
-	childSetAction("events_back", boost::bind(&FSPanelSearchEvents::onBtnBack, this));
-	childSetAction("events_tomorrow", boost::bind(&FSPanelSearchEvents::onBtnTomorrow, this));
-	childSetAction("events_yesterday", boost::bind(&FSPanelSearchEvents::onBtnYesterday, this));
-	childSetAction("events_today", boost::bind(&FSPanelSearchEvents::onBtnToday, this));
-
-	getChildView("events_next")->setEnabled(FALSE);
-	getChildView("events_back")->setEnabled(FALSE);
-	getChildView("events_tomorrow")->setEnabled(FALSE);
-	getChildView("events_yesterday")->setEnabled(FALSE);
-	getChildView("events_today")->setEnabled(FALSE);
-	setDay(0);
-
-	return TRUE;
-}
-
-void FSPanelSearchEvents::focusDefaultElement()
-{
-	mSearchComboBox->focusTextEntry();
-}
-
-void FSPanelSearchEvents::find()
-{
-	std::string text = filterShortWords(mSearchComboBox->getSimple());
-
-	static LLUICachedControl<bool> inc_pg("ShowPGEvents", 1);
-	static LLUICachedControl<bool> inc_mature("ShowMatureEvents", 0);
-	static LLUICachedControl<bool> inc_adult("ShowAdultEvents", 0);
-	if (!(inc_pg || inc_mature || inc_adult))
-	{
-		LLNotificationsUtil::add("NoContentToSearch");
-		return;
-	}
-
-	U32 category = findChild<LLComboBox>("events_category")->getSelectedValue().asInteger();
-	U32 scope = DFQ_DATE_EVENTS;
-	if (gAgent.wantsPGOnly())
-	{
-		scope |= DFQ_PG_SIMS_ONLY;
-	}
-	bool mature_enabled = gAgent.canAccessMature();
-	bool adult_enabled = gAgent.canAccessAdult();
-	if (inc_pg)
-	{
-		scope |= DFQ_INC_PG;
-	}
-	if (inc_mature && mature_enabled)
-	{
-		scope |= DFQ_INC_MATURE;
-	}
-	if (inc_adult && adult_enabled)
-	{
-		scope |= DFQ_INC_ADULT;
-	}
-
-	std::ostringstream string;
-
-	if ("current" == childGetValue("events_search_mode").asString())
-	{
-		string << "u|";
-	}
-	else
-	{
-		string << mDay << "|";
-	}
-	string << category << "|";
-	string << text;
-
-	mResultsReceived = 0;
-	if (mQueryID.notNull())
-	{
-		mQueryID.setNull();
-	}
-	mQueryID.generate();
-
-	if (mStartSearch < 0)
-	{
-		mStartSearch = 0;
-	}
-
-	gMessageSystem->newMessage("DirFindQuery");
-	gMessageSystem->nextBlock("AgentData");
-	gMessageSystem->addUUID("AgentID", gAgentID);
-	gMessageSystem->addUUID("SessionID", gAgentSessionID);
-	gMessageSystem->nextBlock("QueryData");
-	gMessageSystem->addUUID("QueryID", getQueryID());
-	gMessageSystem->addString("QueryText", string.str());
-	gMessageSystem->addU32("QueryFlags", scope);
-	gMessageSystem->addS32("QueryStart", mStartSearch);
-	gAgent.sendReliableMessage();
-	LL_DEBUGS("Search") << "Firing off search request: " << getQueryID() << " Search Text: " << string.str() << LL_ENDL;
-
-	mSearchResults->deleteAllItems();
-	mSearchResults->setCommentText(LLTrans::getString("searching"));
-	mNumResultsReturned = 0;
-}
-
-void FSPanelSearchEvents::onBtnFind()
-{
-	std::string text = mSearchComboBox->getSimple();
-	if (!text.empty())
-	{
-		LLSearchHistory::getInstance()->addEntry(text);
-	}
-
-	resetSearch();
-
-	find();
-}
-
-void FSPanelSearchEvents::onBtnNext()
-{
-	mStartSearch += RESULT_PAGE_SIZE;
-	getChildView("events_back")->setEnabled(TRUE);
-
-	find();
-}
-
-void FSPanelSearchEvents::onBtnBack()
-{
-	mStartSearch -= RESULT_PAGE_SIZE;
-	getChildView("events_back")->setEnabled(mStartSearch > 0);
-
-	find();
-}
-
-void FSPanelSearchEvents::onBtnTomorrow()
-{
-	resetSearch();
-	setDay(mDay + 1);
-
-	find();
-}
-
-void FSPanelSearchEvents::onBtnYesterday()
-{
-	resetSearch();
-	setDay(mDay - 1);
-
-	find();
-}
-
-void FSPanelSearchEvents::onBtnToday()
-{
-	resetSearch();
-	setDay(0);
-
-	find();
-}
-
-void FSPanelSearchEvents::resetSearch()
-{
-	mStartSearch = 0;
-	getChildView("events_back")->setEnabled(FALSE);
-	getChildView("events_next")->setEnabled(FALSE);
-}
-
-void FSPanelSearchEvents::onSearchModeChanged()
-{
-	if (mEventsMode->getValue().asString() == "current")
-	{
-		getChildView("events_yesterday")->setEnabled(FALSE);
-		getChildView("events_tomorrow")->setEnabled(FALSE);
-		getChildView("events_today")->setEnabled(FALSE);
-	}
-	else
-	{
-		getChildView("events_yesterday")->setEnabled(TRUE);
-		getChildView("events_tomorrow")->setEnabled(TRUE);
-		getChildView("events_today")->setEnabled(TRUE);
-	}
-}
-
-void FSPanelSearchEvents::setDay(S32 day)
-{
-	mDay = day;
-	struct tm* internal_time;
-
-	time_t utc = time_corrected();
-	utc += day * 24 * 60 * 60;
-	internal_time = utc_to_pacific_time(utc, is_daylight_savings());
-	std::string buffer = llformat("%d/%d", 1 + internal_time->tm_mon, internal_time->tm_mday);
-	childSetValue("events_date", buffer);
-}
-
-S32 FSPanelSearchEvents::showNextButton(S32 rows)
-{
-	bool show_next_button = (mResultsReceived > RESULT_PAGE_SIZE);
-	getChildView("events_next")->setEnabled(show_next_button);
-	if (show_next_button)
-	{
-		rows -= (mResultsReceived - RESULT_PAGE_SIZE);
-	}
-	return rows;
-}
-
-void FSPanelSearchEvents::onSelectItem()
-{
-	if (!mSearchResults)
-	{
-		return;
-	}
-	S32 event_id = mSearchResults->getSelectedValue();
-	FSFloaterSearch* search_instance = LLFloaterReg::findTypedInstance<FSFloaterSearch>("search");
-	if (search_instance)
-	{
-		search_instance->FSFloaterSearch::onSelectedEvent(event_id);
-	}
-}
-
-// static
-void FSPanelSearchEvents::processSearchReply(LLMessageSystem* msg, void**)
-{
-	LLUUID		agent_id;
-	LLUUID		query_id;
-	LLUUID		owner_id;
-	std::string	name;
-	std::string	date;
-
-	msg->getUUID("AgentData", "AgentID", agent_id);
-	msg->getUUID("QueryData", "QueryID", query_id);
-
-	// Not for us
-	if (agent_id != gAgentID)
-	{
-		return;
-	}
-	LL_DEBUGS("Search") << "received directory request - QueryID: " << query_id << " AgentID: " << agent_id << LL_ENDL;
-
-	FSPanelSearchEvents* self = FSFloaterSearch::getSearchPanel<FSPanelSearchEvents>("panel_ls_events");
-
-	// floater is closed or these are not results from our last request
-	if (!self || query_id != self->mQueryID)
-	{
-		return;
-	}
-
-	LLScrollListCtrl* search_results = self->getChild<LLScrollListCtrl>("search_results_events");
-
-	// Clear "Searching" label on first results
-	if (self->mNumResultsReturned++ == 0)
-	{
-		search_results->deleteAllItems();
-	}
-	// Check for status messages
-	if (msg->getNumberOfBlocks("StatusData"))
-	{
-		U32 status;
-		msg->getU32("StatusData", "Status", status);
-		if (status & STATUS_SEARCH_EVENTS_FOUNDNONE)
-		{
-			LLStringUtil::format_map_t map;
-			map["[TEXT]"] = self->getChild<LLUICtrl>("events_edit")->getValue().asString();
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("not_found", map));
-			return;
-		}
-		else if(status & STATUS_SEARCH_EVENTS_SHORTSTRING)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_short"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_EVENTS_BANNEDWORD)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_banned"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_EVENTS_SEARCHDISABLED)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_disabled"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_EVENTS_NODATEOFFSET)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_no_date_offset"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_EVENTS_NOCATEGORY)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_no_events_category"));
-			return;
-		}
-		else if (status & STATUS_SEARCH_EVENTS_NOQUERY)
-		{
-			search_results->setEnabled(FALSE);
-			search_results->setCommentText(LLTrans::getString("search_no_query"));
-			return;
-		}
-	}
-
-	S32 num_new_rows = msg->getNumberOfBlocks("QueryReplies");
-	if (num_new_rows == 0 && self->mResultsReceived == 0)
-	{
-		LLStringUtil::format_map_t map;
-		map["[TEXT]"] = self->getChild<LLUICtrl>("events_edit")->getValue().asString();
-		search_results->setEnabled(FALSE);
-		search_results->setCommentText(LLTrans::getString("not_found", map));
-	}
-
-	self->mResultsReceived += num_new_rows;
-	num_new_rows = self->showNextButton(num_new_rows);
-	static LLUICachedControl<bool> inc_pg("ShowPGEvents", 1);
-	static LLUICachedControl<bool> inc_mature("ShowMatureEvents", 0);
-	static LLUICachedControl<bool> inc_adult("ShowAdultEvents", 0);
-	bool found_one = false;
-
-	for (S32 i = 0; i < num_new_rows; i++)
-	{
-		U32 event_id;
-		U32 unix_time;
-		U32 event_flags;
-
-		msg->getUUID(	"QueryReplies",	"OwnerID",		owner_id,	i);
-		msg->getString(	"QueryReplies",	"Name",			name,		i);
-		msg->getU32(	"QueryReplies",	"EventID",		event_id,	i);
-		msg->getString(	"QueryReplies",	"Date",			date,		i);
-		msg->getU32(	"QueryReplies",	"UnixTime",		unix_time,	i);
-		msg->getU32(	"QueryReplies",	"EventFlags",	event_flags,i);
-
-		// Skip empty events...
-		if (owner_id.isNull())
-		{
-			LL_INFOS("Search") << "Skipped " << event_id << " because of a nullptr owner result" << LL_ENDL;
-			continue;
-		}
-		// Skips events that don't match our scope...
-		if (((event_flags & (EVENT_FLAG_ADULT | EVENT_FLAG_MATURE)) == EVENT_FLAG_NONE) && !inc_pg)
-		{
-			LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL;
-			continue;
-		}
-		if ((event_flags & EVENT_FLAG_MATURE) && !inc_mature)
-		{
-			LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL;
-			continue;
-		}
-		if ((event_flags & EVENT_FLAG_ADULT) && !inc_adult)
-		{
-			LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL;
-			continue;
-		}
-		search_results->setEnabled(TRUE);
-		found_one = true;
-
-		LLSD content;
-		LLSD element;
-
-		element["id"] = llformat("%u", event_id);
-
-		if (event_flags == EVENT_FLAG_ADULT)
-		{
-			element["columns"][0]["column"] = "icon";
-			element["columns"][0]["type"] = "icon";
-			element["columns"][0]["value"] = "Icon_Legacy_Event_Adult";
-		}
-		else if (event_flags == EVENT_FLAG_MATURE)
-		{
-			element["columns"][0]["column"] = "icon";
-			element["columns"][0]["type"] = "icon";
-			element["columns"][0]["value"] = "Icon_Legacy_Event_Mature";
-		}
-		else
-		{
-			element["columns"][0]["column"] = "icon";
-			element["columns"][0]["type"] = "icon";
-			element["columns"][0]["value"] = "Icon_Legacy_Event_PG";
-		}
-		element["columns"][1]["column"] = "name";
-		element["columns"][1]["value"] = name;
-
-		element["columns"][2]["column"] = "date";
-		element["columns"][2]["value"] = date;
-
-		element["columns"][3]["column"] = "time";
-		element["columns"][3]["value"] = llformat("%u", unix_time);
-
-		content["name"] = name;
-		content["event_id"] = (S32)event_id;
-
-		search_results->addElement(element, ADD_BOTTOM);
-		std::string event = llformat("%u", event_id);
-		self->mResultsContent[event] = content;
-	}
-	if (found_one)
-	{
-		search_results->selectFirstItem();
-		search_results->setFocus(TRUE);
-		self->onSelectItem();
-	}
-}
-
-////////////////////////////////////////
-//          WebSearch Panel           //
-////////////////////////////////////////
-
-static LLPanelInjector<FSPanelSearchWeb> t_panel_fs_search_web("panel_ls_web");
-
-FSPanelSearchWeb::FSPanelSearchWeb() : FSSearchPanelBase()
-, mWebBrowser(nullptr)
-, mResetFocusOnLoad(false)
-{
-	// Second Life grids use a different URL format now
-	mCategoryPaths = LLSD::emptyMap();
-	if (LLGridManager::getInstance()->isInSecondlife())
-	{
-		// declare a map that transforms a category name into
-		// the parameter list that is used to search that category
-		mCategoryPaths["people"]       = "collection_chosen=people";
-		mCategoryPaths["places"]       = "collection_chosen=places";
-		mCategoryPaths["events"]       = "collection_chosen=events";
-		mCategoryPaths["groups"]       = "collection_chosen=groups";
-		mCategoryPaths["destinations"] = "collection_chosen=destinations";
-
-		mCategoryPaths["classifieds"]  = "search_type=classified";
-		mCategoryPaths["wiki"]         = "search/wiki";						// not sure if this is still a thing in the new search
-
-		mCategoryPaths["all"]          = mCategoryPaths["people"].asString() + "&" +
-										mCategoryPaths["places"].asString() + "&" +
-										mCategoryPaths["events"].asString() + "&" +
-										mCategoryPaths["groups"].asString() + "&" +
-										mCategoryPaths["destinations"].asString();
-	}
-	// OpenSim currently still uses the old URL format
-	else
-	{
-		// declare a map that transforms a category name into
-		// the URL suffix that is used to search that category
-		mCategoryPaths["all"]          = "search";
-		mCategoryPaths["people"]       = "search/people";
-		mCategoryPaths["places"]       = "search/places";
-		mCategoryPaths["events"]       = "search/events";
-		mCategoryPaths["groups"]       = "search/groups";
-		mCategoryPaths["wiki"]         = "search/wiki";
-		mCategoryPaths["destinations"] = "destinations";
-		mCategoryPaths["classifieds"]  = "classifieds";
-	}
-}
-
-BOOL FSPanelSearchWeb::postBuild()
-{
-	mWebBrowser = getChild<LLMediaCtrl>("search_browser");
-	return TRUE;
-}
-
-void FSPanelSearchWeb::loadURL(const SearchQuery &p)
-{
-	if (!mWebBrowser || !p.validateBlock())
-	{
-		return;
-	}
-
-	// CATEGORY is no longer used as part of the path on Second Life grids
-	LLSD subs = LLSD().with("CATEGORY", "");
-
-	// on OpenSim grids it probably is currently still being used, so keep the old behavior
-	if (!LLGridManager::getInstance()->isInSecondlife())
-	{
-		// work out the subdir to use based on the requested category
-		LLSD subs = LLSD().with("CATEGORY", (mCategoryPaths.has(p.category.getValue()) ? mCategoryPaths[p.category.getValue()].asString() : mCategoryPaths["all"].asString()));
-	}
-
-	// add the search query string
-	subs["QUERY"] = LLURI::escape(p.query);
-
-	// add the permissions token that login.cgi gave us
-	// We use "search_token", and fallback to "auth_token" if not present.
-	LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
-	if (search_token.asString().empty())
-	{
-		search_token = LLLoginInstance::getInstance()->getResponse("auth_token");
-	}
-	subs["AUTH_TOKEN"] = search_token.asString();
-
-	// add the user's preferred maturity (can be changed via prefs)
-	std::string maturity;
-
-	// on Second Life grids, the maturity level is now a "&maturity" parameter that's not in the provided search URL
-	if (LLGridManager::getInstance()->isInSecondlife())
-	{
-		if (gAgent.prefersAdult())
-		{
-			maturity = "gma";  // PG,Mature,Adult
-		}
-		else if (gAgent.prefersMature())
-		{
-			maturity = "gm";  // PG,Mature
-		}
-		else
-		{
-			maturity = "g";  // PG
-		}
-
-		// not used on the SL search anymore, so clear out the respective parameter
-		subs["MATURITY"] = "";
-	}
-	// OpenSim probably still uses the old maturity variant, so keep the old behavior here
-	else
-	{
-		if (gAgent.prefersAdult())
-		{
-			maturity = "42";  // PG,Mature,Adult
-		}
-		else if (gAgent.prefersMature())
-		{
-			maturity = "21";  // PG,Mature
-		}
-		else
-		{
-			maturity = "13";  // PG
-		}
-		subs["MATURITY"] = maturity;
-	}
-
-	// add the user's god status
-	subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
-
-	// Get the search URL and expand all of the substitutions
-	// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
-
-	// add the maturity and category variables to the new Second Life search URL
-	std::string url = gAgent.getRegion() != nullptr ? gAgent.getRegion()->getSearchServerURL()
-		: gSavedSettings.getString(LLGridManager::getInstance()->isInOpenSim() ? "OpenSimSearchURL" : "SearchURL");
-	if (LLGridManager::getInstance()->isInSecondlife())
-	{
-		url.append("&maturity=" + maturity + "&" + mCategoryPaths[p.category.getValue()].asString());
-	}
-
-	url = LLWeb::expandURLSubstitutions(url, subs);
-
-	// Finally, load the URL in the webpanel
-	mWebBrowser->navigateTo(url, HTTP_CONTENT_TEXT_HTML);
-}
-
-void FSPanelSearchWeb::focusDefaultElement()
-{
-	mWebBrowser->setFocus(TRUE);
-}
-
-void FSPanelSearchWeb::draw()
-{
-	if (mResetFocusOnLoad)
-	{
-		focusDefaultElement();
-		mResetFocusOnLoad = false;
-	}
-
-	FSSearchPanelBase::draw();
-}
-
-////////////////////////////////////////
-//           Local functions          //
-////////////////////////////////////////
-
-std::string filterShortWords(std::string query_string)
-{
-	if (query_string.length() < 1)
-	{
-		return "";
-	}
-
-	std::string final_query;
-	bool filtered = false;
-	boost::char_separator<char> sep(" ");
-	boost::tokenizer<boost::char_separator<char> > tokens(query_string, sep);
-	boost::tokenizer<boost::char_separator<char> >::iterator iter = tokens.begin();
-	boost::tokenizer<boost::char_separator<char> >::iterator last = tokens.end();
-	boost::tokenizer<boost::char_separator<char> >::iterator temp;
-	for (; iter != last; ++iter)
-	{
-		if ((*iter).length() > MIN_SEARCH_STRING_SIZE)
-		{
-			final_query.append((*iter));
-			temp = iter; ++temp;
-			if (temp != last)
-			{
-				final_query.append(" ");
-			}
-		}
-		else
-		{
-			filtered = true;
-		}
-	}
-
-	if (filtered)
-	{
-		LLSD args = LLSD().with("FINALQUERY", final_query);
-		LLNotificationsUtil::add("SeachFilteredOnShortWords", args);
-	}
-	
-	return final_query;
-}
-
-void fillSearchComboBox(LLSearchComboBox* search_combo)
-{
-	if (search_combo == nullptr)
-	{
-		return;
-	}
-
-	LLSearchHistory::getInstance()->load();
-
-	LLSearchHistory::search_history_list_t search_list =
-	LLSearchHistory::getInstance()->getSearchHistoryList();
-	LLSearchHistory::search_history_list_t::const_iterator it = search_list.begin();
-	for ( ; search_list.end() != it; ++it)
-	{
-		LLSearchHistory::LLSearchHistoryItem item = *it;
-		search_combo->add(item.search_query);
-	}
-}
diff --git a/indra/newview/fsfloatersearch.h b/indra/newview/fsfloatersearch.h
deleted file mode 100644
index 2b6a3055c890d314cfd79de95f4975b3017c1598..0000000000000000000000000000000000000000
--- a/indra/newview/fsfloatersearch.h
+++ /dev/null
@@ -1,416 +0,0 @@
-/**
- * @file fsfloatersearch.h
- * @brief Firestorm search definitions
- *
- * $LicenseInfo:firstyear=2012&license=fsviewerlgpl$
- * Phoenix Firestorm Viewer Source Code
- * Copyright (C) 2012, Cinder Roxley <cinder.roxley@phoenixviewer.com>
- *
- * 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
- *
- * The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
- * http://www.firestormviewer.org
- * $/LicenseInfo$
- */
-
-#ifndef FS_FLOATERSEARCH_H
-#define FS_FLOATERSEARCH_H
-
-#include "llfloater.h"
-#include "lliconctrl.h"
-#include "lltexteditor.h"
-#include "lltexturectrl.h"
-#include "llremoteparcelrequest.h"
-#include "llavatarpropertiesprocessor.h"
-#include "llgroupmgr.h"
-#include "llavatarnamecache.h"
-#include "llmediactrl.h"
-#include "llradiogroup.h"
-#include "llsearchcombobox.h"
-#include "llscrolllistctrl.h"
-#include "lltabcontainer.h"
-
-class FSSearchRemoteParcelInfoObserver;
-class LLAvatarPropertiesObserver;
-class LLGroupMgrObserver;
-class LLSearchEditor;
-class LLSearchComboBox;
-class FSFloaterSearch;
-class FSScrollListCtrl;
-
-struct SearchQuery : public LLInitParam::Block<SearchQuery>
-{
-	Optional<std::string> category;
-	Optional<std::string> query;
-
-	SearchQuery();
-};
-
-///////////////////////////////
-//       Search Panels       //
-///////////////////////////////
-
-class FSSearchPanelBase : public LLPanel
-{
-public:
-	FSSearchPanelBase() : LLPanel() { }
-	virtual ~FSSearchPanelBase() = default;
-	virtual void focusDefaultElement() { }
-};
-
-class FSPanelSearchPeople : public FSSearchPanelBase
-{
-	LOG_CLASS(FSFloaterSearch);
-public:
-	FSPanelSearchPeople();
-	static void processSearchReply(LLMessageSystem* msg, void**);
-
-	/*virtual*/ void focusDefaultElement();
-
-protected:
-	const S32& getNumResultsReturned() const { return mNumResultsReturned; };
-	const S32& getNumResultsReceived() const { return mResultsReceived; };
-
-private:
-	/*virtual*/ BOOL postBuild();
-	virtual ~FSPanelSearchPeople();
-	
-	void onBtnFind();
-	void onSelectItem();
-	void onBtnNext();
-	void onBtnBack();
-
-	void find();
-	void resetSearch();
-	S32  showNextButton(S32);
-
-	const LLUUID& getQueryID() const { return mQueryID; }
-
-	void onAvatarNameCallback(const LLUUID& id, const LLAvatarName& av_name);
-
-	typedef boost::signals2::connection avatar_name_callback_connection_t;
-	avatar_name_callback_connection_t mAvatarNameCallbackConnection;
-
-	S32			mNumResultsReturned;
-	S32			mStartSearch;
-	S32			mResultsReceived;
-	LLSD		mResultsContent;
-	LLUUID		mQueryID;
-
-	FSFloaterSearch*		mParent;
-	LLSearchComboBox*		mSearchComboBox;
-	LLScrollListCtrl*		mSearchResults;
-};
-
-class FSPanelSearchGroups : public FSSearchPanelBase
-{
-	LOG_CLASS(FSFloaterSearch);
-public:
-	FSPanelSearchGroups();
-	static void processSearchReply(LLMessageSystem* msg, void**);
-
-	/*virtual*/ void focusDefaultElement();
-
-private:
-	/*virtual*/ BOOL postBuild();
-	virtual ~FSPanelSearchGroups();
-
-	void onBtnFind();
-	void onSelectItem();
-	void onBtnNext();
-	void onBtnBack();
-
-	void find();
-	void resetSearch();
-	S32  showNextButton(S32);
-
-	const LLUUID& getQueryID() const { return mQueryID; }
-
-	S32			mNumResultsReturned;
-	S32			mStartSearch;
-	S32			mResultsReceived;
-	LLSD		mResultsContent;
-	LLUUID		mQueryID;
-
-	FSFloaterSearch*	mParent;
-	LLSearchComboBox*	mSearchComboBox;
-	LLScrollListCtrl*	mSearchResults;
-};
-
-class FSPanelSearchPlaces : public FSSearchPanelBase
-{
-	LOG_CLASS(FSFloaterSearch);
-public:
-	FSPanelSearchPlaces();
-	static void processSearchReply(LLMessageSystem* msg, void**);
-
-	/*virtual*/ void focusDefaultElement();
-
-private:
-	/*virtual*/ BOOL postBuild();
-	virtual ~FSPanelSearchPlaces();
-
-	void onBtnFind();
-	void onSelectItem();
-	void onBtnNext();
-	void onBtnBack();
-
-	void find();
-	void resetSearch();
-	S32  showNextButton(S32);
-
-	const LLUUID& getQueryID() const { return mQueryID; }
-	
-	S32			mNumResultsReturned;
-	S32			mStartSearch;
-	S32			mResultsReceived;
-	LLSD		mResultsContent;
-	LLUUID		mQueryID;
-
-	FSFloaterSearch*	mParent;
-	LLSearchComboBox*	mSearchComboBox;
-	LLScrollListCtrl*	mSearchResults;
-	LLComboBox*			mPlacesCategory;
-};
-
-class FSPanelSearchLand : public FSSearchPanelBase
-{
-	LOG_CLASS(FSFloaterSearch);
-public:
-	FSPanelSearchLand();
-	static void processSearchReply(LLMessageSystem* msg, void**);
-
-private:
-	/*virtual*/ BOOL postBuild();
-	virtual ~FSPanelSearchLand();
-
-	void onBtnFind();
-	void onSelectItem();
-	void onBtnNext();
-	void onBtnBack();
-
-	void find();
-	void resetSearch();
-	S32  showNextButton(S32);
-
-	const LLUUID& getQueryID() const { return mQueryID; }
-
-	S32			mNumResultsReturned;
-	S32			mStartSearch;
-	S32			mResultsReceived;
-	LLSD		mResultsContent;
-	LLUUID		mQueryID;
-
-	FSFloaterSearch*	mParent;
-	LLLineEditor*		mPriceEditor;
-	LLLineEditor*		mAreaEditor;
-	LLScrollListCtrl*	mSearchResults;
-};
-
-class FSPanelSearchClassifieds : public FSSearchPanelBase
-{
-	LOG_CLASS(FSFloaterSearch);
-public:
-	FSPanelSearchClassifieds();
-	static void processSearchReply(LLMessageSystem* msg, void**);
-	
-	/*virtual*/ void focusDefaultElement();
-
-private:
-	/*virtual*/ BOOL postBuild();
-	virtual ~FSPanelSearchClassifieds();
-
-	void onBtnFind();
-	void onSelectItem();
-	void onBtnNext();
-	void onBtnBack();
-
-	void find();
-	void resetSearch();
-	S32  showNextButton(S32);
-
-	const LLUUID& getQueryID() const { return mQueryID; }
-	
-	S32			mNumResultsReturned;
-	S32			mStartSearch;
-	S32			mResultsReceived;
-	LLSD		mResultsContent;
-	LLUUID		mQueryID;
-
-	FSFloaterSearch*	mParent;
-	LLSearchComboBox*	mSearchComboBox;
-	LLScrollListCtrl*	mSearchResults;
-	LLComboBox*			mClassifiedsCategory;
-};
-
-class FSPanelSearchEvents : public FSSearchPanelBase
-{
-	LOG_CLASS(FSFloaterSearch);
-public:
-	FSPanelSearchEvents();
-	static void processSearchReply(LLMessageSystem* msg, void**);
-
-	/*virtual*/ void focusDefaultElement();
-
-private:
-	/*virtual*/ BOOL postBuild();
-	virtual ~FSPanelSearchEvents();
-
-	void onBtnFind();
-	void onSelectItem();
-	void onBtnNext();
-	void onBtnBack();
-	void onBtnTomorrow();
-	void onBtnYesterday();
-	void onBtnToday();
-	
-	void find();
-	void setDay(S32 day);
-	void onSearchModeChanged();
-	void resetSearch();
-	S32  showNextButton(S32);
-
-	const LLUUID& getQueryID() const { return mQueryID; }
-
-	S32			mNumResultsReturned;
-	S32			mResultsReceived;
-	S32			mStartSearch;
-	S32			mDay;
-	LLSD		mResultsContent;
-	LLUUID		mQueryID;
-
-	FSFloaterSearch*	mParent;
-	LLSearchComboBox*	mSearchComboBox;
-	LLScrollListCtrl*	mSearchResults;
-	LLRadioGroup*		mEventsMode;
-};
-
-class FSPanelSearchWeb : public FSSearchPanelBase
-{
-	LOG_CLASS(FSFloaterSearch);
-public:
-	FSPanelSearchWeb();
-	/*virtual*/ BOOL postBuild();
-	void loadURL(const SearchQuery &query);
-	/*virtual*/ void focusDefaultElement();
-	/*virtual*/ void draw();
-	void resetFocusOnLoad() { mResetFocusOnLoad = true; }
-
-private:
-	virtual ~FSPanelSearchWeb() {};
-
-	LLMediaCtrl*	mWebBrowser;
-	LLSD			mCategoryPaths;
-
-	bool			mResetFocusOnLoad;
-};
-
-class FSFloaterSearch : public LLFloater
-{
-	LOG_CLASS(FSFloaterSearch);
-public:
-	typedef enum e_search_category
-	{
-		SC_AVATAR,
-		SC_GROUP,
-		SC_PLACE,
-		SC_CLASSIFIED
-	}	ESearchCategory;
-
-	struct _Params : public LLInitParam::Block<_Params, LLFloater::Params>
-	{
-		Optional<SearchQuery> search;
-	};
-
-	typedef LLSDParamAdapter<_Params> Params;
-	
-	FSFloaterSearch(const Params& key);
-	~FSFloaterSearch();
-	void onOpen(const LLSD& key);
-	BOOL postBuild();
-
-	void avatarNameUpdatedCallback(const LLUUID& id, const LLAvatarName& av_name);
-	void groupNameUpdatedCallback(const LLUUID& id, const std::string& name, bool is_group);
-	void onSelectedItem(const LLUUID& selected_item, ESearchCategory type);
-	void onSelectedEvent(const S32 selected_event);
-	void displayParcelDetails(const LLParcelData& parcel_data);
-	void displayClassifiedDetails(LLAvatarClassifiedInfo*& c_info);
-	void displayAvatarDetails(LLAvatarData*& avatar_data);
-	void displayGroupDetails(LLGroupMgrGroupData*& group_data);
-	void displayEventDetails(U32 eventId,
-							 F64 eventEpoch,
-							 const std::string& eventDateStr,
-							 const std::string &eventName,
-							 const std::string &eventDesc,
-							 const std::string &simName,
-							 U32 eventDuration,
-							 U32 eventFlags,
-							 U32 eventCover,
-							 LLVector3d eventGlobalPos);
-	void displayEventParcelImage(const LLParcelData& parcel_data);
-	void setLoadingProgress(bool started);
-
-	template <class T>
-	static T* getSearchPanel(const std::string& panel_name);
-
-private:
-	virtual void onClose(bool app_quitting);
-	const LLUUID& getSelectedID() { return mSelectedID; }
-	LLVector3d	mParcelGlobal;
-	LLUUID		mSelectedID;
-	U32			mEventID;
-	bool		mHasSelection;
-
-	void resetVerbs();
-	void flushDetails();
-	void onTabChange();
-	void onBtnPeopleProfile();
-	void onBtnPeopleIM();
-	void onBtnPeopleFriend();
-	void onBtnGroupProfile();
-	void onBtnGroupChat();
-	void onBtnGroupJoin();
-	void onBtnEventReminder();
-	void onBtnTeleport();
-	void onBtnMap();
-
-	void regionHandleCallback(U64 region_handle, LLVector3d pos_global);
-
-	FSSearchRemoteParcelInfoObserver* mRemoteParcelObserver;
-	FSSearchRemoteParcelInfoObserver* mRemoteParcelEventLocationObserver;
-	LLAvatarPropertiesObserver* mAvatarPropertiesObserver;
-	LLGroupMgrObserver* mGroupPropertiesRequest;
-
-	FSPanelSearchPeople*	mPanelPeople;
-	FSPanelSearchGroups*	mPanelGroups;
-	FSPanelSearchPlaces*	mPanelPlaces;
-	FSPanelSearchEvents*	mPanelEvents;
-	FSPanelSearchLand*		mPanelLand;
-	FSPanelSearchClassifieds* mPanelClassifieds;
-	FSPanelSearchWeb*		mPanelWeb;
-
-	LLPanel*		mDetailsPanel;
-	LLTextEditor*	mDetailTitle;
-	LLTextEditor*	mDetailDesc;
-	LLTextEditor*	mDetailAux1;
-	LLTextEditor*	mDetailAux2;
-	LLTextEditor*	mDetailLocation;
-	LLTextureCtrl*	mDetailSnapshot;
-	LLTextureCtrl*	mDetailSnapshotParcel;
-	LLIconCtrl*		mDetailMaturity;
-	LLTabContainer*	mTabContainer;
-};
-
-#endif // FS_FLOATERSEARCH_H
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 2c812bad67e498991f9daa9290255cb10541eca3..987b0a7efa4a18cff6c15a99db9174d1388d9dca 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -380,8 +380,6 @@ void LLAvatarPropertiesProcessor::processClassifiedInfoReply(LLMessageSystem* ms
 	// Request processed, no longer pending
 	self->removePendingRequest(c_info.creator_id, APT_CLASSIFIED_INFO);
 	self->notifyObservers(c_info.creator_id, &c_info, APT_CLASSIFIED_INFO);
-	self->removePendingRequest(c_info.classified_id, APT_CLASSIFIED_INFO);
-	self->notifyObservers(c_info.classified_id, &c_info, APT_CLASSIFIED_INFO);
 }
 
 
diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp
index 941f7cb7d0f136aa63d86244f941a4971739f553..1eeb9d4555d982d027d125b52a9091be6643d986 100644
--- a/indra/newview/lleventnotifier.cpp
+++ b/indra/newview/lleventnotifier.cpp
@@ -103,7 +103,7 @@ LLEventNotifier::~LLEventNotifier()
 
 	for (iter = mEventNotifications.begin();
 		 iter != mEventNotifications.end();
-		 ++iter)
+		 iter++)
 	{
 		delete iter->second;
 	}
@@ -124,7 +124,7 @@ void LLEventNotifier::update()
 		{
 			LLEventNotification *np = iter->second;
 
-			++iter;
+			iter++;
 			if (np->getEventDateEpoch() < alert_time)
 			{
 				LLSD args;
@@ -166,7 +166,8 @@ bool LLEventNotifier::handleResponse(U32 eventId, const LLSD& notification, cons
 
 bool LLEventNotifier::add(const LLEventStruct& event)
 {
-	if (mNewEventSignal(event)) return false;
+	if (mNewEventSignal(event)) { return false; }
+
 	LLEventNotification *new_enp = new LLEventNotification(event.eventId, event.eventEpoch, event.eventDateStr, event.eventName);
 	
 	LL_INFOS() << "Add event " << event.eventName << " id " << event.eventId << " date " << event.eventDateStr << LL_ENDL;
@@ -205,21 +206,21 @@ void LLEventNotifier::processEventInfoReply(LLMessageSystem *msg, void **)
 	U32 event_time_utc;
 	
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
-	msg->getU32("EventData", "EventID", event_id);
-	msg->getString("EventData", "Name", event_name);
-	msg->getString("EventData", "Date", eventd_date);
-	msg->getU32("EventData", "DateUTC", event_time_utc);
+	msg->getU32Fast(_PREHASH_EventData, _PREHASH_EventID, event_id);
+	msg->getStringFast(_PREHASH_EventData, _PREHASH_Name, event_name);
+	msg->getStringFast(_PREHASH_EventData, _PREHASH_Date, eventd_date);
+	msg->getU32Fast(_PREHASH_EventData, _PREHASH_DateUTC, event_time_utc);
 	
 	LLEventStruct event(event_id, (F64)event_time_utc, eventd_date, event_name);
-	msg->getString("EventData", "Creator", event.creator);
-	msg->getString("EventData", "Category", event.category);
-	msg->getString("EventData", "Desc", event.desc);
-	msg->getU32("EventData", "Duration", event.duration);
-	msg->getU32("EventData", "Cover", event.cover);
-	msg->getU32("EventData", "Amount", event.amount);
-	msg->getString("EventData", "SimName", event.simName);
-	msg->getVector3d("EventData", "GlobalPos", event.globalPos);
-	msg->getU32("EventData", "EventFlags", event.flags);
+    msg->getString(_PREHASH_EventData, _PREHASH_Creator, event.creator);
+	msg->getString(_PREHASH_EventData, _PREHASH_Category, event.category);
+    msg->getString(_PREHASH_EventData, _PREHASH_Desc, event.desc);
+    msg->getU32(_PREHASH_EventData, _PREHASH_Duration, event.duration);
+    msg->getU32(_PREHASH_EventData, _PREHASH_Cover, event.cover);
+    msg->getU32(_PREHASH_EventData, _PREHASH_Amount, event.amount);
+    msg->getString(_PREHASH_EventData, _PREHASH_SimName, event.simName);
+    msg->getVector3d(_PREHASH_EventData, _PREHASH_GlobalPos, event.globalPos);
+    msg->getU32(_PREHASH_EventData, _PREHASH_EventFlags, event.flags);
 	
 	gEventNotifier.add(event);
 }	
@@ -244,29 +245,22 @@ void LLEventNotifier::load(const LLSD& event_options)
             is_iso8601_date = true;
         }
 
+		std::string dateStr = response["event_date"].asString();
+
         if (is_iso8601_date)
         {
-            std::string dateStr;
-
-            dateStr = "[" + LLTrans::getString("LTimeYear") + "]-["
-                + LLTrans::getString("LTimeMthNum") + "]-["
-                + LLTrans::getString("LTimeDay") + "] ["
-                + LLTrans::getString("LTimeHour") + "]:["
-                + LLTrans::getString("LTimeMin") + "]:["
-                + LLTrans::getString("LTimeSec") + "]";
+            std::string iso8601date = 
+				"[" + LLTrans::getString("LTimeYear") + "]-[" + LLTrans::getString("LTimeMthNum") + "]-["
+                    + LLTrans::getString("LTimeDay") + "] [" + LLTrans::getString("LTimeHour") + "]:["
+                    + LLTrans::getString("LTimeMin") + "]:[" + LLTrans::getString("LTimeSec") + "]";
 
             LLSD substitution;
             substitution["datetime"] = date;
-            LLStringUtil::format(dateStr, substitution);
-
-			LLEventStruct event(response["event_id"].asInteger(), response["event_date_ut"], dateStr, response["event_name"].asString());
-            add(event);
-        }
-        else
-        {
-			LLEventStruct event(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString());
-            add(event);
+            LLStringUtil::format(iso8601date, substitution);
+            dateStr = iso8601date;
         }
+
+        add(LLEventStruct(response["event_id"].asInteger(), response["event_date_ut"], dateStr, response["event_name"].asString()));
 	}
 }
 
@@ -309,11 +303,11 @@ void LLEventNotifier::serverPushRequest(U32 event_id, bool add)
 }
 
 
-LLEventNotification::LLEventNotification(U32 eventId, F64 eventEpoch, std::string eventDateStr, std::string eventName) :
+LLEventNotification::LLEventNotification(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName) :
 	mEventID(eventId),
-	mEventName(std::move(eventName)),
+	mEventName(eventName),
 	mEventDateEpoch(eventEpoch),
-    mEventDateStr(std::move(eventDateStr))
+    mEventDateStr(eventDateStr)
 {
 	
 }
diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h
index 03c6785838bfcbac78dd513d694fa0578b2455f7..5587f57b0c6f1190459c3e5cb99494476f58ee8b 100644
--- a/indra/newview/lleventnotifier.h
+++ b/indra/newview/lleventnotifier.h
@@ -27,7 +27,6 @@
 #ifndef LL_LLEVENTNOTIFIER_H
 #define LL_LLEVENTNOTIFIER_H
 
-#include <utility>
 #include "llframetimer.h"
 #include "v3dmath.h"
 
@@ -48,9 +47,9 @@ typedef struct event_st{
 	std::string simName;
 	LLVector3d globalPos;
 	U32 flags = 0;
-	event_st(U32 id, F64 epoch, std::string date_str, std::string name)
-		: eventId(id), eventEpoch(epoch), eventDateStr(std::move(date_str)), eventName(std::move(name)){}
-	event_st() = default;
+	event_st(U32 id, F64 epoch, const std::string& date_str, const std::string& name)
+		: eventId(id), eventEpoch(epoch), eventDateStr(date_str), eventName(name){}
+	event_st(){}
 } LLEventStruct;
 
 class LLEventNotifier
@@ -91,12 +90,12 @@ class LLEventNotifier
 class LLEventNotification
 {
 public:
-	LLEventNotification(U32 eventId, F64 eventEpoch, std::string eventDateStr, std::string eventName);
+	LLEventNotification(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName);
 
 
 	U32					getEventID() const				{ return mEventID; }
 	const std::string	&getEventName() const			{ return mEventName; }
-	bool                isValid() const                 { return mEventID > 0 && mEventDateEpoch != 0 && !mEventName.empty(); }
+	bool                isValid() const                 { return mEventID > 0 && mEventDateEpoch != 0 && mEventName.size() > 0; }
 	const F64		    &getEventDateEpoch() const		{ return mEventDateEpoch; }
 	const std::string   &getEventDateStr() const        { return mEventDateStr; }
 	
diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..23b6c664f12656d797ebcc8f7b694b8db11f90a9
--- /dev/null
+++ b/indra/newview/llfloaterdirectory.cpp
@@ -0,0 +1,1206 @@
+/*
+ * @file llfloaterdirectory.cpp
+ * @brief Legacy search facility
+ *
+ * Copyright (c) 2014, 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 "llfloaterdirectory.h"
+
+// llmessage
+#include "lleventflags.h"
+#include "llqueryflags.h"
+#include "message.h"
+
+// llui
+#include "llfloaterreg.h"
+#include "lllayoutstack.h"
+#include "llpanel.h"
+#include "llresmgr.h"
+#include "llscrolllistctrl.h"
+#include "lltabcontainer.h"
+#include "lltextbase.h"
+#include "lltrans.h"
+
+// newview
+#include "llagent.h"
+#include "llpanelsearchbase.h"
+#include "llpanelsearchweb.h"
+#include "llproductinforequest.h"
+
+SearchQuery::SearchQuery()
+:	category("category", ""), query("query")
+{}
+
+static const std::array<std::string, 6> sSearchPanels{ {"panel_search_people", "panel_search_groups", "panel_search_places", "panel_search_classifieds", "panel_search_events", "panel_search_landsales"} };
+static const std::array<std::string, 5> sDetailPanels{ {"detail_avatar", "detail_group", "detail_place", "detail_classified", "detail_event"} };
+
+LLFloaterDirectory::LLFloaterDirectory(const Params& key)
+	: LLFloater(key)
+	, mCurrentResultType(SE_UNDEFINED)
+	, mCurrentQuery()
+	, mResultStart(0)
+	, mNumResultsReceived(0)
+	, mQueryID()
+	, mTabContainer(nullptr)
+	, mDetailPeople(nullptr)
+	, mPanelWeb(nullptr)
+	, mResultList(nullptr)
+	, mResultsStatus(nullptr)
+{
+}
+
+LLFloaterDirectory::~LLFloaterDirectory()
+{
+}
+
+BOOL LLFloaterDirectory::postBuild()
+{
+	mResultList = findChild<LLScrollListCtrl>("results");
+	mResultList->setCommitCallback(boost::bind(&LLFloaterDirectory::onCommitSelection, this));
+	for (std::string panel_name: sSearchPanels)
+	{
+		LLPanelSearch* panel = static_cast<LLPanelSearch*>(findChild<LLUICtrl>(panel_name));
+		if (panel)
+			panel->setSearchFloater(this);
+	}
+	mPanelWeb = findChild<LLPanelSearchWeb>("panel_search_web");
+	mTabContainer = findChild<LLTabContainer>("search_tabs");
+	mTabContainer->setCommitCallback(boost::bind(&LLFloaterDirectory::onTabChanged, this));
+	setProgress(false);
+	mResultsStatus = findChild<LLTextBase>("results_status");
+	getChild<LLButton>("PageUp")->setCommitCallback(boost::bind(&LLFloaterDirectory::choosePage, this, _1));
+	getChild<LLButton>("PageDn")->setCommitCallback(boost::bind(&LLFloaterDirectory::choosePage, this, _1));
+	showDetailPanel(LLStringUtil::null); // hide all the panels
+	paginate();
+	return TRUE;
+}
+
+void LLFloaterDirectory::onOpen(const LLSD& key)
+{
+	Params p(key);
+	mPanelWeb->loadUrl(p.search);
+	if (key.has("query"))
+	{
+		mTabContainer->selectTabPanel(mPanelWeb);
+	}
+	onTabChanged();
+}
+
+void LLFloaterDirectory::setProgress(bool working)
+{
+	getChild<LLUICtrl>("loading")->setVisible(working);
+}
+
+void LLFloaterDirectory::setResultsComment(const std::string& message)
+{
+	mResultList->setCommentText(message);
+}
+
+void LLFloaterDirectory::onTabChanged()
+{
+	LLPanel* active_panel = mTabContainer->getCurrentPanel();
+	bool show_detail = active_panel != mPanelWeb;
+	findChild<LLLayoutStack>("results_stack")->setVisible(show_detail);
+	findChild<LLButton>("PageUp")->setVisible(show_detail);
+	findChild<LLButton>("PageDn")->setVisible(show_detail);
+	mResultsStatus->setVisible(show_detail);
+}
+
+void LLFloaterDirectory::onCommitSelection()
+{
+	switch (mCurrentResultType)
+	{
+		case SE_PEOPLE:
+		{
+			LLSD params;
+			params["avatar_id"] = mResultList->getSelectedValue().asUUID();
+			getChild<LLPanel>("detail_avatar")->onOpen(params);
+			showDetailPanel("detail_avatar");
+			break;
+		}
+		case SE_GROUPS:
+		{
+			LLSD params;
+			params["group_id"] = mResultList->getSelectedValue().asUUID();
+			getChild<LLPanel>("detail_group")->onOpen(params);
+			showDetailPanel("detail_group");
+			break;
+		}
+		case SE_LANDSALES:
+		case SE_PLACES:
+		{
+			LLSD params;
+			params["type"] = "remote_place";
+			params["id"] = mResultList->getSelectedValue().asUUID();
+			getChild<LLPanel>("detail_place")->onOpen(params);
+			showDetailPanel("detail_place");
+			break;
+		}
+		case SE_CLASSIFIEDS:
+		{
+			LLSD params;
+			params["classified_id"] = mResultList->getSelectedValue().asUUID();
+			getChild<LLPanel>("detail_classified")->onOpen(params);
+			showDetailPanel("detail_classified");
+			break;
+		}
+		case SE_EVENTS:
+		{
+			getChild<LLPanel>("detail_event")->onOpen(mResultList->getSelectedValue().asInteger());
+			showDetailPanel("detail_event");
+			break;
+		}
+		case SE_UNDEFINED:
+		default:
+			LL_WARNS("Search") << "Unhandled search mode: " << mCurrentResultType << LL_ENDL;
+			break;
+	}
+}
+
+void LLFloaterDirectory::paginate()
+{
+	if (mNumResultsReceived)
+	{
+		LLStringUtil::format_map_t args;
+		std::string total_str;
+		LLResMgr::getInstance()->getIntegerString(total_str, mResultStart + mNumResultsReceived - 1);
+		args["TOTAL"] = total_str;
+		args["VISIBLE_END"] = total_str;
+		total_str = LLStringUtil::null;
+		LLResMgr::getInstance()->getIntegerString(total_str, mResultStart + 1);
+		args["VISIBLE_BEGIN"] = total_str;
+		mResultsStatus->setText(getString((mNumResultsReceived > mCurrentQuery.results_per_page)
+										  ? "result_spillover" : "result_count",
+										  args));
+	}
+	else
+		mResultsStatus->setText(getString("no_results"));
+	childSetEnabled("PageUp", mNumResultsReceived > mCurrentQuery.results_per_page);
+	childSetEnabled("PageDn", mResultStart > 0);
+}
+
+void LLFloaterDirectory::choosePage(LLUICtrl* ctrl)
+{
+	if (ctrl->getName() == "PageUp")
+		mResultStart += mCurrentQuery.results_per_page;
+	else if (ctrl->getName() == "PageDn")
+		mResultStart -= mCurrentQuery.results_per_page;
+	else
+	{
+		LL_WARNS("Search") << "Unknown control: " << ctrl->getName() << LL_ENDL;
+		return; // Fuck you, you lose.
+	}
+	queryDirectory(mCurrentQuery, false);
+}
+
+void LLFloaterDirectory::showDetailPanel(const std::string& panel_name)
+{
+	for (const std::string& panel_itr: sDetailPanels)
+	{
+		getChild<LLPanel>(panel_itr)->setVisible(panel_itr == panel_name);
+	}
+}
+
+void LLFloaterDirectory::rebuildResultList()
+{
+	mResultList->clearColumns();
+	switch (mCurrentResultType)
+	{
+		case SE_PEOPLE:
+		{
+			LLScrollListColumn::Params icon;
+			icon.name = "icon";
+			icon.width.pixel_width = 20;
+			mResultList->addColumn(icon);
+			
+			LLScrollListColumn::Params name;
+			name.name = "name";
+			name.header.label = "Name";
+			name.width.relative_width = 1.f;
+			mResultList->addColumn(name);
+			break;
+		}
+		case SE_GROUPS:
+		{
+			LLScrollListColumn::Params icon;
+			icon.name = "icon";
+			icon.width.pixel_width = 20;
+			mResultList->addColumn(icon);
+			
+			LLScrollListColumn::Params name;
+			name.name = "name";
+			name.header.label = "Name";
+			name.width.relative_width = 0.72f;
+			mResultList->addColumn(name);
+			
+			LLScrollListColumn::Params members;
+			members.name = "members";
+			members.header.label = "Members";
+			members.width.relative_width = 0.25f;
+			mResultList->addColumn(members);
+			
+			LLScrollListColumn::Params score;
+			score.name = "score";
+			score.header.label = "Score";
+			score.width.relative_width = 0.03f;
+			mResultList->addColumn(score);
+			break;
+		}
+		case SE_PLACES:
+		{
+			LLScrollListColumn::Params icon;
+			icon.name = "icon";
+			icon.width.pixel_width = 20;
+			mResultList->addColumn(icon);
+			
+			LLScrollListColumn::Params name;
+			name.name = "name";
+			name.header.label = "Name";
+			name.width.relative_width = 0.81f;
+			mResultList->addColumn(name);
+			
+			LLScrollListColumn::Params dwell;
+			dwell.name = "dwell";
+			dwell.header.label = "Traffic";
+			dwell.width.relative_width = 0.19f;
+			mResultList->addColumn(dwell);
+			break;
+		}
+		case SE_LANDSALES:
+		{
+			LLScrollListColumn::Params icon;
+			icon.name = "icon";
+			icon.width.pixel_width = 20;
+			mResultList->addColumn(icon);
+			
+			LLScrollListColumn::Params name;
+			name.name = "name";
+			name.header.label = "Name";
+			name.width.relative_width = 0.45f;
+			mResultList->addColumn(name);
+			
+			LLScrollListColumn::Params price;
+			price.name="price";
+			price.header.label="Price";
+			price.width.relative_width = 0.1f;
+			mResultList->addColumn(price);
+			
+			LLScrollListColumn::Params area;
+			area.name="area";
+			area.header.label="Area";
+			area.width.relative_width = 0.1f;
+			mResultList->addColumn(area);
+			
+			LLScrollListColumn::Params ppm;
+			ppm.name="ppm";
+			ppm.header.label="L$/m";
+			ppm.width.relative_width = 0.1f;
+			mResultList->addColumn(ppm);
+			
+			LLScrollListColumn::Params type;
+			type.name="type";
+			type.header.label="Type";
+			type.width.relative_width = 0.2f;
+			mResultList->addColumn(type);
+			break;
+		}
+		case SE_CLASSIFIEDS:
+		{
+			LLScrollListColumn::Params icon;
+			icon.name = "icon";
+			icon.width.pixel_width = 20;
+			mResultList->addColumn(icon);
+			
+			LLScrollListColumn::Params name;
+			name.name = "name";
+			name.header.label = "Name";
+			name.width.relative_width = 0.7f;
+			mResultList->addColumn(name);
+			
+			LLScrollListColumn::Params price;
+			price.name="price";
+			price.header.label="Price";
+			price.width.relative_width = 0.3f;
+			mResultList->addColumn(price);
+			break;
+		}
+		case SE_EVENTS:
+		{
+			LLScrollListColumn::Params icon;
+			icon.name = "icon";
+			icon.width.pixel_width = 20;
+			mResultList->addColumn(icon);
+			
+			LLScrollListColumn::Params name;
+			name.name = "name";
+			name.header.label = "Name";
+			name.width.relative_width = 0.65f;
+			mResultList->addColumn(name);
+			
+			//LLScrollListColumn::Params time;
+			//time.name="time";
+			//time.header.label="Time";
+			//time.width.relative_width = 0.2f;
+			//mResultList->addColumn(time);
+			
+			LLScrollListColumn::Params date;
+			date.name="date";
+			date.header.label="Date";
+			date.width.relative_width = 0.3f;
+			mResultList->addColumn(date);
+			break;
+		}
+		case SE_UNDEFINED:
+		default:
+			LL_WARNS("Search") << "Unhandled search mode: " << mCurrentResultType << LL_ENDL;
+			break;
+			
+	}
+}
+
+void LLFloaterDirectory::queryDirectory(const LLDirQuery& query, bool new_search)
+{
+	if (mCurrentResultType != query.type)
+	{
+		mCurrentResultType = query.type;
+		rebuildResultList();
+	}
+	mResultList->clearRows();
+	
+	if (new_search)
+	{
+		mResultStart = 0;
+	}
+	
+	mCurrentQuery = query;
+	mNumResultsReceived = 0;
+	mQueryID.generate();
+	
+	switch (mCurrentResultType)
+	{
+		case SE_PEOPLE:
+		{
+			gMessageSystem->newMessageFast(_PREHASH_DirFindQuery);
+			gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+			gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			gMessageSystem->nextBlockFast(_PREHASH_QueryData);
+			gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID);
+			gMessageSystem->addStringFast(_PREHASH_QueryText, query.text);
+			gMessageSystem->addU32Fast(_PREHASH_QueryFlags, DFQ_PEOPLE);
+			gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart);
+			gAgent.sendReliableMessage();
+			LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << LL_ENDL;
+			break;
+		}
+		case SE_GROUPS:
+		{
+			gMessageSystem->newMessageFast(_PREHASH_DirFindQuery);
+			gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+			gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			gMessageSystem->nextBlockFast(_PREHASH_QueryData);
+			gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID);
+			gMessageSystem->addStringFast(_PREHASH_QueryText, query.text);
+			gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope);
+			gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart);
+			gAgent.sendReliableMessage();
+			LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << LL_ENDL;
+			break;
+		}
+		case SE_EVENTS:
+		{
+			gMessageSystem->newMessageFast(_PREHASH_DirFindQuery);
+			gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+			gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			gMessageSystem->nextBlockFast(_PREHASH_QueryData);
+			gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID);
+			gMessageSystem->addStringFast(_PREHASH_QueryText, query.text);
+			gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope);
+			gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart);
+			gAgent.sendReliableMessage();
+			LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << " Search Text: " << query.text << LL_ENDL;
+			break;
+		}
+		case SE_PLACES:
+		{
+			gMessageSystem->newMessageFast(_PREHASH_DirPlacesQuery);
+			gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+			gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			gMessageSystem->nextBlockFast(_PREHASH_QueryData);
+			gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID);
+			gMessageSystem->addStringFast(_PREHASH_QueryText, query.text);
+			gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope);
+			gMessageSystem->addS8Fast(_PREHASH_Category, query.category_char);
+			// TODO: Search filter by region name.
+			gMessageSystem->addStringFast(_PREHASH_SimName, "");
+			gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart);
+			gAgent.sendReliableMessage();
+			LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << LL_ENDL;
+			break;
+		}
+		case SE_LANDSALES:
+		{
+			gMessageSystem->newMessageFast(_PREHASH_DirLandQuery);
+			gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+			gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			gMessageSystem->nextBlockFast(_PREHASH_QueryData);
+			gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID);
+			gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope);
+			gMessageSystem->addU32Fast(_PREHASH_SearchType, query.category_int);
+			gMessageSystem->addS32Fast(_PREHASH_Price, query.price);
+			gMessageSystem->addS32Fast(_PREHASH_Area, query.area);
+			gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart);
+			gAgent.sendReliableMessage();
+			LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << query.category_int << LL_ENDL;
+			break;
+		}
+		case SE_CLASSIFIEDS:
+		{
+			gMessageSystem->newMessageFast(_PREHASH_DirClassifiedQuery);
+			gMessageSystem->nextBlockFast(_PREHASH_AgentData);
+			gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+			gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+			gMessageSystem->nextBlockFast(_PREHASH_QueryData);
+			gMessageSystem->addUUIDFast(_PREHASH_QueryID, mQueryID);
+			gMessageSystem->addStringFast(_PREHASH_QueryText, query.text);
+			gMessageSystem->addU32Fast(_PREHASH_QueryFlags, query.scope);
+			gMessageSystem->addU32Fast(_PREHASH_Category, query.category_int);
+			gMessageSystem->addS32Fast(_PREHASH_QueryStart, mResultStart);
+			gAgent.sendReliableMessage();
+			LL_DEBUGS("Search") << "Firing off search request: " << mQueryID << LL_ENDL;
+			break;
+		}
+		case SE_UNDEFINED:
+		default:
+			break;
+	}
+	mResultList->setCommentText(getString("searching"));
+	setProgress(true);
+}
+
+//static
+void LLFloaterDirectory::processSearchPeopleReply(LLMessageSystem* msg, void**)
+{
+	LLUUID query_id;
+	std::string first_name;
+	std::string last_name;
+	LLUUID agent_id;
+	LLUUID avatar_id;
+	U8 online;
+	//S32 reputation;
+	
+	msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id);
+	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+	
+	if (agent_id != gAgent.getID()) return; // not for us
+	LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL;
+	
+	// *TODO: Get rid of this so we can have multiple search windows
+	LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("search");
+	if (self == nullptr || query_id != self->mQueryID) return; // not the result we're waiting for
+	self->setProgress(false);
+
+	LLScrollListCtrl* pResults = self->mResultList;
+	
+	S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies);
+	if (num_new_rows == 0)
+	{
+		LLStringUtil::format_map_t map;
+		map["[TEXT]"] = self->mCurrentQuery.text;
+		pResults->setCommentText(self->getString("not_found", map));
+	}
+	
+	self->mNumResultsReceived += num_new_rows;
+
+	for (S32 i = 0; i < num_new_rows; ++i)
+	{
+		msg->getStringFast(	_PREHASH_QueryReplies,	_PREHASH_FirstName,	first_name, i);
+		msg->getStringFast(	_PREHASH_QueryReplies,	_PREHASH_LastName,	last_name, i);
+		msg->getUUIDFast(	_PREHASH_QueryReplies,	_PREHASH_AgentID,	agent_id, i);
+		//msg->getS32Fast(	_PREHASH_QueryReplies,	_PREHASH_Reputation, reputation, i);
+		msg->getU8Fast(		_PREHASH_QueryReplies,	_PREHASH_Online,	online, i);
+		
+		if (agent_id.isNull())
+		{
+			LL_INFOS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL;
+			LLStringUtil::format_map_t map;
+			map["[TEXT]"] = self->mCurrentQuery.text;
+			pResults->setCommentText(self->getString("not_found", map));
+		}
+		else
+		{
+			LL_DEBUGS("Search") << "Got: " << first_name << " " << last_name << " AgentID: " << agent_id << LL_ENDL;
+			pResults->setEnabled(TRUE);
+
+			std::string avatar_name = LLCacheName::buildFullName(first_name, last_name);
+			
+			LLSD element;
+			element["id"] = agent_id;
+			
+			element["columns"][0]["column"]	= "icon";
+			element["columns"][0]["type"]	= "icon";
+			element["columns"][0]["value"]	= online ? "icon_avatar_online.tga" : "icon_avatar_offline.tga";
+			
+			element["columns"][1]["column"]	= "name";
+			element["columns"][1]["value"]	= avatar_name;
+			
+			pResults->addElement(element, ADD_BOTTOM);
+		}
+	}
+	self->paginate();
+}
+
+//static
+void LLFloaterDirectory::processSearchGroupsReply(LLMessageSystem* msg, void**)
+{
+	LLUUID query_id;
+	LLUUID group_id;
+	LLUUID agent_id;
+	std::string group_name;
+	S32 members;
+	F32 search_order;
+	
+	msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id);
+	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+	
+	if (agent_id != gAgent.getID()) return; // not for us
+	LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL;
+	
+	LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("search");
+	if (self == nullptr || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->mResultList;
+	
+	// Check for status messages
+	if (msg->getNumberOfBlocks("StatusData"))
+	{
+		U32 status;
+		msg->getU32("StatusData", "Status", status);
+		if (status & STATUS_SEARCH_PLACES_FOUNDNONE)
+		{
+			LLStringUtil::format_map_t map;
+			map["[TEXT]"] = self->getChild<LLUICtrl>("groups_edit")->getValue().asString();
+			pResults->setCommentText(self->getString("not_found", map));
+			return;
+		}
+		else if(status & STATUS_SEARCH_PLACES_SHORTSTRING)
+		{
+			pResults->setCommentText(self->getString("search_short"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_PLACES_BANNEDWORD)
+		{
+			pResults->setCommentText(self->getString("search_banned"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED)
+		{
+			pResults->setCommentText(self->getString("search_disabled"));
+			return;
+		}
+	}
+	
+	S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies);
+	if (num_new_rows == 0)
+	{
+		LLStringUtil::format_map_t map;
+		map["[TEXT]"] = self->mCurrentQuery.text;
+		pResults->setCommentText(self->getString("not_found", map));
+	}
+	
+	self->mNumResultsReceived += num_new_rows;
+	for (S32 i = 0; i < num_new_rows; ++i)
+	{
+		msg->getUUIDFast(	_PREHASH_QueryReplies,	_PREHASH_GroupID,		group_id,	i);
+		msg->getStringFast(	_PREHASH_QueryReplies,	_PREHASH_GroupName,		group_name,	i);
+		msg->getS32Fast(	_PREHASH_QueryReplies,	_PREHASH_Members,		members,	i);
+		msg->getF32Fast(	_PREHASH_QueryReplies,	_PREHASH_SearchOrder,	search_order,i);
+		if (group_id.isNull())
+		{
+			LL_DEBUGS("Search") << "No results returned for QueryID: " << query_id << LL_ENDL;
+			LLStringUtil::format_map_t map;
+			map["[TEXT]"] = self->mCurrentQuery.text;
+			pResults->setCommentText(self->getString("not_found", map));
+		}
+		else
+		{
+			LL_DEBUGS("Search") << "Got: " << group_name << " GroupID: " << group_id << LL_ENDL;
+			pResults->setEnabled(TRUE);
+			
+			LLSD element;
+			
+			element["id"] = group_id;
+			
+			element["columns"][0]["column"]	= "icon";
+			element["columns"][0]["type"]	= "icon";
+			element["columns"][0]["value"]	= "Icon_Group";
+			
+			element["columns"][1]["column"]	= "name";
+			element["columns"][1]["value"]	= group_name;
+			
+			element["columns"][2]["column"]	= "members";
+			element["columns"][2]["value"]	= members;
+			
+			element["columns"][3]["column"]	= "score";
+			element["columns"][3]["value"]	= search_order;
+			
+			pResults->addElement(element, ADD_BOTTOM);
+		}
+	}
+	self->paginate();
+}
+
+//static
+void LLFloaterDirectory::processSearchPlacesReply(LLMessageSystem* msg, void**)
+{
+	LLUUID	agent_id;
+	LLUUID	query_id;
+	LLUUID	parcel_id;
+	std::string	name;
+	BOOL	for_sale;
+	BOOL	auction;
+	F32		dwell;
+	
+	msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id);
+	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+	
+	if (agent_id != gAgent.getID()) return; // not for us
+	LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL;
+	
+	LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("search");
+	if (self == nullptr || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->mResultList;
+	
+	// Check for status messages
+	if (msg->getNumberOfBlocks("StatusData"))
+	{
+		U32 status;
+		msg->getU32("StatusData", "Status", status);
+		if (status & STATUS_SEARCH_PLACES_FOUNDNONE)
+		{
+			LLStringUtil::format_map_t map;
+			map["[TEXT]"] = self->mCurrentQuery.text;
+			pResults->setCommentText(self->getString("not_found", map));
+			return;
+		}
+		else if(status & STATUS_SEARCH_PLACES_SHORTSTRING)
+		{
+			pResults->setCommentText(self->getString("search_short"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_PLACES_BANNEDWORD)
+		{
+			pResults->setCommentText(self->getString("search_banned"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED)
+		{
+			pResults->setCommentText(self->getString("search_disabled"));
+			return;
+		}
+	}
+	
+	S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies);
+	if (num_new_rows == 0)
+	{
+		LLStringUtil::format_map_t map;
+		map["[TEXT]"] = self->mCurrentQuery.text;
+				pResults->setCommentText(self->getString("not_found", map));
+	}
+	
+	self->mNumResultsReceived += num_new_rows;
+	for (S32 i = 0; i < num_new_rows; ++i)
+	{
+		msg->getUUID(	"QueryReplies",	"ParcelID",	parcel_id,	i);
+		msg->getString(	"QueryReplies",	"Name",		name,		i);
+		msg->getBOOL(	"QueryReplies",	"ForSale",	for_sale,	i);
+		msg->getBOOL(	"QueryReplies",	"Auction",	auction,	i);
+		msg->getF32(	"QueryReplies",	"Dwell",	dwell,		i);
+		if (parcel_id.isNull())
+		{
+			LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL;
+			LLStringUtil::format_map_t map;
+			map["[TEXT]"] = self->mCurrentQuery.text;
+						pResults->setCommentText(self->getString("not_found", map));
+		}
+		else
+		{
+			LL_DEBUGS("Search") << "Got: " << name << " ParcelID: " << parcel_id << LL_ENDL;
+			pResults->setEnabled(TRUE);
+			
+			LLSD element;
+			
+			element["id"] = parcel_id;
+			
+			if (auction)
+			{
+				element["columns"][0]["column"]	= "icon";
+				element["columns"][0]["type"]	= "icon";
+				element["columns"][0]["value"]	= "Icon_Auction";
+			}
+			else if (for_sale)
+			{
+				element["columns"][0]["column"]	= "icon";
+				element["columns"][0]["type"]	= "icon";
+				element["columns"][0]["value"]	= "Icon_For_Sale";
+			}
+			else
+			{
+				element["columns"][0]["column"]	= "icon";
+				element["columns"][0]["type"]	= "icon";
+				element["columns"][0]["value"]	= "Icon_Place";
+			}
+			
+			element["columns"][1]["column"]	= "name";
+			element["columns"][1]["value"]	= name;
+			
+			std::string buffer = llformat("%.0f", dwell);
+			element["columns"][2]["column"]	= "dwell";
+			element["columns"][2]["value"]	= buffer;
+			
+			pResults->addElement(element, ADD_BOTTOM);
+		}
+	}
+	self->paginate();
+}
+
+//static
+void LLFloaterDirectory::processSearchClassifiedsReply(LLMessageSystem* msg, void**)
+{
+	LLUUID	agent_id;
+	LLUUID	query_id;
+	LLUUID	classified_id;
+	std::string name;
+	U32		creation_date;
+	U32		expiration_date;
+	S32		price_for_listing;
+
+	msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id);
+	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+	
+	if (agent_id != gAgent.getID()) return; // not for us
+	LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL;
+	
+	LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("search");
+	if (self == nullptr || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->mResultList;
+	
+	// Check for status messages
+	if (msg->getNumberOfBlocks("StatusData"))
+	{
+		U32 status;
+		msg->getU32("StatusData", "Status", status);
+		if (status & STATUS_SEARCH_PLACES_FOUNDNONE)
+		{
+			LLStringUtil::format_map_t map;
+			map["[TEXT]"] = self->mCurrentQuery.text;
+			pResults->setCommentText(self->getString("not_found", map));
+			return;
+		}
+		else if(status & STATUS_SEARCH_PLACES_SHORTSTRING)
+		{
+			pResults->setCommentText(self->getString("search_short"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_PLACES_BANNEDWORD)
+		{
+			pResults->setCommentText(self->getString("search_banned"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED)
+		{
+			pResults->setCommentText(self->getString("search_disabled"));
+			return;
+		}
+	}
+	
+	S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies);
+	if (num_new_rows == 0)
+	{
+		LLStringUtil::format_map_t map;
+		map["[TEXT]"] = self->mCurrentQuery.text;
+		pResults->setCommentText(self->getString("not_found", map));
+	}
+	
+	self->mNumResultsReceived += num_new_rows;
+	for (S32 i = 0; i < num_new_rows; ++i)
+	{
+		msg->getUUID(	"QueryReplies", "ClassifiedID",		classified_id,	i);
+		msg->getString(	"QueryReplies", "Name",				name,			i);
+		msg->getU32(	"QueryReplies", "CreationDate",		creation_date,	i);
+		msg->getU32(	"QueryReplies", "ExpirationDate",	expiration_date,i);
+		msg->getS32(	"QueryReplies", "PriceForListing",	price_for_listing,i);
+		if (classified_id.isNull())
+		{
+			LL_DEBUGS("Search") << "No results returned for QueryID: " << query_id << LL_ENDL;
+			LLStringUtil::format_map_t map;
+			map["[TEXT]"] = self->mCurrentQuery.text;
+						pResults->setCommentText(self->getString("not_found", map));
+		}
+		else
+		{
+			LL_DEBUGS("Search") << "Got: " << name << " ClassifiedID: " << classified_id << LL_ENDL;
+			pResults->setEnabled(TRUE);
+			
+			LLSD element;
+			
+			element["id"] = classified_id;
+			
+			element["columns"][0]["column"]	= "icon";
+			element["columns"][0]["type"]	= "icon";
+			element["columns"][0]["value"]	= "icon_top_pick.tga";
+			
+			element["columns"][1]["column"]	= "name";
+			element["columns"][1]["value"]	= name;
+			
+			element["columns"][2]["column"]	= "price";
+			element["columns"][2]["value"]	= price_for_listing;
+			
+			pResults->addElement(element, ADD_BOTTOM);
+		}
+	}
+	self->paginate();
+}
+
+// static
+void LLFloaterDirectory::processSearchLandReply(LLMessageSystem* msg, void**)
+{
+	LLUUID	agent_id;
+	LLUUID	query_id;
+	LLUUID	parcel_id;
+	std::string	name;
+	std::string land_sku;
+	std::string land_type;
+	BOOL	auction;
+	BOOL	for_sale;
+	S32		price;
+	S32		area;
+	
+	msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id);
+	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+	
+	if (agent_id != gAgent.getID()) return; // not for us
+	LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL;
+	
+	LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("search");
+	if (self == nullptr || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->mResultList;
+	
+	// Check for status messages
+	if (msg->getNumberOfBlocks("StatusData"))
+	{
+		U32 status;
+		msg->getU32("StatusData", "Status", status);
+		if (status & STATUS_SEARCH_PLACES_FOUNDNONE)
+		{
+			LLStringUtil::format_map_t map;
+			map["[TEXT]"] = self->mCurrentQuery.text;
+			pResults->setCommentText(self->getString("not_found", map));
+			return;
+		}
+		else if(status & STATUS_SEARCH_PLACES_SHORTSTRING)
+		{
+			pResults->setCommentText(self->getString("search_short"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_PLACES_BANNEDWORD)
+		{
+			pResults->setCommentText(self->getString("search_banned"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_PLACES_SEARCHDISABLED)
+		{
+			pResults->setCommentText(self->getString("search_disabled"));
+			return;
+		}
+	}
+	
+	S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies);
+	if (num_new_rows == 0)
+	{
+		LLStringUtil::format_map_t map;
+		map["[TEXT]"] = self->mCurrentQuery.text;
+				pResults->setCommentText(self->getString("not_found", map));
+	}
+	
+	self->mNumResultsReceived += num_new_rows;
+	S32 not_auction = 0;
+	for (S32 i = 0; i < num_new_rows; ++i)
+	{
+		msg->getUUID(	"QueryReplies", "ParcelID",		parcel_id,	i);
+		msg->getString(	"QueryReplies", "Name",			name,		i);
+		msg->getBOOL(	"QueryReplies", "Auction",		auction,	i);
+		msg->getBOOL(	"QueryReplies", "ForSale",		for_sale,	i);
+		msg->getS32(	"QueryReplies", "SalePrice",	price,		i);
+		msg->getS32(	"QueryReplies", "ActualArea",	area,		i);
+		if (parcel_id.isNull())
+		{
+			LL_DEBUGS("Search") << "Null result returned for QueryID: " << query_id << LL_ENDL;
+			pResults->setCommentText(self->getString("no_results"));
+		}
+		else
+		{
+			LL_DEBUGS("Search") << "Got: " << name << " ClassifiedID: " << parcel_id << LL_ENDL;
+			pResults->setEnabled(TRUE);
+			if ( msg->getSizeFast(_PREHASH_QueryReplies, i, _PREHASH_ProductSKU) > 0 )
+			{
+				msg->getStringFast(	_PREHASH_QueryReplies, _PREHASH_ProductSKU, land_sku, i);
+				land_type = LLProductInfoRequestManager::instance().getDescriptionForSku(land_sku);
+			}
+			else
+			{
+				land_sku.clear();
+				land_type = LLTrans::getString("land_type_unknown");
+			}
+			if (parcel_id.isNull())
+				continue;
+			
+			LLSD element;
+			
+			element["id"] = parcel_id;
+			if (auction)
+			{
+				element["columns"][0]["column"]	= "icon";
+				element["columns"][0]["type"]	= "icon";
+				element["columns"][0]["value"]	= "Icon_Auction";
+			}
+			else if (for_sale)
+			{
+				element["columns"][0]["column"]	= "icon";
+				element["columns"][0]["type"]	= "icon";
+				element["columns"][0]["value"]	= "Icon_For_Sale";
+			}
+			else
+			{
+				element["columns"][0]["column"]	= "icon";
+				element["columns"][0]["type"]	= "icon";
+				element["columns"][0]["value"]	= "Icon_Place";
+			}
+			
+			element["columns"][1]["column"]	= "name";
+			element["columns"][1]["value"]	= name;
+			
+			std::string buffer = "Auction";
+			if (!auction)
+			{
+				buffer = llformat("%d", price);
+				not_auction++;
+			}
+			element["columns"][2]["column"]	= "price";
+			element["columns"][2]["value"]	= price;
+			
+			element["columns"][3]["column"]	= "area";
+			element["columns"][3]["value"]	= area;
+			if (!auction)
+			{
+				F32 ppm;
+				if (area > 0)
+					ppm = (F32)price / (F32)area;
+				else
+					ppm = 0.f;
+				std::string buffer = llformat("%.1f", ppm);
+				element["columns"][4]["column"]	= "ppm";
+				element["columns"][4]["value"]	= buffer;
+			}
+			else
+			{
+				element["columns"][4]["column"]	= "ppm";
+				element["columns"][4]["value"]	= "1.0";
+			}
+			
+			element["columns"][5]["column"]	= "type";
+			element["columns"][5]["value"]	= land_type;
+			
+			pResults->addElement(element, ADD_BOTTOM);
+		}
+	}
+	self->paginate();
+}
+
+// static
+void LLFloaterDirectory::processSearchEventsReply(LLMessageSystem* msg, void**)
+{
+	LLUUID	agent_id;
+	LLUUID	query_id;
+	LLUUID	owner_id;
+	std::string	name;
+	std::string	date;
+	
+	msg->getUUIDFast(_PREHASH_QueryData, _PREHASH_QueryID, query_id);
+	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+	
+	if (agent_id != gAgent.getID()) return; // not for us
+	LL_DEBUGS("Search") << "Received results for query id: " << query_id << LL_ENDL;
+	
+	LLFloaterDirectory* self = LLFloaterReg::findTypedInstance<LLFloaterDirectory>("search");
+	if (self == nullptr || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->mResultList;
+	
+	// Check for status messages
+	if (msg->getNumberOfBlocks("StatusData"))
+	{
+		U32 status;
+		msg->getU32("StatusData", "Status", status);
+		if (status & STATUS_SEARCH_EVENTS_FOUNDNONE)
+		{
+			LLStringUtil::format_map_t map;
+			map["[TEXT]"] = self->mCurrentQuery.text;
+			pResults->setCommentText(self->getString("not_found", map));
+			return;
+		}
+		else if(status & STATUS_SEARCH_EVENTS_SHORTSTRING)
+		{
+			pResults->setCommentText(self->getString("search_short"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_EVENTS_BANNEDWORD)
+		{
+			pResults->setCommentText(self->getString("search_banned"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_EVENTS_SEARCHDISABLED)
+		{
+			pResults->setCommentText(self->getString("search_disabled"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_EVENTS_NODATEOFFSET)
+		{
+			pResults->setCommentText(self->getString("search_no_date_offset"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_EVENTS_NOCATEGORY)
+		{
+			pResults->setCommentText(self->getString("search_no_events_category"));
+			return;
+		}
+		else if (status & STATUS_SEARCH_EVENTS_NOQUERY)
+		{
+			pResults->setCommentText(self->getString("search_no_query"));
+			return;
+		}
+	}
+	
+	S32 num_new_rows = msg->getNumberOfBlocksFast(_PREHASH_QueryReplies);
+	if (num_new_rows == 0)
+	{
+		LLStringUtil::format_map_t map;
+		map["[TEXT]"] = self->mCurrentQuery.text;
+				pResults->setCommentText(self->getString("not_found", map));
+	}
+	
+	self->mNumResultsReceived += num_new_rows;
+	for (S32 i = 0; i < num_new_rows; ++i)
+	{
+		U32 event_id;
+		//U32 unix_time;
+		U32 event_flags;
+		
+		msg->getUUID(	"QueryReplies",	"OwnerID",		owner_id,	i);
+		msg->getString(	"QueryReplies",	"Name",			name,		i);
+		msg->getU32(	"QueryReplies",	"EventID",		event_id,	i);
+		msg->getString(	"QueryReplies",	"Date",			date,		i);
+		//msg->getU32(	"QueryReplies",	"UnixTime",		unix_time,	i);
+		msg->getU32(	"QueryReplies",	"EventFlags",	event_flags,i);
+		
+		static LLUICachedControl<bool> inc_pg("ShowPGEvents", true);
+		static LLUICachedControl<bool> inc_mature("ShowMatureEvents", false);
+		static LLUICachedControl<bool> inc_adult("ShowAdultEvents", false);
+		
+		// Skip empty events...
+		if (owner_id.isNull())
+		{
+			LL_INFOS("Search") << "Skipped " << event_id << " because of a NULL owner result" << LL_ENDL;
+			continue;
+		}
+		// Skips events that don't match our scope...
+		if (((event_flags & (EVENT_FLAG_ADULT | EVENT_FLAG_MATURE)) == EVENT_FLAG_NONE) && !inc_pg)
+		{
+			LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL;
+			continue;
+		}
+		if ((event_flags & EVENT_FLAG_MATURE) && !inc_mature)
+		{
+			LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL;
+			continue;
+		}
+		if ((event_flags & EVENT_FLAG_ADULT) && !inc_adult)
+		{
+			LL_INFOS("Search") << "Skipped " << event_id << " because it was out of scope" << LL_ENDL;
+			continue;
+		}
+		pResults->setEnabled(TRUE);
+
+		LLSD element;
+		
+		element["id"] = llformat("%u", event_id);
+		
+		if (event_flags == EVENT_FLAG_ADULT)
+		{
+			element["columns"][0]["column"] = "icon";
+			element["columns"][0]["type"] = "icon";
+			element["columns"][0]["value"] = "Parcel_R_Dark";
+		}
+		else if (event_flags == EVENT_FLAG_MATURE)
+		{
+			element["columns"][0]["column"] = "icon";
+			element["columns"][0]["type"] = "icon";
+			element["columns"][0]["value"] = "Parcel_M_Dark";
+		}
+		else
+		{
+			element["columns"][0]["column"] = "icon";
+			element["columns"][0]["type"] = "icon";
+			element["columns"][0]["value"] = "Parcel_PG_Dark";
+		}
+		
+		element["columns"][1]["column"] = "name";
+		element["columns"][1]["value"] = name;
+		
+		element["columns"][2]["column"] = "date";
+		element["columns"][2]["value"] = date;
+		
+		//element["columns"][3]["column"] = "time";
+		//element["columns"][3]["value"] = llformat("%u", unix_time);
+		
+		pResults->addElement(element, ADD_BOTTOM);
+	}
+	self->paginate();
+}
diff --git a/indra/newview/llfloaterdirectory.h b/indra/newview/llfloaterdirectory.h
new file mode 100644
index 0000000000000000000000000000000000000000..a6cd944f455c13adb8f0dad54146067c330d86fe
--- /dev/null
+++ b/indra/newview/llfloaterdirectory.h
@@ -0,0 +1,133 @@
+/*
+ * @file llfloaterdirectory.h
+ * @brief Legacy search facility definitions
+ *
+ * Copyright (c) 2014, 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_FLOATERDIRECTORY_H
+#define LL_FLOATERDIRECTORY_H
+
+#include "llfloater.h"
+#include "llsdparam.h"
+
+class LLUICtrl;
+class LLPanel;
+class LLPanelSearchWeb;
+class LLScrollListCtrl;
+class LLTabContainer;
+class LLTextBase;
+
+static const size_t MIN_SEARCH_STRING_SIZE = 3;
+
+typedef enum {
+	SE_UNDEFINED = 0,
+	SE_PEOPLE,
+	SE_GROUPS,
+	SE_PLACES,
+	SE_LANDSALES,
+	SE_EVENTS,
+	SE_CLASSIFIEDS
+} ESearch;
+
+struct SearchQuery : public LLInitParam::Block<SearchQuery>
+{
+	Optional<std::string> category;
+	Optional<std::string> query;
+	
+	SearchQuery();
+};
+
+typedef struct dir_query
+{
+	dir_query()
+		: type(SE_UNDEFINED), text(LLStringUtil::null), scope(0),
+		category_int(0), category_char(0x0), price(0), area(0), results_per_page(100) {}
+	ESearch type;
+	std::string text;
+	U32 scope;
+	U32 category_int;
+	S8 category_char;
+	S32 price;
+	S32 area;
+	U32 results_per_page;
+} LLDirQuery;
+
+class LLFloaterDirectory : public LLFloater
+{
+	friend class LLPanelSearchClassifieds;
+	friend class LLPanelSearchEvents;
+	friend class LLPanelSearchGroups;
+	friend class LLPanelSearchLandSales;
+	friend class LLPanelSearchPeople;
+	friend class LLPanelSearchPlaces;
+	
+public:
+	struct _Params : LLInitParam::Block<_Params, LLFloater::Params>
+	{
+		Optional<SearchQuery> search;
+	};
+	typedef LLSDParamAdapter<_Params> Params;
+	
+	LLFloaterDirectory(const Params& key);
+	BOOL postBuild() override;
+	void onOpen(const LLSD& key) override;
+	
+	static void processSearchPeopleReply(LLMessageSystem* msg, void**);
+	static void processSearchGroupsReply(LLMessageSystem* msg, void**);
+	static void processSearchPlacesReply(LLMessageSystem* msg, void**);
+	static void processSearchClassifiedsReply(LLMessageSystem* msg, void**);
+	static void processSearchLandReply(LLMessageSystem* msg, void**);
+	static void processSearchEventsReply(LLMessageSystem* msg, void**);
+	
+protected:
+	void setProgress(bool working);
+	void queryDirectory(const LLDirQuery& query, bool new_search = false);
+	void setResultsComment(const std::string& message);
+	
+private:
+	~LLFloaterDirectory();
+	void onCommitSelection();
+	void choosePage(LLUICtrl* ctrl);
+	void onTabChanged();
+	void paginate();
+	void showDetailPanel(const std::string& panel_name);
+	void rebuildResultList();
+
+	ESearch mCurrentResultType;
+	LLDirQuery mCurrentQuery;
+	S32 mResultStart;
+	S32 mNumResultsReceived;
+	LLUUID mQueryID;
+	
+	LLTabContainer*	mTabContainer;
+	LLPanel* mDetailPeople;
+	LLPanelSearchWeb* mPanelWeb;
+	LLScrollListCtrl* mResultList;
+	LLTextBase* mResultsStatus;
+};
+
+#endif // LL_FLOATERDIRECTORY_H
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 4e8ed45d5e00667bdbd4a4aae1a1cb6b6972dcb4..c4f81b6dca91347803f9caef13bcf54b923e2885 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -48,7 +48,7 @@
 
 //static
 LLPanelClassifiedInfo::panel_list_t LLPanelClassifiedInfo::sAllPanels;
-static LLPanelInjector<LLPanelClassifiedInfo> t_panel_panel_classified_info("panel_classified_info");
+static LLPanelInjector<LLPanelClassifiedInfo> t_panel_classified_info("panel_classified_info");
 
 // "classifiedclickthrough"
 // strings[0] = classified_id
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 21d9872395169f484edfc452562e8f81a6637521..471becd0f7fe330dc0c34bc001a394f72cd2668d 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -165,10 +165,8 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 	S32 mMapClicksNew;
 	S32 mProfileClicksNew;
 
-public:
     static void handleSearchStatResponse(LLUUID classifiedId, LLSD result);
 
-private:
 
 	typedef std::list<LLPanelClassifiedInfo*> panel_list_t;
 	static panel_list_t sAllPanels;
diff --git a/indra/newview/llpaneleventinfo.cpp b/indra/newview/llpaneleventinfo.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..54950840e95710ac0b2c4f092f02be8badcf8509
--- /dev/null
+++ b/indra/newview/llpaneleventinfo.cpp
@@ -0,0 +1,158 @@
+/*
+ * @file llpaneleventinfo.cpp
+ * @brief Event info panel
+ *
+ * Copyright (c) 2014, 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 "llpaneleventinfo.h"
+
+#include "llbutton.h"
+#include "lleventflags.h"
+#include "lliconctrl.h"
+#include "llfloaterreg.h"
+#include "llresmgr.h"
+#include "llslurl.h"
+#include "lltrans.h"
+
+#include "llagent.h"
+#include "llfloaterworldmap.h"
+#include "llviewercontrol.h"
+
+static LLPanelInjector<LLPanelEventInfo> t_event_info("panel_event_info");
+
+LLPanelEventInfo::LLPanelEventInfo()
+:	LLPanel()
+,	mEvent()
+,	mEventID(0)
+{
+	mEventNotifierConnection = gEventNotifier.setNewEventCallback(boost::bind(&LLPanelEventInfo::processEventReply, this, _1));
+}
+
+LLPanelEventInfo::~LLPanelEventInfo()
+{
+	if (mEventNotifierConnection.connected())
+	{
+		mEventNotifierConnection.disconnect();
+	}
+}
+
+BOOL LLPanelEventInfo::postBuild()
+{
+	childSetAction("teleport_btn", boost::bind(&LLPanelEventInfo::onBtnTeleport, this));
+	childSetAction("show_on_map_btn", boost::bind(&LLPanelEventInfo::onBtnMap, this));
+	childSetAction("remind_btn", boost::bind(&LLPanelEventInfo::onBtnRemind, this));
+	return TRUE;
+}
+
+void LLPanelEventInfo::onOpen(const LLSD& key)
+{
+	U32 id(key.asInteger());
+	setEventID(id);
+	
+	gEventNotifier.add(getEventID());
+}
+
+// *TODO: localize this bitch.
+std::string LLPanelEventInfo::formatFromMinutes(U32 time)
+{
+	U32 hours = time / 60;
+	U32 minutes = time % 60;
+	
+	std::ostringstream output;
+	if (hours)
+		output << hours << " " << getString("hours") << " ";
+	if (minutes)
+		output << minutes << " " << getString("minutes");
+	return output.str();
+}
+
+bool LLPanelEventInfo::processEventReply(const LLEventStruct& event)
+{
+	if (event.eventId != getEventID()) return false; // no
+	mEvent = event;
+	getChild<LLUICtrl>("name")->setValue(mEvent.eventName);
+	getChild<LLUICtrl>("desc")->setValue(mEvent.desc);
+	getChild<LLUICtrl>("duration")->setValue(formatFromMinutes(mEvent.duration));
+	getChild<LLUICtrl>("host")->setValue(LLSLURL("agent", LLUUID(mEvent.creator), "inspect").getSLURLString());
+	getChild<LLUICtrl>("time")->setValue(mEvent.eventDateStr);
+	// *TODO: Prettier
+	//std::string time;
+	//LLStringUtil::formatDatetime(time, "%a %d %b %Y %H:%M", "slt", mEvent.eventEpoch);
+	//getChild<LLUICtrl>("time")->setValue(time);
+	
+	// *TODO: Add translation strings
+	//getChild<LLUICtrl>("category")->setValue(LLTrans::getString(mEvent.category));
+	getChild<LLUICtrl>("category")->setValue(mEvent.category);
+	getChild<LLUICtrl>("cover")->setValue(mEvent.cover
+										  ? LLResMgr::getInstance()->getMonetaryString(mEvent.amount)
+										  : getString("free"));
+	bool mature = (mEvent.flags & EVENT_FLAG_MATURE);
+	getChild<LLUICtrl>("content_type")->setValue(getString(mature ? "type_mature" : "type_pg"));
+	getChild<LLIconCtrl>("content_type_moderate")->setVisible(mature);
+	getChild<LLIconCtrl>("content_type_general")->setVisible(!mature);
+	getChild<LLUICtrl>("location")->setValue(LLSLURL(mEvent.simName, mEvent.globalPos).getSLURLString());
+	getChild<LLButton>("remind_btn")->setLabel(getString(gEventNotifier.hasNotification(mEvent.eventId)
+														 ? "no_reminder"
+														 : "reminder"));
+	return true;
+}
+
+void LLPanelEventInfo::onBtnTeleport()
+{
+	if (!mEvent.globalPos.isExactlyZero())
+	{
+		gAgent.teleportViaLocation(mEvent.globalPos);
+		LLFloaterWorldMap* worldmap = LLFloaterWorldMap::getInstance();
+		if (worldmap)
+			worldmap->trackLocation(mEvent.globalPos);
+	}
+}
+
+void LLPanelEventInfo::onBtnMap()
+{
+	LLFloaterWorldMap* worldmap = LLFloaterWorldMap::getInstance();
+	if (!mEvent.globalPos.isExactlyZero() && worldmap)
+	{
+		worldmap->trackLocation(mEvent.globalPos);
+		LLFloaterReg::showInstance("world_map", "center");
+	}
+}
+
+void LLPanelEventInfo::onBtnRemind()
+{
+	if (gEventNotifier.hasNotification(mEvent.eventId))
+	{
+		gEventNotifier.remove(mEvent.eventId);
+		getChild<LLButton>("remind_btn")->setLabel(getString("reminder"));
+	}
+	else
+	{
+		gEventNotifier.add(mEvent.eventId);
+		getChild<LLButton>("remind_btn")->setLabel(getString("no_reminder"));
+	}
+}
diff --git a/indra/newview/llpaneleventinfo.h b/indra/newview/llpaneleventinfo.h
new file mode 100644
index 0000000000000000000000000000000000000000..17cbda087546d15632b72861992d23654ba7a831
--- /dev/null
+++ b/indra/newview/llpaneleventinfo.h
@@ -0,0 +1,59 @@
+/*
+ * @file llpaneleventinfo.cpp
+ * @brief Event info panel
+ *
+ * Copyright (c) 2014, 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_PANELEVENTINFO_H
+#define LL_PANELEVENTINFO_H
+
+#include "llpanel.h"
+#include "lleventnotifier.h"
+
+class LLPanelEventInfo : public LLPanel
+{
+public:
+	LLPanelEventInfo();
+	/*virtual*/ BOOL postBuild() override;
+	/*virtual*/ void onOpen(const LLSD& key) override;
+	
+private:
+	~LLPanelEventInfo();
+	bool processEventReply(const LLEventStruct& event);
+	std::string formatFromMinutes(U32 time);
+	void setEventID(U32 id) { mEventID = id; }
+	U32 getEventID() const { return mEventID; }
+	void onBtnTeleport();
+	void onBtnMap();
+	void onBtnRemind();
+	
+	LLEventStruct mEvent;
+	U32 mEventID;
+	boost::signals2::connection mEventNotifierConnection;
+};
+
+#endif // LL_PANELEVENTINFO_H
diff --git a/indra/newview/llpanelsearchbase.cpp b/indra/newview/llpanelsearchbase.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0dea5d04ec11852f0cae93fe841189a7cc8efd65
--- /dev/null
+++ b/indra/newview/llpanelsearchbase.cpp
@@ -0,0 +1,44 @@
+/*
+ * @file llpanelsearchbase.cpp
+ * @brief Search panel base class
+ *
+ * Copyright (c) 2014, 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 "llpanelsearchbase.h"
+#include "llfloaterdirectory.h"
+
+LLPanelSearch::LLPanelSearch()
+:	LLPanel()
+,	mFloater(nullptr)
+{
+}
+
+void LLPanelSearch::setSearchFloater(LLFloaterDirectory* floater)
+{
+	mFloater = floater;
+}
diff --git a/indra/newview/llpanelsearchbase.h b/indra/newview/llpanelsearchbase.h
new file mode 100644
index 0000000000000000000000000000000000000000..52e6d8885bfd80850de58c441ec1ee03cc3262ba
--- /dev/null
+++ b/indra/newview/llpanelsearchbase.h
@@ -0,0 +1,55 @@
+/*
+ * @file llpanelsearchbase.h
+ * @brief Search panel base class
+ *
+ * Copyright (c) 2014, 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_PANELSEARCHBASE_H
+#define LL_PANELSEARCHBASE_H
+
+#include "llpanel.h"
+
+class LLUICtrl;
+class LLFloaterDirectory;
+
+class LLPanelSearch : public LLPanel
+{
+public:
+	LLPanelSearch();
+	BOOL postBuild() override { return FALSE; }
+	void setSearchFloater(LLFloaterDirectory* floater);
+	
+protected:
+	virtual ~LLPanelSearch() = default;;
+	LLFloaterDirectory* mFloater;
+	
+private:
+	virtual void onCommitSearch(LLUICtrl* ctrl) {}
+	virtual void search() {}
+};
+
+#endif // LL_PANELSEARCHBASE_H
diff --git a/indra/newview/llpanelsearchclassifieds.cpp b/indra/newview/llpanelsearchclassifieds.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..93f61a92dd970841bcd502b150777f634fc0a9bc
--- /dev/null
+++ b/indra/newview/llpanelsearchclassifieds.cpp
@@ -0,0 +1,110 @@
+/*
+ * @file llpanelsearchclassifieds.cpp
+ * @brief Groups search panel
+ *
+ * Copyright (c) 2014, 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 "llpanelsearchclassifieds.h"
+#include "llfloaterdirectory.h"
+
+#include "llfloaterreg.h"
+#include "llqueryflags.h"
+#include "lltrans.h"
+
+#include "llagent.h"
+#include "llclassifiedflags.h"
+#include "llclassifiedinfo.h"
+#include "llcombobox.h"
+#include "llnotificationsutil.h"
+#include "llparcel.h"
+#include "llsearcheditor.h"
+#include "llsearchhistory.h"
+
+static LLPanelInjector<LLPanelSearchClassifieds> t_panel_search_classifieds("panel_search_classifieds");
+
+LLPanelSearchClassifieds::LLPanelSearchClassifieds()
+	: LLPanelSearch()
+	, mSearchEditor(nullptr)
+	, mClassifiedsCategory(nullptr)
+{
+	mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchClassifieds::onCommitSearch, this, _1));
+}
+
+BOOL LLPanelSearchClassifieds::postBuild()
+{
+	mClassifiedsCategory = getChild<LLComboBox>("classifieds_category");
+	mClassifiedsCategory->add("All categories", LLSD("any"));
+	mClassifiedsCategory->addSeparator();
+	for (auto iter = LLClassifiedInfo::sCategories.cbegin();
+		 iter != LLClassifiedInfo::sCategories.cend();
+		 ++iter)
+	{
+		mClassifiedsCategory->add(LLTrans::getString(iter->second));
+	}
+	
+	mSearchEditor = getChild<LLSearchEditor>("search_bar");
+	//mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchClassifieds::onCommitSearch, this, _1));
+	
+	return TRUE;
+}
+
+void LLPanelSearchClassifieds::onCommitSearch(LLUICtrl* ctrl)
+{
+	LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl);
+	if (pSearchEditor)
+	{
+		std::string text = pSearchEditor->getText();
+		LLStringUtil::trim(text);
+		if (text.length() <= MIN_SEARCH_STRING_SIZE)
+			LLSearchHistory::getInstance()->addEntry(text);
+	}
+	search();
+}
+
+void LLPanelSearchClassifieds::search()
+{
+	LLDirQuery query;
+	query.type = SE_CLASSIFIEDS;
+	query.results_per_page = 100;
+	query.text = mSearchEditor->getText();
+	LLStringUtil::trim(query.text);
+	
+	query.category_int = mClassifiedsCategory->getValue().asInteger();
+	
+	static LLUICachedControl<bool> inc_pg("ShowPGClassifieds", true);
+	static LLUICachedControl<bool> inc_mature("ShowMatureClassifieds", false);
+	static LLUICachedControl<bool> inc_adult("ShowAdultClassifieds", false);
+	if (!(inc_pg || inc_mature || inc_adult))
+	{
+		LLNotificationsUtil::add("NoContentToSearch");
+		return;
+	}
+	query.scope = pack_classified_flags_request(/*auto_renew*/ FALSE, inc_pg, inc_mature, inc_adult);
+	
+	mFloater->queryDirectory(query, true);
+}
diff --git a/indra/newview/llpanelsearchclassifieds.h b/indra/newview/llpanelsearchclassifieds.h
new file mode 100644
index 0000000000000000000000000000000000000000..bdce2da629bb74541df0c16853b53c081aa01d3e
--- /dev/null
+++ b/indra/newview/llpanelsearchclassifieds.h
@@ -0,0 +1,53 @@
+/*
+ * @file llpanelsearchclassifieds.h
+ * @brief Groups search panel
+ *
+ * Copyright (c) 2014, 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_PANELSEARCHCLASSIFIEDS_H
+#define LL_PANELSEARCHCLASSIFIEDS_H
+
+#include "llpanelsearchbase.h"
+
+class LLComboBox;
+class LLSearchEditor;
+
+class LLPanelSearchClassifieds : public LLPanelSearch
+{
+public:
+	LLPanelSearchClassifieds();
+	/*virtual*/ BOOL postBuild() override;
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl) override;
+	/*virtual*/ void search() override;
+	
+	LLSearchEditor* mSearchEditor;
+	LLComboBox* mClassifiedsCategory;
+};
+
+#endif // LL_PANELSEARCHCLASSIFIEDS_H
diff --git a/indra/newview/llpanelsearchevents.cpp b/indra/newview/llpanelsearchevents.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2a82bb389193cbd1ec22a79e98817a5a644cba0b
--- /dev/null
+++ b/indra/newview/llpanelsearchevents.cpp
@@ -0,0 +1,135 @@
+/*
+ * @file llpanelsearchevents.cpp
+ * @brief Events search panel
+ *
+ * Copyright (c) 2014, 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 "llpanelsearchevents.h"
+#include "llfloaterdirectory.h"
+
+#include "llfloaterreg.h"
+#include "llqueryflags.h"
+
+#include "llagent.h"
+#include "llcombobox.h"
+#include "llnotificationsutil.h"
+#include "llparcel.h"
+#include "llsearcheditor.h"
+#include "llsearchhistory.h"
+
+static LLPanelInjector<LLPanelSearchEvents> t_panel_search_events("panel_search_events");
+
+LLPanelSearchEvents::LLPanelSearchEvents()
+:	LLPanelSearch()
+,	mDate(0)
+{
+	mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchEvents::onCommitSearch, this, _1));
+	mCommitCallbackRegistrar.add("Search.AddDay", boost::bind(&LLPanelSearchEvents::addDay, this));
+	mCommitCallbackRegistrar.add("Search.MinusDay", boost::bind(&LLPanelSearchEvents::minusDay, this));
+}
+
+BOOL LLPanelSearchEvents::postBuild()
+{
+	mSearchEditor = getChild<LLSearchEditor>("search_bar");
+	//mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchEvents::onCommitSearch, this, _1));
+	setDate(0);
+	
+	return TRUE;
+}
+
+void LLPanelSearchEvents::onCommitSearch(LLUICtrl* ctrl)
+{
+	LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl);
+	if (pSearchEditor)
+	{
+		std::string text = pSearchEditor->getText();
+		LLStringUtil::trim(text);
+		if (text.length() <= MIN_SEARCH_STRING_SIZE)
+			LLSearchHistory::getInstance()->addEntry(text);
+	}
+	search();
+}
+
+void LLPanelSearchEvents::search()
+{
+	LLDirQuery query;
+	query.type = SE_EVENTS;
+	query.results_per_page = 200;
+	std::string text = mSearchEditor->getText();
+	LLStringUtil::trim(text);
+	
+	static LLUICachedControl<bool> inc_pg("ShowPGEvents", true);
+	static LLUICachedControl<bool> inc_mature("ShowMatureEvents", false);
+	static LLUICachedControl<bool> inc_adult("ShowAdultEvents", false);
+	if (!(inc_pg || inc_mature || inc_adult))
+	{
+		LLNotificationsUtil::add("NoContentToSearch");
+		return;
+	}
+
+	query.scope = DFQ_DATE_EVENTS;
+	if (inc_pg)
+		query.scope |= DFQ_INC_PG;
+	if (inc_mature && gAgent.canAccessMature())
+		query.scope |= DFQ_INC_MATURE;
+	if (inc_adult && gAgent.canAccessAdult())
+		query.scope |= DFQ_INC_ADULT;
+	
+	std::ostringstream string;
+	string << (childGetValue("events_search_mode").asString() == "current" ? "u" : llformat("%d",mDate)) << "|"
+	       << getChild<LLComboBox>("events_category")->getSelectedValue().asInteger() << "|"
+		   << text;
+	query.text = string.str();
+	
+	mFloater->queryDirectory(query, true);
+}
+
+void LLPanelSearchEvents::setDate(S32 day)
+{
+	mDate = day;
+
+	time_t utc = time_corrected();
+	utc += day * 24 * 60 * 60;
+	struct tm * internal_time = utc_to_pacific_time(utc, is_daylight_savings());
+	const std::string date = llformat("%d/%d", 1 + internal_time->tm_mon, internal_time->tm_mday);
+	childSetValue("events_date", date);
+}
+
+void LLPanelSearchEvents::addDay()
+{
+	setDate(++mDate);
+	if (childGetValue("events_search_mode").asString() == "date")
+		search();
+}
+
+void LLPanelSearchEvents::minusDay()
+{
+	setDate(--mDate);
+	if (childGetValue("events_search_mode").asString() == "date")
+		search();
+}
diff --git a/indra/newview/llpanelsearchevents.h b/indra/newview/llpanelsearchevents.h
new file mode 100644
index 0000000000000000000000000000000000000000..54667328180f3cdd9d3d2461173abf8fc3719e94
--- /dev/null
+++ b/indra/newview/llpanelsearchevents.h
@@ -0,0 +1,56 @@
+/*
+ * @file llpanelsearchevents.h
+ * @brief Events search panel
+ *
+ * Copyright (c) 2014, 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_PANELSEARCHEVENTS_H
+#define LL_PANELSEARCHEVENTS_H
+
+#include "llpanelsearchbase.h"
+
+class LLComboBox;
+class LLSearchEditor;
+
+class LLPanelSearchEvents : public LLPanelSearch
+{
+public:
+	LLPanelSearchEvents();
+	/*virtual*/ BOOL postBuild() override;
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl) override;
+	/*virtual*/ void search() override;
+	void setDate(S32 day);
+	void addDay();
+	void minusDay();
+	
+	S32 mDate;
+	LLSearchEditor* mSearchEditor;
+};
+
+#endif // LL_PANELSEARCHEVENTS_H
diff --git a/indra/newview/llpanelsearchgroups.cpp b/indra/newview/llpanelsearchgroups.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..b623baba666c75c94b31e1dc3f00b8674890e96d
--- /dev/null
+++ b/indra/newview/llpanelsearchgroups.cpp
@@ -0,0 +1,99 @@
+/*
+ * @file llpanelsearchgroups.cpp
+ * @brief Groups search panel
+ *
+ * Copyright (c) 2014, 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 "llpanelsearchgroups.h"
+#include "llfloaterdirectory.h"
+
+#include "llfloaterreg.h"
+#include "llqueryflags.h"
+
+#include "llagent.h"
+#include "llnotificationsutil.h"
+#include "llsearcheditor.h"
+#include "llsearchhistory.h"
+
+static LLPanelInjector<LLPanelSearchGroups> t_panel_search_groups("panel_search_groups");
+
+LLPanelSearchGroups::LLPanelSearchGroups()
+	: LLPanelSearch()
+	, mSearchEditor(nullptr)
+{
+	mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchGroups::onCommitSearch, this, _1));
+}
+
+BOOL LLPanelSearchGroups::postBuild()
+{
+	mSearchEditor = getChild<LLSearchEditor>("search_bar");
+	//mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchGroups::onCommitSearch, this, _1));
+	
+	return TRUE;
+}
+
+void LLPanelSearchGroups::onCommitSearch(LLUICtrl* ctrl)
+{
+	LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl);
+	if (pSearchEditor)
+	{
+		std::string text = pSearchEditor->getText();
+		LLStringUtil::trim(text);
+		if (text.length() <= MIN_SEARCH_STRING_SIZE)
+			LLSearchHistory::getInstance()->addEntry(text);
+	}
+	search();
+}
+
+void LLPanelSearchGroups::search()
+{
+	LLDirQuery query;
+	query.type = SE_GROUPS;
+	query.results_per_page = 100;
+	query.text = mSearchEditor->getText();
+	LLStringUtil::trim(query.text);
+	
+	static LLUICachedControl<bool> inc_pg("ShowPGGroups", true);
+	static LLUICachedControl<bool> inc_mature("ShowMatureGroups", false);
+	static LLUICachedControl<bool> inc_adult("ShowAdultGroups", false);
+	if (!(inc_pg || inc_mature || inc_adult))
+	{
+		LLNotificationsUtil::add("NoContentToSearch");
+		return;
+	}
+
+	if (inc_pg)
+		query.scope |= DFQ_INC_PG;
+	if (inc_mature && gAgent.canAccessMature())
+		query.scope |= DFQ_INC_MATURE;
+	if (inc_adult && gAgent.canAccessAdult())
+		query.scope |= DFQ_INC_ADULT;
+	query.scope |= DFQ_GROUPS;
+	
+	mFloater->queryDirectory(query, true);
+}
diff --git a/indra/newview/llpanelsearchgroups.h b/indra/newview/llpanelsearchgroups.h
new file mode 100644
index 0000000000000000000000000000000000000000..65a5a90902d6fada25b00cd01ba2da777167def1
--- /dev/null
+++ b/indra/newview/llpanelsearchgroups.h
@@ -0,0 +1,51 @@
+/*
+ * @file llpanelsearchgroups.h
+ * @brief Groups search panel
+ *
+ * Copyright (c) 2014, 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_PANELSEARCHGROUPS_H
+#define LL_PANELSEARCHGROUPS_H
+
+#include "llpanelsearchbase.h"
+
+class LLSearchEditor;
+
+class LLPanelSearchGroups : public LLPanelSearch
+{
+public:
+	LLPanelSearchGroups();
+	/*virtual*/ BOOL postBuild() override;
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl) override;
+	/*virtual*/ void search() override;
+	
+	LLSearchEditor* mSearchEditor;
+};
+
+#endif // LL_PANELSEARCHGROUPS_H
diff --git a/indra/newview/llpanelsearchlandsales.cpp b/indra/newview/llpanelsearchlandsales.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..52fb5c9ccc5f47c3b07762a9de54bf1adfdf1d8d
--- /dev/null
+++ b/indra/newview/llpanelsearchlandsales.cpp
@@ -0,0 +1,118 @@
+/*
+ * @file llpanelsearchlandsales.cpp
+ * @brief Groups search panel
+ *
+ * Copyright (c) 2014, 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 "llpanelsearchlandsales.h"
+#include "llfloaterdirectory.h"
+
+#include "llfloaterreg.h"
+#include "llqueryflags.h"
+
+#include "llagent.h"
+#include "llnotificationsutil.h"
+#include "llsearcheditor.h"
+#include "llsearchhistory.h"
+#include "llviewercontrol.h"
+
+static LLPanelInjector<LLPanelSearchLandSales> t_panel_search_land_sales("panel_search_landsales");
+
+LLPanelSearchLandSales::LLPanelSearchLandSales()
+:	LLPanelSearch()
+{
+	mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchLandSales::onCommitSearch, this, _1));
+}
+
+BOOL LLPanelSearchLandSales::postBuild()
+{
+	return TRUE;
+}
+
+void LLPanelSearchLandSales::onCommitSearch(LLUICtrl* ctrl)
+{
+	search();
+}
+
+void LLPanelSearchLandSales::search()
+{
+	LLDirQuery query;
+	query.type = SE_LANDSALES;
+	query.results_per_page = 100;
+	
+	static LLUICachedControl<bool> inc_pg("ShowPGLand", true);
+	static LLUICachedControl<bool> inc_mature("ShowMatureLand", false);
+	static LLUICachedControl<bool> inc_adult("ShowAdultLand", false);
+	static LLUICachedControl<bool> limit_price("FindLandPrice", true);
+	static LLUICachedControl<bool> limit_area("FindLandArea", true);
+	if (!(inc_pg || inc_mature || inc_adult))
+	{
+		LLNotificationsUtil::add("NoContentToSearch");
+		return;
+	}
+
+	const std::string& type = gSavedSettings.getString("FindLandType");
+	if (type == "All")
+		query.category_int = ST_ALL;
+	else if (type == "Auction")
+		query.category_int = ST_AUCTION;
+	else if (type == "Mainland")
+		query.category_int = ST_MAINLAND;
+	else if (type == "Estate")
+		query.category_int = ST_ESTATE;
+	
+	if (gAgent.wantsPGOnly())
+		query.scope |= DFQ_PG_SIMS_ONLY;
+	if (inc_pg)
+		query.scope |= DFQ_INC_PG;
+	if (inc_mature && gAgent.canAccessMature())
+		query.scope |= DFQ_INC_MATURE;
+	if (inc_adult && gAgent.canAccessAdult())
+		query.scope |= DFQ_INC_ADULT;
+	
+	const std::string& sort = gSavedSettings.getString("FindLandSort");
+	if (sort == "Name")
+		query.scope |= DFQ_NAME_SORT;
+	else if (sort == "Price")
+		query.scope |= DFQ_PRICE_SORT;
+	else if (sort == "PPM")
+		query.scope |= DFQ_PER_METER_SORT;
+	else if (sort == "Area")
+		query.scope |= DFQ_AREA_SORT;
+
+	if (gSavedSettings.getBOOL("FindLandSortAscending"))
+		query.scope |= DFQ_SORT_ASC;
+	if (limit_price)
+		query.scope |= DFQ_LIMIT_BY_PRICE;
+	if (limit_area)
+		query.scope |= DFQ_LIMIT_BY_AREA;
+	query.price = childGetValue("edit_price").asInteger();
+	query.area = childGetValue("edit_area").asInteger();
+	
+	mFloater->queryDirectory(query, true);
+}
diff --git a/indra/newview/llpanelsearchlandsales.h b/indra/newview/llpanelsearchlandsales.h
new file mode 100644
index 0000000000000000000000000000000000000000..64b57b225b60f4955634cac6910d03f3f97803b0
--- /dev/null
+++ b/indra/newview/llpanelsearchlandsales.h
@@ -0,0 +1,47 @@
+/*
+ * @file llpanelsearchlandsales.h
+ * @brief Land sale search panel
+ *
+ * Copyright (c) 2014, 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_PANELSEARCHLANDSALES_H
+#define LL_PANELSEARCHLANDSALES_H
+
+#include "llpanelsearchbase.h"
+
+class LLPanelSearchLandSales : public LLPanelSearch
+{
+public:
+	LLPanelSearchLandSales();
+	/*virtual*/ BOOL postBuild() override;
+	
+private:
+	/*virtual*/ void search() override;
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl) override;
+};
+
+#endif // LL_PANELSEARCHLANDSALES_H
diff --git a/indra/newview/llpanelsearchpeople.cpp b/indra/newview/llpanelsearchpeople.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..dbd604890460487d5a52456aaebe99e1f6b6969a
--- /dev/null
+++ b/indra/newview/llpanelsearchpeople.cpp
@@ -0,0 +1,87 @@
+/*
+ * @file llpanelsearchpeople.cpp
+ * @brief People search panel
+ *
+ * Copyright (c) 2014, 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 "llpanelsearchpeople.h"
+#include "llfloaterdirectory.h"
+
+#include "llfloaterreg.h"
+
+#include "llagent.h"
+#include "llsearcheditor.h"
+#include "llsearchhistory.h"
+
+static LLPanelInjector<LLPanelSearchPeople> t_panel_search_people("panel_search_people");
+
+LLPanelSearchPeople::LLPanelSearchPeople()
+:	LLPanelSearch()
+{
+	mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchPeople::onCommitSearch, this, _1));
+}
+
+BOOL LLPanelSearchPeople::postBuild()
+{
+	mSearchEditor = getChild<LLSearchEditor>("search_bar");
+	//mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchPeople::onCommitSearch, this, _1));
+	
+	return TRUE;
+}
+
+void LLPanelSearchPeople::onCommitSearch(LLUICtrl* ctrl)
+{
+	LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl);
+	if (pSearchEditor)
+	{
+		std::string text = pSearchEditor->getText();
+		LLStringUtil::trim(text);
+		if (text.length() <= MIN_SEARCH_STRING_SIZE)
+			LLSearchHistory::getInstance()->addEntry(text);
+	}
+	search();
+}
+
+bool isNotAlphaNum(char c)
+{
+	return !std::isalnum(c);
+}
+
+void LLPanelSearchPeople::search()
+{
+	LLDirQuery query;
+	query.type = SE_PEOPLE;
+	query.results_per_page = 100;
+	query.text = mSearchEditor->getText();
+	std::replace_if(query.text.begin(), query.text.end(), isNotAlphaNum, ' ');
+	LLStringUtil::trim(query.text);
+
+	mFloater->queryDirectory(query, true);
+	if (query.text.length() < MIN_SEARCH_STRING_SIZE)
+		mFloater->setResultsComment(getString("SeachFilteredOnShortWordsEmpty"));
+}
diff --git a/indra/newview/llpanelsearchpeople.h b/indra/newview/llpanelsearchpeople.h
new file mode 100644
index 0000000000000000000000000000000000000000..c437292fb9ae669833ec4ff6ae91dc8b565ce296
--- /dev/null
+++ b/indra/newview/llpanelsearchpeople.h
@@ -0,0 +1,51 @@
+/*
+ * @file llpanelsearchpeople.h
+ * @brief People search panel
+ *
+ * Copyright (c) 2014, 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_PANELSEARCHPEOPLE_H
+#define LL_PANELSEARCHPEOPLE_H
+
+#include "llpanelsearchbase.h"
+
+class LLSearchEditor;
+
+class LLPanelSearchPeople : public LLPanelSearch
+{
+public:
+	LLPanelSearchPeople();
+	/*virtual*/ BOOL postBuild() override;
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl) override;
+	/*virtual*/ void search() override;
+	
+	LLSearchEditor* mSearchEditor;
+};
+
+#endif // LL_PANELSEARCHPEOPLE_H
diff --git a/indra/newview/llpanelsearchplaces.cpp b/indra/newview/llpanelsearchplaces.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ab41d8f1c16e215fe396e4c5ce1256d6bb8dd350
--- /dev/null
+++ b/indra/newview/llpanelsearchplaces.cpp
@@ -0,0 +1,113 @@
+/*
+ * @file llpanelsearchplaces.cpp
+ * @brief Groups search panel
+ *
+ * Copyright (c) 2014, 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 "llpanelsearchplaces.h"
+#include "llfloaterdirectory.h"
+
+#include "llfloaterreg.h"
+#include "llqueryflags.h"
+
+#include "llagent.h"
+#include "llcombobox.h"
+#include "llnotificationsutil.h"
+#include "llparcel.h"
+#include "llsearcheditor.h"
+#include "llsearchhistory.h"
+
+static LLPanelInjector<LLPanelSearchPlaces> t_panel_search_places("panel_search_places");
+
+LLPanelSearchPlaces::LLPanelSearchPlaces()
+:	LLPanelSearch()
+{
+	mCommitCallbackRegistrar.add("Search.query", boost::bind(&LLPanelSearchPlaces::onCommitSearch, this, _1));
+}
+
+BOOL LLPanelSearchPlaces::postBuild()
+{
+	mPlacesCategory = getChild<LLComboBox>("places_category");
+	mPlacesCategory->add("All categories", LLSD("any"));
+	mPlacesCategory->addSeparator();
+	for (size_t category = LLParcel::C_LINDEN; category < LLParcel::C_COUNT; ++category)
+	{
+		LLParcel::ECategory eCategory = static_cast<LLParcel::ECategory>(category);
+		mPlacesCategory->add(LLParcel::getCategoryUIString(eCategory), LLParcel::getCategoryString(eCategory));
+	}
+	
+	mSearchEditor = getChild<LLSearchEditor>("search_bar");
+	//mSearchEditor->setKeystrokeCallback(boost::bind(&LLPanelSearchPlaces::onCommitSearch, this, _1));
+	
+	return TRUE;
+}
+
+void LLPanelSearchPlaces::onCommitSearch(LLUICtrl* ctrl)
+{
+	LLSearchEditor* pSearchEditor = dynamic_cast<LLSearchEditor*>(ctrl);
+	if (pSearchEditor)
+	{
+		std::string text = pSearchEditor->getText();
+		LLStringUtil::trim(text);
+		if (text.length() <= MIN_SEARCH_STRING_SIZE)
+			LLSearchHistory::getInstance()->addEntry(text);
+	}
+	search();
+}
+
+void LLPanelSearchPlaces::search()
+{
+	LLDirQuery query;
+	query.type = SE_PLACES;
+	query.results_per_page = 100;
+	query.text = mSearchEditor->getText();
+	LLStringUtil::trim(query.text);
+	
+	const std::string& category_string = mPlacesCategory->getSelectedValue();
+	query.category_char = category_string == "any" ? LLParcel::C_ANY : LLParcel::getCategoryFromString(category_string);
+	
+	static LLUICachedControl<bool> inc_pg("ShowPGSims", true);
+	static LLUICachedControl<bool> inc_mature("ShowMatureSims", false);
+	static LLUICachedControl<bool> inc_adult("ShowAdultSims", false);
+	if (!(inc_pg || inc_mature || inc_adult))
+	{
+		LLNotificationsUtil::add("NoContentToSearch");
+		return;
+	}
+	if (gAgent.wantsPGOnly())
+		query.scope |= DFQ_PG_SIMS_ONLY;
+	if (inc_pg)
+		query.scope |= DFQ_INC_PG;
+	if (inc_mature && gAgent.canAccessMature())
+		query.scope |= DFQ_INC_MATURE;
+	if (inc_adult && gAgent.canAccessAdult())
+		query.scope |= DFQ_INC_ADULT;
+	query.scope |= DFQ_DWELL_SORT;
+	
+	mFloater->queryDirectory(query, true);
+}
diff --git a/indra/newview/llpanelsearchplaces.h b/indra/newview/llpanelsearchplaces.h
new file mode 100644
index 0000000000000000000000000000000000000000..5d2f6f7f058b8bfa51425eeff574c5c5aa25e831
--- /dev/null
+++ b/indra/newview/llpanelsearchplaces.h
@@ -0,0 +1,53 @@
+/*
+ * @file llpanelsearchplaces.h
+ * @brief Groups search panel
+ *
+ * Copyright (c) 2014, 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_PANELSEARCHPLACES_H
+#define LL_PANELSEARCHPLACES_H
+
+#include "llpanelsearchbase.h"
+
+class LLComboBox;
+class LLSearchEditor;
+
+class LLPanelSearchPlaces : public LLPanelSearch
+{
+public:
+	LLPanelSearchPlaces();
+	/*virtual*/ BOOL postBuild() override;
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl) override;
+	/*virtual*/ void search() override;
+	
+	LLSearchEditor* mSearchEditor;
+	LLComboBox* mPlacesCategory;
+};
+
+#endif // LL_PANELSEARCHPLACES_H
diff --git a/indra/newview/llpanelsearchweb.cpp b/indra/newview/llpanelsearchweb.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..90bba998ce7bb72982e7c91bbfac3cf9799e6182
--- /dev/null
+++ b/indra/newview/llpanelsearchweb.cpp
@@ -0,0 +1,228 @@
+/*
+ * @file llpanelsearchweb.cpp
+ * @brief Web search panel
+ *
+ * Copyright (c) 2014, 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 "llpanelsearchweb.h"
+
+#include "llagent.h"
+#include "llfloaterdirectory.h"
+#include "lllogininstance.h"
+#include "llmediactrl.h"
+#include "llprogressbar.h"
+#include "lltextbox.h"
+#include "llviewercontrol.h"
+#include "llviewernetwork.h"
+#include "llviewerregion.h"
+#include "llweb.h"
+
+static LLPanelInjector<LLPanelSearchWeb> t_panel_search_web("panel_search_web");
+
+LLPanelSearchWeb::LLPanelSearchWeb()
+:	LLPanel()
+,	mStatusBarText(nullptr)
+,	mStatusBarProgress(nullptr)
+,	mBtnBack(nullptr)
+,	mBtnForward(nullptr)
+,	mBtnReload(nullptr)
+,	mBtnStop(nullptr)
+,	mWebBrowser(nullptr)
+{
+	mCategoryPaths = LLSD::emptyMap();
+	mCategoryPaths["all"]          = "search";
+	mCategoryPaths["people"]       = "search/people";
+	mCategoryPaths["places"]       = "search/places";
+	mCategoryPaths["events"]       = "search/events";
+	mCategoryPaths["groups"]       = "search/groups";
+	mCategoryPaths["wiki"]         = "search/wiki";
+	mCategoryPaths["destinations"] = "destinations";
+	
+	mCommitCallbackRegistrar.add("WebContent.Back", boost::bind(&LLPanelSearchWeb::onClickBack, this));
+	mCommitCallbackRegistrar.add("WebContent.Forward", boost::bind(&LLPanelSearchWeb::onClickForward, this));
+	mCommitCallbackRegistrar.add("WebContent.Reload", boost::bind(&LLPanelSearchWeb::onClickReload, this));
+	mCommitCallbackRegistrar.add("WebContent.Stop", boost::bind(&LLPanelSearchWeb::onClickStop, this));
+}
+
+BOOL LLPanelSearchWeb::postBuild()
+{
+	mWebBrowser = getChild<LLMediaCtrl>("webbrowser");
+	if (mWebBrowser) mWebBrowser->addObserver(this);
+	
+	mWebBrowser        = getChild<LLMediaCtrl>("webbrowser");
+	mStatusBarProgress = getChild<LLProgressBar>("statusbarprogress");
+	mStatusBarText     = getChild<LLTextBox>("statusbartext");
+	
+	mBtnBack           = getChild<LLButton>("back");
+	mBtnForward        = getChild<LLButton>("forward");
+	mBtnReload         = getChild<LLButton>("reload");
+	mBtnStop           = getChild<LLButton>("stop");
+	
+	return TRUE;
+}
+
+void LLPanelSearchWeb::loadUrl(const SearchQuery &p)
+{
+	if (!mWebBrowser || !p.validateBlock()) return;
+	
+	mWebBrowser->setTrustedContent(true);
+	// work out the subdir to use based on the requested category
+	LLSD subs = LLSD().with("CATEGORY", (mCategoryPaths.has(p.category.getValue()) 
+		? mCategoryPaths[p.category.getValue()].asString()
+		: mCategoryPaths["all"].asString()));
+	
+	// add the search query string
+	subs["QUERY"] = LLURI::escape(p.query);
+	
+	// add the permissions token that login.cgi gave us
+	// We use "search_token", and fallback to "auth_token" if not present.
+	LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
+	if (search_token.asString().empty())
+	{
+		search_token = LLLoginInstance::getInstance()->getResponse("auth_token");
+	}
+	subs["AUTH_TOKEN"] = search_token.asString();
+	
+	// add the user's preferred maturity (can be changed via prefs)
+	std::string maturity;
+	if (gAgent.prefersAdult())
+	{
+		maturity = "42";  // PG,Mature,Adult
+	}
+	else if (gAgent.prefersMature())
+	{
+		maturity = "21";  // PG,Mature
+	}
+	else
+	{
+		maturity = "13";  // PG
+	}
+	subs["MATURITY"] = maturity;
+	
+	// add the user's god status
+	subs["GODLIKE"] = gAgent.isGodlike() ? "1" : "0";
+	
+	// Get the search URL and expand all of the substitutions
+	// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
+	LLViewerRegion* regionp = gAgent.getRegion();
+	std::string url = regionp != nullptr ? regionp->getSearchServerURL()
+		: gSavedSettings.getString(LLGridManager::getInstance()->isInOpenSim() ? "OpenSimSearchURL" : "SearchURL");
+	url = LLWeb::expandURLSubstitutions(url, subs);
+	// Finally, load the URL in the webpanel
+	mWebBrowser->navigateTo(url, "text/html");
+}
+
+// virtual
+void LLPanelSearchWeb::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
+{
+	if(event == MEDIA_EVENT_LOCATION_CHANGED)
+	{
+		const std::string url = self->getLocation();
+		
+		if ( url.length() )
+			mStatusBarText->setText( url );
+	}
+	else if(event == MEDIA_EVENT_NAVIGATE_BEGIN)
+	{
+		// flags are sent with this event
+		mBtnBack->setEnabled( self->getHistoryBackAvailable() );
+		mBtnForward->setEnabled( self->getHistoryForwardAvailable() );
+		
+		// toggle visibility of these buttons based on browser state
+		mBtnReload->setVisible( false );
+		mBtnStop->setVisible( true );
+		
+		// turn "on" progress bar now we're about to start loading
+		mStatusBarProgress->setVisible( true );
+	}
+	else if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
+	{
+		// flags are sent with this event
+		mBtnBack->setEnabled( self->getHistoryBackAvailable() );
+		mBtnForward->setEnabled( self->getHistoryForwardAvailable() );
+		
+		// toggle visibility of these buttons based on browser state
+		mBtnReload->setVisible( true );
+		mBtnStop->setVisible( false );
+		
+		// turn "off" progress bar now we're loaded
+		mStatusBarProgress->setVisible( false );
+		
+		// we populate the status bar with URLs as they change so clear it now we're done
+        const LLStringExplicit end_str("");
+		mStatusBarText->setText( end_str );
+	}
+	else if(event == MEDIA_EVENT_STATUS_TEXT_CHANGED )
+	{
+		const std::string text = self->getStatusText();
+		if ( text.length() )
+			mStatusBarText->setText( text );
+	}
+	else if(event == MEDIA_EVENT_PROGRESS_UPDATED )
+	{
+		int percent = (int)self->getProgressPercent();
+		mStatusBarProgress->setValue( percent );
+	}
+	else if(event == MEDIA_EVENT_LINK_HOVERED )
+	{
+		const std::string link = self->getHoverLink();
+		mStatusBarText->setText( link );
+	}
+}
+
+void LLPanelSearchWeb::onClickForward() const
+{
+	mWebBrowser->navigateForward();
+}
+
+void LLPanelSearchWeb::onClickBack() const
+{
+	mWebBrowser->navigateBack();
+}
+
+void LLPanelSearchWeb::onClickReload() const
+{
+	
+	if( mWebBrowser->getMediaPlugin() )
+	{
+		bool ignore_cache = true;
+		mWebBrowser->getMediaPlugin()->browse_reload( ignore_cache );
+	}
+}
+
+void LLPanelSearchWeb::onClickStop()
+{
+	if( mWebBrowser->getMediaPlugin() )
+		mWebBrowser->getMediaPlugin()->browse_stop();
+	
+	// still should happen when we catch the navigate complete event
+	// but sometimes (don't know why) that event isn't sent from Qt
+	// and we ghetto a point where the stop button stays active.
+	mBtnReload->setVisible( true );
+	mBtnStop->setVisible( false );
+}
diff --git a/indra/newview/llpanelsearchweb.h b/indra/newview/llpanelsearchweb.h
new file mode 100644
index 0000000000000000000000000000000000000000..094b0885be2ce5f3dfb99afddb63ea593c0a9e1f
--- /dev/null
+++ b/indra/newview/llpanelsearchweb.h
@@ -0,0 +1,68 @@
+/*
+ * @file llpanelsearchweb.h
+ * @brief Web search panel
+ *
+ * Copyright (c) 2014, 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_PANELSEARCHWEB_H
+#define LL_PANELSEARCHWEB_H
+
+#include "llpanel.h"
+#include "llviewermediaobserver.h"
+
+class LLMediaCtrl;
+class LLProgressBar;
+class LLTextBox;
+struct SearchQuery;
+
+class LLPanelSearchWeb : public LLPanel, public LLViewerMediaObserver
+{
+public:
+	LLPanelSearchWeb();
+	BOOL postBuild() override;
+	void loadUrl(const SearchQuery& query);
+	
+private:
+	void             onClickBack() const;
+	void             onClickForward() const;
+	void             onClickReload() const;
+	void             onClickStop();
+	/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override;
+	
+	LLTextBox* mStatusBarText;
+	LLProgressBar* mStatusBarProgress;
+	LLButton* mBtnBack;
+	LLButton* mBtnForward;
+	LLButton* mBtnReload;
+	LLButton* mBtnStop;
+	
+	LLSD mCategoryPaths;
+	//U8 mSearchGodLevel;
+	LLMediaCtrl* mWebBrowser;
+};
+
+#endif // LL_PANELSEARCHWEB_H
diff --git a/indra/newview/llsearchcombobox.h b/indra/newview/llsearchcombobox.h
index 288f07554f1965f5c0e4437ca4ec00cf48b54adf..68f397953291b68025b77280c9de915d0091332d 100644
--- a/indra/newview/llsearchcombobox.h
+++ b/indra/newview/llsearchcombobox.h
@@ -61,11 +61,6 @@ class LLSearchComboBox : public LLComboBox
 
 	~LLSearchComboBox();
 
-	/**
-	 * Sets focus to text box
-	 */
-	void focusTextEntry();
-
 protected:
 
 	LLSearchComboBox(const Params&p);
@@ -98,6 +93,11 @@ class LLSearchComboBox : public LLComboBox
 	 */
 	void onSelectionCommit();
 
+	/**
+	 * Sets focus to text box
+	 */
+	void focusTextEntry();
+
 	LLButton* mSearchButton;
 };
 
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index a45c81bcfc87e8dd6828c2390dc975b11fa72540..89bddd44c6a387c37d201dd0ef01de6c55b6f24a 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -186,6 +186,7 @@
 #include "llappviewer.h"
 #include "llfasttimerview.h"
 #include "lltelemetry.h"
+#include "llfloaterdirectory.h"
 #include "llfloatermap.h"
 #include "llweb.h"
 #include "llvoiceclient.h"
@@ -217,7 +218,6 @@
 #if LL_WINDOWS
 #include "lldxhardware.h"
 #endif
-#include "fsfloatersearch.h"
 
 //
 // exported globals
@@ -2687,12 +2687,14 @@ void register_viewer_callbacks(LLMessageSystem* msg)
 	msg->setHandlerFuncFast(_PREHASH_PlacesReply, process_places_reply);
 	msg->setHandlerFuncFast(_PREHASH_GroupNoticesListReply, LLPanelGroupNotices::processGroupNoticesListReply);
 
-	msg->setHandlerFuncFast(_PREHASH_DirPeopleReply, FSPanelSearchPeople::processSearchReply);
-	msg->setHandlerFuncFast(_PREHASH_DirPlacesReply, FSPanelSearchPlaces::processSearchReply);
-	msg->setHandlerFuncFast(_PREHASH_DirGroupsReply, FSPanelSearchGroups::processSearchReply);
-	msg->setHandlerFuncFast(_PREHASH_DirEventsReply, FSPanelSearchEvents::processSearchReply);
-	msg->setHandlerFuncFast(_PREHASH_DirLandReply,   FSPanelSearchLand::processSearchReply);
-	msg->setHandlerFuncFast(_PREHASH_DirClassifiedReply,  FSPanelSearchClassifieds::processSearchReply);
+	// directory search
+	msg->setHandlerFunc("DirPeopleReply", LLFloaterDirectory::processSearchPeopleReply);
+	msg->setHandlerFunc("DirGroupsReply", LLFloaterDirectory::processSearchGroupsReply);
+	msg->setHandlerFunc("DirPlacesReply", LLFloaterDirectory::processSearchPlacesReply);
+	msg->setHandlerFunc("DirEventsReply", LLFloaterDirectory::processSearchEventsReply);
+	msg->setHandlerFunc("DirLandReply",   LLFloaterDirectory::processSearchLandReply);
+	msg->setHandlerFunc("DirClassifiedReply",  LLFloaterDirectory::processSearchClassifiedsReply);
+
 
 	msg->setHandlerFuncFast(_PREHASH_AvatarPickerReply, LLFloaterAvatarPicker::processAvatarPickerReply);
 
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 2f062b264832a23ceb36a6308132c24ddef905c9..6b73a0c5eeb4ac3290ea9ba3acd1ad812207a686 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -75,6 +75,7 @@
 #include "llfloatercreatelandmark.h"
 #include "llfloaterdeleteprefpreset.h"
 #include "llfloaterdestinations.h"
+#include "llfloaterdirectory.h"
 #include "llfloaterdisplayname.h"
 #include "llfloatereditextdaycycle.h"
 #include "llfloaterenvironmentadjust.h"
@@ -180,7 +181,6 @@
 #include "llpreviewtexture.h"
 #include "llscriptfloater.h"
 #include "llsyswellwindow.h"
-#include "fsfloatersearch.h"
 
 // *NOTE: Please add files in alphabetical order to keep merges easy.
 // [RLVa:KB] - Checked: 2010-03-11
@@ -392,8 +392,7 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);
 	LLFloaterReg::add("snapshot", "floater_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSnapshot>);
     LLFloaterReg::add("outfit_snapshot", "floater_outfit_snapshot.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOutfitSnapshot>);
-	LLFloaterReg::add("search", "floater_fs_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<FSFloaterSearch>);
-    //LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);
+    LLFloaterReg::add("search", "floater_search.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearch>);
 // [SL:KB] - Patch: UI-FloaterSearchReplace | Checked: 2010-10-26 (Catznip-2.3)
 	LLFloaterReg::add("search_replace", "floater_search_replace.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSearchReplace>);
 // [/SL:KB]
@@ -427,6 +426,8 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("particle_editor", "floater_particle_editor.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<ALFloaterParticleEditor>);
 	LLFloaterReg::add("quick_settings", "floater_quick_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
 	LLFloaterReg::add("region_tracker", "floater_region_tracker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<ALFloaterRegionTracker>);
+	LLFloaterReg::add("search", "floater_directory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDirectory>);
+
 	LLFloaterReg::add("sound_explorer", "floater_explore_sounds.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<ALFloaterExploreSounds>);
 	
 	LLFloaterReg::registerControlVariables(); // Make sure visibility and rect controls get preserved when saving
diff --git a/indra/newview/llviewerinput.cpp b/indra/newview/llviewerinput.cpp
index 7f084147fefb2bc46750612f6d43926d06cdcb59..1655176523af31becb9b1cb2f67637b1670549e1 100644
--- a/indra/newview/llviewerinput.cpp
+++ b/indra/newview/llviewerinput.cpp
@@ -48,8 +48,6 @@
 #include "llfloatercamera.h"
 #include "llinitparam.h"
 #include "llselectmgr.h"
-#include "fsfloatersearch.h"
-#include "llfloaterwebcontent.h"
 // [RLVa:KB] - Checked: 2021-07-29 (RLVa-1.4.4a)
 #include "rlvactions.h"
 #include "rlvhandler.h"
@@ -676,12 +674,6 @@ bool start_chat( EKeystate s )
 
 bool start_gesture( EKeystate s )
 {
-    LLFloater* focused_floater = gFloaterView->getFocusedFloater();
-    if (focused_floater && (dynamic_cast<LLFloaterWebContent*>(focused_floater) || dynamic_cast<FSFloaterSearch*>(focused_floater)))
-    {
-        return true;
-    }
-
 	LLUICtrl* focus_ctrlp = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
 	if (KEYSTATE_UP == s &&
 		! (focus_ctrlp && focus_ctrlp->acceptsTextInput()))
diff --git a/indra/newview/skins/default/textures/icon_group.png b/indra/newview/skins/default/textures/icon_group.png
deleted file mode 100644
index 4c206fd883470dabb2235e6e44fb26dd4cd87fce..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icon_group.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icon_group.tga b/indra/newview/skins/default/textures/icon_group.tga
new file mode 100644
index 0000000000000000000000000000000000000000..79cd71689d0b982cc016cfe685e605098dfc8f67
Binary files /dev/null and b/indra/newview/skins/default/textures/icon_group.tga differ
diff --git a/indra/newview/skins/default/textures/icon_legacy_event.tga b/indra/newview/skins/default/textures/icon_legacy_event.tga
deleted file mode 100644
index 7805dbce60eb7c58bb99826157ed222813c27419..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icon_legacy_event.tga and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icon_legacy_event_adult.tga b/indra/newview/skins/default/textures/icon_legacy_event_adult.tga
deleted file mode 100644
index c344fb1e78887afe2b20ac4830ffb057772416cd..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icon_legacy_event_adult.tga and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icon_legacy_event_mature.tga b/indra/newview/skins/default/textures/icon_legacy_event_mature.tga
deleted file mode 100644
index 61c879bc923c7d1ee625a3995012a3ddecca363d..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icon_legacy_event_mature.tga and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_1.png b/indra/newview/skins/default/textures/icons/ProgressLarge_1.png
deleted file mode 100644
index ff277fc431d6d5f8b13baeb47b478f321e00ab79..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_1.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_10.png b/indra/newview/skins/default/textures/icons/ProgressLarge_10.png
deleted file mode 100644
index 1c94e21d89261478fdde301cf1309dcc3bbe3065..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_10.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_11.png b/indra/newview/skins/default/textures/icons/ProgressLarge_11.png
deleted file mode 100644
index 89bea9b474bbbdb36be8e1024c00d226a22070f9..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_11.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_12.png b/indra/newview/skins/default/textures/icons/ProgressLarge_12.png
deleted file mode 100644
index da38475ba4dc61dfe4bff14a3175837f07d13fa3..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_12.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_2.png b/indra/newview/skins/default/textures/icons/ProgressLarge_2.png
deleted file mode 100644
index c024275ebef799760ab3ae4f1ef9377df066632e..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_2.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_3.png b/indra/newview/skins/default/textures/icons/ProgressLarge_3.png
deleted file mode 100644
index 87b931e72e753c263fc0f07bddd2448ce123d8be..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_3.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_4.png b/indra/newview/skins/default/textures/icons/ProgressLarge_4.png
deleted file mode 100644
index 6dbef74361edb829542a2809fb2a976f03008cac..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_4.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_5.png b/indra/newview/skins/default/textures/icons/ProgressLarge_5.png
deleted file mode 100644
index daccf9b375ffc677a02aa434bd0fc2514c1d614b..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_5.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_6.png b/indra/newview/skins/default/textures/icons/ProgressLarge_6.png
deleted file mode 100644
index cafddcb88dc21d60592ca403c46fd7fc0289adb9..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_6.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_7.png b/indra/newview/skins/default/textures/icons/ProgressLarge_7.png
deleted file mode 100644
index 8acf6472d4d70d6fb758fa7321584c8bf7c6e621..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_7.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_8.png b/indra/newview/skins/default/textures/icons/ProgressLarge_8.png
deleted file mode 100644
index df0e825cef1f053d42c4fffca7efdd0e9f4969cf..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_8.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/icons/ProgressLarge_9.png b/indra/newview/skins/default/textures/icons/ProgressLarge_9.png
deleted file mode 100644
index 293a7b8f5c6c7983e2e46c56cb661a1994ad3249..0000000000000000000000000000000000000000
Binary files a/indra/newview/skins/default/textures/icons/ProgressLarge_9.png and /dev/null differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 4eba54719ae377765219245e0d71281104a6e93c..9dbd0f75c6791573e7d347b9e33213fc599cedfe 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -816,6 +816,10 @@ with the same filename but different name
   <texture name="icon_diurnal.tga" />
   <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />
   <texture name="icon_top_pick.tga" />
+  <texture name="Icon_Place" file_name="icon_place.tga" preload="false" />
+  <texture name="Icon_Auction" file_name="icon_auction.tga" preload="false" />
+  <texture name="Icon_Group" file_name="icon_group.tga" preload="false" />
+
 
   <texture name="lag_status_critical.tga" />
   <texture name="lag_status_good.tga" />
@@ -877,23 +881,4 @@ with the same filename but different name
   <texture name="System_Notification" file_name="icons/SL_Logo.png" preload="true"/>
   <texture name="Icon_Attachment_Small" file_name="icons/Icon_Attachment_Small.png"	preload="true"/>
   <texture name="Icon_Attachment_Large" file_name="icons/Icon_Attachment_Large.png"	preload="true"/>
-<texture name="Icon_Place" file_name="icon_place.tga" preload="false" />
-<texture name="Icon_Auction" file_name="icon_auction.tga" preload="false" />
-<texture name="Icon_Group" file_name="icon_group.png" preload="false" />
-<texture name="Icon_Legacy_Event_PG" file_name="icon_legacy_event.tga" preload="false" />
-<texture name="Icon_Legacy_Event_Mature" file_name="icon_legacy_event_mature.tga" preload="false" />
-<texture name="Icon_Legacy_Event_Adult" file_name="icon_legacy_event_adult.tga" preload="false" />
-
-<texture name="ProgressLarge_1" file_name="icons/ProgressLarge_1.png" preload="true" />
-<texture name="ProgressLarge_2" file_name="icons/ProgressLarge_2.png" preload="true" />
-<texture name="ProgressLarge_3" file_name="icons/ProgressLarge_3.png" preload="true" />
-<texture name="ProgressLarge_4" file_name="icons/ProgressLarge_4.png" preload="true" />
-<texture name="ProgressLarge_5" file_name="icons/ProgressLarge_5.png" preload="true" />
-<texture name="ProgressLarge_6" file_name="icons/ProgressLarge_6.png" preload="true" />
-<texture name="ProgressLarge_7" file_name="icons/ProgressLarge_7.png" preload="true" />
-<texture name="ProgressLarge_8" file_name="icons/ProgressLarge_8.png" preload="true" />
-<texture name="ProgressLarge_9" file_name="icons/ProgressLarge_9.png" preload="true" />
-<texture name="ProgressLarge_10" file_name="icons/ProgressLarge_10.png" preload="true" />
-<texture name="ProgressLarge_11" file_name="icons/ProgressLarge_11.png" preload="true" />
-<texture name="ProgressLarge_12" file_name="icons/ProgressLarge_12.png" preload="true" />
 </textures>
diff --git a/indra/newview/skins/default/xui/en/floater_directory.xml b/indra/newview/skins/default/xui/en/floater_directory.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3c6d0cb7fee1f17c5a061f15982c43aef2957e74
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_directory.xml
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ single_instance="true"
+ can_resize="true"
+ height="590"
+ min_height="135"
+ min_width="430"
+ layout="topleft"
+ name="search"
+ save_rect="true"
+ title="SEARCH"
+ width="602">
+  <floater.string
+   name="not_found">
+&apos;[TEXT]&apos; not found
+  </floater.string>
+  <floater.string
+   name="no_results">
+No results
+  </floater.string>
+  <floater.string
+   name="result_spillover">
+Over [TOTAL] results Showing [VISIBLE_BEGIN]/[VISIBLE_END]
+  </floater.string>
+  <floater.string
+   name="result_count">
+[TOTAL] results.
+  </floater.string>
+  <floater.string
+   name="searching">
+Searching...
+  </floater.string>
+  <floater.string
+   name="all_categories">
+All Categories
+  </floater.string>
+  <floater.string
+   name="search_banned">
+Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards.
+  </floater.string>
+  <floater.string
+   name="search_short">
+Your search terms were too short so no search was performed.
+  </floater.string>
+  <floater.string
+   name="search_disabled">
+Directory search is disabled in this region.
+  </floater.string>
+  <floater.string
+   name="search_no_date_offset">
+Your search terms were missing the date offset.
+  </floater.string>
+  <floater.string
+   name="search_no_catgory">
+Your search terms were missing a category.
+  </floater.string>
+  <floater.string
+   name="search_no_query">
+Your search terms were missing a query string.
+  </floater.string>
+  <tab_container
+   border="true"
+   follows="all"
+   top="16"
+   left="0"
+   height="573"
+   width="602"
+   name="search_tabs"
+   tab_min_width="70"
+   tab_position="top">
+    <panel
+     border="false"
+     label="People"
+     filename="panel_search_people.xml"
+     class="panel_search_people"
+     name="panel_search_people"
+     follows="left|top|right"
+     layout="topleft"
+     left="0"
+     top="0"
+     bottom="-16" />
+    <panel
+     border="false"
+     label="Groups"
+     filename="panel_search_groups.xml"
+     class="panel_search_groups"
+     name="panel_search_groups"
+     follows="left|top|right"
+     layout="topleft"
+     left="0"
+     top="0"
+     bottom="-1" />
+    <panel
+     border="false"
+     label="Places"
+     filename="panel_search_places.xml"
+     class="panel_search_places"
+     name="panel_search_places"
+     follows="left|top|right"
+     layout="topleft"
+     left="0"
+     top="0"
+     bottom="-1" />
+    <panel
+     border="false"
+     label="Land"
+     filename="panel_search_landsales.xml"
+     class="panel_search_landsales"
+     name="panel_search_landsales"
+     follows="left|top|right"
+     layout="topleft"
+     left="0"
+     top="0"
+     bottom="-1" />
+    <panel
+     border="false"
+     label="Events"
+     filename="panel_search_events.xml"
+     class="panel_search_events"
+     name="panel_search_events"
+     follows="left|top|right"
+     layout="topleft"
+     left="0"
+     top="0"
+     bottom="-1" />
+    <panel
+     border="false"
+     label="Classifieds"
+     filename="panel_search_classifieds.xml"
+     class="panel_search_classifieds"
+     name="panel_search_classifieds"
+     follows="left|top|right"
+     layout="topleft"
+     left="0"
+     top="0"
+     bottom="-1" />
+    <panel
+     border="false"
+     label="AltaVista"
+     filename="panel_search_web.xml"
+     class="panel_search_web"
+     name="panel_search_web"
+     follows="all"
+     layout="topleft"
+     left="0"
+     top="0"
+     bottom="-1" />
+  </tab_container>
+ <layout_stack
+  follows="all"
+  animate="false"
+  top="86"
+  height="480"
+  left="0"
+  right="-1"
+  drag_handle_gap="2"
+  drag_handle_first_indent="1"
+  drag_handle_second_indent="1"
+  layout="topleft"
+  name="results_stack"
+  orientation="horizontal"
+  show_drag_handle="true">
+   <layout_panel
+    border="true"
+    auto_resize="true"
+    user_resize="true"
+    layout="topleft"
+    top="0"
+    left="0"
+    width="300"
+    bottom="-1"
+    min_height="10"
+    name="results_lp">
+     <scroll_list
+      layout="topleft"
+      top="1"
+      left="2"
+      width="300"
+      bottom="-1"
+      column_padding="0"
+      draw_heading="true"
+      follows="left|right|top|bottom"
+      multi_select="true"
+      name="results"
+      search_column="0" />
+   </layout_panel>
+   <layout_panel
+    border="true"
+    auto_resize="true"
+    user_resize="true"
+    layout="topleft"
+    top="0"
+    bottom="-1"
+    left="405"
+    width="313"
+    min_height="10"
+    name="detail_lp">
+     <panel
+      follows="all"
+      name="detail_avatar"
+      top="0"
+      bottom="-1"
+      left="0"
+      width="313"
+      class="panel_profile_legacy_sidetray"
+      filename="panel_profile_legacy_sidetray.xml" />
+     <panel
+      follows="all"
+      name="detail_group"
+      top="0"
+      bottom="-1"
+      left="0"
+      width="313"
+      class="panel_group_info_sidetray"
+      filename="panel_group_info_sidetray.xml" />
+     <panel
+      follows="all"
+      name="detail_place"
+      top="0"
+      bottom="-1"
+      left="0"
+      width="313"
+      class="panel_places"
+      filename="panel_places.xml" />
+     <panel
+      follows="all"
+      name="detail_event"
+      top="0"
+      bottom="-1"
+      left="0"
+      width="313"
+      class="panel_event_info"
+     filename="panel_event_info.xml" />
+     <panel
+      follows="all"
+      name="detail_classified"
+      top="0"
+      bottom="-1"
+      left="0"
+      width="313"
+      class="panel_classified_info"
+      filename="panel_classified_info.xml" />
+   </layout_panel>
+ </layout_stack>
+ <text
+  follows="bottom|left"
+  height="16"
+  layout="topleft"
+  left="4"
+  name="results_status"
+  top_pad="3"
+  value="[TOTAL] results"
+  width="205" />
+ <button
+  follows="bottom|left"
+  height="16"
+  width="16"
+  image_unselected="Arrow_Left"
+  image_disabled="Arrow_Left_Off"
+  image_disabled_selected="Arrow_Left_Off"
+  image_selected="Arrow_Left"
+  image_pressed="Arrow_Left"
+  image_top_pad="0"
+  layout="topleft"
+  left_pad="5"
+  name="PageDn"
+  top_delta="0" />
+ <button
+  follows="bottom|left"
+  height="16"
+  width="16"
+  image_unselected="Arrow_Right"
+  image_disabled="Arrow_Right_Off"
+  image_disabled_selected="Arrow_Right_Off"
+  image_selected="Arrow_Right"
+  image_pressed="Arrow_Right"
+  image_top_pad="0"
+  layout="topleft"
+  left_pad="5"
+  name="PageUp"
+  top_delta="0" />
+ <loading_indicator
+  follows="bottom|right"
+  height="16"
+  layout="topleft"
+  right="-4"
+  name="loading"
+  top_delta="0"
+  width="16" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_fs_search.xml b/indra/newview/skins/default/xui/en/floater_fs_search.xml
deleted file mode 100644
index 71f0b7a4444cb34877d115934d5ee4d84370ad5d..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/floater_fs_search.xml
+++ /dev/null
@@ -1,337 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater
-	can_resize="true"
-	default_tab_group="1"
-	height="590"
-	help_topic="search"
-	layout="topleft"
-	legacy_header_height="0"
-	min_height="590"
-	min_width="660"
-	name="floater_search"
-	positioning="centered"
-	save_rect="true"
-	single_instance="true"
-	title="SEARCH"
-	width="780">
-	<!-- Strings -->
-	<floater.string name="string.location">
-		Location: [LOCATION]
-	</floater.string>
-	<floater.string name="string.traffic">
-		Traffic: [DWELL]
-	</floater.string>
-	<floater.string name="string.area">
-		Area: [AREA]
-	</floater.string>
-	<floater.string name="string.members">
-		Members: [MEMBER_COUNT]
-	</floater.string>
-	<floater.string name="string.founder">
-		Founder: [FOUNDER]
-	</floater.string>
-	<floater.string name="string.age">
-		Age: [AGE]
-	</floater.string>
-	<floater.string name="string.partner">
-		Partner: [PARTNER]
-	</floater.string>
-	<floater.string name="string.listing_price">
-		Listing Price: [LISTING_PRICE]
-	</floater.string>
-	<floater.string name="string.slurl">
-		[SLURL]
-	</floater.string>
-	<floater.string name="string.duration">
-		Duration: [DURATION]
-	</floater.string>
-	<floater.string name="string.covercharge">
-		Cover: [COVERCHARGE]
-	</floater.string>
-	<!-- Tab time -->
-	<tab_container
-		layout="topleft"
-		follows="all"
-		top="1"
-		left="0"
-		name="ls_tabs"
-		tab_min_width="90"
-		tab_position="top"
-		width="780"
-		height="585">
-		<panel
-			class="panel_ls_web"
-			filename="panel_fs_search_legacy_web.xml"
-			label="Websearch"
-			layout="topleft"
-			name="panel_ls_web" />
-		<panel
-			class="panel_ls_people"
-			filename="panel_fs_search_legacy_people.xml"
-			label="People"
-			layout="topleft"
-			name="panel_ls_people" />
-		<panel
-			class="panel_ls_groups"
-			filename="panel_fs_search_legacy_groups.xml"
-			label="Groups"
-			layout="topleft"
-			name="panel_ls_groups" />
-		<panel
-			class="panel_ls_places"
-			filename="panel_fs_search_legacy_places.xml"
-			label="Places"
-			layout="topleft"
-			name="panel_ls_places" />
-		<panel
-			class="panel_ls_land"
-			filename="panel_fs_search_legacy_land.xml"
-			label="Land Sales"
-			layout="topleft"
-			name="panel_ls_land" />
-		<panel
-			class="panel_ls_events"
-			filename="panel_fs_search_legacy_events.xml"
-			label="Events"
-			layout="topleft"
-			name="panel_ls_events" />
-		<panel
-			class="panel_ls_classifieds"
-			filename="panel_fs_search_legacy_classifieds.xml"
-			label="Classifieds"
-			layout="topleft"
-			name="panel_ls_classifieds" />
-	</tab_container>
-	<!-- Details/Action Panes -->
-	<panel
-		border="true"
-		follows="top|right|bottom"
-		height="508"
-		layout="topleft"
-		left="412"
-		top="80"
-		width="366"
-		name="panel_ls_details">
-		<text_editor
-		left="12"
-		top="5"
-		height="24"
-		width="340"
-		layout="topleft"
-		follows="left|top|right"
-		name="title"
-		bg_visible="false"
-		border_visible="false"
-		allow_scroll="false"
-		h_pad="0"
-		v_pad="0"
-		halign="center"
-		enabled="false"
-		use_ellipses="true"
-		font="SansSerifHugeBold"
-		value="Undefined name" />
-		<texture_picker
-		enabled="false"
-		fallback_image="Generic_Person_Large"
-		follows="left|top|right"
-		height="210"
-		layout="topleft"
-		left="43"
-		name="snapshot"
-		top_pad="4"
-		width="280"/>
-		<texture_picker
-		enabled="false"
-		fallback_image="default_land_picture.j2c"
-		follows="left|top|right"
-		height="210"
-		layout="topleft"
-		left_delta="0"
-		name="snapshot_parcel"
-		top_delta="0"
-		visible="false"
-		width="280"/>
-		<text_editor
-		left="20"
-		top_pad="2"
-		height="16"
-		width="180"
-		layout="topleft"
-		follows="left|top|right"
-		name="aux1"
-		bg_visible="false"
-		border_visible="false"
-		h_pad="0"
-		v_pad="0"
-		word_wrap="true"
-		enabled="false"
-		max_length="117"
-		allow_scroll="false"
-		parse_urls="true"
-		value="Auxilary info field 1"/>
-		<text_editor
-		left_pad="4"
-		top_delta="0"
-		height="16"
-		width="140"
-		layout="topleft"
-		follows="left|top|right"
-		name="aux2"
-		bg_visible="false"
-		border_visible="false"
-		h_pad="0"
-		v_pad="0"
-		word_wrap="true"
-		enabled="false"
-		max_length="117"
-		allow_scroll="false"
-		parse_urls="true"
-		value="Auxilary info field 2"/>
-		<icon
-		follows="top|right"
-		height="16"
-		image_name="Unknown_Icon"
-		layout="topleft"
-		left="20"
-		top_pad="2"
-		name="maturity_icon"
-		width="18" />
-		<text_editor
-		left_pad="4"
-		top_delta="0"
-		height="28"
-		width="302"
-		layout="topleft"
-		follows="left|top|right"
-		name="location"
-		bg_visible="false"
-		border_visible="false"
-		h_pad="0"
-		v_pad="0"
-		word_wrap="true"
-		enabled="false"
-		max_length="117"
-		allow_scroll="false"
-		parse_urls="true"
-		value="Location info field"/>
-		<text_editor
-		left="20"
-		top_pad="12"
-		height="154"
-		width="324"
-		layout="topleft"
-		follows="left|top|right"
-		name="desc"
-		bg_visible="false"
-		border_visible="false"
-		h_pad="0"
-		v_pad="0"
-		word_wrap="true"
-		parse_urls="true"
-		enabled="false"
-		max_length="1000"
-		trusted_content="false"
-		value="You unlock this door with the key of imagination. Beyond it is another dimension: a dimension of sound, a dimension of sight, a dimension of mind. You're moving into a land of both shadow and substance, of things and ideas; you've just crossed over into the Twilight Zone. What you are about to see is real; the litigants on the screen are not actors. They are genuine citizens who, having filed their claims in a real small claims court, have been persuaded to drop their suits there and have them settled here, in this forum... the People's Court."/>
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Open Profile"
-		name="people_profile_btn"
-		top="484"
-		left="3"
-		width="120" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Send Message"
-		name="people_message_btn"
-		width="120"
-		left_pad="1" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Add Friend"
-		name="people_friend_btn"
-		width="120"
-		left_pad="1" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Open Profile"
-		name="group_profile_btn"
-		top="484"
-		left="3"
-		width="120" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Join Chat"
-		name="group_message_btn"
-		width="120"
-		left_pad="1" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Join Group"
-		name="group_join_btn"
-		width="120"
-		left_pad="1" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Teleport"
-		name="teleport_btn"
-		top="484"
-		left="3"
-		width="120" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Show on Map"
-		name="map_btn"
-		width="120"
-		left_pad="1" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Remind me"
-		name="event_reminder_btn"
-		width="120"
-		left_pad="1" />
-		<loading_indicator
-		left="134"
-		top="320"
-		follows="left|top|right"
-		mouse_opaque="false"
-		name="loading"
-		images_per_sec="1.0"
-		tab_stop="false"
-		height="100"
-		width="100"
-		visible="false" >
-			<images>
-				<image name="ProgressLarge_1"/>
-				<image name="ProgressLarge_2"/>
-				<image name="ProgressLarge_3"/>
-				<image name="ProgressLarge_4"/>
-				<image name="ProgressLarge_5"/>
-				<image name="ProgressLarge_6"/>
-				<image name="ProgressLarge_7"/>
-				<image name="ProgressLarge_8"/>
-				<image name="ProgressLarge_9"/>
-				<image name="ProgressLarge_10"/>
-				<image name="ProgressLarge_11"/>
-				<image name="ProgressLarge_12"/>
-			</images>
-		</loading_indicator>
-	</panel>
-</floater>
diff --git a/indra/newview/skins/default/xui/en/panel_event_info.xml b/indra/newview/skins/default/xui/en/panel_event_info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..81e884079f24b4f6c6a214adfb6f2eb9d01e28b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_event_info.xml
@@ -0,0 +1,456 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="event_info"
+ class="event_info"
+ top="20"
+ width="333">
+  <panel.string name="free">
+   FREE
+  </panel.string>
+  <panel.string name="hours">
+   hours
+  </panel.string>
+  <panel.string name="minutes">
+   minutes
+  </panel.string>
+  <panel.string name="type_mature">
+   Moderate
+  </panel.string>
+  <panel.string name="type_pg">
+  General Content
+  </panel.string>
+  <panel.string name="reminder">
+   Remind
+  </panel.string>
+  <panel.string name="no_reminder">
+   Don't remind
+  </panel.string>
+  <button
+   follows="top|left"
+   height="24"
+   image_hover_unselected="BackButton_Over"
+   image_pressed="BackButton_Press"
+   image_unselected="BackButton_Off"
+   layout="topleft"
+   name="back_btn"
+   left="10"
+   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="4"
+   name="title"
+   text_color="LtGray"
+   top="0"
+   value="Event Info"
+   use_ellipses="true"
+   width="275" />
+  <scroll_container
+   color="DkGray2"
+   opaque="true"
+   follows="all"
+   height="502"
+   layout="topleft"
+   left="10"
+   top_pad="10"
+   name="profile_scroll"
+   reserve_scroll_corner="false"
+   width="312">
+    <panel
+     name="scroll_content_panel"
+     follows="left|top"
+     min_height="300"
+     layout="topleft"
+     top="0"
+     background_visible="false"
+     height="610"
+     left="0"
+     width="285">
+     <panel
+     name="snapshot_panel"
+     layout="topleft"
+     follows="left|top|right"
+     height="197"
+     left="10"
+     top="10"
+     width="275">
+      <texture_picker
+       fallback_image="default_land_picture.j2c"
+       enabled="false"
+       follows="left|top|right"
+       height="197"
+       layout="topleft"
+       left="0"
+       name="snapshot"
+       top="0"
+       width="275" />
+    </panel>
+    <text_editor
+     allow_scroll="false"
+     bg_visible="false"
+     follows="left|top|right"
+     h_pad="0"
+     height="35"
+     width="290"
+     layout="topleft"
+     font="SansSerifBig"
+     font.style="BOLD"
+     left="10"
+     top_pad="10"
+     name="name"
+     read_only="true"
+     text_color="white"
+     v_pad="0"
+     value="[name]"
+     use_ellipses="true" />
+    <text
+     follows="left|top"
+     font.style="BOLD"
+     height="10"
+     layout="topleft"
+     left="10"
+     name="event_location_label"
+     text_color="white"
+     top_pad="5"
+     value="Location:"
+     width="250" />
+    <text_editor
+     parse_urls="true"
+     allow_scroll="false"
+     bg_visible="false"
+     follows="left|top"
+     h_pad="0"
+     height="30"
+     layout="topleft"
+     left="10"
+     name="location"
+     read_only="true"
+     top_pad="5"
+     width="290"
+     word_wrap="true"
+     v_pad="0"
+     value="[loading...]" />
+    <text
+     follows="left|top"
+     font.style="BOLD"
+     height="10"
+     layout="topleft"
+     left="10"
+     name="content_type_label"
+     text_color="white"
+     top_pad="10"
+     value="Content Type:"
+     width="140" />
+    <icon
+     follows="top|left"
+     height="16"
+     image_name="Parcel_M_Light"
+     layout="topleft"
+     left_pad="0"
+     name="content_type_moderate"
+     top_pad="-11"
+     width="18" />
+    <icon
+     follows="top|left"
+     height="16"
+     image_name="Parcel_PG_Light"
+     layout="topleft"
+     left_delta="0"
+     name="content_type_general"
+     top_delta="0"
+     width="18" />
+    <text_editor
+     allow_scroll="false"
+     bg_visible="false"
+     follows="left|top|right"
+     h_pad="0"
+     height="18"
+     layout="topleft"
+     left_pad="2"
+     name="content_type"
+     read_only="true"
+     width="130"
+     top_delta="1"
+     v_pad="0"
+     value="[content type]" />
+    <text
+     follows="left|top"
+     font.style="BOLD"
+     height="10"
+     layout="topleft"
+     left="10"
+     name="time_label"
+     text_color="white"
+     top_pad="0"
+     value="Time:"
+     width="140" />
+    <text_editor
+     allow_scroll="false"
+     bg_visible="false"
+     follows="left|top|right"
+     h_pad="0"
+     height="18"
+     layout="topleft"
+     left_pad="0"
+     name="time"
+     read_only="true"
+     width="150"
+     top_pad="-10"
+     v_pad="0"
+     value="[time]" />
+    <text
+     follows="left|top"
+     font.style="BOLD"
+     height="10"
+     layout="topleft"
+     left="10"
+     name="duration_label"
+     text_color="white"
+     top_pad="0"
+     value="Duration:"
+     width="140" />
+    <text_editor
+     allow_scroll="false"
+     bg_visible="false"
+     follows="left|top"
+     h_pad="0"
+     halign="left"
+     height="16"
+     layout="topleft"
+     left_pad="0"
+     name="duration"
+     read_only="true"
+     top_pad="-10"
+     v_pad="0"
+     value="[duration] hours"
+     width="150" />
+    <layout_stack
+     animate="false"
+     name="descr_stack"
+     layout="topleft"
+     follows="all"
+     orientation="vertical"
+     left="10"
+     top_pad="5"
+     width="290"
+     height="215">
+      <layout_panel
+       auto_resize="false"
+       name="host_layout_panel"
+       layout="topleft"
+       follows="all"
+       left="0"
+       top="0"
+       width="290"
+       height="16">
+       <text
+        follows="left|top"
+        font.style="BOLD"
+        height="10"
+        layout="topleft"
+        left="0"
+        name="host_label"
+        text_color="white"
+        top_pad="0"
+        value="Host:"
+        width="140" />
+       <text_editor
+        allow_scroll="false"
+        bg_visible="false"
+        follows="left|top"
+        h_pad="0"
+        halign="left"
+        height="16"
+        layout="topleft"
+        left_pad="0"
+        parse_urls="true"
+        name="host"
+        read_only="true"
+        top_pad="-10"
+        v_pad="0"
+        value="secondlife:///app/agent/00000000-0000-0000-0000-000000000000/inspect"
+        width="150" />
+      </layout_panel>
+      <layout_panel
+       auto_resize="false"
+       name="category_panel"
+       layout="topleft"
+       follows="all"
+       left="0"
+       top="0"
+       width="290"
+       height="16">
+        <text
+         follows="left|top"
+         font.style="BOLD"
+         height="10"
+         layout="topleft"
+         left="0"
+         name="category_label"
+         text_color="white"
+         top="0"
+         value="Category:"
+         width="140" />
+        <text
+         height="16"
+         layout="topleft"
+         follows="top|left"
+         left_pad="0"
+         name="category"
+         top_pad="-10"
+         value="[category]"
+         width="150" />
+      </layout_panel>
+      <layout_panel
+       auto_resize="false"
+       name="cover_panel"
+       layout="topleft"
+       follows="all"
+       left="0"
+       top="0"
+       width="290"
+       height="16">
+        <text
+         follows="left|top"
+         font.style="BOLD"
+         height="10"
+         layout="topleft"
+         left="0"
+         name="cover_label"
+         text_color="white"
+         top="0"
+         value="Cover:"
+         width="140" />
+        <text
+         height="16"
+         layout="topleft"
+         follows="top|left"
+         left_pad="0"
+         name="cover"
+         top_pad="-10"
+         value="L$[cover]"
+       width="150" />
+      </layout_panel>
+      <layout_panel
+       name="descr_layout_panel"
+       layout="topleft"
+       follows="all"
+       left="0"
+       top="0"
+       width="290"
+       height="215">
+        <text
+         auto_resize="false"
+         follows="left|top"
+         font.style="BOLD"
+         height="10"
+         layout="topleft"
+         left="0"
+         name="desc_label"
+         text_color="white"
+         top="0"
+         value="Description:"
+         width="250" />
+        <text_editor
+         parse_urls="true"
+         allow_scroll="true"
+         bg_visible="false"
+         follows="all"
+         h_pad="0"
+         height="200"
+         layout="topleft"
+         left="0"
+         max_length="1023"
+         name="desc"
+         read_only="true"
+         top_pad="7"
+         width="280"
+         v_pad="0"
+         value="[description]"
+         word_wrap="true" />
+      </layout_panel>
+    </layout_stack>
+  </panel>
+</scroll_container>
+<panel
+ follows="left|right|bottom"
+ height="35"
+ layout="topleft"
+ top_pad="5"
+ left="9"
+ name="buttons">
+  <layout_stack
+   follows="bottom|left|right"
+   height="23"
+   layout="topleft"
+   name="layout_stack1"
+   left="0"
+   orientation="horizontal"
+   top_pad="0"
+   width="309">
+    <layout_panel
+     follows="bottom|left|right"
+     height="23"
+     layout="bottomleft"
+     left="0"
+     name="layout_panel1"
+     auto_resize="true"
+     width="101">
+      <button
+       follows="bottom|left|right"
+       height="23"
+       label="Teleport"
+       layout="topleft"
+       left="0"
+       name="teleport_btn"
+       top="0"
+       width="101" />
+    </layout_panel>
+    <layout_panel
+     follows="bottom|left|right"
+     height="23"
+     layout="bottomleft"
+     left_pad="3"
+     name="show_on_map_btn_lp"
+     auto_resize="true"
+     width="100">
+      <button
+       follows="bottom|left|right"
+       height="23"
+       label="Map"
+       layout="topleft"
+       name="show_on_map_btn"
+       top="0"
+       width="100" />
+    </layout_panel>
+    <layout_panel
+     follows="bottom|left|right"
+     height="23"
+     layout="bottomleft"
+     left_pad="3"
+     name="remind_btn_lp"
+     auto_resize="true"
+     width="101">
+      <button
+       follows="bottom|left|right"
+       height="23"
+       label="Remind"
+       layout="topleft"
+       name="remind_btn"
+       top="0"
+       width="101" />
+    </layout_panel>
+  </layout_stack>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml
deleted file mode 100644
index 66c35558b10d93e30f6027ecaa2ac34ce6264715..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_classifieds.xml
+++ /dev/null
@@ -1,169 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="false"
- follows="all"
- height="566"
- layout="topleft"
- left="1"
- width="780"
- label="Classifieds"
- name="panel_ls_classifieds">
-	<panel
-	 border="false"
-	 follows="top|left|right"
-	 height="53"
-	 layout="topleft"
-	 left="0"
-	 width="780"
-	 name="panel_ls_input">
-		<text
-		 type="string"
-		 length="1"
-		 follows="left|top"
-		 top_pad="5"
-		 layout="topleft"
-		 left="6"
-		 name="search_text"
-		 top="12"
-		 height="16"
-		 width="156">
-		Enter search terms:
-		</text>
-		<search_combo_box
-		 layout="topleft"
-		 follows="left|top|right"
-		 height="23"
-		 left_delta="0"
-		 name="classifieds_edit"
-		 top="29"
-		 width="651" />
-		<combo_box
-		 follows="right|top"
-		 layout="topleft"
-		 height="23"
-		 allow_text_entry="false"
-		 top_delta="0"
-		 left_pad="2"
-		 name="classifieds_category"
-		 width="122">
-			<combo_box.commit_callback
-			 function="CommitSearch" />
-		</combo_box>
-		<check_box
-		 control_name="ShowPGClassifieds"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left="660"
-		 name="pg_all"
-		 top="12"
-		 width="15">
-			<check_box.commit_callback
-			 function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_PG_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_general"
-		 top_delta="-1"
-		 width="18"/>
-		<check_box
-		 control_name="ShowMatureClassifieds"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left_pad="2"
-		 name="mature_all"
-		 top_delta="1"
-		 width="15">
-			<check_box.commit_callback
-			 function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_M_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_moderate"
-		 top_delta="-1"
-		 width="18"/>
-		<check_box
-		 control_name="ShowAdultClassifieds"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left_pad="2"
-		 name="adult_all"
-		 top_delta="1"
-		 width="15">
-			<check_box.commit_callback
-			 function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_R_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_adult"
-		 top_delta="-1"
-		 width="18"/>
-	</panel>
-	<!-- Search Pane -->
-	<panel
-	 border="true"
-	 follows="all"
-	 height="510"
-	 layout="topleft"
-	 left="1"
-	 width="410"
-	 top_pad="1"
-	 name="panel_ls_scrolllist">
-		<scroll_list
-		 draw_heading="true"
-		 follows="all"
-		 height="485"
-		 layout="topleft"
-		 left="0"
-		 name="search_results_classifieds"
-		 top="0"
-		 width="410">
-			<columns
-			 label=""
-			 name="icon"
-			 width="20" />
-			<columns
-			 label="Name"
-			 name="classified_name"
-			 relwidth="0.70" />
-			<columns
-			 label="Listing Price"
-			 name="price"
-			 relwidth="0.3"/>
-		</scroll_list>
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 label="Back"
-	 	 name="classifieds_back"
-		 top_pad="2"
-		 left="3"
-		 width="100" />
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 label="Next"
-		 name="classifieds_next"
-		 width="100"
-		 left_pad="1" />
-	</panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml
deleted file mode 100644
index 3f7e3290a78b879bf0ad4ea5634c092f5d108beb..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_events.xml
+++ /dev/null
@@ -1,257 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="false"
- follows="all"
- height="566"
- layout="topleft"
- left="1"
- width="780"
- label="Events"
- name="panel_ls_events">
-	<panel
-	 border="false"
-	 follows="top|left|right"
-	 height="53"
-	 layout="topleft"
-	 left="0"
-	 width="780"
-	 name="panel_ls_input">
-		<text
-		 type="string"
-		 length="1"
-		 follows="left|top"
-		 top_pad="5"
-		 layout="topleft"
-		 left="6"
-		 name="search_text"
-		 top="12"
-		 height="16"
-		 width="156">
-		 Enter search terms:
-		</text>
-		<radio_group
-		 left_pad="20"
-		 height="16"
-		 width="300"
-		 layout="topleft"
-		 name="events_search_mode">
-			<radio_item
-			 height="16"
-			 label="Ongoing and Upcoming"
-			 layout="topleft"
-			 name="current"
-			 value="current"
-			 top_pad="0"
-			 width="120" />
-			<radio_item
-			 height="16"
-			 label="By Date"
-			 layout="topleft"
-			 name="date"
-			 value="date"
-			 left_pad="70"
-			 width="120" />
-			<radio_group.commit_callback
-			 function="CommitSearch" />
-		</radio_group>
-		<text
-		 type="string"
-		 length="1"
-		 follows="left|top"
-		 top_delta="0"
-		 layout="topleft"
-		 left_pad="5"
-		 name="events_date"
-		 font.style="BOLD"
-		 height="16"
-		 width="80">
-			4/20
-		</text>
-		<search_combo_box
-		 layout="topleft"
-		 follows="left|top|right"
-		 height="23"
-		 left="6"
-		 name="events_edit"
-		 top="29"
-		 width="651" />
-		<combo_box
-		 follows="right|top"
-		 layout="topleft"
-		 height="23"
-		 top_delta="0"
-		 left_pad="2"
-		 name="events_category"
-		 width="122">
-			<combo_box.item label="Any Category" name="any" value="0" />
-			<combo_box.item label="" value="filter_separator" enabled="false" />
-			<combo_box.item label="Discussion" name="discussion" value="18" />
-			<combo_box.item label="Sports" name="sports" value="19" />
-			<combo_box.item label="Live Music" name="music" value="20" />
-			<!-- <combo_box.item label="???" name="mystery_category" value="21" /> -->
-			<combo_box.item label="Commercial" name="commercial" value="22" />
-			<combo_box.item label="Nightlife/Entertainment" name="nightlife" value="23" />
-			<combo_box.item label="Games/Contests" name="games" value="24" />
-			<combo_box.item label="Pageants" name="pageants" value="25" />
-			<combo_box.item label="Education" name="education" value="26" />
-			<combo_box.item label="Arts and Culture" name="arts" value="27" />
-			<combo_box.item label="Charity/Support Groups" name="charity" value="28" />
-			<combo_box.item label="Miscellaneous" name="misc" value="29" />
-			<combo_box.commit_callback
-			 function="CommitSearch" />
-		</combo_box>
-		<check_box
-		 control_name="ShowPGEvents"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left="660"
-		 name="pg_all"
-		 top="12"
-		 width="15" >
-		<check_box.commit_callback
-		 function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_PG_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_general"
-		 top_delta="-1"
-		 width="18"/>
-		<check_box
-		 control_name="ShowMatureEvents"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left_pad="2"
-		 name="mature_all"
-		 top_delta="1"
-		 width="15">
-			<check_box.commit_callback
-			 function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_M_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_moderate"
-		 top_delta="-1"
-		 width="18"/>
-		<check_box
-		 control_name="ShowAdultEvents"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left_pad="2"
-		 name="adult_all"
-		 top_delta="1"
-		 width="15">
-			<check_box.commit_callback
-			 function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_R_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_adult"
-		 top_delta="-1"
-		 width="18"/>
-	</panel>
-	<!-- Search Pane -->
-	<panel
-	 border="true"
-	 follows="all"
-	 height="510"
-	 layout="topleft"
-	 left="1"
-	 width="410"
-	 top_pad="1"
-	 name="panel_ls_scrolllist">
-		<scroll_list
-		 draw_heading="true"
-		 follows="all"
-		 height="485"
-		 layout="topleft"
-		 left="0"
-		 name="search_results_events"
-		 sort_ascending="true"
-		 sort_column="3"
-		 top="0"
-		 width="410">
-			<columns
-			 label=""
-			 name="icon"
-			 width="20" />
-			<columns
-			 label="Event Name"
-			 name="name"
-			 relwidth="0.72" />
-			<columns
-			 label="Date/Time"
-			 name="date"
-			 sort_column="time"
-			 relwidth="0.28" />
-			<columns
-			 label="Time"
-			 name="time"
-			 width="0"/>
-		</scroll_list>
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 label="Yesterday"
-		 name="events_yesterday"
-		 top_pad="2"
-		 left="3"
-		 width="100" />
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 label="Today"
-		 name="events_today"
-		 width="100"
-		 left_pad="1" />
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 label="Tomorrow"
-		 name="events_tomorrow"
-		 width="100"
-		 left_pad="1" />
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 image_bottom_pad="2"
-		 image_overlay="Arrow_Left_Off"
-		 image_overlay_alignment="left"
-		 label="Back"
-		 name="events_back"
-		 width="25"
-		 left_pad="1" />
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 image_bottom_pad="2"
-		 image_overlay="Arrow_Right_Off"
-		 image_overlay_alignment="left"
-		 label="Next"
-		 name="events_next"
-		 width="25"
-		 left_pad="1" />
-	</panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_groups.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_groups.xml
deleted file mode 100644
index 90001952f7c38528926e77ddb32302e2e0b23bbc..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_groups.xml
+++ /dev/null
@@ -1,159 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
-	border="false"
-	follows="all"
-	height="566"
-	layout="topleft"
-	left="1"
-	width="780"
-	label="Groups"
-	name="panel_ls_groups">
-	<panel
-		border="false"
-		follows="top|left|right"
-		height="53"
-		layout="topleft"
-		left="0"
-		width="780"
-		name="panel_ls_input">
-		<text
-			type="string"
-			length="1"
-			follows="left|top"
-			top_pad="5"
-			layout="topleft"
-			left="6"
-			name="search_text"
-			top="12"
-			height="16"
-			width="156">
-			Enter search terms:
-		</text>
-		<search_combo_box
-		layout="topleft"
-		follows="left|top|right"
-		height="23"
-		left_delta="0"
-		name="groups_edit"
-		top="29"
-		width="770">
-		</search_combo_box>
-		<check_box
-		control_name="ShowPGGroups"
-		follows="right|top"
-		height="16"
-		label=""
-		layout="topleft"
-		left="660"
-		name="pg_all"
-		top="12"
-		width="15"
-		visible="false"/>
-		<icon
-		follows="right|top"
-		height="16"
-		image_name="Parcel_PG_Dark"
-		layout="topleft"
-		left_pad="2"
-		name="rating_icon_general"
-		top_delta="-1"
-		width="18"
-		visible="false"/>
-		<check_box
-		control_name="ShowMatureGroups"
-		follows="right|top"
-		height="16"
-		label=""
-		layout="topleft"
-		left_pad="2"
-		name="mature_all"
-		top_delta="1"
-		width="15"
-		visible="false"/>
-		<icon
-		follows="right|top"
-		height="16"
-		image_name="Parcel_M_Dark"
-		layout="topleft"
-		left_pad="2"
-		name="rating_icon_moderate"
-		top_delta="-1"
-		width="18"
-		visible="false"/>
-		<check_box
-		control_name="ShowAdultGroups"
-		follows="right|top"
-		height="16"
-		label=""
-		layout="topleft"
-		left_pad="2"
-		name="adult_all"
-		top_delta="1"
-		width="15"
-		visible="false"/>
-		<icon
-		follows="right|top"
-		height="16"
-		image_name="Parcel_R_Dark"
-		layout="topleft"
-		left_pad="2"
-		name="rating_icon_adult"
-		top_delta="-1"
-		width="18"
-		visible="false"/>
-	</panel>
-	<!-- Search Pane -->
-	<panel
-		border="true"
-		follows="all"
-		height="510"
-		layout="topleft"
-		left="1"
-		width="410"
-		top_pad="1"
-		name="panel_ls_scrolllist">
-		<scroll_list
-			draw_heading="true"
-			follows="all"
-			height="485"
-			layout="topleft"
-			left="0"
-			name="search_results_groups"
-			top="0"
-			width="410">
-			<columns
-			label=""
-			name="icon"
-			width="20" />
-			<columns
-			label="Group Name"
-			name="group_name"
-			relwidth="0.72" />
-			<columns
-			label="Members"
-			name="members"
-			relwidth="0.25" />
-			<columns
-			label="Score"
-			name="score"
-			width="0" />
-		</scroll_list>
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Back"
-		name="groups_back"
-		top_pad="2"
-		left="3"
-		width="100" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Next"
-		name="groups_next"
-		width="100"
-		left_pad="1" />
-	</panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_land.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_land.xml
deleted file mode 100644
index bb03a1e9995b765a5386002da4a82bba89cb7c77..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_land.xml
+++ /dev/null
@@ -1,281 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
-	border="false"
-	follows="all"
-	height="566"
-	layout="topleft"
-	left="1"
-	width="780"
-	label="Land Sales"
-	name="panel_ls_land">
-	<panel
-		border="false"
-		follows="top|left|right"
-		height="53"
-		layout="topleft"
-		left="0"
-		width="780"
-		name="panel_ls_input">
-		<check_box
-		 control_name="ShowPGLand"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left="660"
-		 name="pg_all"
-		 top="12"
-		 width="15">
-            <check_box.commit_callback
-             function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_PG_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_general"
-		 top_delta="-1"
-		 width="18"/>
-		<check_box
-		 control_name="ShowMatureLand"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left_pad="2"
-		 name="mature_all"
-		 top_delta="1"
-		 width="15">
-            <check_box.commit_callback
-             function="CommitSearch" />
-        </check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_M_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_moderate"
-		 top_delta="-1"
-		 width="18"/>
-		<check_box
-		 control_name="ShowAdultLand"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left_pad="2"
-		 name="adult_all"
-		 top_delta="1"
-         width="15">
-            <check_box.commit_callback
-             function="CommitSearch" />
-        </check_box>
-		<icon
-		follows="right|top"
-		height="16"
-		image_name="Parcel_R_Dark"
-		layout="topleft"
-		left_pad="2"
-		name="rating_icon_adult"
-		top_delta="-1"
-		width="18"/>
-		<text
-			type="string"
-			length="1"
-			follows="left|top"
-			layout="topleft"
-			left="6"
-			name="search_text"
-			top="12"
-			height="16"
-			width="256">
-			Enter search terms:
-		</text>
-		<combo_box
-			control_name="FindLandType"
-			follows="left|top"
-			layout="topleft"
-			height="23"
-			allow_text_entry="false"
-			top_pad="2"
-			left="6"
-			name="land_category"
-			width="122">
-                <combo_box.item label="All Categories" name="All" value="All"/>
-                <combo_box.item label="Auction" name="Auction" value="Auction"/>
-                <combo_box.item label="Mainland Sales" name="Mainland" value="Mainland"/>
-                <combo_box.item label="Estate Sales" name="Estate" value="Estate"/>
-                <combo_box.commit_callback
-                 function="CommitSearch" />
-		</combo_box>
-		<check_box
-		 control_name="FindLandPrice"
-		 follows="left|top"
-		 height="16"
-		 label="Price &lt;"
-		 layout="topleft"
-		 left_pad="3"
-		 name="price_check"
-		 top_delta="3"
-		 width="40" >
-            <check_box.commit_callback
-             function="CommitSearch" />
-        </check_box>
-		<line_editor
-		 enabled_control="FindLandPrice"
-		 bevel_style="none"
-		 border_style="line"
-		 border.border_thickness="0"
-		 commit_on_focus_lost="false"
-		 follows="left|top"
-		 height="18"
-		 left_pad="20"
-		 name="edit_price"
-		 top_delta="-1"
-		 width="40" >
-            <line_editor.commit_callback
-             function="CommitSearch" />
-        </line_editor>
-		<check_box
-		 control_name="FindLandArea"
-		 follows="left|top"
-		 height="16"
-		 label="Area &gt;"
-		 layout="topleft"
-		 left_pad="3"
-		 name="area_check"
-		 top_delta="1"
-		 width="40" >
-            <check_box.commit_callback
-             function="CommitSearch" />
-        </check_box>
-		<line_editor
-		enabled_control="FindLandArea"
-		bevel_style="none"
-		border_style="line"
-		border.border_thickness="0"
-		commit_on_focus_lost="false"
-		follows="left|top"
-		height="18"
-		left_pad="20"
-		name="edit_area"
-		top_delta="-1"
-		width="40" >
-            <line_editor.commit_callback
-             function="CommitSearch" />
-        </line_editor>
-		<text
-         type="string"
-         length="1"
-         follows="left|top"
-         layout="topleft"
-         left="365"
-         name="sort_text"
-         top="12"
-         height="16"
-         width="98">
-         Sort results by:
-		</text>
-		<check_box
-         follows="left|top"
-         height="16"
-         label="Ascending"
-         layout="topleft"
-         left_pad="3"
-         name="ascending_check"
-         width="100" >
-            <check_box.commit_callback
-             function="CommitSearch" />
-        </check_box>
-		<combo_box
-         follows="left|top"
-         layout="topleft"
-         height="23"
-         allow_text_entry="false"
-         left_delta="-102"
-         top_pad="1"
-         name="land_sort_combo"
-         width="118">
-			<combo_box.item label="Name" name="Name_item" value="Name"/>
-			<combo_box.item label="Price" name="Price_item" value="Price"/>
-			<combo_box.item label="Price per meter" name="PPM_item" value="PPM"/>
-			<combo_box.item label="Area" name="Area_item" value="Area"/>
-            <combo_box.commit_callback
-             function="CommitSearch" />
-		</combo_box>
-		<button
-		 follows="top|right"
-		 height="23"
-		 label="Search"
-		 layout="topleft"
-		 left="678"
-		 top_delta="0"
-		 name="land_find"
-		 width="100" />
-	</panel>
-	<!-- Search Pane -->
-	<panel
-     border="true"
-     follows="all"
-     height="510"
-     layout="topleft"
-     left="1"
-     width="410"
-     top_pad="1"
-     name="panel_ls_scrolllist">
-		<scroll_list
-         draw_heading="true"
-         follows="all"
-         height="485"
-         layout="topleft"
-         left="0"
-         name="search_results_land"
-         top="0"
-         width="410">
-			<columns
-			 label=""
-			 name="icon"
-			 width="20" />
-			 <columns
-			 label="Name"
-			 name="land_name"
-			 relwidth="0.45" />
-			<columns
-			 label="Price"
-			 name="price"
-			 relwidth="0.1" />
-            <columns
-			 label="Area"
-			 name="area"
-			 relwidth="0.1" />
-            <columns
-			 label="L$/m"
-			 name="ppm"
-			 relwidth="0.1" />
-			<columns
-			 label="Type"
-			 name="land_type"
-			 relwidth="0.2" />
-		</scroll_list>
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 label="Back"
-		 name="land_back"
-		 top_pad="2"
-		 left="3"
-		 width="100" />
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 label="Next"
-		 name="land_next"
-		 width="100"
-		 left_pad="1" />
-	</panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_people.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_people.xml
deleted file mode 100644
index 28df02a7e3ced559795525a87414e0945231b539..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_people.xml
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
-	border="false"
-	follows="all"
-	height="566"
-	layout="topleft"
-	left="1"
-	width="780"
-	label="People"
-	name="panel_ls_people">
-	<panel
-		border="false"
-		follows="top|left|right"
-		height="53"
-		layout="topleft"
-		left="0"
-		width="780"
-		name="panel_ls_input">
-		<text
-			type="string"
-			length="1"
-			follows="left|top"
-			top_pad="5"
-			layout="topleft"
-			left="6"
-			name="search_text"
-			top="12"
-			height="16"
-			width="156">
-			Enter search terms:
-		</text>
-		<search_combo_box
-		layout="topleft"
-		follows="left|top|right"
-		height="23"
-		left_delta="0"
-		name="people_edit"
-		top="29"
-		width="770">
-		</search_combo_box>
-	</panel>
-	<!-- Search Pane -->
-	<panel
-		border="true"
-		follows="all"
-		height="510"
-		layout="topleft"
-		left="1"
-		width="410"
-		top_pad="1"
-		name="panel_ls_scrolllist">
-		<scroll_list
-			content_type="Agents"
-			draw_heading="true"
-			follows="all"
-			height="485"
-			layout="topleft"
-			left="0"
-			name="search_results_people"
-			top="0"
-			width="410">
-			<columns
-			label=""
-			name="icon"
-			width="20" />
-			<columns
-			label="Name"
-			name="username"
-			relwidth="1" />
-		</scroll_list>
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Back"
-		name="people_back"
-		top_pad="2"
-		left="3"
-		width="100" />
-		<button
-		layout="topleft"
-		follows="left|bottom"
-		height="23"
-		label="Next"
-		name="people_next"
-		width="100"
-		left_pad="1" />
-	</panel>
-</panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml
deleted file mode 100644
index 09c142b8fc18688df44226384e6e7ae8a28a72ca..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_places.xml
+++ /dev/null
@@ -1,169 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- border="false"
- follows="all"
- height="566"
- layout="topleft"
- left="1"
- width="780"
- label="Places"
- name="panel_ls_places">
-	<panel
-	 border="false"
-	 follows="top|left|right"
-	 height="53"
-	 layout="topleft"
-	 left="0"
-	 width="780"
-	 name="panel_ls_input">
-		<text
-		 type="string"
-		 length="1"
-		 follows="left|top"
-		 top_pad="5"
-		 layout="topleft"
-		 left="6"
-		 name="search_text"
-		 top="12"
-		 height="16"
-		 width="156">
-		Enter search terms:
-		</text>
-		<search_combo_box
-		 layout="topleft"
-		 follows="left|top|right"
-		 height="23"
-		 left_delta="0"
-		 name="places_edit"
-		 top="29"
-		 width="651" />
-		<combo_box
-		 follows="right|top"
-		 layout="topleft"
-		 height="23"
-		 allow_text_entry="false"
-		 top_delta="0"
-		 left_pad="2"
-		 name="places_category"
-		 width="122">
-			<combo_box.commit_callback
-			 function="CommitSearch" />
-		</combo_box>
-		<check_box
- 		 control_name="ShowPGSims"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left="660"
-		 name="pg_all"
-		 top="12"
-		 width="15">
-			<check_box.commit_callback
-			 function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_PG_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_general"
-		 top_delta="-1"
-		 width="18"/>
-		<check_box
-		 control_name="ShowMatureSims"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left_pad="2"
-		 name="mature_all"
-		 top_delta="1"
-		 width="15">
-			<check_box.commit_callback
-			 function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_M_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_moderate"
-		 top_delta="-1"
-		 width="18"/>
-		<check_box
-		 control_name="ShowAdultSims"
-		 follows="right|top"
-		 height="16"
-		 label=""
-		 layout="topleft"
-		 left_pad="2"
-		 name="adult_all"
-		 top_delta="1"
-		 width="15">
-			<check_box.commit_callback
-			 function="CommitSearch" />
-		</check_box>
-		<icon
-		 follows="right|top"
-		 height="16"
-		 image_name="Parcel_R_Dark"
-		 layout="topleft"
-		 left_pad="2"
-		 name="rating_icon_adult"
-		 top_delta="-1"
-		 width="18"/>
-	</panel>
-	<!-- Search Pane -->
-	<panel
-	 border="true"
-	 follows="all"
-	 height="510"
-	 layout="topleft"
-	 left="1"
-	 width="410"
-	 top_pad="1"
-	 name="panel_ls_scrolllist">
-		<scroll_list
-		 draw_heading="true"
-		 follows="all"
-		 height="485"
-		 layout="topleft"
-		 left="0"
-		 name="search_results_places"
-		 top="0"
-		 width="410">
-			<columns
-			 label=""
-			 name="icon"
-			 width="20" />
-			<columns
-			 label="Name"
-			 name="place_name"
-			 relwidth="0.81" />
-			<columns
-			 label="Traffic"
-			 name="dwell"
-			 relwidth="0.16" />
-		</scroll_list>
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 label="Back"
-		 name="places_back"
-		 top_pad="2"
-		 left="3"
-		 width="100" />
-		<button
-		 layout="topleft"
-		 follows="left|bottom"
-		 height="23"
-		 label="Next"
-		 name="places_next"
-		 width="100"
-		 left_pad="1" />
-	</panel>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_web.xml b/indra/newview/skins/default/xui/en/panel_fs_search_legacy_web.xml
deleted file mode 100644
index 382a5e8945eafd325fbbb81c5225acdb8c52edc9..0000000000000000000000000000000000000000
--- a/indra/newview/skins/default/xui/en/panel_fs_search_legacy_web.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
-border="false"
-follows="all"
-height="566"
-layout="topleft"
-left="1"
-width="780"
-label="Websearch"
-name="panel_ls_web">
-	<web_browser
-	 top="5"
-	 bottom="-1"
-	 left="5"
-	 right="-5"
-	 layout="topleft"
-	 follows="all"
-	 name="search_browser"
-	 trusted_content="true"
-	 start_url="about:blank" />
-</panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_search_classifieds.xml b/indra/newview/skins/default/xui/en/panel_search_classifieds.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7af7ac76a94195a67acdfa65fe511ab7a4816673
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_search_classifieds.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="70"
+ layout="topleft"
+ name="panel_search_classifieds"
+ width="602">
+  <text
+   follows="left|top|right"
+   height="16"
+   layout="topleft"
+   left="4"
+   name="search_title"
+   top="4"
+   value="Enter search terms:"
+   width="255" />
+  <check_box
+   control_name="ShowPGClassifieds"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left="489"
+   name="pg_all"
+   top="4"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_PG_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_general"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowMatureClassifieds"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="mature_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_M_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_moderate"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowAdultClassifieds"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="adult_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_R_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_adult"
+   top_delta="-1"
+   width="18"/>
+  <search_editor
+   follows="top|left|right"
+   search_button_visible="true"
+   height="22"
+   text_readonly_color="DkGray"
+   label="Search"
+   layout="topleft"
+   top_pad="1"
+   left="4"
+   right="-128"
+   name="search_bar"
+   select_on_focus="true"
+   commit_on_focus_lost="false"
+   tool_tip="Enter search terms">
+    <search_editor.commit_callback
+     function="Search.query" />
+  </search_editor>
+  <combo_box
+   follows="right|top"
+   layout="topleft"
+   height="23"
+   allow_text_entry="false"
+   top_delta="0"
+   left_pad="2"
+   name="classifieds_category"
+   width="122">
+    <combo_box.commit_callback
+     function="Search.query" />
+  </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_search_events.xml b/indra/newview/skins/default/xui/en/panel_search_events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dbe5739bbf701ba1bc28ab402adbfd73d4177dd4
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_search_events.xml
@@ -0,0 +1,196 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="70"
+ layout="topleft"
+ name="panel_search_events"
+ width="602">
+  <text
+   follows="left|top"
+   height="16"
+   layout="topleft"
+   left="4"
+   name="search_title"
+   top="4"
+   value="Enter search terms:"
+   width="128" />
+  <radio_group
+   top_delta="0"
+   left="130"
+   height="16"
+   width="230"
+   layout="topleft"
+   initial_value="current"
+   name="events_search_mode">
+    <radio_item
+     height="16"
+     label="Ongoing and Upcoming"
+     layout="topleft"
+     name="current"
+     value="current"
+     top_pad="0"
+     width="120" />
+    <radio_item
+     height="16"
+     label="By Date"
+     layout="topleft"
+     name="date"
+     value="date"
+     left_pad="40"
+     width="120" />
+    <radio_group.commit_callback
+     function="Search.query" />
+  </radio_group>
+  <button
+   follows="top|left"
+   height="16"
+   width="16"
+   image_unselected="MinusItem_Off"
+   image_disabled="MinusItem_Disabled"
+   image_selected="MinusItem_Press"
+   image_pressed="MinusItem_Press"
+   image_top_pad="0"
+   layout="topleft"
+   left_pad="14"
+   name="minus_day"
+   top_delta="0">
+    <button.commit_callback
+     function="Search.MinusDay" />
+  </button>
+  <text
+   type="string"
+   length="1"
+   follows="left|top"
+   top_delta="0"
+   layout="topleft"
+   left_pad="5"
+   name="events_date"
+   font.style="BOLD"
+   height="16"
+   width="40"
+   value="4/20" />
+  <button
+   follows="top|left"
+   height="16"
+   width="16"
+   image_unselected="AddItem_Off"
+   image_disabled="AddItem_Disabled"
+   image_selected="AddItem_Press"
+   image_pressed="AddItem_Press"
+   image_top_pad="0"
+   layout="topleft"
+   left_pad="5"
+   name="plus_day"
+   top_delta="0">
+    <button.commit_callback
+     function="Search.AddDay" />
+  </button>
+  <check_box
+   control_name="ShowPGEvents"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left="489"
+   name="pg_all"
+   top="4"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_PG_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_general"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowMatureEvents"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="mature_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_M_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_moderate"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowAdultEvents"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="adult_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_R_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_adult"
+   top_delta="-1"
+   width="18"/>
+  <search_editor
+   follows="top|left|right"
+   search_button_visible="true"
+   height="22"
+   text_readonly_color="DkGray"
+   label="Search"
+   layout="topleft"
+   top_pad="1"
+   left="4"
+   right="-128"
+   name="search_bar"
+   select_on_focus="true"
+   commit_on_focus_lost="false"
+   tool_tip="Enter search terms">
+    <search_editor.commit_callback
+     function="Search.query" />
+  </search_editor>
+  <combo_box
+   follows="right|top"
+   layout="topleft"
+   height="23"
+   allow_text_entry="false"
+   top_delta="0"
+   left_pad="2"
+   name="events_category"
+   width="122">
+    <combo_box.item label="Any Category" name="any" value="0" />
+    <combo_box.item label="" value="filter_separator" enabled="false" />
+    <combo_box.item label="Discussion" name="discussion" value="18" />
+    <combo_box.item label="Sports" name="sports" value="19" />
+    <combo_box.item label="Live Music" name="music" value="20" />
+    <!-- <combo_box.item label="???" name="mystery_category" value="21" /> -->
+    <combo_box.item label="Commercial" name="commercial" value="22" />
+    <combo_box.item label="Nightlife/Entertainment" name="nightlife" value="23" />
+    <combo_box.item label="Games/Contests" name="games" value="24" />
+    <combo_box.item label="Pageants" name="pageants" value="25" />
+    <combo_box.item label="Education" name="education" value="26" />
+    <combo_box.item label="Arts and Culture" name="arts" value="27" />
+    <combo_box.item label="Charity/Support Groups" name="charity" value="28" />
+    <combo_box.item label="Miscellaneous" name="misc" value="29" />
+    <combo_box.commit_callback
+     function="Search.query" />
+  </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_search_groups.xml b/indra/newview/skins/default/xui/en/panel_search_groups.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3fd136702897b30b9b178ea8ef6db3b28bc2c8d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_search_groups.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="70"
+ layout="topleft"
+ name="panel_search_groups"
+ width="602">
+  <text
+   follows="left|top|right"
+   height="16"
+   layout="topleft"
+   left="4"
+   name="search_title"
+   top="4"
+   value="Enter search terms:"
+   width="255" />
+  <check_box
+   control_name="ShowPGGroups"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left="489"
+   name="pg_all"
+   top="4"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_PG_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_general"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowMatureGroups"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="mature_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_M_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_moderate"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowAdultGroups"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="adult_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_R_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_adult"
+   top_delta="-1"
+   width="18"/>
+  <search_editor
+   follows="top|left|right"
+   search_button_visible="true"
+   height="22"
+   text_readonly_color="DkGray"
+   label="Search"
+   layout="topleft"
+   top_pad="1"
+   left="4"
+   right="-4"
+   name="search_bar"
+   select_on_focus="true"
+   commit_on_focus_lost="false"
+   tool_tip="Enter search terms">
+    <search_editor.commit_callback
+     function="Search.query" />
+  </search_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_search_landsales.xml b/indra/newview/skins/default/xui/en/panel_search_landsales.xml
new file mode 100644
index 0000000000000000000000000000000000000000..982fcdefc9db9a7f7b13f0dcce8582965dc748ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_search_landsales.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="70"
+ layout="topleft"
+ name="panel_search_landsales"
+ width="602">
+  <text
+   follows="left|top|right"
+   height="16"
+   layout="topleft"
+   left="4"
+   name="search_title"
+   top="4"
+   value="Enter search terms:"
+   width="255" />
+  <check_box
+   control_name="ShowPGLand"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left="489"
+   name="pg_all"
+   top="4"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_PG_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_general"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowMatureLand"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="mature_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_M_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_moderate"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowAdultLand"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="adult_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_R_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_adult"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="FindLandPrice"
+   follows="left|top"
+   height="16"
+   label="Price &lt;"
+   layout="topleft"
+   left="4"
+   name="price_check"
+   top_pad="6"
+   width="40" >
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <line_editor
+   enabled_control="FindLandPrice"
+   commit_on_focus_lost="false"
+   follows="left|top"
+   height="16"
+   left_pad="20"
+   name="edit_price"
+   layout="topleft"
+   top_delta="-1"
+   width="40" >
+    <line_editor.commit_callback
+     function="Search.query" />
+  </line_editor>
+  <check_box
+   control_name="FindLandArea"
+   follows="left|top"
+   height="16"
+   label="Area &gt;"
+   layout="topleft"
+   left_pad="3"
+   name="area_check"
+   top_delta="1"
+   width="40" >
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <line_editor
+   enabled_control="FindLandArea"
+   commit_on_focus_lost="false"
+   follows="left|top"
+   layout="topleft"
+   height="16"
+   left_pad="18"
+   name="edit_area"
+   top_delta="-1"
+   width="40" >
+    <line_editor.commit_callback
+     function="Search.query" />
+  </line_editor>
+  <combo_box
+   control_name="FindLandType"
+   follows="right|top"
+   layout="topleft"
+   height="22"
+   allow_text_entry="false"
+   left_pad="90"
+   top_delta="-1"
+   name="land_type"
+   width="110">
+    <combo_box.item label="All Categories" name="All" value="All"/>
+    <combo_box.item label="Auction" name="Auction" value="Auction"/>
+    <combo_box.item label="Mainland Sales" name="Mainland" value="Mainland"/>
+    <combo_box.item label="Estate Sales" name="Estate" value="Estate"/>
+    <combo_box.commit_callback
+     function="Search.query" />
+  </combo_box>
+  <combo_box
+   control_name="FindLandSort"
+   follows="right|top"
+   layout="topleft"
+   height="22"
+   allow_text_entry="false"
+   left_pad="2"
+   top_delta="0"
+   name="land_sort"
+   width="110">
+    <combo_box.item label="Sort by Name" name="Name_item" value="Name"/>
+    <combo_box.item label="Sort by Price" name="Price_item" value="Price"/>
+    <combo_box.item label="Sort by Price per meter" name="PPM_item" value="PPM"/>
+    <combo_box.item label="Sort by Area" name="Area_item" value="Area"/>
+    <combo_box.commit_callback
+     function="Search.query" />
+  </combo_box>
+  <check_box
+   control_name="FindLandSortAscending"
+   follows="right|top"
+   height="16"
+   label="Ascending"
+   layout="topleft"
+   left_pad="3"
+   name="ascending"
+   top_delta="5"
+   width="40" >
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_search_people.xml b/indra/newview/skins/default/xui/en/panel_search_people.xml
new file mode 100644
index 0000000000000000000000000000000000000000..addd20ff739ee3eccb085711d406ba6ad226d759
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_search_people.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="70"
+ class="panel_search_people"
+ name="panel_search_people"
+ width="602">
+  <panel.string name="SeachFilteredOnShortWordsEmpty">
+   Your search terms were too short so no search was performed.
+  </panel.string>
+  <text
+   follows="left|top|right"
+   height="16"
+   layout="topleft"
+   left="4"
+   name="search_title"
+   top="4"
+   value="Enter search terms:"
+   width="255" />
+  <search_editor
+   follows="top|left|right"
+   search_button_visible="true"
+   height="22"
+   text_readonly_color="DkGray"
+   label="Search"
+   layout="topleft"
+   top_pad="1"
+   left="4"
+   right="-4"
+   name="search_bar"
+   select_on_focus="true"
+   commit_on_focus_lost="false"
+   tool_tip="Enter search terms">
+    <search_editor.commit_callback
+     function="Search.query" />
+  </search_editor>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_search_places.xml b/indra/newview/skins/default/xui/en/panel_search_places.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fabc2c6bbaaacaa7048d3ce05c47ce17e259356a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_search_places.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="70"
+ layout="topleft"
+ name="panel_search_places"
+ width="602">
+  <text
+   follows="left|top|right"
+   height="16"
+   layout="topleft"
+   left="4"
+   name="search_title"
+   top="4"
+   value="Enter search terms:"
+   width="255" />
+  <check_box
+   control_name="ShowPGSims"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left="489"
+   name="pg_all"
+   top="4"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_PG_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_general"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowMatureSims"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="mature_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_M_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_moderate"
+   top_delta="-1"
+   width="18"/>
+  <check_box
+   control_name="ShowAdultSims"
+   follows="right|top"
+   height="16"
+   label=""
+   layout="topleft"
+   left_pad="2"
+   name="adult_all"
+   top_delta="1"
+   width="15">
+    <check_box.commit_callback
+     function="Search.query" />
+  </check_box>
+  <icon
+   follows="right|top"
+   height="16"
+   image_name="Parcel_R_Dark"
+   layout="topleft"
+   left_pad="2"
+   name="rating_icon_adult"
+   top_delta="-1"
+   width="18"/>
+  <search_editor
+   follows="top|left|right"
+   search_button_visible="true"
+   height="22"
+   text_readonly_color="DkGray"
+   label="Search"
+   layout="topleft"
+   top_pad="1"
+   left="4"
+   right="-128"
+   name="search_bar"
+   select_on_focus="true"
+   commit_on_focus_lost="false"
+   tool_tip="Enter search terms">
+    <search_editor.commit_callback
+     function="Search.query" />
+  </search_editor>
+  <combo_box
+   follows="right|top"
+   layout="topleft"
+   height="23"
+   allow_text_entry="false"
+   top_delta="0"
+   left_pad="2"
+   name="places_category"
+   width="122">
+    <combo_box.commit_callback
+     function="Search.query" />
+  </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_search_web.xml b/indra/newview/skins/default/xui/en/panel_search_web.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c160728e735bd2ff26b91a2eb2d0d00bd2b61357
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_search_web.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="775"
+ layout="topleft"
+ follows="all"
+ name="panel_search_web"
+ width="780">
+  <layout_stack
+    bottom="775"
+    follows="all"
+    layout="topleft"
+    left="5"
+    animate="false"
+    name="stack1"
+    orientation="vertical"
+    top="4"
+    width="770">
+    <layout_panel
+      height="40"
+      follows="all"
+      layout="topleft"
+      left_delta="0"
+      name="external_controls"
+      top_delta="0"
+      auto_resize="true"
+      width="585">
+      <web_browser
+        bottom="-2"
+        follows="all"
+        layout="topleft"
+        left="0"
+        name="webbrowser"
+        top="0"/>
+    </layout_panel>
+    <layout_panel
+     name="status_bar"
+     height="23"
+     auto_resize="false">
+      <button
+       image_overlay="Arrow_Left_Off"
+       image_disabled="PushButton_Disabled"
+       image_disabled_selected="PushButton_Disabled"
+       image_selected="PushButton_Selected"
+       image_unselected="PushButton_Off"
+       chrome="true"
+       hover_glow_amount="0.15"
+       tool_tip="Navigate back"
+       follows="left|top"
+       height="22"
+       layout="topleft"
+       left="1"
+       name="back"
+       top="0"
+       width="22">
+        <button.commit_callback
+         function="WebContent.Back" />
+      </button>
+      <button
+       image_overlay="Arrow_Right_Off"
+       image_disabled="PushButton_Disabled"
+       image_disabled_selected="PushButton_Disabled"
+       image_selected="PushButton_Selected"
+       image_unselected="PushButton_Off"
+       chrome="true"
+       tool_tip="Navigate forward"
+       follows="left|top"
+       height="22"
+       layout="topleft"
+       left="27"
+       name="forward"
+       top_delta="0"
+       width="22">
+        <button.commit_callback
+         function="WebContent.Forward" />
+      </button>
+      <button
+       image_overlay="Stop_Off"
+       image_disabled="PushButton_Disabled"
+       image_disabled_selected="PushButton_Disabled"
+       image_selected="PushButton_Selected"
+       image_unselected="PushButton_Off"
+       chrome="true"
+       tool_tip="Stop navigation"
+       enabled="true"
+       follows="left|top"
+       height="22"
+       layout="topleft"
+       left="51"
+       name="stop"
+       top_delta="0"
+       width="22">
+        <button.commit_callback
+         function="WebContent.Stop" />
+      </button>
+      <button
+       image_overlay="Refresh_Off"
+       image_disabled="PushButton_Disabled"
+       image_disabled_selected="PushButton_Disabled"
+       image_selected="PushButton_Selected"
+       image_unselected="PushButton_Off"
+       chrome="true"
+       tool_tip="Reload page"
+       follows="left|top"
+       height="22"
+       layout="topleft"
+       left="51"
+       name="reload"
+       top_delta="0"
+       width="22">
+        <button.commit_callback
+         function="WebContent.Reload" />
+      </button>
+      <text
+       type="string"
+       length="200"
+       follows="bottom|left"
+       height="20"
+       layout="topleft"
+       left_pad="3"
+       name="statusbartext"
+       parse_urls="false"
+       text_color="0.4 0.4 0.4 1"
+       top_delta="1"
+       width="441"/>
+      <progress_bar
+       color_bar="0.3 1.0 0.3 1"
+       follows="bottom|right"
+       height="16"
+       top_delta="1"
+       left_pad="3"
+       layout="topleft"
+       name="statusbarprogress"
+       width="64"/>
+    </layout_panel>
+  </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index fa921f601eb494f52cac1ecb907dbb12963f0a51..06bc6eb48815b456f36bf602287c70783ab42aa3 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2916,13 +2916,13 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .anim
 	<string name="None">None</string>
 	<string name="Linden Location">Linden Location</string>
 	<string name="Adult">Adult</string>
-	<string name="Arts and Culture">Arts &amp; Culture</string>
+	<string name="Arts&amp;Culture">Arts &amp; Culture</string>
 	<string name="Business">Business</string>
 	<string name="Educational">Educational</string>
 	<string name="Gaming">Gaming</string>
 	<string name="Hangout">Hangout</string>
 	<string name="Newcomer Friendly">Newcomer Friendly</string>
-	<string name="Parks and Nature">Parks &amp; Nature</string>
+	<string name="Parks&amp;Nature">Parks &amp; Nature</string>
 	<string name="Residential">Residential</string>
 	<!--<string name="Shopping">Shopping</string>	-->
 	<string name="Stage">Stage</string>
@@ -4370,13 +4370,6 @@ and report the problem.
   <string name="outfit_photo_load_codec_error">Invalid image format. Please use another image</string>
 
   <!-- Alchemy Strings -->
-  <string name="not_found">&apos;[TEXT]&apos; not found</string>
-  <string name="no_results">No results</string>
-  <string name="searching">Searching...</string>
-  <string name="all_categories">All Categories</string>
-  <string name="search_banned">Some terms in your search query were excluded due to content restrictions as clarified in the Community Standards.</string>
-  <string name="search_short">Your search terms were too short so no search was performed.</string>
-  <string name="search_disabled">Legacy Search has been disabled in this region.</string>
   <string name="NotifyIncomingMessage">Incoming message from [NAME]...</string>
   <string name="AvatarTyping">Typing</string>
   <string name="UnknownAvatar">Unknown Avatar</string>