diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 389448654a1120ff4b40373c21b20feb1c5ccc0c..b35eef20f7fdc27bac53e9f5a83717dd698b87b0 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -1481,7 +1481,7 @@ void LLAgent::resetControlFlags()
 //-----------------------------------------------------------------------------
 void LLAgent::setAFK()
 {
-	if (!gAgent.getRegion())
+	if (gNonInteractive || !gAgent.getRegion())
 	{
 		// Don't set AFK if we're not talking to a region yet.
 		return;
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index b6446e40ac5ec7fe2d5ef7e395b1f0ac06885c6a..5413045e7a9c07a9f18c355d8ceb8e517f7e9cda 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -1559,7 +1559,7 @@ bool LLAppViewer::doFrame()
 
 			if (gNonInteractive)
 			{
-				S32 non_interactive_ms_sleep_time = 1000;
+				S32 non_interactive_ms_sleep_time = 100;
 				LLAppViewer::getTextureCache()->pause();
 				LLAppViewer::getImageDecodeThread()->pause();
 				ms_sleep(non_interactive_ms_sleep_time);
@@ -2759,6 +2759,9 @@ bool LLAppViewer::initConfiguration()
 	if (gNonInteractive)
 	{
 		tempSetControl("SLURLPassToOtherInstance", "FALSE");
+		tempSetControl("RenderWater", "FALSE");
+		tempSetControl("FlyingAtExit", "FALSE");
+		LLError::setEnabledLogTypesMask(0);
 		llassert_always(!gSavedSettings.getBOOL("SLURLPassToOtherInstance"));
 	}
 
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index f64db7beb54e73e77f43f0279aa74cacb74560d2..9126360eed8d0fb290c0a8cd4d2a09139685b6dc 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -1139,6 +1139,10 @@ void LLTextureFetchWorker::startWork(S32 param)
 // Threads:  Ttf
 bool LLTextureFetchWorker::doWork(S32 param)
 {
+	if (gNonInteractive)
+	{
+		return true;
+	}
 	static const LLCore::HttpStatus http_not_found(HTTP_NOT_FOUND);						// 404
 	static const LLCore::HttpStatus http_service_unavail(HTTP_SERVICE_UNAVAILABLE);		// 503
 	static const LLCore::HttpStatus http_not_sat(HTTP_REQUESTED_RANGE_NOT_SATISFIABLE);	// 416;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index c99232eba031b17b596be4ffa5e62dea94ed7ba4..ab65d747ba8d7caefd444144d2c871d03167eb08 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4049,7 +4049,6 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
 
 	S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationList);
 	S32 num_source_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationSourceList);
-	bool non_interactive_got_run = false;
 
 	LL_DEBUGS("Messaging", "Motion") << "Processing " << num_blocks << " Animations" << LL_ENDL;
 
@@ -4065,14 +4064,6 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
 			mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i);
 			mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i);
 
-			if (gNonInteractive && (animation_id == ANIM_AGENT_RUN))
-			{
-				// RUN requests get sent at startup for unclear
-				// reasons. Same avatar may get requests one run and
-				// not another. At least in the non-interactive case,
-				// we want to override these.
-				non_interactive_got_run = true;
-			}
 			avatarp->mSignaledAnimations[animation_id] = anim_sequence_id;
 
 			// *HACK: Disabling flying mode if it has been enabled shortly before the agent
@@ -4086,6 +4077,11 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
 				gAgent.setFlying(FALSE);
 			}
 
+			if (gNonInteractive && animation_id == ANIM_AGENT_RUN)
+			{
+				LL_INFOS() << "Noninteractive, got run request for self" << LL_ENDL;
+			}
+
 			if (i < num_source_blocks)
 			{
 				mesgsys->getUUIDFast(_PREHASH_AnimationSourceList, _PREHASH_ObjectID, object_id, i);
@@ -4136,13 +4132,6 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
 	{
 		avatarp->processAnimationStateChanges();
 	}
-
-	if (non_interactive_got_run)
-	{
-		// Total kluge alert.
-		LL_INFOS("Messaging","Motion") << "non-interactive mode, resetting animations" << LL_ENDL;
-		gAgent.stopCurrentAnimations();
-	}
 }
 
 
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 528448c4774986fd68848cd8bf2b3fc5d08cbb68..0832415e1e7dcd96bc846c98d0115aeed95b14aa 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -156,15 +156,25 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
     
 	LLViewerObject *res = NULL;
 	LL_RECORD_BLOCK_TIME(FTM_CREATE_OBJECT);
-	
+
+	if (gNonInteractive
+		&& pcode != LL_PCODE_LEGACY_AVATAR
+		&& pcode != LL_VO_SURFACE_PATCH
+		&& pcode != LL_VO_WATER
+		&& pcode != LL_VO_VOID_WATER
+		&& pcode != LL_VO_WL_SKY
+		&& pcode != LL_VO_SKY
+		&& pcode != LL_VO_GROUND
+		&& pcode != LL_VO_PART_GROUP
+		)
+	{
+		return res;
+	}
 	switch (pcode)
 	{
 	case LL_PCODE_VOLUME:
 	{
-		if (!gNonInteractive)
-		{
-			res = new LLVOVolume(id, pcode, regionp); break;
-		}
+		res = new LLVOVolume(id, pcode, regionp); break;
 		break;
 	}
 	case LL_PCODE_LEGACY_AVATAR:
@@ -200,12 +210,9 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
         }
 		else
 		{
-			if (!gNonInteractive)
-			{
-				LLVOAvatar *avatar = new LLVOAvatar(id, pcode, regionp); 
-				avatar->initInstance();
-				res = avatar;
-			}
+			LLVOAvatar *avatar = new LLVOAvatar(id, pcode, regionp); 
+			avatar->initInstance();
+			res = avatar;
 		}
 		break;
 	}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index e085a945a84ad9ea4d51da26373efa8fda74bc61..dad580de703d41a359713ef4e4482fca31b80d1e 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3807,6 +3807,11 @@ LLViewerInventoryItem* recursiveGetObjectInventoryItem(LLViewerObject *vobj, LLU
 
 void LLVOAvatar::updateAnimationDebugText()
 {
+	if (isSelf() && gNonInteractive)
+	{
+		LLVector3 vel = getVelocity();
+		addDebugText(llformat("vel %f %f %f\n",vel[0],vel[1],vel[2]));
+	}
 	for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin();
 		 iter != mMotionController.getActiveMotions().end(); ++iter)
 	{
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 30703426ce094936ec9ab9c911ecd82a66f664df..1730753eb15f4b8058b51e869dd9e9637585162b 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -487,10 +487,10 @@ void LLPipeline::init()
 	{
 		clearAllRenderTypes();
 	}
-	//else if (gSavedSettings.getBOOL("NonInteractive"))
-//	{
-	//	clearAllRenderTypes();
-	//}
+	else if (gNonInteractive)
+	{
+		clearAllRenderTypes();
+	}
 	else
 	{
 		setAllRenderTypes(); // By default, all rendering types start enabled