diff --git a/.hgignore b/.hgignore
index 61c38705f441ce6f476df5822638681ef03bfb74..648ea3eabbfd5c7f85e4962cf32a4150f83f4157 100644
--- a/.hgignore
+++ b/.hgignore
@@ -11,6 +11,7 @@ indra/lib/mono/1.0/*.dll
 indra/lib/mono/indra/*.dll
 indra/lib/mono/indra/*.exe
 indra/lib/mono/indra/*.pdb
+indra/lib/python/eventlet/
 indra/llwindow/glh/glh_linear.h
 indra/newview/app_settings/mozilla
 indra/newview/app_settings/mozilla-runtime-*
diff --git a/indra/cmake/Externals.cmake b/indra/cmake/Externals.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..26f3b5604937a781490838532276b2e67717e8d1
--- /dev/null
+++ b/indra/cmake/Externals.cmake
@@ -0,0 +1,34 @@
+# -*- cmake -*-
+
+include(Python)
+include(FindSVN)
+
+macro (use_svn_external _binary _path _url _rev)
+  if (NOT STANDALONE)
+    if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
+      if(SVN_FOUND)
+        if(DEBUG_EXTERNALS)
+          message("cd ${_path} && ${SVN_EXECUTABLE} checkout -r ${_rev} ${_url} ${_binary}")
+        endif(DEBUG_EXTERNALS)
+        execute_process(COMMAND ${SVN_EXECUTABLE}
+          checkout
+          -r ${_rev}
+          ${_url}
+          ${_binary}
+          WORKING_DIRECTORY ${_path}
+          RESULT_VARIABLE ${_binary}_installed
+          )
+      else(SVN_FOUND)
+        message(FATAL_ERROR "Failed to find SVN_EXECUTABLE")
+      endif(SVN_FOUND)
+      file(WRITE ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${${_binary}_installed}")
+    else(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
+      set(${_binary}_installed 0)
+    endif(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
+    if(NOT ${_binary}_installed EQUAL 0)
+      message(FATAL_ERROR
+              "Failed to download or unpack prebuilt '${_binary}'."
+              " Process returned ${${_binary}_installed}.")
+    endif (NOT ${_binary}_installed EQUAL 0)
+  endif (NOT STANDALONE)
+endmacro (use_svn_external _binary _path _url _rev)
diff --git a/indra/cmake/FindSVN.cmake b/indra/cmake/FindSVN.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..3322be4ca9213bffcae36da3922d4ef8e539ecd1
--- /dev/null
+++ b/indra/cmake/FindSVN.cmake
@@ -0,0 +1,34 @@
+# -*- cmake -*-
+#
+# Find the svn executable for exporting old svn:externals.
+#
+# Input variables:
+#   SVN_FIND_REQUIRED - set this if configuration should fail without scp
+#
+# Output variables:
+#
+#   SVN_FOUND - set if svn was found
+#   SVN_EXECUTABLE - path to svn executable
+#   SVN_BATCH_FLAG - how to put svn into batch mode
+
+
+SET(SVN_EXECUTABLE)
+FIND_PROGRAM(SVN_EXECUTABLE NAMES svn svn.exe)
+
+IF (SVN_EXECUTABLE)
+  SET(SVN_FOUND ON)
+ELSE (SVN_EXECUTABLE)
+  SET(SVN_FOUND OFF)
+ENDIF (SVN_EXECUTABLE)
+
+IF (SVN_FOUND)
+  GET_FILENAME_COMPONENT(_svn_name ${SVN_EXECUTABLE} NAME_WE)
+  SET(SVN_BATCH_FLAG --non-interactive)
+ELSE (SVN_FOUND)
+  IF (SVN_FIND_REQUIRED)
+    MESSAGE(FATAL_ERROR "Could not find svn executable")
+  ENDIF (SVN_FIND_REQUIRED)
+ENDIF (SVN_FOUND)
+
+MARK_AS_ADVANCED(SVN_EXECUTABLE SVN_FOUND SVN_BATCH_FLAG)
+
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index ecb6c283dbfb67366ac1279003afde21cba3bf69..06a295b4104c6d77942be9f85cfc6d0f5ef92251 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -7,11 +7,13 @@ include(LLAddBuildTest)
 include(LLCommon)
 include(Linking)
 include(Boost)
+include (Pth)
 
 include_directories(
     ${EXPAT_INCLUDE_DIRS}
     ${LLCOMMON_INCLUDE_DIRS}
     ${ZLIB_INCLUDE_DIRS}
+    ${PTH_INCLUDE_DIRS}
     )
 
 # add_executable(lltreeiterators lltreeiterators.cpp)
@@ -24,7 +26,6 @@ set(llcommon_SOURCE_FILES
     llallocator_heap_profile.cpp
     llapp.cpp
     llapr.cpp
-    llaprsockstream.cpp
     llassettype.cpp
     llbase32.cpp
     llbase64.cpp
@@ -102,7 +103,6 @@ set(llcommon_HEADER_FILES
     llagentconstants.h
     llapp.h
     llapr.h
-    llaprsockstream.h
     llassettype.h
     llassoclist.h
     llavatarconstants.h
@@ -247,6 +247,7 @@ target_link_libraries(
     ${WINDOWS_LIBRARIES}
     ${BOOST_PROGRAM_OPTIONS_LIBRARY}
     ${BOOST_REGEX_LIBRARY}
+    ${PTH_LIBRARIES}
     )
 
 include(LLAddBuildTest)
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index b80080e458f949933560202379352b2e307b19c5..beaf5c3488ad7b34cab1c6a6f12037f125ad0b9e 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -64,7 +64,7 @@ if (NOT LINUX OR VIEWER)
       ${UI_LIBRARIES}     # for GTK
       ${SDL_LIBRARY}
       )
-endif (VIEWER)
+endif (NOT LINUX OR VIEWER)
 
 if (DARWIN)
   list(APPEND llwindow_SOURCE_FILES
@@ -96,7 +96,7 @@ if (LINUX AND VIEWER)
        llkeyboardsdl.h
        llwindowsdl.h
        )
-endif (LINUX)
+endif (LINUX AND VIEWER)
 
 if (WINDOWS)
   list(APPEND llwindow_SOURCE_FILES
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index afa7f707f17e656a0190ac0e5923105b841931a9..71878d02db069aef9b6c1b5ff15e84fa5568b81b 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -5123,6 +5123,17 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>QAModeEventHostPort</key>
+    <map>
+      <key>Comment</key>
+      <string>Enable Testing Features.</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>S32</string>
+      <key>Value</key>
+      <integer>-1</integer>
+    </map>
     <key>QuietSnapshotsToDisk</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f9e6db52c33fef1e4306a656c4028ecc3b9edce6..b61e75f60dea040a503e6391cd395938b7d34269 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -93,6 +93,10 @@
 #   include <sys/file.h> // For initMarkerFile support
 #endif
 
+#include "llapr.h"
+#include "apr_dso.h"
+#include <boost/lexical_cast.hpp>
+
 #include "llnotify.h"
 #include "llviewerkeyboard.h"
 #include "lllfsthread.h"
@@ -860,6 +864,11 @@ bool LLAppViewer::init()
 
 	LLViewerJoystick::getInstance()->init(false);
 
+	if (gSavedSettings.getBOOL("QAMode") && gSavedSettings.getS32("QAModeEventHostPort") > 0)
+	{
+		loadEventHostModule(gSavedSettings.getS32("QAModeEventHostPort"));
+	}
+	
 	return true;
 }
 
@@ -4085,3 +4094,45 @@ void LLAppViewer::handleLoginComplete()
 	}
 	writeDebugInfo();
 }
+
+// *TODO - generalize this and move DSO wrangling to a helper class -brad
+void LLAppViewer::loadEventHostModule(S32 listen_port) const
+{
+	std::string dso_name("liblleventhost");
+
+#if LL_WINDOWS
+	dso_name += ".dll";
+#elif LL_DARWIN
+	dso_name += ".dylib";
+#else
+	dso_name += ".so";
+#endif
+
+	std::string dso_path = gDirUtilp->findFile(dso_name,
+		gDirUtilp->getAppRODataDir(),
+		gDirUtilp->getExecutableDir());
+
+	apr_dso_handle_t * eventhost_dso_handle = NULL;
+	apr_pool_t * eventhost_dso_memory_pool = NULL;
+
+	//attempt to load the shared library
+	apr_pool_create(&eventhost_dso_memory_pool, NULL);
+	apr_status_t rv = apr_dso_load(&eventhost_dso_handle,
+		dso_path.c_str(),
+		eventhost_dso_memory_pool);
+	ll_apr_assert_status(rv);
+	llassert_always(eventhost_dso_handle != NULL);
+
+	int (*ll_plugin_start_func)(char const * const *, char const * const *) = NULL;
+	rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll_plugin_start_func, eventhost_dso_handle, "ll_plugin_start");
+
+	ll_apr_assert_status(rv);
+	llassert_always(ll_plugin_start_func != NULL);
+
+	std::string port_text = boost::lexical_cast<std::string>(listen_port);
+	std::vector<char const *> args;
+	args.push_back("-L");
+	args.push_back(port_text.c_str());
+
+	ll_plugin_start_func(&args[0], &args[0] + args.size());
+}
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 540c8785431ed074a4ffc667b4c34f113539fa27..1227ab470f06968a27beca39a9c67048951b2811 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -204,6 +204,8 @@ class LLAppViewer : public LLApp
     void sendLogoutRequest();
     void disconnectViewer();
 
+	void loadEventHostModule(S32 listen_port) const;
+	
 	// *FIX: the app viewer class should be some sort of singleton, no?
 	// Perhaps its child class is the singleton and this should be an abstract base.
 	static LLAppViewer* sInstance; 
diff --git a/indra/newview/llappviewerlistener.cpp b/indra/newview/llappviewerlistener.cpp
index a8c98b17a7326b1a6bd84de5e84d926e696a5f75..befebae88ee9e813ba87f26b527e8cec6d08196a 100644
--- a/indra/newview/llappviewerlistener.cpp
+++ b/indra/newview/llappviewerlistener.cpp
@@ -18,6 +18,7 @@
 // external library headers
 // other Linden headers
 #include "llappviewer.h"
+#include "llviewercontrol.h"
 
 LLAppViewerListener::LLAppViewerListener(const std::string& pumpname, LLAppViewer* llappviewer):
     LLDispatchListener(pumpname, "op"),
@@ -25,9 +26,21 @@ LLAppViewerListener::LLAppViewerListener(const std::string& pumpname, LLAppViewe
 {
     // add() every method we want to be able to invoke via this event API.
     add("requestQuit", &LLAppViewerListener::requestQuit);
+    add("setSetting", &LLAppViewerListener::setSetting);
 }
 
 void LLAppViewerListener::requestQuit(const LLSD& event) const
 {
     mAppViewer->requestQuit();
 }
+
+void LLAppViewerListener::setSetting(const LLSD & event) const
+{
+	std::string control_name = event["name"].asString();
+	if (gSavedSettings.controlExists(control_name))
+	{
+		LLControlVariable* control = gSavedSettings.getControl(control_name);
+
+		control->set(event["value"]);
+	}
+}
diff --git a/indra/newview/llappviewerlistener.h b/indra/newview/llappviewerlistener.h
index ab17dd1d9042d0dc6a7b1847b5a5c60098080b0c..ff63b69c137ed9d7092030204bedb3015501494f 100644
--- a/indra/newview/llappviewerlistener.h
+++ b/indra/newview/llappviewerlistener.h
@@ -27,6 +27,7 @@ class LLAppViewerListener: public LLDispatchListener
 
 private:
     void requestQuit(const LLSD& event) const;
+    void setSetting(const LLSD & event) const;
 
     LLAppViewer* mAppViewer;
 };
diff --git a/indra/viewer_components/CMakeLists.txt b/indra/viewer_components/CMakeLists.txt
index 60b459b78a53a20be063f08554f5b7e1d35949eb..b3e07c527c3563cb24566808b2141e9fb404da57 100644
--- a/indra/viewer_components/CMakeLists.txt
+++ b/indra/viewer_components/CMakeLists.txt
@@ -1,2 +1,9 @@
+# -*- cmake -*-
+
+include(Externals)
+
 add_subdirectory(login)
 add_subdirectory(eventhost)
+
+use_svn_external(eventlet ${CMAKE_CURRENT_SOURCE_DIR}/../lib/python/ http://svn.secondlife.com/svn/eventlet/trunk/eventlet 164)
+