diff --git a/autobuild.xml b/autobuild.xml
index 63701dae790b44836b7ff56166d2db069affd987..d1a7107319fe0586ee9695c0cce873961ede57f3 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -1907,11 +1907,8 @@
             <map>
               <key>build</key>
               <map>
-                <key>arguments</key>
+                <key>filters</key>
                 <array>
-                  <string>|</string>
-                  <string>grep</string>
-                  <string>-v</string>
                   <string>setenv</string>
                 </array>
                 <key>command</key>
@@ -1964,11 +1961,8 @@
             <map>
               <key>build</key>
               <map>
-                <key>arguments</key>
+                <key>filters</key>
                 <array>
-                  <string>|</string>
-                  <string>grep</string>
-                  <string>-v</string>
                   <string>setenv</string>
                 </array>
                 <key>command</key>
@@ -2023,11 +2017,8 @@
             <map>
               <key>build</key>
               <map>
-                <key>arguments</key>
+                <key>filters</key>
                 <array>
-                  <string>|</string>
-                  <string>grep</string>
-                  <string>-v</string>
                   <string>setenv</string>
                 </array>
                 <key>command</key>
diff --git a/indra/llmessage/lliosocket.cpp b/indra/llmessage/lliosocket.cpp
index ca84fa8bb80abf27f3a4b6a1da50afe79f2f82e5..8c752fbe301e74f2767e4203555d6cc4bc7fd868 100644
--- a/indra/llmessage/lliosocket.cpp
+++ b/indra/llmessage/lliosocket.cpp
@@ -191,7 +191,7 @@ LLSocket::ptr_t LLSocket::create(apr_pool_t* pool, EType type, U16 port)
 		port = PORT_EPHEMERAL;
 	}
 	rv->mPort = port;
-	rv->setOptions();
+	rv->setNonBlocking();
 	return rv;
 }
 
@@ -206,7 +206,7 @@ LLSocket::ptr_t LLSocket::create(apr_socket_t* socket, apr_pool_t* pool)
 	}
 	rv = ptr_t(new LLSocket(socket, pool));
 	rv->mPort = PORT_EPHEMERAL;
-	rv->setOptions();
+	rv->setNonBlocking();
 	return rv;
 }
 
@@ -227,10 +227,10 @@ bool LLSocket::blockingConnect(const LLHost& host)
 	{
 		return false;
 	}
-	apr_socket_timeout_set(mSocket, 1000);
+	setBlocking(1000);
 	ll_debug_socket("Blocking connect", mSocket);
 	if(ll_apr_warn_status(apr_socket_connect(mSocket, sa))) return false;
-	setOptions();
+	setNonBlocking();
 	return true;
 }
 
@@ -258,11 +258,27 @@ LLSocket::~LLSocket()
 	}
 }
 
-void LLSocket::setOptions()
+// See http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial-13.html#ss13.4
+// for an explanation of how to get non-blocking sockets and timeouts with
+// consistent behavior across platforms.
+
+void LLSocket::setBlocking(S32 timeout)
+{
+	LLMemType m1(LLMemType::MTYPE_IO_TCP);
+	// set up the socket options
+	ll_apr_warn_status(apr_socket_timeout_set(mSocket, timeout));
+	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 0));
+	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
+	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));
+
+}
+
+void LLSocket::setNonBlocking()
 {
 	LLMemType m1(LLMemType::MTYPE_IO_TCP);
 	// set up the socket options
 	ll_apr_warn_status(apr_socket_timeout_set(mSocket, 0));
+	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_NONBLOCK, 1));
 	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_SNDBUF, LL_SEND_BUFFER_SIZE));
 	ll_apr_warn_status(apr_socket_opt_set(mSocket, APR_SO_RCVBUF, LL_RECV_BUFFER_SIZE));
 
diff --git a/indra/llmessage/lliosocket.h b/indra/llmessage/lliosocket.h
index 6806e5084a4211d7a819b1613e43fa0e17b94e05..e0f6c1e34d0ea15be627cb718f64f171cf506491 100644
--- a/indra/llmessage/lliosocket.h
+++ b/indra/llmessage/lliosocket.h
@@ -153,9 +153,16 @@ class LLSocket
 	LLSocket(apr_socket_t* socket, apr_pool_t* pool);
 
 	/** 
-	 * @brief Set default socket options.
+	 * @brief Set default socket options, with SO_NONBLOCK = 0 and a timeout in us.
+	 * @param timeout Number of microseconds to wait on this socket. Any
+	 * negative number means block-forever. TIMEOUT OF 0 IS NON-PORTABLE.
 	 */
-	void setOptions();
+	void setBlocking(S32 timeout);
+
+	/**
+	 * @brief Set default socket options, with SO_NONBLOCK = 1 and timeout = 0.
+	 */
+	void setNonBlocking();
 
 public:
 	/**