diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt
index 0f40a670fad223de66193721b78c33f323ca5d69..d98781e9e62ba8ff79e689345f3975d3cec98d39 100644
--- a/indra/llmessage/CMakeLists.txt
+++ b/indra/llmessage/CMakeLists.txt
@@ -254,6 +254,14 @@ if (LL_TESTS)
     "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_llsdmessage_peer.py"
     )
 
+  LL_ADD_INTEGRATION_TEST(
+    llhttpclient
+    "llhttpclient.cpp"
+    "${test_libs}"
+    ${PYTHON_EXECUTABLE}
+    "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_llsdmessage_peer.py"
+    )
+
   LL_ADD_INTEGRATION_TEST(llavatarnamecache "" "${test_libs}")
   LL_ADD_INTEGRATION_TEST(llhost "" "${test_libs}")
   LL_ADD_INTEGRATION_TEST(llpartdata "" "${test_libs}")
diff --git a/indra/test/llhttpclient_tut.cpp b/indra/llmessage/tests/llhttpclient_test.cpp
similarity index 90%
rename from indra/test/llhttpclient_tut.cpp
rename to indra/llmessage/tests/llhttpclient_test.cpp
index 4b4046632c4e3eb80a6b94300efa15d040491b01..843c3bcc4bd6c09b7cdb04bd579853c2bea7d5be 100644
--- a/indra/test/llhttpclient_tut.cpp
+++ b/indra/llmessage/tests/llhttpclient_test.cpp
@@ -1,5 +1,5 @@
 /** 
- * @file llhttpclient_tut.cpp
+ * @file llhttpclient_test.cpp
  * @brief Testing the HTTP client classes.
  *
  * $LicenseInfo:firstyear=2006&license=viewerlgpl$
@@ -33,9 +33,6 @@
 #include <tut/tut.hpp>
 #include "linden_common.h"
 
-// These are too slow on Windows to actually include in the build. JC
-#if !LL_WINDOWS
-
 #include "lltut.h"
 #include "llhttpclient.h"
 #include "llformat.h"
@@ -46,6 +43,7 @@
 #include "llsdhttpserver.h"
 #include "lliohttpserver.h"
 #include "lliosocket.h"
+#include "stringize.h"
 
 namespace tut
 {
@@ -83,7 +81,8 @@ namespace tut
 	struct HTTPClientTestData
 	{
 	public:
-		HTTPClientTestData()
+		HTTPClientTestData():
+			local_server(STRINGIZE("http://127.0.0.1:" << getenv("PORT") << "/"))
 		{
 			apr_pool_create(&mPool, NULL);
 			LLCurl::initClass(false);
@@ -134,13 +133,14 @@ namespace tut
 			delete mServerPump;
 			mServerPump = NULL;
 		}
-	
+
+		const std::string local_server;
+
 	private:
 		apr_pool_t* mPool;
 		LLPumpIO* mServerPump;
 		LLPumpIO* mClientPump;
 
-		
 	protected:
 		void ensureStatusOK()
 		{
@@ -257,7 +257,7 @@ namespace tut
 	template<> template<>
 	void HTTPClientTestObject::test<1>()
 	{
-		LLHTTPClient::get("http://www.google.com/", newResult());
+		LLHTTPClient::get(local_server, newResult());
 		runThePump();
 		ensureStatusOK();
 		ensure("result object wasn't destroyed", mResultDeleted);
@@ -266,8 +266,8 @@ namespace tut
 	template<> template<>
 	void HTTPClientTestObject::test<2>()
 	{
-		skip("error test depends on dev's local ISP not supplying \"helpful\" search page");
-		LLHTTPClient::get("http://www.invalid", newResult());
+		// Please nobody listen on this particular port...
+		LLHTTPClient::get("http://127.0.0.1:7950", newResult());
 		runThePump();
 		ensureStatusError();
 	}
@@ -344,18 +344,13 @@ namespace tut
 		// won't ever let it run.  Instead get from a known LLSD
 		// source and compare results with the non-blocking get which
 		// is tested against the mini server earlier.
-		skip("secondlife.com is not reliable enough for unit tests.");
-
-
-		LLSD expected;
-
-		LLHTTPClient::get("http://secondlife.com/xmlhttp/homepage.php", newResult());
+		LLHTTPClient::get(local_server, newResult());
 		runThePump();
 		ensureStatusOK();
-		expected = getResult();
+		LLSD expected = getResult();
 
 		LLSD result;
-		result = LLHTTPClient::blockingGet("http://secondlife.com/xmlhttp/homepage.php");
+		result = LLHTTPClient::blockingGet(local_server);
 		LLSD body = result["body"];
 		ensure_equals("echoed result matches", body.size(), expected.size());
 	}
@@ -364,20 +359,18 @@ namespace tut
 	{
 		// This is testing for the presence of the Header in the returned results
 		// from an HTTP::get call.
-		LLHTTPClient::get("http://www.google.com/", newResult());
+		LLHTTPClient::get(local_server, newResult());
 		runThePump();
 		ensureStatusOK();
 		LLSD header = getHeader();
-		ensure_equals("got a header", header.emptyMap().asBoolean(), FALSE);
+		ensure("got a header", ! header.emptyMap().asBoolean());
 	}
 	template<> template<>
 	void HTTPClientTestObject::test<9>()
 	{
-		LLHTTPClient::head("http://www.google.com/", newResult());
+		LLHTTPClient::head(local_server, newResult());
 		runThePump();
 		ensureStatusOK();
 		ensure("result object wasn't destroyed", mResultDeleted);
 	}
 }
-
-#endif	// !LL_WINDOWS
diff --git a/indra/llmessage/tests/llsdmessage_test.cpp b/indra/llmessage/tests/llsdmessage_test.cpp
index 0f2c0693031351ed7e34fcec041d1de2be90ae86..31a791e4b4f281a970ec0eea321a9acc3c116aa8 100644
--- a/indra/llmessage/tests/llsdmessage_test.cpp
+++ b/indra/llmessage/tests/llsdmessage_test.cpp
@@ -143,7 +143,7 @@ namespace tut
         httpPump.post(request);
         ensure("got response", netio.pump());
         ensure("success response", success);
-        ensure_equals(result.asString(), "success");
+        ensure_equals(result["reply"].asString(), "success");
 
         body["status"] = 499;
         body["reason"] = "custom error message";
diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py
index 22edd9dad84b6c63aeae44866705eca40c23a4aa..fe4f3a8c011b095ab7b020f5b6d01c1216bc30a7 100644
--- a/indra/llmessage/tests/test_llsdmessage_peer.py
+++ b/indra/llmessage/tests/test_llsdmessage_peer.py
@@ -78,25 +78,32 @@ def read_xml(self):
 ##         debug("root node tag %s", tree.getroot().tag)
 ##         return llsd.to_python(tree.getroot())
 
-    def do_GET(self):
+    def do_HEAD(self):
+        self.do_GET(withdata=False)
+
+    def do_GET(self, withdata=True):
         # Of course, don't attempt to read data.
-        self.answer(dict(reply="success", status=500,
-                         reason="Your GET operation requested failure"))
+        data = dict(reply="success", body="avatar", random=17)
+        self.answer(data, withdata=withdata)
 
     def do_POST(self):
         # Read the provided POST data.
         self.answer(self.read_xml())
 
-    def answer(self, data):
+    def answer(self, data, withdata=True):
         debug("%s.answer(%s): self.path = %r", self.__class__.__name__, data, self.path)
         if "fail" not in self.path:
-            response = llsd.format_xml(data.get("reply", llsd.LLSD("success")))
+            data = data.copy()          # we're going to modify
+            # Ensure there's a "reply" key in data, even if there wasn't before
+            data["reply"] = data.get("reply", llsd.LLSD("success"))
+            response = llsd.format_xml(data)
             debug("success: %s", response)
             self.send_response(200)
             self.send_header("Content-type", "application/llsd+xml")
             self.send_header("Content-Length", str(len(response)))
             self.end_headers()
-            self.wfile.write(response)
+            if withdata:
+                self.wfile.write(response)
         else:                           # fail requested
             status = data.get("status", 500)
             # self.responses maps an int status to a (short, long) pair of
diff --git a/indra/newview/tests/llcapabilitylistener_test.cpp b/indra/newview/tests/llcapabilitylistener_test.cpp
index 2ad08dc1f34cf59bfc063639152212ad536d4d90..e1cbd28f92b1c35ab3fa05775420adc160db850b 100644
--- a/indra/newview/tests/llcapabilitylistener_test.cpp
+++ b/indra/newview/tests/llcapabilitylistener_test.cpp
@@ -156,7 +156,7 @@ namespace tut
         regionPump.post(request);
         ensure("got response", netio.pump());
         ensure("success response", success);
-        ensure_equals(result.asString(), "success");
+        ensure_equals(result["reply"].asString(), "success");
 
         body["status"] = 499;
         body["reason"] = "custom error message";
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index 328ab4ca518f51cfe5f0f42a3b32d957568c36bd..816f1d7175ebd177c5b3efe114d1bfef9af0d8b0 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -37,7 +37,6 @@ set(test_SOURCE_FILES
     lldoubledispatch_tut.cpp
     llevents_tut.cpp
     llhttpdate_tut.cpp
-    llhttpclient_tut.cpp
     llhttpnode_tut.cpp
     lliohttpserver_tut.cpp
     llmessageconfig_tut.cpp