diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 8f5cb7c709c5bfd6d29d850d9dfbd653c92cf7dd..cc0e0a78db3f632625130eeb93c1f6f18b50dee6 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11022,7 +11022,29 @@
       <key>Type</key>
       <string>String</string>
       <key>Value</key>
-      <string>http://localhost/agni</string>
+      <string>http://update.secondlife.com</string>
+    </map>
+    <key>UpdaterServicePath</key>
+    <map>
+      <key>Comment</key>
+      <string>Path on the update server host.</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>update</string>
+    </map>
+    <key>UpdaterServiceProtocolVersion</key>
+    <map>
+      <key>Comment</key>
+      <string>The update protocol version to use.</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>String</string>
+      <key>Value</key>
+      <string>v1.0</string>
     </map>
     <key>UploadBakedTexOld</key>
     <map>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 3a48bc25f156f3639416d75a6d0cf9a0c296d514..6bb25969a6095ffb9fd8118c52e5c61bf3540df8 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -2337,9 +2337,11 @@ void LLAppViewer::initUpdater()
 	std::string url = gSavedSettings.getString("UpdaterServiceURL");
 	std::string channel = LLVersionInfo::getChannel();
 	std::string version = LLVersionInfo::getVersion();
+	std::string protocol_version = gSavedSettings.getString("UpdaterServiceProtocolVersion");
+	std::string service_path = gSavedSettings.getString("UpdaterServicePath");
 	U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod");
 
-	mUpdater->setParams(url, channel, version);
+	mUpdater->setParams(protocol_version, url, service_path, channel, version);
 	mUpdater->setCheckPeriod(check_period);
 	if(gSavedSettings.getBOOL("UpdaterServiceActive"))
 	{
diff --git a/indra/viewer_components/updater/llupdatechecker.cpp b/indra/viewer_components/updater/llupdatechecker.cpp
index 596b122a25ab707797cb38dd1d81de3f51f63450..2c60636122ee0a05e7ccb8c30cdf41d1f85ad530 100644
--- a/indra/viewer_components/updater/llupdatechecker.cpp
+++ b/indra/viewer_components/updater/llupdatechecker.cpp
@@ -41,7 +41,8 @@ class LLUpdateChecker::Implementation:
 	
 	Implementation(Client & client);
 	~Implementation();
-	void check(std::string const & host, std::string channel, std::string version);
+	void check(std::string const & protocolVersion, std::string const & hostUrl, 
+			   std::string const & servicePath, std::string channel, std::string version);
 	
 	// Responder:
 	virtual void completed(U32 status,
@@ -50,7 +51,8 @@ class LLUpdateChecker::Implementation:
 	virtual void error(U32 status, const std::string & reason);
 	
 private:
-	std::string buildUrl(std::string const & host, std::string channel, std::string version);
+	std::string buildUrl(std::string const & protocolVersion, std::string const & hostUrl, 
+						 std::string const & servicePath, std::string channel, std::string version);
 	
 	Client & mClient;
 	LLHTTPClient mHttpClient;
@@ -74,9 +76,10 @@ LLUpdateChecker::LLUpdateChecker(LLUpdateChecker::Client & client):
 }
 
 
-void LLUpdateChecker::check(std::string const & host, std::string channel, std::string version)
+void LLUpdateChecker::check(std::string const & protocolVersion, std::string const & hostUrl, 
+							std::string const & servicePath, std::string channel, std::string version)
 {
-	mImplementation->check(host, channel, version);
+	mImplementation->check(protocolVersion, hostUrl, servicePath, channel, version);
 }
 
 
@@ -100,13 +103,14 @@ LLUpdateChecker::Implementation::~Implementation()
 }
 
 
