diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp
index 9ea822cb8d475e7b247b7d78225e30b5d44e3c31..653b043de4f86acae33ac5534ed3e879e7e2823a 100755
--- a/indra/llcommon/tests/llleap_test.cpp
+++ b/indra/llcommon/tests/llleap_test.cpp
@@ -17,7 +17,7 @@
 // std headers
 // external library headers
 #include <boost/assign/list_of.hpp>
-#include <boost/lambda/lambda.hpp>
+#include <boost/phoenix/core/argument.hpp>
 #include <boost/foreach.hpp>
 // other Linden headers
 #include "../test/lltut.h"
@@ -109,7 +109,7 @@ namespace tut
         llleap_data():
             reader(".py",
                    // This logic is adapted from vita.viewerclient.receiveEvent()
-                   boost::lambda::_1 <<
+                   boost::phoenix::placeholders::arg1 <<
                    "import re\n"
                    "import os\n"
                    "import sys\n"
@@ -403,7 +403,7 @@ namespace tut
         AckAPI api;
         Result result;
         NamedTempFile script("py",
-                             boost::lambda::_1 <<
+                             boost::phoenix::placeholders::arg1 <<
                              "from " << reader_module << " import *\n"
                              // make a request on our little API
                              "request(pump='" << api.getName() << "', data={})\n"
@@ -441,7 +441,7 @@ namespace tut
         ReqIDAPI api;
         Result result;
         NamedTempFile script("py",
-                             boost::lambda::_1 <<
+                             boost::phoenix::placeholders::arg1 <<
                              "import sys\n"
                              "from " << reader_module << " import *\n"
                              // Note that since reader imports llsd, this
@@ -484,7 +484,7 @@ namespace tut
         ReqIDAPI api;
         Result result;
         NamedTempFile script("py",
-                             boost::lambda::_1 <<
+                             boost::phoenix::placeholders::arg1 <<
                              "import sys\n"
                              "from " << reader_module << " import *\n"
                              // Generate a very large string value.
diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp
index b5893135ea4dad342a4de51c7c1cd62de9fa88b0..afd4e7c8c1858879a8cd296bf544666dd13087fe 100755
--- a/indra/llcommon/tests/llsdserialize_test.cpp
+++ b/indra/llcommon/tests/llsdserialize_test.cpp
@@ -46,9 +46,9 @@ typedef U32 uint32_t;
 #include "boost/range.hpp"
 #include "boost/foreach.hpp"
 #include "boost/function.hpp"
-#include "boost/lambda/lambda.hpp"
-#include "boost/lambda/bind.hpp"
-namespace lambda = boost::lambda;
+#include "boost/phoenix/bind/bind_function.hpp"
+#include "boost/phoenix/core/argument.hpp"
+using namespace boost::phoenix;
 
 #include "../llsd.h"
 #include "../llsdserialize.h"
@@ -1612,6 +1612,20 @@ namespace tut
                "print 'Running on', sys.platform\n");
     }
 
+    // helper for test<3>
+    static void writeLLSDArray(std::ostream& out, const LLSD& array)
+    {
+        BOOST_FOREACH(LLSD item, llsd::inArray(array))
+        {
+            LLSDSerialize::toNotation(item, out);
+            // It's important to separate with newlines because Python's llsd
+            // module doesn't support parsing from a file stream, only from a
+            // string, so we have to know how much of the file to read into a
+            // string.
+            out << '\n';
+        }
+    }
+
     template<> template<>
     void TestPythonCompatibleObject::test<3>()
     {
@@ -1639,26 +1653,16 @@ namespace tut
             "        assert False, 'Too many data items'\n";
 
         // Create an llsdXXXXXX file containing 'data' serialized to
-        // notation. It's important to separate with newlines because Python's
-        // llsd module doesn't support parsing from a file stream, only from a
-        // string, so we have to know how much of the file to read into a
-        // string.
+        // notation.
         NamedTempFile file("llsd",
                            // NamedTempFile's boost::function constructor
                            // takes a callable. To this callable it passes the
                            // std::ostream with which it's writing the
-                           // NamedTempFile. This lambda-based expression
-                           // first calls LLSD::Serialize() with that ostream,
-                           // then streams a newline to it, etc.
-                           (lambda::bind(LLSDSerialize::toNotation, cdata[0], lambda::_1),
-                            lambda::_1 << '\n',
-                            lambda::bind(LLSDSerialize::toNotation, cdata[1], lambda::_1),
-                            lambda::_1 << '\n',
-                            lambda::bind(LLSDSerialize::toNotation, cdata[2], lambda::_1),
-                            lambda::_1 << '\n'));
+                           // NamedTempFile.
+                           bind(writeLLSDArray, placeholders::arg1, cdata));
 
         python("read C++ notation",
-               lambda::_1 <<
+               placeholders::arg1 <<
                import_llsd <<
                "def parse_each(iterable):\n"
                "    for item in iterable:\n"
@@ -1679,7 +1683,7 @@ namespace tut
         NamedTempFile file("llsd", "");
 
         python("write Python notation",
-               lambda::_1 <<
+               placeholders::arg1 <<
                "from __future__ import with_statement\n" <<
                import_llsd <<
                "DATA = [\n"
diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp
index a8e06511d725d64d1b865e476322516df3c00490..734018cfc29831effafa77167ae19ebe054999d7 100755
--- a/indra/newview/llwindowlistener.cpp
+++ b/indra/newview/llwindowlistener.cpp
@@ -44,10 +44,7 @@
 #include <typeinfo>
 #include <map>
 #include <boost/scoped_ptr.hpp>
-#include <boost/lambda/core.hpp>
-#include <boost/lambda/bind.hpp>
-
-namespace bll = boost::lambda;
+#include <boost/bind.hpp>
 
 LLWindowListener::LLWindowListener(LLViewerWindow *window, const KeyboardGetter& kbgetter)
 	: LLEventAPI("LLWindow", "Inject input events into the LLWindow instance"),
@@ -358,6 +355,30 @@ static WhichButton buttons;
 
 typedef boost::function<bool(LLCoordGL, MASK)> MouseFunc;
 
+// Wrap a function returning 'void' to return 'true' instead. I'm sure there's
+// a more generic way to accomplish this, but generically handling the
+// arguments seems to require variadic templates and perfect forwarding. (We
+// used to be able to write (boost::lambda::bind(...), true), counting on
+// boost::lambda's comma operator overload, until
+// https://svn.boost.org/trac/boost/ticket/10864. And boost::phoenix doesn't
+// seem to overload comma the same way; or at least not with bind().)
+class MouseFuncTrue
+{
+    typedef boost::function<void(LLCoordGL, MASK)> MouseFuncVoid;
+    MouseFuncVoid mFunc;
+
+public:
+    MouseFuncTrue(const MouseFuncVoid& func):
+        mFunc(func)
+    {}
+
+    bool operator()(LLCoordGL coords, MASK mask) const
+    {
+        mFunc(coords, mask);
+        return true;
+    }
+};
+
 static void mouseEvent(const MouseFunc& func, const LLSD& request)
 {
 	// Ensure we send response
@@ -464,11 +485,11 @@ void LLWindowListener::mouseDown(LLSD const & request)
 	if (actions.valid)
 	{
 		// Normally you can pass NULL to an LLWindow* without compiler
-		// complaint, but going through boost::lambda::bind() evidently
+		// complaint, but going through boost::bind() evidently
 		// bypasses that special case: it only knows you're trying to pass an
 		// int to a pointer. Explicitly cast NULL to the desired pointer type.
-		mouseEvent(bll::bind(actions.down, mWindow,
-							 static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
+		mouseEvent(boost::bind(actions.down, mWindow,
+							 static_cast<LLWindow*>(NULL), _1, _2),
 				   request);
 	}
 }
@@ -478,8 +499,8 @@ void LLWindowListener::mouseUp(LLSD const & request)
 	Actions actions(buttons.lookup(request["button"]));
 	if (actions.valid)
 	{
-		mouseEvent(bll::bind(actions.up, mWindow,
-							 static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
+		mouseEvent(boost::bind(actions.up, mWindow,
+							 static_cast<LLWindow*>(NULL), _1, _2),
 				   request);
 	}
 }
@@ -489,12 +510,10 @@ void LLWindowListener::mouseMove(LLSD const & request)
 	// We want to call the same central mouseEvent() routine for
 	// handleMouseMove() as for button clicks. But handleMouseMove() returns
 	// void, whereas mouseEvent() accepts a function returning bool -- and
-	// uses that bool return. Use (void-lambda-expression, true) to construct
-	// a callable that returns bool anyway. Pass 'true' because we expect that
-	// our caller will usually treat 'false' as a problem.
-	mouseEvent((bll::bind(&LLWindowCallbacks::handleMouseMove, mWindow,
-						  static_cast<LLWindow*>(NULL), bll::_1, bll::_2),
-				true),
+	// uses that bool return. Use MouseFuncTrue to construct a callable that
+	// returns bool anyway.
+	mouseEvent(MouseFuncTrue(boost::bind(&LLWindowCallbacks::handleMouseMove, mWindow,
+						  static_cast<LLWindow*>(NULL), _1, _2)),
 			   request);
 }