diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 9025982310c5f6ccc5f124f6fdb5c6feb3f093b5..75acd1a0bedc975f1f62078b0edf1ba791921d2e 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -198,6 +198,7 @@ LLAgent::LLAgent() :
 
 	mAutoPilot(FALSE),
 	mAutoPilotFlyOnStop(FALSE),
+	mAutoPilotAllowFlying(TRUE),
 	mAutoPilotTargetGlobal(),
 	mAutoPilotStopDistance(1.f),
 	mAutoPilotUseRotation(FALSE),
@@ -1207,7 +1208,7 @@ BOOL LLAgent::getBusy() const
 //-----------------------------------------------------------------------------
 // startAutoPilotGlobal()
 //-----------------------------------------------------------------------------
-void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *),  void *callback_data, F32 stop_distance, F32 rot_threshold)
+void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *),  void *callback_data, F32 stop_distance, F32 rot_threshold, BOOL allow_flying)
 {
 	if (!isAgentAvatarValid())
 	{
@@ -1224,6 +1225,7 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
 	mAutoPilotCallbackData = callback_data;
 	mAutoPilotRotationThreshold = rot_threshold;
 	mAutoPilotBehaviorName = behavior_name;
+	mAutoPilotAllowFlying = allow_flying;
 
 	LLVector3d delta_pos( target_global );
 	delta_pos -= getPositionGlobal();
@@ -1251,14 +1253,23 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
 		}
 	}
 
-	mAutoPilotFlyOnStop = getFlying();
+	if (mAutoPilotAllowFlying)
+	{
+		mAutoPilotFlyOnStop = getFlying();
+	}
+	else
+	{
+		mAutoPilotFlyOnStop = FALSE;
+	}
 
-	if (distance > 30.0)
+	if (distance > 30.0 && mAutoPilotAllowFlying)
 	{
 		setFlying(TRUE);
 	}
 
-	if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
+	if ( distance > 1.f && 
+		mAutoPilotAllowFlying &&
+		heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
 	{
 		setFlying(TRUE);
 		// Do not force flying for "Sit" behavior to prevent flying after pressing "Stand"
@@ -1394,7 +1405,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
 		
 		if (!isAgentAvatarValid()) return;
 
-		if (gAgentAvatarp->mInAir)
+		if (gAgentAvatarp->mInAir && mAutoPilotAllowFlying)
 		{
 			setFlying(TRUE);
 		}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 0fc77bd3a1e78a9c4db1678530674c32038c25ed..a45f55f27acf0f83ca0164a5d459434596d8270c 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -479,7 +479,8 @@ class LLAgent : public LLOldEvents::LLObservable
 										 const std::string& behavior_name = std::string(), 
 										 const LLQuaternion *target_rotation = NULL, 
 										 void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL, 
-										 F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f);
+										 F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f,
+										 BOOL allow_flying = TRUE);
 	void 			startFollowPilot(const LLUUID &leader_id);
 	void			stopAutoPilot(BOOL user_cancel = FALSE);
 	void 			setAutoPilotTargetGlobal(const LLVector3d &target_global);
@@ -488,6 +489,7 @@ class LLAgent : public LLOldEvents::LLObservable
 private:
 	BOOL			mAutoPilot;
 	BOOL			mAutoPilotFlyOnStop;
+	BOOL			mAutoPilotAllowFlying;
 	LLVector3d		mAutoPilotTargetGlobal;
 	F32				mAutoPilotStopDistance;
 	BOOL			mAutoPilotUseRotation;
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 8476c4847aecf8ffd8380f24d31a0da0e79b9e59..6b128535478ac21b61a7c0fcade9b44f650a9b79 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -184,10 +184,13 @@ void LLAgentListener::getAxes(const LLSD& event) const
     quat.getEulerAngles(&roll, &pitch, &yaw);
     // The official query API for LLQuaternion's [x, y, z, w] values is its
     // public member mQ...
-    sendReply(LLSDMap
-              ("quat", llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ)))
-              ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)),
-              event);
+	LLSD reply = LLSD::emptyMap();
+	reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+	reply["euler"] = LLSD::emptyMap();
+	reply["euler"]["roll"] = roll;
+	reply["euler"]["pitch"] = pitch;
+	reply["euler"]["yaw"] = yaw;
+    sendReply(reply, event);
 }
 
 
