diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index ddb6c6baffee7708bfaa44b9a5f2929a3015e9a7..dae4b512d15ed2ed8f55d7a515c3a282d03169ea 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -145,6 +145,18 @@ void LLUrlEntryBase::callObservers(const std::string &id, const std::string &lab
 	}
 }
 
+static std::string getStringAfterToken(const std::string str, const std::string token)
+{
+	size_t pos = str.find(token);
+	if (pos == std::string::npos)
+	{
+		return "";
+	}
+
+	pos += token.size();
+	return str.substr(pos, str.size() - pos);
+}
+
 //
 // LLUrlEntryHTTP Describes generic http: and https: Urls
 //
@@ -154,7 +166,6 @@ LLUrlEntryHTTP::LLUrlEntryHTTP()
 							boost::regex::perl|boost::regex::icase);
 	mMenuName = "menu_url_http.xml";
 	mTooltip = LLTrans::getString("TooltipHttpUrl");
-	//mIcon = "gear.tga";
 }
 
 std::string LLUrlEntryHTTP::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
@@ -390,7 +401,7 @@ std::string LLUrlEntryParcel::getLabel(const std::string &url, const LLUrlLabelC
 }
 
 //
-// LLUrlEntryPlace Describes secondlife:///<location> URLs
+// LLUrlEntryPlace Describes secondlife://<location> URLs
 //
 LLUrlEntryPlace::LLUrlEntryPlace()
 {
@@ -433,15 +444,7 @@ std::string LLUrlEntryPlace::getLabel(const std::string &url, const LLUrlLabelCa
 std::string LLUrlEntryPlace::getLocation(const std::string &url) const
 {
 	// return the part of the Url after secondlife:// part
-	const std::string search_string = "://";
-	size_t pos = url.find(search_string);
-	if (pos == std::string::npos)
-	{
-		return "";
-	}
-
-	pos += search_string.size();
-	return url.substr(pos, url.size() - pos);
+	return ::getStringAfterToken(url, "://");
 }
 
 //
@@ -506,15 +509,7 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
 std::string LLUrlEntryTeleport::getLocation(const std::string &url) const
 {
 	// return the part of the Url after ///app/teleport
-	const std::string search_string = "teleport";
-	size_t pos = url.find(search_string);
-	if (pos == std::string::npos)
-	{
-		return "";
-	}
-
-	pos += search_string.size() + 1;
-	return url.substr(pos, url.size() - pos);
+	return ::getStringAfterToken(url, "app/teleport/");
 }
 
 ///
@@ -638,14 +633,5 @@ std::string LLUrlEntryWorldMap::getLabel(const std::string &url, const LLUrlLabe
 std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const
 {
 	// return the part of the Url after secondlife:///app/worldmap/ part
-	const std::string search_string = "//app/worldmap/";
-	size_t pos = url.find(search_string);
-	if (pos == std::string::npos)
-	{
-		return "";
-	}
-
-	pos += search_string.size();
-	return url.substr(pos, url.size() - pos);
+	return ::getStringAfterToken(url, "app/worldmap/");
 }
-
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index 180ef856737ededf389efd6adef007c69d7d1c14..4507572b1e1939d722eb6dbfd574d30534d9a08c 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -186,7 +186,7 @@ class LLUrlEntryParcel : public LLUrlEntryBase
 
 ///
 /// LLUrlEntryPlace Describes a Second Life location Url, e.g.,
-/// secondlife:///Ahern/50/50/50
+/// secondlife://Ahern/50/50/50
 ///
 class LLUrlEntryPlace : public LLUrlEntryBase
 {
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index bd9798c18e144c33fd037dd05c30951c2dbca779..97c573ddea516ecd6f3b777a8c2ffe9605965ccd 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -34,8 +34,8 @@
 #include "llviewerprecompiledheaders.h"
 #include "llfloatersearch.h"
 #include "llmediactrl.h"
-#include "llagent.h"
-
+#include "lllogininstance.h"
+#include "lluri.h"
 
 LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
 	LLFloater(key),
@@ -116,15 +116,11 @@ void LLFloaterSearch::search(const LLSD &key)
 
 	// append the search query string
 	std::string search_text = key.has("id") ? key["id"].asString() : "";
-	url += std::string("?q=") + search_text;
+	url += std::string("?q=") + LLURI::escape(search_text);
 
-	// append the maturity and teen capabilities for this agent
-	BOOL godlike = gAgent.isGodlike();
-	bool mature_enabled = gAgent.canAccessMature() || godlike;
-	bool adult_enabled = gAgent.canAccessAdult() || godlike;
-	std::string mature = (mature_enabled) ? "True" : "False";
-	std::string teen = (!adult_enabled) ? "True" : "False";
-	url += "&t=" + teen + "&m=" + mature;
+	// append the permissions token that login.cgi gave us
+	LLSD search_token = LLLoginInstance::getInstance()->getResponse("search_token");
+	url += "&p=" + search_token.asString();
 
 	// and load the URL in the web view
 	mBrowser->navigateTo(url);