diff --git a/doc/contributions.txt b/doc/contributions.txt
index f7041c538e9520b31a35ea345de9bce10a817ce5..211d4fcf087e42b4144fb1e2e830acaa5e387032 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -327,6 +327,7 @@ Cinder Roxley
     STORM-2036
     STORM-2037
     STORM-2053
+    STORM-2113
 Clara Young
 Coaldust Numbers
     VWR-1095
@@ -1231,6 +1232,7 @@ Sovereign Engineer
     MAINT-2334
     OPEN-189
     STORM-1972
+    STORM-2113
     OPEN-195
     OPEN-217
     OPEN-295
diff --git a/indra/llcommon/lluriparser.h b/indra/llcommon/lluriparser.h
index 561431e8f905c01375ac7cbf1e7aab23e666eaba..2df8085ae6330582453cd0c0e839a97a5ad5994a 100644
--- a/indra/llcommon/lluriparser.h
+++ b/indra/llcommon/lluriparser.h
@@ -36,7 +36,7 @@ class LL_COMMON_API LLUriParser
 {
 public:
 	LLUriParser(const std::string& u);
-	virtual ~LLUriParser();
+	~LLUriParser();
 
 	const char * scheme() const;
 	void sheme (const std::string& s);
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 7ccb6055b3f46f1fa405f25fb617053e1f9659f6..602a70345061a82a801d0d5b8139beeb5a6a474d 100755
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -38,7 +38,6 @@
 #include "lltextutil.h"
 #include "lltooltip.h"
 #include "lluictrl.h"
-#include "lluriparser.h"
 #include "llurlaction.h"
 #include "llurlregistry.h"
 #include "llview.h"
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 65fbd9ba69365e3aff7cf9897885f3c223aca340..5f60d80858c071ac12c0dad69bc2a58ced94df9d 100755
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -39,8 +39,6 @@
 #include "lluicolortable.h"
 #include "message.h"
 
-#include "uriparser/Uri.h"
-
 #define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"
 
 // Utility functions
@@ -495,6 +493,17 @@ LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL()
 	
 	mIcon = "Hand";
 	mMenuName = "menu_url_http.xml";
+	mTooltip = LLTrans::getString("TooltipHttpUrl");
+}
+
+/// Return the url from a string that matched the regex
+std::string LLUrlEntrySecondlifeURL::getUrl(const std::string &string) const
+{
+	if (string.find("://") == std::string::npos)
+	{
+		return "https://" + escapeUrl(string);
+	}
+	return escapeUrl(string);
 }
 
 std::string LLUrlEntrySecondlifeURL::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
@@ -512,15 +521,6 @@ std::string LLUrlEntrySecondlifeURL::getTooltip(const std::string &url) const
 	return url;
 }
 
-std::string LLUrlEntrySecondlifeURL::getUrl(const std::string &string) const
-{
-	if (string.find("://") == std::string::npos)
-	{
-		return "http://" + escapeUrl(string);
-	}
-	return escapeUrl(string);
-}
-
 //
 // LLUrlEntrySimpleSecondlifeURL Describes *secondlife.com and *lindenlab.com urls to substitute icon 'hand.png' before link
 //
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index ddfc33ab78fdae98d1070691cc36854b752e0ebc..60a494974f544373efba50f40e6904a655f4b30b 100755
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -199,11 +199,11 @@ class LLUrlEntrySecondlifeURL : public LLUrlEntryBase
 {
 public:
 	LLUrlEntrySecondlifeURL();
-	bool isTrusted() const { return true; }
+	/*virtual*/ bool isTrusted() const { return true; }
+	/*virtual*/ std::string getUrl(const std::string &string) const;
 	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
 	/*virtual*/ std::string getQuery(const std::string &url) const;
 	/*virtual*/ std::string getTooltip(const std::string &url) const;
-	/*virtual*/ std::string getUrl(const std::string &string) const;
 };
 
 ///
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index 4fc79964e236c836161e878c932bf54b81558df9..1143574968a57b48ed3a8069f0566f35408460a4 100755
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -220,9 +220,12 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL
 		// fill in the LLUrlMatch object and return it
 		std::string url = text.substr(match_start, match_end - match_start + 1);
 
-		LLUriParser up(url);
-		up.normalize();
-		url = up.normalizedUri();
+		if (match_entry == mUrlEntryTrusted)
+		{
+			LLUriParser up(url);
+			up.normalize();
+			url = up.normalizedUri();
+		}
 
 		match.setValues(match_start, match_end,
 						match_entry->getUrl(url),
@@ -255,7 +258,7 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr
 		// character encoding, so we need to update the start
 		// and end values to be correct for the wide string.
 		LLWString wurl = utf8str_to_wstring(match.getUrl());
-		S32 start = text.find(wurl);
+		size_t start = text.find(wurl);
 		if (start == std::string::npos)
 		{
 			return false;
diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h
index d85fbcb012ae82064c47e56a62a813923bfad2d8..5ce4048d5d66a647ad712aabdc82fe1801a8d585 100755
--- a/indra/llui/llurlregistry.h
+++ b/indra/llui/llurlregistry.h
@@ -93,6 +93,7 @@ class LLUrlRegistry : public LLSingleton<LLUrlRegistry>
 	friend class LLSingleton<LLUrlRegistry>;
 
 	std::vector<LLUrlEntryBase *> mUrlEntry;
+	LLUrlEntryBase*	mUrlEntryTrusted;
 	LLUrlEntryBase*	mUrlEntryIcon;
 	LLUrlEntryBase* mLLUrlEntryInvalidSLURL;
 	LLUrlEntryBase* mUrlEntryHTTPLabel;
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index 0f0d9ce703c0d3b6e559a53b58b2b4714f210838..0be6e498342c70440b30e0574099337189979687 100755
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -49,7 +49,7 @@
 #include "llviewerregion.h"
 #include "llviewerwindow.h"
 #include "llnotificationsutil.h"
-
+#include "lluriparser.h"
 #include "uriparser/Uri.h"
 
 #include <boost/regex.hpp>
@@ -240,19 +240,10 @@ bool LLWeb::useExternalBrowser(const std::string &url)
 	}
 	else if (gSavedSettings.getU32("PreferredBrowserBehavior") == BROWSER_INT_LL_EXT_OTHERS)
 	{
-		UriParserStateA state;
-		UriUriA uri;
-		state.uri = &uri;
-
-		std::string uri_string = url;
-		uriParseUriA(&state, uri_string.c_str());
-		if (uri.hostText.first)
-		{
-			S32 length = uri.hostText.afterLast - uri.hostText.first;
-			std::string buf = uri.hostText.first;
-			uri_string = buf.substr(0,length);
-		}
-		uriFreeUriMembersA(&uri);
+		LLUriParser up(url);
+		up.normalize();
+		up.extractParts();
+		std::string uri_string = up.host();
 
 		boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com)$", boost::regex::perl|boost::regex::icase);
 		boost::match_results<std::string::const_iterator> matches;