@@ -196,12 +199,17 @@ void LLAgentListener::getPosition(const LLSD& event) const
     F32 roll, pitch, yaw;
     LLQuaternion quat(mAgent.getQuat());
     quat.getEulerAngles(&roll, &pitch, &yaw);
-    sendReply(LLSDMap
-              ("region", ll_sd_from_vector3(mAgent.getPositionAgent()))
-              ("global", ll_sd_from_vector3d(mAgent.getPositionGlobal()))
-              ("quat", ll_sd_from_quaternion(quat))
-              ("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)),
-              event);
+
+	LLSD reply = LLSD::emptyMap();
+	reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
+	reply["euler"] = LLSD::emptyMap();
+	reply["euler"]["roll"] = roll;
+	reply["euler"]["pitch"] = pitch;
+	reply["euler"]["yaw"] = yaw;
+    reply["region"] = ll_sd_from_vector3(mAgent.getPositionAgent());
+    reply["global"] = ll_sd_from_vector3d(mAgent.getPositionGlobal());
+
+	sendReply(reply, event);
 }
 
 
@@ -220,9 +228,15 @@ void LLAgentListener::startAutoPilot(LLSD const & event) const
     {
         rotation_threshold = event["rotation_threshold"].asReal();
     }
-	if (event.has("fly"))
+	
+	BOOL allow_flying = TRUE;
+	if (event.has("allow_flying"))
 	{
-		mAgent.setFlying(event["fly"].asBoolean());
+		allow_flying = (BOOL) event["allow_flying"].asBoolean();
+		if (!allow_flying)
+		{
+			mAgent.setFlying(FALSE);
+		}
 	}
 
     mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event["target_global"]),
@@ -230,23 +244,25 @@ void LLAgentListener::startAutoPilot(LLSD const & event) const
                                 target_rotation,
                                 NULL, NULL,
                                 event["stop_distance"].asReal(),
-                                rotation_threshold);
+                                rotation_threshold,
+								allow_flying);
 }
 
 void LLAgentListener::getAutoPilot(const LLSD& event) const
 {
-    sendReply(LLSDMap
-              ("enabled", (LLSD::Boolean) mAgent.getAutoPilot())
-              ("target_global", ll_sd_from_vector3d(mAgent.getAutoPilotTargetGlobal()))
-              ("leader_id", mAgent.getAutoPilotLeaderID())
-              ("stop_distance", mAgent.getAutoPilotStopDistance())
-              ("target_distance", mAgent.getAutoPilotTargetDist())
-              ("use_rotation", (LLSD::Boolean) mAgent.getAutoPilotUseRotation())
-              ("target_facing", ll_sd_from_vector3(mAgent.getAutoPilotTargetFacing()))
-              ("rotation_threshold", mAgent.getAutoPilotRotationThreshold())
-              ("behavior_name", mAgent.getAutoPilotBehaviorName()),
-              ("fly", (LLSD::Boolean) mAgent.getFlying()),
-              event);
+	LLSD reply = LLSD::emptyMap();
+	reply["enabled"] = (LLSD::Boolean) mAgent.getAutoPilot();
+	reply["target_global"] = ll_sd_from_vector3d(mAgent.getAutoPilotTargetGlobal());
+	reply["leader_id"] = mAgent.getAutoPilotLeaderID();
+	reply["stop_distance"] = mAgent.getAutoPilotStopDistance();
+	reply["target_distance"] = mAgent.getAutoPilotTargetDist();
+	reply["use_rotation"] = (LLSD::Boolean) mAgent.getAutoPilotUseRotation();
+	reply["target_facing"] = ll_sd_from_vector3(mAgent.getAutoPilotTargetFacing());
+	reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold();
+	reply["behavior_name"] = mAgent.getAutoPilotBehaviorName();
+	reply["fly"] = (LLSD::Boolean) mAgent.getFlying();
+
+	sendReply(reply, event);
 }
 
 void LLAgentListener::startFollowPilot(LLSD const & event) const