-void LLUpdateChecker::Implementation::check(std::string const & host, std::string channel, std::string version)
+void LLUpdateChecker::Implementation::check(std::string const & protocolVersion, std::string const & hostUrl, 
+											std::string const & servicePath, std::string channel, std::string version)
 {
 	// llassert(!mInProgress);
 		
 	mInProgress = true;
 	mVersion = version;
-	std::string checkUrl = buildUrl(host, channel, version);
+	std::string checkUrl = buildUrl(protocolVersion, hostUrl, servicePath, channel, version);
 	LL_INFOS("UpdateCheck") << "checking for updates at " << checkUrl << llendl;
 	
 	// The HTTP client will wrap a raw pointer in a boost::intrusive_ptr causing the
@@ -125,17 +129,17 @@ void LLUpdateChecker::Implementation::completed(U32 status,
 	if(status != 200) {
 		LL_WARNS("UpdateCheck") << "html error " << status << " (" << reason << ")" << llendl;
 		mClient.error(reason);
-	} else if(!content["valid"].asBoolean()) {
-		LL_INFOS("UpdateCheck") << "version invalid" << llendl;
-		LLURI uri(content["download_url"].asString());
-		mClient.requiredUpdate(content["latest_version"].asString(), uri);
-	} else if(content["latest_version"].asString() != mVersion) {
-		LL_INFOS("UpdateCheck") << "newer version " << content["latest_version"].asString() << " available" << llendl;
-		LLURI uri(content["download_url"].asString());
-		mClient.optionalUpdate(content["latest_version"].asString(), uri);
-	} else {
+	} else if(!content.asBoolean()) {
 		LL_INFOS("UpdateCheck") << "up to date" << llendl;
 		mClient.upToDate();
+	} else if(content["required"].asBoolean()) {
+		LL_INFOS("UpdateCheck") << "version invalid" << llendl;
+		LLURI uri(content["url"].asString());
+		mClient.requiredUpdate(content["version"].asString(), uri);
+	} else {
+		LL_INFOS("UpdateCheck") << "newer version " << content["version"].asString() << " available" << llendl;
+		LLURI uri(content["url"].asString());
+		mClient.optionalUpdate(content["version"].asString(), uri);
 	}
 }
 
@@ -144,14 +148,26 @@ void LLUpdateChecker::Implementation::error(U32 status, const std::string & reas
 {
 	mInProgress = false;
 	LL_WARNS("UpdateCheck") << "update check failed; " << reason << llendl;
+	mClient.error(reason);
 }
 
 
-std::string LLUpdateChecker::Implementation::buildUrl(std::string const & host, std::string channel, std::string version)
+std::string LLUpdateChecker::Implementation::buildUrl(std::string const & protocolVersion, std::string const & hostUrl, 
+													  std::string const & servicePath, std::string channel, std::string version)
 {	
+#ifdef LL_WINDOWS
+	static const char * platform = "win";
+#elif LL_DARWIN
+	static const char * platform = "mac";
+#else
+	static const char * platform = "lnx";
+#endif
+	
 	LLSD path;
-	path.append("version");
+	path.append(servicePath);
+	path.append(protocolVersion);
 	path.append(channel);
 	path.append(version);
-	return LLURI::buildHTTP(host, path).asString();
+	path.append(platform);
+	return LLURI::buildHTTP(hostUrl, path).asString();
 }
diff --git a/indra/viewer_components/updater/llupdatechecker.h b/indra/viewer_components/updater/llupdatechecker.h
index 1f8c6d8a9100fabdd7990df5e7d0abce1708ff8d..58aaee4e3d541ab3d3a71c818897fc802d952aab 100644
--- a/indra/viewer_components/updater/llupdatechecker.h
+++ b/indra/viewer_components/updater/llupdatechecker.h
@@ -41,7 +41,8 @@ class LLUpdateChecker {
 	LLUpdateChecker(Client & client);
 	
 	// Check status of current app on the given host for the channel and version provided.
-	void check(std::string const & hostUrl, std::string channel, std::string version);
+	void check(std::string const & protocolVersion, std::string const & hostUrl, 
+			   std::string const & servicePath, std::string channel, std::string version);
 	
 private:
 	boost::shared_ptr<Implementation> mImplementation;
diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp
index 21e4ce94cc42c9651e36f55c685a0df06fcdccee..087d79f8041fe91a66a1161af0ee6e12e242c311 100644
--- a/indra/viewer_components/updater/llupdatedownloader.cpp
+++ b/indra/viewer_components/updater/llupdatedownloader.cpp
@@ -222,6 +222,7 @@ void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & u
 	
 	CURLcode code;
 	code = curl_easy_setopt(mCurl, CURLOPT_NOSIGNAL, true);
+	code = curl_easy_setopt(mCurl, CURLOPT_FOLLOWLOCATION, true);
 	code = curl_easy_setopt(mCurl, CURLOPT_WRITEFUNCTION, &write_function);
 	code = curl_easy_setopt(mCurl, CURLOPT_WRITEDATA, this);
 	code = curl_easy_setopt(mCurl, CURLOPT_HEADERFUNCTION, &header_function);
diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp
index a1b6de38e510f7bf098019a04c000e8161b26d57..e865552fb30f10f32bd2e2a635c9c0f67c3bda6f 100644
--- a/indra/viewer_components/updater/llupdaterservice.cpp
+++ b/indra/viewer_components/updater/llupdaterservice.cpp
@@ -48,7 +48,9 @@ class LLUpdaterServiceImpl :
 {
 	static const std::string sListenerName;
 	
+	std::string mProtocolVersion;
 	std::string mUrl;
+	std::string mPath;
 	std::string mChannel;
 	std::string mVersion;
 	
@@ -74,10 +76,12 @@ class LLUpdaterServiceImpl :
 	virtual void pluginLaunchFailed();
 	virtual void pluginDied();
 
-	void setParams(const std::string& url,
+	void setParams(const std::string& protocol_version,
+				   const std::string& url, 
+				   const std::string& path,
 				   const std::string& channel,
 				   const std::string& version);
-
+	
 	void setCheckPeriod(unsigned int seconds);
 
 	void startChecking();
@@ -134,7 +138,9 @@ void LLUpdaterServiceImpl::pluginDied()
 {
 };
 
-void LLUpdaterServiceImpl::setParams(const std::string& url,
+void LLUpdaterServiceImpl::setParams(const std::string& protocol_version,
+									 const std::string& url, 
+									 const std::string& path,
 									 const std::string& channel,
 									 const std::string& version)
 {
@@ -144,7 +150,9 @@ void LLUpdaterServiceImpl::setParams(const std::string& url,
 			" before setting params.");
 	}
 		
+	mProtocolVersion = protocol_version;
 	mUrl = url;
+	mPath = path;
 	mChannel = channel;
 	mVersion = version;
 }
@@ -165,7 +173,7 @@ void LLUpdaterServiceImpl::startChecking()
 		}
 		mIsChecking = true;
 		
-		mUpdateChecker.check(mUrl, mChannel, mVersion);
+		mUpdateChecker.check(mProtocolVersion, mUrl, mPath, mChannel, mVersion);
 	}
 }
 
@@ -218,7 +226,7 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)
 	{
 		mTimer.stop();
 		LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName);
-		mUpdateChecker.check(mUrl, mChannel, mVersion);
+		mUpdateChecker.check(mProtocolVersion, mUrl, mPath, mChannel, mVersion);
 	} else {
 		// Keep on waiting...
 	}
