From 22a00c93b32cb0498c6c87712078971c7a9d70c8 Mon Sep 17 00:00:00 2001
From: Unexpectedly Dismantled <darl@alchemyviewer.org>
Date: Thu, 20 May 2021 16:47:20 -0400
Subject: [PATCH] Initial port of integrated search from Alchemy classic

The following file is placeholder from the port and broken:
indra/newview/skins/default/xui/en/panel_profile_legacy_sidetray.xml

Featuring work by:
Cinder <cinder@sdf.org>
Rye Mutt <rye@alchemyviewer.org>
---
 indra/newview/CMakeLists.txt                  |  134 +-
 .../newview/app_settings/settings_alchemy.xml |   22 +
 indra/newview/lleventnotifier.cpp             |   23 +-
 indra/newview/lleventnotifier.h               |   29 +-
 indra/newview/llfloaterdirectory.cpp          | 1175 +++++++++++++++++
 indra/newview/llfloaterdirectory.h            |  115 ++
 indra/newview/llpanelclassified.cpp           |    4 +-
 indra/newview/llpaneleventinfo.cpp            |  158 +++
 indra/newview/llpaneleventinfo.h              |   59 +
 indra/newview/llpanelsearchbase.cpp           |   43 +
 indra/newview/llpanelsearchbase.h             |   55 +
 indra/newview/llpanelsearchclassifieds.cpp    |  109 ++
 indra/newview/llpanelsearchclassifieds.h      |   53 +
 indra/newview/llpanelsearchevents.cpp         |  136 ++
 indra/newview/llpanelsearchevents.h           |   56 +
 indra/newview/llpanelsearchgroups.cpp         |   98 ++
 indra/newview/llpanelsearchgroups.h           |   51 +
 indra/newview/llpanelsearchlandsales.cpp      |  118 ++
 indra/newview/llpanelsearchlandsales.h        |   47 +
 indra/newview/llpanelsearchpeople.cpp         |   87 ++
 indra/newview/llpanelsearchpeople.h           |   51 +
 indra/newview/llpanelsearchplaces.cpp         |  113 ++
 indra/newview/llpanelsearchplaces.h           |   53 +
 indra/newview/llstartup.cpp                   |   13 +
 indra/newview/llviewerfloaterreg.cpp          |    2 +
 .../skins/default/textures/icon_auction.tga   |  Bin 0 -> 1068 bytes
 .../skins/default/textures/icon_group.png     |  Bin 0 -> 484 bytes
 .../skins/default/textures/icon_place.tga     |  Bin 0 -> 1068 bytes
 .../skins/default/textures/textures.xml       |    3 +
 .../default/xui/en/floater_directory.xml      |  282 ++++
 .../skins/default/xui/en/menu_viewer.xml      |   10 +
 .../skins/default/xui/en/panel_event_info.xml |  456 +++++++
 .../xui/en/panel_profile_legacy_sidetray.xml  |  323 +++++
 .../xui/en/panel_search_classifieds.xml       |  111 ++
 .../default/xui/en/panel_search_events.xml    |  196 +++
 .../default/xui/en/panel_search_groups.xml    |   99 ++
 .../default/xui/en/panel_search_landsales.xml |  181 +++
 .../default/xui/en/panel_search_people.xml    |   36 +
 .../default/xui/en/panel_search_places.xml    |  111 ++
 39 files changed, 4546 insertions(+), 66 deletions(-)
 create mode 100644 indra/newview/llfloaterdirectory.cpp
 create mode 100644 indra/newview/llfloaterdirectory.h
 create mode 100644 indra/newview/llpaneleventinfo.cpp
 create mode 100644 indra/newview/llpaneleventinfo.h
 create mode 100644 indra/newview/llpanelsearchbase.cpp
 create mode 100644 indra/newview/llpanelsearchbase.h
 create mode 100644 indra/newview/llpanelsearchclassifieds.cpp
 create mode 100644 indra/newview/llpanelsearchclassifieds.h
 create mode 100644 indra/newview/llpanelsearchevents.cpp
 create mode 100644 indra/newview/llpanelsearchevents.h
 create mode 100644 indra/newview/llpanelsearchgroups.cpp
 create mode 100644 indra/newview/llpanelsearchgroups.h
 create mode 100644 indra/newview/llpanelsearchlandsales.cpp
 create mode 100644 indra/newview/llpanelsearchlandsales.h
 create mode 100644 indra/newview/llpanelsearchpeople.cpp
 create mode 100644 indra/newview/llpanelsearchpeople.h
 create mode 100644 indra/newview/llpanelsearchplaces.cpp
 create mode 100644 indra/newview/llpanelsearchplaces.h
 create mode 100644 indra/newview/skins/default/textures/icon_auction.tga
 create mode 100644 indra/newview/skins/default/textures/icon_group.png
 create mode 100644 indra/newview/skins/default/textures/icon_place.tga
 create mode 100644 indra/newview/skins/default/xui/en/floater_directory.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_event_info.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_profile_legacy_sidetray.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_search_classifieds.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_search_events.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_search_groups.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_search_landsales.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_search_people.xml
 create mode 100644 indra/newview/skins/default/xui/en/panel_search_places.xml

diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index a0dfd9e2eca..7b9a4088e68 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -113,11 +113,11 @@ include_directories(SYSTEM
     )
 
 set(viewer_SOURCE_FILES
-    alcinematicmode.cpp
     alaoengine.cpp
     alaoset.cpp
     alavataractions.cpp
     alchatcommand.cpp
+    alcinematicmode.cpp
     alcontrolcache.cpp
     alfloaterao.cpp
     alfloaterparticleeditor.cpp
@@ -132,7 +132,6 @@ set(viewer_SOURCE_FILES
     alviewermenu.cpp
     groupchatlistener.cpp
     llaccountingcostmanager.cpp
-    llaisapi.cpp
     llagent.cpp
     llagentaccess.cpp
     llagentbenefits.cpp
@@ -144,6 +143,7 @@ set(viewer_SOURCE_FILES
     llagentpilot.cpp
     llagentui.cpp
     llagentwearables.cpp
+    llaisapi.cpp
     llanimstatelabels.cpp
     llappcorehttp.cpp
     llappearancemgr.cpp
@@ -156,9 +156,9 @@ set(viewer_SOURCE_FILES
     llavatariconctrl.cpp
     llavatarlist.cpp
     llavatarlistitem.cpp
+    llavatarpropertiesprocessor.cpp
     llavatarrenderinfoaccountant.cpp
     llavatarrendernotifier.cpp
-    llavatarpropertiesprocessor.cpp
     llblockedlistitem.cpp
     llblocklist.cpp
     llbox.cpp
@@ -196,8 +196,8 @@ set(viewer_SOURCE_FILES
     lldeferredsounds.cpp
     lldelayedgestureerror.cpp
     lldirpicker.cpp
-    lldonotdisturbnotificationstorage.cpp
     lldndbutton.cpp
+    lldonotdisturbnotificationstorage.cpp
     lldrawable.cpp
     lldrawpool.cpp
     lldrawpoolalpha.cpp
@@ -230,7 +230,6 @@ set(viewer_SOURCE_FILES
     llflexibleobject.cpp
     llfloaterabout.cpp
     llfloaterassetrecovery.cpp
-    llfloaterbvhpreview.cpp
     llfloaterauction.cpp
     llfloaterautoreplacesettings.cpp
     llfloateravatar.cpp
@@ -248,6 +247,7 @@ set(viewer_SOURCE_FILES
     llfloaterbuycurrency.cpp
     llfloaterbuycurrencyhtml.cpp
     llfloaterbuyland.cpp
+    llfloaterbvhpreview.cpp
     llfloatercamera.cpp
     llfloatercamerapresets.cpp
     llfloaterchatalerts.cpp
@@ -257,6 +257,7 @@ set(viewer_SOURCE_FILES
     llfloaterconversationpreview.cpp
     llfloaterdeleteprefpreset.cpp
     llfloaterdestinations.cpp
+    llfloaterdirectory.cpp
     llfloaterdisplayname.cpp
     llfloatereditenvironmentbase.cpp
     llfloatereditextdaycycle.cpp
@@ -280,9 +281,12 @@ set(viewer_SOURCE_FILES
     llfloaterhoverheight.cpp
     llfloaterhud.cpp
     llfloaterimagepreview.cpp
-    llfloaterimsessiontab.cpp
-    llfloaterimsession.cpp
     llfloaterimcontainer.cpp
+    llfloaterimnearbychat.cpp
+    llfloaterimnearbychathandler.cpp
+    llfloaterimnearbychatlistener.cpp
+    llfloaterimsession.cpp
+    llfloaterimsessiontab.cpp
     llfloaterinspect.cpp
     llfloaterjoystick.cpp
     llfloaterlagmeter.cpp
@@ -290,21 +294,21 @@ set(viewer_SOURCE_FILES
     llfloaterlandholdings.cpp
     llfloaterlinkreplace.cpp
     llfloaterloadprefpreset.cpp
-    llfloatermarketplacelistings.cpp
     llfloatermap.cpp
+    llfloatermarketplacelistings.cpp
     llfloatermediasettings.cpp
     llfloatermemleak.cpp
     llfloatermodelpreview.cpp
     llfloatermodeluploadbase.cpp
-    llfloatermyscripts.cpp
     llfloatermyenvironment.cpp
+    llfloatermyscripts.cpp
     llfloaternamedesc.cpp
     llfloaternotificationsconsole.cpp
     llfloaternotificationstabbed.cpp
-    llfloateroutfitphotopreview.cpp 
-    llfloateroutfitsnapshot.cpp
     llfloaterobjectweights.cpp
     llfloateropenobject.cpp
+    llfloateroutfitphotopreview.cpp 
+    llfloateroutfitsnapshot.cpp
     llfloaterpathfindingcharacters.cpp
     llfloaterpathfindingconsole.cpp
     llfloaterpathfindinglinksets.cpp
@@ -312,15 +316,15 @@ set(viewer_SOURCE_FILES
     llfloaterpay.cpp
     llfloaterperms.cpp
     llfloaterpostprocess.cpp
-    llfloaterprofile.cpp
     llfloaterpreference.cpp
     llfloaterpreferenceviewadvanced.cpp
     llfloaterpreviewtrash.cpp
+    llfloaterprofile.cpp
     llfloaterproperties.cpp
     llfloaterregiondebugconsole.cpp
     llfloaterregioninfo.cpp
-    llfloaterreporter.cpp
     llfloaterregionrestarting.cpp
+    llfloaterreporter.cpp
     llfloatersavecamerapreset.cpp
     llfloatersaveprefpreset.cpp
     llfloatersceneloadstats.cpp
@@ -352,10 +356,10 @@ set(viewer_SOURCE_FILES
     llfloaterwhitelistentry.cpp
     llfloaterwindowsize.cpp
     llfloaterworldmap.cpp
+    llflyoutcombobtn.cpp
     llfolderviewmodelinventory.cpp
     llfollowcam.cpp
     llfriendcard.cpp
-    llflyoutcombobtn.cpp
     llgesturelistener.cpp
     llgesturemgr.cpp
     llgiveinventory.cpp
@@ -363,17 +367,17 @@ set(viewer_SOURCE_FILES
     llgroupactions.cpp
     llgroupiconctrl.cpp
     llgrouplist.cpp
-    llgroupoptions.cpp
     llgroupmgr.cpp
+    llgroupoptions.cpp
     llhasheduniqueid.cpp
     llhints.cpp
     llhttpretrypolicy.cpp
     llhudeffect.cpp
     llhudeffectbeam.cpp
+    llhudeffectblob.cpp
     llhudeffectlookat.cpp
     llhudeffectpointat.cpp
     llhudeffecttrail.cpp
-    llhudeffectblob.cpp
     llhudicon.cpp
     llhudmanager.cpp
     llhudnametag.cpp
@@ -437,9 +441,6 @@ set(viewer_SOURCE_FILES
     llnameeditor.cpp
     llnamelistctrl.cpp
     llnavigationbar.cpp
-    llfloaterimnearbychat.cpp
-    llfloaterimnearbychathandler.cpp
-    llfloaterimnearbychatlistener.cpp
     llnetmap.cpp
     llnotificationalerthandler.cpp
     llnotificationgrouphandler.cpp
@@ -453,8 +454,8 @@ set(viewer_SOURCE_FILES
     llnotificationstorage.cpp
     llnotificationtiphandler.cpp
     lloutfitgallery.cpp
-    lloutfitslist.cpp
     lloutfitobserver.cpp
+    lloutfitslist.cpp
     lloutputmonitorctrl.cpp
     llpanelappearancetab.cpp
     llpanelavatar.cpp
@@ -466,6 +467,7 @@ set(viewer_SOURCE_FILES
     llpaneleditwater.cpp
     llpaneleditwearable.cpp
     llpanelenvironment.cpp
+    llpaneleventinfo.cpp
     llpanelexperiencelisteditor.cpp
     llpanelexperiencelog.cpp
     llpanelexperiencepicker.cpp
@@ -473,9 +475,9 @@ set(viewer_SOURCE_FILES
     llpanelface.cpp
     llpanelgenerictip.cpp
     llpanelgroup.cpp
-    llpanelgroupcreate.cpp
     llpanelgroupbulk.cpp
     llpanelgroupbulkban.cpp
+    llpanelgroupcreate.cpp
     llpanelgroupexperiences.cpp
     llpanelgroupgeneral.cpp
     llpanelgroupinvite.cpp
@@ -516,6 +518,14 @@ set(viewer_SOURCE_FILES
     llpanelprofile.cpp
     llpanelprofileclassifieds.cpp
     llpanelprofilepicks.cpp
+    llpanelpulldown.cpp
+    llpanelsearchbase.cpp
+    llpanelsearchclassifieds.cpp
+    llpanelsearchevents.cpp
+    llpanelsearchgroups.cpp
+    llpanelsearchlandsales.cpp
+    llpanelsearchpeople.cpp
+    llpanelsearchplaces.cpp
     llpanelsnapshot.cpp
     llpanelsnapshotinventory.cpp
     llpanelsnapshotlocal.cpp
@@ -524,10 +534,9 @@ set(viewer_SOURCE_FILES
     llpanelsnapshotprofile.cpp
     llpanelteleporthistory.cpp
     llpaneltiptoast.cpp
-    llpanelvoiceeffect.cpp
     llpaneltopinfobar.cpp
-    llpanelpulldown.cpp
     llpanelvoicedevicesettings.cpp
+    llpanelvoiceeffect.cpp
     llpanelvolume.cpp
     llpanelvolumepulldown.cpp
     llpanelwearing.cpp
@@ -549,9 +558,9 @@ set(viewer_SOURCE_FILES
     llphysicsmotion.cpp
     llphysicsshapebuilderutil.cpp
     llpipelinelistener.cpp
+    llplacesfolderview.cpp
     llplacesinventorybridge.cpp
     llplacesinventorypanel.cpp
-    llplacesfolderview.cpp
     llpopupview.cpp
     llpostcard.cpp
     llpresetsmanager.cpp
@@ -629,8 +638,8 @@ set(viewer_SOURCE_FILES
     lltoastimpanel.cpp
     lltoastnotifypanel.cpp
     lltoastpanel.cpp
-    lltoastscripttextbox.cpp
     lltoastscriptquestion.cpp
+    lltoastscripttextbox.cpp
     lltool.cpp
     lltoolbarview.cpp
     lltoolbrush.cpp
@@ -686,15 +695,15 @@ set(viewer_SOURCE_FILES
     llviewerhelp.cpp
     llviewerhelputil.cpp
     llviewerhome.cpp
+    llviewerinput.cpp
     llviewerinventory.cpp
     llviewerjoint.cpp
     llviewerjointattachment.cpp
     llviewerjointmesh.cpp
     llviewerjoystick.cpp
-    llviewerinput.cpp
     llviewerlayer.cpp
-    llviewermedia.cpp
     llviewermedia_streamingaudio.cpp
+    llviewermedia.cpp
     llviewermediafocus.cpp
     llviewermenu.cpp
     llviewermenufile.cpp
@@ -723,7 +732,7 @@ set(viewer_SOURCE_FILES
     llviewerwearable.cpp
     llviewerwindow.cpp
     llviewerwindowlistener.cpp
-	llvisualeffect.cpp
+    llvisualeffect.cpp
     llvlcomposition.cpp
     llvlmanager.cpp
     llvoavatar.cpp
@@ -755,16 +764,16 @@ set(viewer_SOURCE_FILES
     llworld.cpp
     llworldmap.cpp
     llworldmapmessage.cpp
-    llworldmipmap.cpp
     llworldmapview.cpp
+    llworldmipmap.cpp
     llxmlrpclistener.cpp
     llxmlrpctransaction.cpp
     noise.cpp
     pipeline.cpp
     rlvactions.cpp
-    rlvenvironment.cpp
     rlvcommon.cpp
     rlveffects.cpp
+    rlvenvironment.cpp
     rlvextensions.cpp
     rlvfloaters.cpp
     rlvhandler.cpp
@@ -780,11 +789,11 @@ set(VIEWER_BINARY_NAME "alchemy-bin" CACHE STRING
 set(viewer_HEADER_FILES
     CMakeLists.txt
     ViewerInstall.cmake
-    alcinematicmode.h
     alaoengine.h
     alaoset.h
     alavataractions.h
     alchatcommand.h
+    alcinematicmode.h
     alcontrolcache.h
     alfloaterao.h
     alfloaterparticleeditor.h
@@ -800,7 +809,6 @@ set(viewer_HEADER_FILES
     groupchatlistener.h
     llaccountingcost.h
     llaccountingcostmanager.h
-    llaisapi.h
     llagent.h
     llagentaccess.h
     llagentbenefits.h
@@ -812,6 +820,7 @@ set(viewer_HEADER_FILES
     llagentpilot.h
     llagentui.h
     llagentwearables.h
+    llaisapi.h
     llanimstatelabels.h
     llappcorehttp.h
     llappearance.h
@@ -865,15 +874,15 @@ set(viewer_HEADER_FILES
     lldeferredsounds.h
     lldelayedgestureerror.h
     lldirpicker.h
-    lldonotdisturbnotificationstorage.h
     lldndbutton.h
+    lldonotdisturbnotificationstorage.h
     lldrawable.h
     lldrawpool.h
     lldrawpoolalpha.h
     lldrawpoolavatar.h
     lldrawpoolbump.h
-    lldrawpoolmaterials.h
     lldrawpoolground.h
+    lldrawpoolmaterials.h
     lldrawpoolsimple.h
     lldrawpoolsky.h
     lldrawpoolterrain.h
@@ -899,7 +908,6 @@ set(viewer_HEADER_FILES
     llflexibleobject.h
     llfloaterabout.h
     llfloaterassetrecovery.h
-    llfloaterbvhpreview.h
     llfloaterauction.h
     llfloaterautoreplacesettings.h
     llfloateravatar.h
@@ -917,8 +925,9 @@ set(viewer_HEADER_FILES
     llfloaterbuycurrency.h
     llfloaterbuycurrencyhtml.h
     llfloaterbuyland.h
-    llfloatercamerapresets.h
+    llfloaterbvhpreview.h
     llfloatercamera.h
+    llfloatercamerapresets.h
     llfloaterchatalerts.h
     llfloaterchatvoicevolume.h
     llfloatercolorpicker.h
@@ -926,6 +935,7 @@ set(viewer_HEADER_FILES
     llfloaterconversationpreview.h
     llfloaterdeleteprefpreset.h
     llfloaterdestinations.h
+    llfloaterdirectory.h
     llfloaterdisplayname.h
     llfloatereditenvironmentbase.h
     llfloatereditextdaycycle.h
@@ -949,12 +959,12 @@ set(viewer_HEADER_FILES
     llfloaterhoverheight.h
     llfloaterhud.h
     llfloaterimagepreview.h
+    llfloaterimcontainer.h
     llfloaterimnearbychat.h
     llfloaterimnearbychathandler.h
     llfloaterimnearbychatlistener.h
-    llfloaterimsessiontab.h
     llfloaterimsession.h
-    llfloaterimcontainer.h
+    llfloaterimsessiontab.h
     llfloaterinspect.h
     llfloaterjoystick.h
     llfloaterlagmeter.h
@@ -968,15 +978,15 @@ set(viewer_HEADER_FILES
     llfloatermemleak.h
     llfloatermodelpreview.h
     llfloatermodeluploadbase.h
-    llfloatermyscripts.h
     llfloatermyenvironment.h
+    llfloatermyscripts.h
     llfloaternamedesc.h
     llfloaternotificationsconsole.h
     llfloaternotificationstabbed.h
-    llfloateroutfitphotopreview.h
-    llfloateroutfitsnapshot.h
     llfloaterobjectweights.h
     llfloateropenobject.h
+    llfloateroutfitphotopreview.h
+    llfloateroutfitsnapshot.h
     llfloaterpathfindingcharacters.h
     llfloaterpathfindingconsole.h
     llfloaterpathfindinglinksets.h
@@ -984,15 +994,15 @@ set(viewer_HEADER_FILES
     llfloaterpay.h
     llfloaterperms.h
     llfloaterpostprocess.h
-    llfloaterprofile.h
     llfloaterpreference.h
     llfloaterpreferenceviewadvanced.h
     llfloaterpreviewtrash.h
+    llfloaterprofile.h
     llfloaterproperties.h
     llfloaterregiondebugconsole.h
     llfloaterregioninfo.h
-    llfloaterreporter.h
     llfloaterregionrestarting.h
+    llfloaterreporter.h
     llfloatersavecamerapreset.h
     llfloatersaveprefpreset.h
     llfloatersceneloadstats.h
@@ -1024,27 +1034,27 @@ set(viewer_HEADER_FILES
     llfloaterwhitelistentry.h
     llfloaterwindowsize.h
     llfloaterworldmap.h
+    llflyoutcombobtn.h
     llfolderviewmodelinventory.h
     llfollowcam.h
     llfriendcard.h
-    llflyoutcombobtn.h
     llgesturelistener.h
     llgesturemgr.h
     llgiveinventory.h
     llgroupactions.h
     llgroupiconctrl.h
     llgrouplist.h
-    llgroupoptions.h
     llgroupmgr.h
+    llgroupoptions.h
     llhasheduniqueid.h
     llhints.h
     llhttpretrypolicy.h
     llhudeffect.h
     llhudeffectbeam.h
+    llhudeffectblob.h
     llhudeffectlookat.h
     llhudeffectpointat.h
     llhudeffecttrail.h
-    llhudeffectblob.h
     llhudicon.h
     llhudmanager.h
     llhudnametag.h
@@ -1114,8 +1124,8 @@ set(viewer_HEADER_FILES
     llnotificationmanager.h
     llnotificationstorage.h
     lloutfitgallery.h
-    lloutfitslist.h
     lloutfitobserver.h
+    lloutfitslist.h
     lloutputmonitorctrl.h
     llpanelappearancetab.h
     llpanelavatar.h
@@ -1127,6 +1137,7 @@ set(viewer_HEADER_FILES
     llpaneleditwater.h
     llpaneleditwearable.h
     llpanelenvironment.h
+    llpaneleventinfo.h
     llpanelexperiencelisteditor.h
     llpanelexperiencelog.h
     llpanelexperiencepicker.h
@@ -1134,10 +1145,10 @@ set(viewer_HEADER_FILES
     llpanelface.h
     llpanelgenerictip.h
     llpanelgroup.h
-    llpanelgroupcreate.h
     llpanelgroupbulk.h
-    llpanelgroupbulkimpl.h
     llpanelgroupbulkban.h
+    llpanelgroupbulkimpl.h
+    llpanelgroupcreate.h
     llpanelgroupexperiences.h
     llpanelgroupgeneral.h
     llpanelgroupinvite.h
@@ -1178,13 +1189,20 @@ set(viewer_HEADER_FILES
     llpanelprofile.h
     llpanelprofileclassifieds.h
     llpanelprofilepicks.h
+    llpanelpulldown.h
+    llpanelsearchbase.h
+    llpanelsearchclassifieds.h
+    llpanelsearchevents.h
+    llpanelsearchgroups.h
+    llpanelsearchlandsales.h
+    llpanelsearchpeople.h
+    llpanelsearchplaces.h
     llpanelsnapshot.h
     llpanelteleporthistory.h
     llpaneltiptoast.h
-    llpanelpulldown.h
+    llpaneltopinfobar.h
     llpanelvoicedevicesettings.h
     llpanelvoiceeffect.h
-    llpaneltopinfobar.h
     llpanelvolume.h
     llpanelvolumepulldown.h
     llpanelwearing.h
@@ -1206,9 +1224,9 @@ set(viewer_HEADER_FILES
     llphysicsmotion.h
     llphysicsshapebuilderutil.h
     llpipelinelistener.h
+    llplacesfolderview.h
     llplacesinventorybridge.h
     llplacesinventorypanel.h
-    llplacesfolderview.h
     llpopupview.h
     llpostcard.h
     llpresetsmanager.h
@@ -1290,8 +1308,8 @@ set(viewer_HEADER_FILES
     lltoastimpanel.h
     lltoastnotifypanel.h
     lltoastpanel.h
-    lltoastscripttextbox.h
     lltoastscriptquestion.h
+    lltoastscripttextbox.h
     lltool.h
     lltoolbarview.h
     lltoolbrush.h
@@ -1316,8 +1334,8 @@ set(viewer_HEADER_FILES
     lltransientdockablefloater.h
     lltransientfloatermgr.h
     lltranslate.h
-    lluiconstants.h
     lluiavatar.h
+    lluiconstants.h
     lluilistener.h
     lluploaddialog.h
     lluploadfloaterobservers.h
@@ -1348,15 +1366,15 @@ set(viewer_HEADER_FILES
     llviewergesture.h
     llviewerhelp.h
     llviewerhome.h
+    llviewerinput.h
     llviewerinventory.h
     llviewerjoint.h
     llviewerjointattachment.h
     llviewerjointmesh.h
     llviewerjoystick.h
-    llviewerinput.h
     llviewerlayer.h
-    llviewermedia.h
     llviewermedia_streamingaudio.h
+    llviewermedia.h
     llviewermediafocus.h
     llviewermediaobserver.h
     llviewermenu.h
@@ -1387,7 +1405,7 @@ set(viewer_HEADER_FILES
     llviewerwearable.h
     llviewerwindow.h
     llviewerwindowlistener.h
-	llvisualeffect.h
+    llvisualeffect.h
     llvlcomposition.h
     llvlmanager.h
     llvoavatar.h
@@ -1418,8 +1436,8 @@ set(viewer_HEADER_FILES
     llworld.h
     llworldmap.h
     llworldmapmessage.h
-    llworldmipmap.h
     llworldmapview.h
+    llworldmipmap.h
     llxmlrpclistener.h
     llxmlrpctransaction.h
     macmain.h
diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index 655c8c0556e..092deddd578 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -255,6 +255,28 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>AlchemyFindLandSort</key>
+    <map>
+      <key>Comment</key>
+      <string>Controls the sort order for land you are searching for ("Name", "Price", "PPM", "Area")</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>Name</string>
+    </map>
+    <key>AlchemyFindLandSortAscending</key>
+    <map>
+      <key>Comment</key>
+      <string>Controls whether the sort order for land you are searching for is displayed in ascending or descending order</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <string>0</string>
+    </map>
     <key>AlchemyHudTextFadeDistance</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp
index e3c17f98777..7e05d6af86f 100644
--- a/indra/newview/lleventnotifier.cpp
+++ b/indra/newview/lleventnotifier.cpp
@@ -163,11 +163,12 @@ bool LLEventNotifier::handleResponse(U32 eventId, const LLSD& notification, cons
 	return true;
 }
 
-bool LLEventNotifier::add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName)
+bool LLEventNotifier::add(const LLEventStruct& event)
 {
-	LLEventNotification *new_enp = new LLEventNotification(eventId, eventEpoch, eventDateStr, eventName);
+	if (mNewEventSignal(event)) return false;
+	LLEventNotification *new_enp = new LLEventNotification(event.eventId, event.eventEpoch, event.eventDateStr, event.eventName);
 	
-	LL_INFOS() << "Add event " << eventName << " id " << eventId << " date " << eventDateStr << LL_ENDL;
+	LL_INFOS() << "Add event " << event.eventName << " id " << event.eventId << " date " << event.eventDateStr << LL_ENDL;
 	if(!new_enp->isValid())
 	{
 		delete new_enp;
@@ -208,7 +209,18 @@ void LLEventNotifier::processEventInfoReply(LLMessageSystem *msg, void **)
 	msg->getString("EventData", "Date", eventd_date);
 	msg->getU32("EventData", "DateUTC", event_time_utc);
 	
-	gEventNotifier.add(event_id, (F64)event_time_utc, eventd_date, event_name);
+	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);
+	
+	gEventNotifier.add(event);
 }	
 	
 	
@@ -219,7 +231,8 @@ void LLEventNotifier::load(const LLSD& event_options)
 	{
 		LLSD response = *resp_it;
 
-		add(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString());
+		LLEventStruct event(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString());
+		add(event);
 	}
 }
 
diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h
index 3fee46c2f67..ca6b286bab1 100644
--- a/indra/newview/lleventnotifier.h
+++ b/indra/newview/lleventnotifier.h
@@ -33,6 +33,24 @@
 class LLEventNotification;
 class LLMessageSystem;
 
+typedef struct event_st{
+	U32 eventId;
+	F64 eventEpoch;
+	std::string eventDateStr;
+	std::string eventName;
+	std::string creator;
+	std::string category;
+	std::string desc;
+	U32 duration;
+	U32 cover;
+	U32 amount;
+	std::string simName;
+	LLVector3d globalPos;
+	U32 flags;
+	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
 {
@@ -41,7 +59,7 @@ class LLEventNotifier
 	virtual ~LLEventNotifier();
 
 	void update();	// Notify the user of the event if it's coming up
-	bool add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName);
+	bool add(const LLEventStruct& event);
 	void add(U32 eventId);
 
 	
@@ -54,7 +72,14 @@ class LLEventNotifier
 	typedef std::map<U32, LLEventNotification *> en_map;
 	bool  handleResponse(U32 eventId, const LLSD& notification, const LLSD& response);		
 
-	static void processEventInfoReply(LLMessageSystem *msg, void **);	
+	static void processEventInfoReply(LLMessageSystem *msg, void **);
+	
+	typedef boost::signals2::signal<bool(LLEventStruct event)> new_event_signal_t;
+	new_event_signal_t mNewEventSignal;
+	boost::signals2::connection setNewEventCallback(const new_event_signal_t::slot_type& cb)
+	{
+		return mNewEventSignal.connect(cb);
+	};
 	
 protected:
 	en_map	mEventNotifications;
diff --git a/indra/newview/llfloaterdirectory.cpp b/indra/newview/llfloaterdirectory.cpp
new file mode 100644
index 00000000000..a1daf5b066e
--- /dev/null
+++ b/indra/newview/llfloaterdirectory.cpp
@@ -0,0 +1,1175 @@
+/*
+ * @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 "llpanel.h"
+#include "llresmgr.h"
+#include "llscrolllistctrl.h"
+#include "lltextbase.h"
+#include "lltrans.h"
+
+// newview
+#include "llagent.h"
+#include "llpanelsearchbase.h"
+#include "llpanelplaces.h"
+#include "llproductinforequest.h"
+
+bool filterShortWords(std::string query_string);
+
+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 LLSD& key)
+:	LLFloater(key)
+,	mQueryID(LLUUID())
+,	mResultStart(0)
+,	mNumResultsReceived(0)
+,	mResultList(NULL)
+,	mCurrentQuery()
+,	mCurrentResultType(SE_UNDEFINED)
+,	mRemoteParcelObserver(NULL)
+{
+	mCommitCallbackRegistrar.add("Search.Page", boost::bind(&LLFloaterDirectory::choosePage, this, _2));
+}
+
+LLFloaterDirectory::~LLFloaterDirectory()
+{
+}
+
+BOOL LLFloaterDirectory::postBuild()
+{
+	mResultList = getChild<LLScrollListCtrl>("results");
+	mResultList->setCommitCallback(boost::bind(&LLFloaterDirectory::onCommitSelection, this));
+	for (std::string panel_name: sSearchPanels)
+	{
+		LLPanelSearch* panel = static_cast<LLPanelSearch*>(getChild<LLUICtrl>(panel_name));
+		panel->setSearchFloater(this);
+	}
+	setProgress(false);
+	mResultsStatus = getChild<LLTextBase>("results_status");
+	showDetailPanel(LLStringUtil::null); // hide all the panels
+	paginate();
+	return TRUE;
+}
+
+void LLFloaterDirectory::setProgress(bool working)
+{
+	getChild<LLUICtrl>("loading")->setVisible(working);
+}
+
+void LLFloaterDirectory::setResultsComment(const std::string& message)
+{
+	mResultList->setCommentText(message);
+}
+
+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(const LLSD& userdata)
+{
+	const std::string command = userdata.asString();
+	if (command == "forward")
+		mResultStart += mCurrentQuery.results_per_page;
+	else if (command == "back")
+		mResultStart -= mCurrentQuery.results_per_page;
+	else
+	{
+		LL_WARNS("Search") << "Unhandled command: " << command << 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)
+	{
+		childSetVisible(panel_itr, 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>("directory");
+	if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for
+	self->setProgress(false);
+
+	LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results");
+	
+	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;
+			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>("directory");
+	if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results");
+	
+	// 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>("directory");
+	if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results");
+	
+	// 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", (F64)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>("directory");
+	if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results");
+	
+	// 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>("directory");
+	if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results");
+	
+	// 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 = price / 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>("directory");
+	if (self == NULL || query_id != self->mQueryID) return; // not the result we're waiting for
+	
+	self->setProgress(false);
+	LLScrollListCtrl* pResults = self->getChild<LLScrollListCtrl>("results");
+	
+	// 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", 1);
+		static LLUICachedControl<bool> inc_mature("ShowMatureEvents", 0);
+		static LLUICachedControl<bool> inc_adult("ShowAdultEvents", 0);
+		
+		// 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 00000000000..8ea0afe047d
--- /dev/null
+++ b/indra/newview/llfloaterdirectory.h
@@ -0,0 +1,115 @@
+/*
+ * @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"
+
+class LLUICtrl;
+class LLPanel;
+class LLScrollListCtrl;
+class LLTextBase;
+
+class LLRemoteParcelInfoObserver;
+
+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;
+
+typedef struct dir_query
+{
+public:
+	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:
+	LLFloaterDirectory(const LLSD& key);
+	BOOL postBuild();
+	
+	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(const LLSD& userdata);
+	void paginate();
+	void showDetailPanel(const std::string& panel_name);
+	void rebuildResultList();
+
+	ESearch mCurrentResultType;
+	LLDirQuery mCurrentQuery;
+	S32 mResultStart;
+	S32 mNumResultsReceived;
+	LLUUID mQueryID;
+	
+	LLPanel* mDetailPeople;
+	LLScrollListCtrl* mResultList;
+	LLTextBase* mResultsStatus;
+	LLRemoteParcelInfoObserver* mRemoteParcelObserver;
+};
+
+#endif // LL_FLOATERDIRECTORY_H
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 183000ceac2..c60d87d86bd 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -82,6 +82,8 @@ static LLDispatchClassifiedClickThrough sClassifiedClickThrough;
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 
+static LLPanelInjector<LLPanelClassifiedInfo> t_classified_info("panel_classified_info");
+
 LLPanelClassifiedInfo::LLPanelClassifiedInfo()
  : LLPanel()
  , mInfoLoaded(false)
@@ -151,7 +153,7 @@ void LLPanelClassifiedInfo::onOpen(const LLSD& key)
 	LLUUID avatar_id = key["classified_creator_id"];
 	if(avatar_id.isNull())
 	{
-		return;
+		//return;
 	}
 
 	if(getAvatarId().notNull())
diff --git a/indra/newview/llpaneleventinfo.cpp b/indra/newview/llpaneleventinfo.cpp
new file mode 100644
index 00000000000..54950840e95
--- /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 00000000000..09260102e00
--- /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();
+	/*virtual*/ void onOpen(const LLSD& key);
+	
+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 00000000000..f28e1c23de7
--- /dev/null
+++ b/indra/newview/llpanelsearchbase.cpp
@@ -0,0 +1,43 @@
+/*
+ * @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()
+{
+}
+
+void LLPanelSearch::setSearchFloater(LLFloaterDirectory* floater)
+{
+	mFloater = floater;
+}
diff --git a/indra/newview/llpanelsearchbase.h b/indra/newview/llpanelsearchbase.h
new file mode 100644
index 00000000000..29aad065170
--- /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();
+	/* virtual */ BOOL postBuild() { return FALSE; }
+	void setSearchFloater(LLFloaterDirectory* floater);
+	
+protected:
+	virtual ~LLPanelSearch() {};
+	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 00000000000..49b2c635ca1
--- /dev/null
+++ b/indra/newview/llpanelsearchclassifieds.cpp
@@ -0,0 +1,109 @@
+/*
+ * @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()
+{
+	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();
+	LLClassifiedInfo::cat_map::iterator iter;
+	for (iter = LLClassifiedInfo::sCategories.begin();
+		 iter != LLClassifiedInfo::sCategories.end();
+		 ++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", 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;
+	}
+	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 00000000000..993950e7c48
--- /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();
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl);
+	/*virtual*/ void search();
+	
+	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 00000000000..30ef758afa2
--- /dev/null
+++ b/indra/newview/llpanelsearchevents.cpp
@@ -0,0 +1,136 @@
+/*
+ * @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", 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;
+	}
+
+	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;
+	struct tm* internal_time;
+	
+	time_t utc = time_corrected();
+	utc += day * 24 * 60 * 60;
+	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 00000000000..c11421fd776
--- /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();
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl);
+	/*virtual*/ void search();
+	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 00000000000..92629609d27
--- /dev/null
+++ b/indra/newview/llpanelsearchgroups.cpp
@@ -0,0 +1,98 @@
+/*
+ * @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()
+{
+	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", 1);
+	static LLUICachedControl<bool> inc_mature("ShowMatureGroups", 0);
+	static LLUICachedControl<bool> inc_adult("ShowAdultGroups", 0);
+	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 00000000000..160fecf4855
--- /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();
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl);
+	/*virtual*/ void search();
+	
+	LLSearchEditor* mSearchEditor;
+};
+
+#endif // LL_PANELSEARCHGROUPS_H
diff --git a/indra/newview/llpanelsearchlandsales.cpp b/indra/newview/llpanelsearchlandsales.cpp
new file mode 100644
index 00000000000..2b136f02dfc
--- /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", 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;
+	}
+
+	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("AlchemyFindLandSort");
+	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("AlchemyFindLandSortAscending"))
+		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 00000000000..0ade87ed6f4
--- /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();
+	
+private:
+	/*virtual*/ void search();
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl);
+};
+
+#endif // LL_PANELSEARCHLANDSALES_H
diff --git a/indra/newview/llpanelsearchpeople.cpp b/indra/newview/llpanelsearchpeople.cpp
new file mode 100644
index 00000000000..dbd60489046
--- /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 00000000000..f3009945ca2
--- /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();
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl);
+	/*virtual*/ void search();
+	
+	LLSearchEditor* mSearchEditor;
+};
+
+#endif // LL_PANELSEARCHPEOPLE_H
diff --git a/indra/newview/llpanelsearchplaces.cpp b/indra/newview/llpanelsearchplaces.cpp
new file mode 100644
index 00000000000..42de344606b
--- /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", 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;
+	}
+	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 00000000000..4614ad7a421
--- /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();
+	
+private:
+	/*virtual*/ void onCommitSearch(LLUICtrl* ctrl);
+	/*virtual*/ void search();
+	
+	LLSearchEditor* mSearchEditor;
+	LLComboBox* mPlacesCategory;
+};
+
+#endif // LL_PANELSEARCHPLACES_H
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 61d7514c5f9..5b4f84520af 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -108,6 +108,7 @@
 //#include "llfirstuse.h"
 #include "llfloaterhud.h"
 #include "llfloaterland.h"
+#include "llfloatersearch.h"
 #include "llfloatertopobjects.h"
 #include "llfloaterworldmap.h"
 #include "llgesturemgr.h"
@@ -179,6 +180,7 @@
 #include "llappviewer.h"
 #include "llfasttimerview.h"
 #include "llfloatermap.h"
+#include "llfloaterdirectory.h"
 #include "llweb.h"
 #include "llvoiceclient.h"
 #include "llnamelistctrl.h"
@@ -1965,6 +1967,10 @@ bool idle_startup()
 
 		display_startup();
 
+		// Build the search floater early on so it pops open quick when we want it.
+		LLFloaterReg::getTypedInstance<LLFloaterDirectory>("search");
+		display_startup();
+
 		// We're successfully logged in.
 		gSavedSettings.setBOOL("FirstLoginThisInstall", FALSE);
 
@@ -2603,6 +2609,13 @@ void register_viewer_callbacks(LLMessageSystem* msg)
 	// Special handler as this message is sometimes used for group land.
 	msg->setHandlerFunc("PlacesReply", process_places_reply);
 	msg->setHandlerFunc("GroupNoticesListReply", LLPanelGroupNotices::processGroupNoticesListReply);
+	
+	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->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply);
 
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 0777ee2b9d4..11a31c8bbe3 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -69,6 +69,7 @@
 #include "llfloaterconversationpreview.h"
 #include "llfloaterdeleteprefpreset.h"
 #include "llfloaterdestinations.h"
+#include "llfloaterdirectory.h"
 #include "llfloaterdisplayname.h"
 #include "llfloatereditextdaycycle.h"
 #include "llfloaterenvironmentadjust.h"
@@ -245,6 +246,7 @@ void LLViewerFloaterReg::registerFloaters()
 
 	LLFloaterReg::add("delete_pref_preset", "floater_delete_pref_preset.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDeletePrefPreset>);
 	LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDestinations>);
+	LLFloaterReg::add("directory", "floater_directory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDirectory>);
 
 	LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>);
 
diff --git a/indra/newview/skins/default/textures/icon_auction.tga b/indra/newview/skins/default/textures/icon_auction.tga
new file mode 100644
index 0000000000000000000000000000000000000000..d121833b475fcfd92b3e2c7a536123f0fa611f08
GIT binary patch
literal 1068
zcmZQzU}As)0R{mE1r8@W8wPwBsQN!Xj888}4x~4!<kf!=0MRh);8uiUE<ST`*^g{K
zNDV$SaLIx6!Q4g*GhlAVWj{<Dn>#>a5t(=Xuio_^9#$~**l3s;QnChM^&lD)&LI6T
z3{rzlFH8(157GzIo0NNzY%@S{-9O{i|2x3w2e||07JP1i*$-0-(p%ec=YMX+DKHHZ
zC!`;w24pu#Z+*wZ{}t6Iz<NPpiBB&m3_$Y8dO>!t-~AsP4}|o>^n=n9NFS+sk>h||
iy~t*O+)K#KKzT3-2?})$^9=U%_tTAV^Yn4mV*mjCqF5>b

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icon_group.png b/indra/newview/skins/default/textures/icon_group.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfb4bc7a96e0216cea829d4954371040cb2d61b6
GIT binary patch
literal 484
zcmV<A0UQ2_P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00052Nkl<ZC>3Rr
z$!@|x5Jd5K0Gk~-YziQOxxs}G;KJu~ARiEfxNu~XkOST(Zy1{#(nw~yyQ;c+Y-_z<
z7xEB7q-mNY2?g7>Ez43$<<0D0zH@`_bULHa2<YK(IGs-aIT?Y5Vfw!Bc^;|bIGfET
zilVooISBIyB97yFy<V%;uz|5^wQA1Vo5<t<X9P}g2+%x9;g}*q1*N;BL}m#bO7w2G
zTd7oHpX>D+h9NUstyb_8TrL-t=nK#U!|ryw{eGYG{eGtie?Fi0dc8)Y!6w_U?e2Sr
zkhX+8c4xEMcsy>m+X#nINF6BhU@Dc$@N<X+MM=)Z4+ewfa>=5&+VA(r<B?vuTsFf|
zY&M%%eLkPr1cX7uM8^B@Km(<1Rwrc#v|tJvQcCWgga+X{Zn0QIo+ljYctn0OnE<w@
z(<wPFd1Z!hKA*WFW*WC_OhDixV7@?r<<R4DKrr|5c;MKOk$k(N!Vrn|)oR6^20_3M
z1Z4C`nXC%>J@Vv7FhMRB3ohF%fHqYSgzLI-600=-T3;_3o&Zf-({m^X_}G*7-?#kg
a>&Gt?7vD*&5LhMv0000<MNUMnLSTYd1>6Pz

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/icon_place.tga b/indra/newview/skins/default/textures/icon_place.tga
new file mode 100644
index 0000000000000000000000000000000000000000..2170c984994e33bb169b499f44c54580bec595a6
GIT binary patch
literal 1068
zcma))O-KSk6o7|J2{n{DN>mpiN-q*oXDy5<$doXWE^C2yvPDt^j~(nHMMz|q*0U^K
zy>#%_Ey#jS5kXQAX@63$H>+dYvdPZ!@#g1!^O)Hoq>Hd-B~~)j0{}z~Lm&ydaUYO=
z`zab>WEQch<*Ln@_Aj8@9RXsS0Q5GIHN=MutK}=_Ob3^s=Z=9mSE%oAF@tdu89?+(
zM?P-)c_6MZ^>v6HnL-?h4e6EVkH%bkmR$>I0o^`C$Na(Vu?qFd-(@H@N+7<8Ak+lN
zJ?9|vn1S>|8u)u2B6m?~|37ZRaYfy8{K{YGf1>{`LZMdp^{dq1f@sTUby>vv*HV3%
zFVtK96V{h}{$HQ&GZJ&1XgNF0VRbvj_W#5C@02HBGwv8c3mb8BQ0}olb&K_)gzzdr
z_9F|aMhf^BJbN_?+${(0Gq+S@HDNkr9*bK1&`k(}l_1;Wh`BUs@!R#2#=P8RzLxWI
oar3&;RgUTX8@T5CSFXv&_!gzMwCMK)ygu*3ykmLVJLhqdAMMdz%K!iX

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index fefe3240538..cb3a93b7c2f 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -800,6 +800,9 @@ 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.png" preload="false" />
 
   <texture name="lag_status_critical.tga" />
   <texture name="lag_status_good.tga" />
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 00000000000..f550c145461
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_directory.xml
@@ -0,0 +1,282 @@
+<?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="directory"
+ 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="top|left|right"
+   top="16"
+   left="0"
+   height="70"
+   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" />
+    <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" />
+    <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" />
+    <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" />
+    <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" />
+    <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" />
+  </tab_container>
+ <layout_stack
+  follows="all"
+  animate="false"
+  top="87"
+  bottom="-25"
+  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.commit_callback
+    function="Search.Page"
+    parameter="back"/>
+ </button>
+ <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">
+   <button.commit_callback
+    function="Search.Page"
+    parameter="forward" />
+  </button>
+ <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/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 78e14fee909..e0ad5097bfc 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -557,6 +557,16 @@
              function="Floater.Toggle"
              parameter="search" />
             </menu_item_check>
+		<menu_item_check
+		label="Directory..."
+		name="Directory">
+			<menu_item_check.on_check
+			function="Floater.Visible"
+			parameter="directory" />
+			<menu_item_check.on_click
+			function="Floater.Toggle"
+			parameter="directory" />
+		</menu_item_check>
         <menu_item_separator/>
         <menu_item_call
          label="Teleport home"
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 00000000000..81e884079f2
--- /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_profile_legacy_sidetray.xml b/indra/newview/skins/default/xui/en/panel_profile_legacy_sidetray.xml
new file mode 100644
index 00000000000..e10169179e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_profile_legacy_sidetray.xml
@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_opaque="true"
+ background_visible="true"
+ follows="all"
+ height="570"
+ label="Profile"
+ layout="topleft"
+ min_height="350"
+ left="0"
+ top="20"
+ name="Avatar Profile"
+ width="313">
+  <panel.string
+   name="account_info_fmt">
+[ACCOUNT_TYPE]
+[PAYMENT_INFO]
+[AGE_VERIFIED]
+  </panel.string>
+  <panel.string
+   name="age_verified">
+Age Verified
+  </panel.string>
+  <panel.string
+   name="rezday_fmt">
+[REZDAY] ([AGE])
+  </panel.string>
+  <panel.string
+   name="add_friend">
+Add Friend
+  </panel.string>
+  <panel.string
+   name="remove_friend">
+Remove Friend
+  </panel.string>
+  <panel
+   name="avatar_info_top"
+   follows="top|left|right"
+   top="0"
+   left="0"
+   height="29"
+   width="313"
+   layout="topleft">
+    <button
+     follows="top|left"
+     height="24"
+     image_hover_unselected="BackButton_Over"
+     image_pressed="BackButton_Press"
+     image_unselected="BackButton_Off"
+     layout="topleft"
+     name="back"
+     left="7"
+     tab_stop="false"
+     top="2"
+     width="30"
+     use_draw_context_alpha="false" />
+    <text_editor
+     allow_scroll="false"
+     bg_visible="false"
+     read_only="true"
+     layout="topleft"
+     name="avatar_name"
+     v_pad="0"
+     value="(Loading...)"
+     font="SansSerifHugeBold"
+     h_pad="0"
+     height="26"
+     left_pad="8"
+     text_color="LtGray"
+     top="1"
+     use_ellipses="true"
+     width="268"
+     follows="top|left|right"
+     word_wrap="false"
+     mouse_opaque="false"/>
+    <loading_indicator
+     height="25"
+     follows="top|right"
+     layout="topleft"
+     left_pad="-32"
+     name="progress_indicator"
+     top_delta="1"
+     width="25" />
+  </panel>
+  <layout_stack
+   name="layout"
+   orientation="vertical"
+   follows="all"
+   left="6"
+   top_pad="0"
+   height="506"
+   width="302"
+   border_size="0">
+    <layout_panel
+     bg_alpha_color="DkGray2"
+     bg_opaque_color="DkGray2"
+     background_visible="true"
+     background_opaque="true"
+     name="avatar_accordions"
+     follows="all"
+     layout="topleft"
+     auto_resize="true"
+     user_resize="true"
+     height="513"
+     width="313">
+      <accordion
+       left="0"
+       top="0"
+       single_expansion="true"
+       fit_parent="true"
+       follows="all"
+       layout="topleft"
+       name="avatar_accordion"
+       height="513"
+       width="313">
+        <accordion_tab
+         expanded="true"
+         layout="topleft"
+         name="avatar_secondlife_tab"
+         title="Second Life"
+         fit_panel="true">
+          <panel
+           border="false"
+           filename="panel_profile_secondlife.xml"
+           layout="topleft"
+           left="0"
+           follows="all"
+           name="secondlife_tab_panel"
+           top="0" />
+        </accordion_tab>
+        <accordion_tab
+         expanded="false"
+         layout="topleft"
+         name="avatar_groups_tab"
+         title="Groups"
+         fit_panel="true">
+          <panel
+           border="false"
+           class="panel_profile_groups"
+           filename="panel_profile_groups.xml"
+           follows="all"
+           layout="topleft"
+           left="0"
+           name="groups_tab_panel"
+           top="0" />
+        </accordion_tab>
+        <accordion_tab
+         expanded="false"
+         layout="topleft"
+         name="avatar_interest_tab"
+         title="Interests"
+         fit_panel="false">
+          <panel
+           border="false"
+           filename="panel_profile_interests.xml"
+           follows="left|top|right"
+           layout="topleft"
+           left="0"
+           name="interests_tab_panel"
+           top="0" />
+        </accordion_tab>
+        <accordion_tab
+         expanded="false"
+         layout="topleft"
+         name="avatar_picks_tab"
+         title="Picks"
+         fit_panel="true">
+          <panel
+           border="false"
+           class="panel_profile_picks"
+           filename="panel_profile_picks.xml"
+           follows="all"
+           layout="topleft"
+           left="0"
+           name="picks_tab_panel"
+           top="0" />
+        </accordion_tab>
+        <accordion_tab
+         expanded="false"
+         layout="topleft"
+         name="avatar_firstlife_tab"
+         title="First Life"
+         fit_panel="true">
+          <panel
+           border="false"
+           filename="panel_profile_firstlife.xml"
+           follows="left|top|right"
+           layout="topleft"
+           left="0"
+           name="firstlife_tab_panel"
+           top="0" />
+        </accordion_tab>
+        <accordion_tab
+         expanded="false"
+         layout="topleft"
+         name="avatar_notes_tab"
+         title="Notes"
+         fit_panel="true">
+          <panel
+           border="false"
+           filename="panel_profile_notes.xml"
+           follows="all"
+           layout="topleft"
+           left="0"
+           name="notes_tab_panel"
+           top="0" />
+        </accordion_tab>
+      </accordion>
+    </layout_panel>
+  </layout_stack>
+
+  <layout_stack
+   follows="bottom|left|right"
+   height="25"
+   layout="topleft"
+   name="button_row_ls"
+   left="6"
+   orientation="horizontal"
+   top_pad="5"
+   width="299">
+    <layout_panel
+     follows="bottom|left|right"
+     height="23"
+     layout="bottomleft"
+     left="0"
+     name="btn_chat_lp"
+     auto_resize="true"
+     width="91">
+      <button
+       follows="bottom|left|right"
+       left="1"
+       height="23"
+       name="btn_chat"
+       label="Chat"
+       layout="topleft"
+       tool_tip="Send an instant message"
+       top="0"
+       width="90">
+        <button.commit_callback
+         function="Profile.Action"
+         parameter="chat" />
+      </button>
+    </layout_panel>
+    <layout_panel
+     follows="bottom|left|right"
+     height="23"
+     layout="bottomleft"
+     left_pad="3"
+     name="btn_friend_lp"
+     auto_resize="true"
+     width="91">
+      <button
+       follows="bottom|left|right"
+       left="1"
+       height="23"
+       name="btn_friend"
+       label="Add Friend"
+       layout="topleft"
+       top="0"
+       width="90">
+        <button.commit_callback
+         function="Profile.Action"
+         parameter="friend" />
+      </button>
+    </layout_panel>
+    <layout_panel
+     follows="bottom|left|right"
+     height="23"
+     layout="bottomleft"
+     left_pad="3"
+     name="btn_block_lp"
+     auto_resize="true"
+     width="91">
+      <button
+       follows="bottom|left|right"
+       left="1"
+       height="23"
+       name="btn_block"
+       label="Block"
+       layout="topleft"
+       tool_tip="Block this avatar"
+       top="0"
+       width="90">
+        <button.commit_callback
+         function="Profile.Action"
+         parameter="block" />
+      </button>
+    </layout_panel>
+    <layout_panel
+     follows="bottom|left|right"
+     height="23"
+     layout="bottomleft"
+     left_pad="3"
+     name="btn_menu_lp"
+     auto_resize="false"
+     width="30">
+    <menu_button
+     follows="bottom|left|right"
+     height="23"
+     image_hover_unselected="Toolbar_Middle_Over"
+     image_overlay="OptionsMenu_Off"
+     image_selected="Toolbar_Middle_Selected"
+     image_unselected="Toolbar_Middle_Off"
+     menu_filename="menu_legacy_profile.xml"
+     menu_position="bottomleft"
+     tool_tip="Actions on this avatar"
+     layout="topleft"
+     left="1"
+     top="0"
+     name="btn_menu"
+     width="30" />
+    </layout_panel>
+  </layout_stack>
+  <drop_target
+   top="0"
+   bottom="-1"
+   left="0"
+   right="-1"
+   layout="topleft"
+   follows="all"
+   name="drop_target"
+   mouse_opaque="false" />
+</panel>
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 00000000000..7af7ac76a94
--- /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 00000000000..dbe5739bbf7
--- /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 00000000000..3fd13670289
--- /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 00000000000..eaae6c535df
--- /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="AlchemyFindLandSort"
+   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="AlchemyFindLandSortAscending"
+   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 00000000000..addd20ff739
--- /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 00000000000..fabc2c6bbaa
--- /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>
-- 
GitLab