@@ -247,11 +255,13 @@ LLUpdaterService::~LLUpdaterService()
 {
 }
 
-void LLUpdaterService::setParams(const std::string& url,
-								 const std::string& chan,
-								 const std::string& vers)
+void LLUpdaterService::setParams(const std::string& protocol_version,
+								 const std::string& url, 
+								 const std::string& path,
+								 const std::string& channel,
+								 const std::string& version)
 {
-	mImpl->setParams(url, chan, vers);
+	mImpl->setParams(protocol_version, url, path, channel, version);
 }
 
 void LLUpdaterService::setCheckPeriod(unsigned int seconds)
diff --git a/indra/viewer_components/updater/llupdaterservice.h b/indra/viewer_components/updater/llupdaterservice.h
index 313ae8ada32e9305e3000bb1b33a5a4f114fd38a..83b09c4bdd3659ff01b905a571d6bb25a01f7793 100644
--- a/indra/viewer_components/updater/llupdaterservice.h
+++ b/indra/viewer_components/updater/llupdaterservice.h
@@ -42,9 +42,9 @@ class LLUpdaterService
 	LLUpdaterService();
 	~LLUpdaterService();
 
-	// The base URL.
-	// *NOTE:Mani The grid, if any, would be embedded in the base URL.
-	void setParams(const std::string& url, 
+	void setParams(const std::string& version,
+				   const std::string& url, 
+				   const std::string& path,
 				   const std::string& channel,
 				   const std::string& version);
 
diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
index 0ffc1f2c701c407d33a7763d3612e312e958c6bb..958526e35ba2401cfcc78cdc5aaa5535c68b8de9 100644
--- a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
+++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp
@@ -60,9 +60,10 @@ LLPluginMessage::LLPluginMessage(LLPluginMessage const&) {}
 
 LLUpdateChecker::LLUpdateChecker(LLUpdateChecker::Client & client)
 {}
-void LLUpdateChecker::check(std::string const & host, std::string channel, std::string version){}
-LLUpdateDownloader::LLUpdateDownloader(LLUpdateDownloader::Client & client)
+void LLUpdateChecker::check(std::string const & protocolVersion, std::string const & hostUrl, 
+								  std::string const & servicePath, std::string channel, std::string version)
 {}
+LLUpdateDownloader::LLUpdateDownloader(Client & ) {}
 void LLUpdateDownloader::download(LLURI const & ){}
 
 /*****************************************************************************
@@ -113,9 +114,9 @@ namespace tut
 		bool got_usage_error = false;
 		try
 		{
-			updater.setParams(test_url, test_channel, test_version);
+			updater.setParams("1.0",test_url, "update" ,test_channel, test_version);
 			updater.startChecking();
-			updater.setParams("other_url", test_channel, test_version);
+			updater.setParams("1.0", "other_url", "update", test_channel, test_version);
 		}
 		catch(LLUpdaterService::UsageError)
 		{
@@ -129,7 +130,7 @@ namespace tut
     {
         DEBUG;
 		LLUpdaterService updater;
-		updater.setParams(test_url, test_channel, test_version);
+		updater.setParams("1.0", test_url, "update", test_channel, test_version);
 		updater.startChecking();
 		ensure(updater.isChecking());
 		updater.stopChecking();