diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index a7bd628d5abec6f82dd06cdb73c27a881a3fec6a..d7965c1e8f94aaf11c91920e9ee694be747c937e 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -4015,6 +4015,7 @@ void LLAgent::teleportCancel()
 	}
 	clearTeleportRequest();
 	gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
+	gPipeline.resetVertexBuffers();
 }
 
 
diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h
index 342d149491b2263a20c940f0ad9ce33738bb50ec..5e3cac260ad29b85ed1ef3b8be6c237b3cdf5c68 100644
--- a/indra/newview/llvieweroctree.h
+++ b/indra/newview/llvieweroctree.h
@@ -70,7 +70,7 @@ S32 AABBSphereIntersect(const LLVector3& min, const LLVector3& max, const LLVect
 S32 AABBSphereIntersectR2(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &radius_squared);
 
 //defines data needed for octree of an entry
-LL_ALIGN_PREFIX(16)
+//LL_ALIGN_PREFIX(16)
 class LLViewerOctreeEntry : public LLRefCount
 {
 	friend class LLViewerOctreeEntryData;
@@ -128,10 +128,10 @@ class LLViewerOctreeEntry : public LLRefCount
 	mutable S32		            mBinIndex;
 	mutable U32		            mVisible;	
 
-} LL_ALIGN_POSTFIX(16);
+} ;//LL_ALIGN_POSTFIX(16);
 
 //defines an abstract class for entry data
-LL_ALIGN_PREFIX(16)
+//LL_ALIGN_PREFIX(16)
 class LLViewerOctreeEntryData : public LLRefCount
 {
 protected:
@@ -178,11 +178,11 @@ class LLViewerOctreeEntryData : public LLRefCount
 	LLPointer<LLViewerOctreeEntry>        mEntry;
 	LLViewerOctreeEntry::eEntryDataType_t mDataType;
 	static  U32                           sCurVisible; // Counter for what value of mVisible means currently visible
-}LL_ALIGN_POSTFIX(16);
+};//LL_ALIGN_POSTFIX(16);
 
 
 //defines an octree group for an octree node, which contains multiple entries.
-LL_ALIGN_PREFIX(16)
+//LL_ALIGN_PREFIX(16)
 class LLviewerOctreeGroup : public LLOctreeListener<LLViewerOctreeEntry>
 {
 	friend class LLViewerOctreeCull;
@@ -279,7 +279,7 @@ class LLviewerOctreeGroup : public LLOctreeListener<LLViewerOctreeEntry>
 public:
 	S32         mVisible[LLViewerCamera::NUM_CAMERAS];	
 
-}LL_ALIGN_POSTFIX(16);
+};//LL_ALIGN_POSTFIX(16);
 
 //octree group which has capability to support occlusion culling
 //LL_ALIGN_PREFIX(16)
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 9c038d54d557ddef1fac09c5344906e428a53c70..7cc4195a3df913634ade5cad25d65125c8431140 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1207,12 +1207,7 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
 
 	max_update_time -= update_timer.getElapsedTimeF32();	
 
-	if(gViewerWindow->getProgressView()->getVisible())
-	{
-		//in case rendering pipeline is not started yet.
-		mImpl->mVOCachePartition->cull(*(LLViewerCamera::getInstance()), false);
-	}
-	else if(max_update_time < 0.f)
+	if(max_update_time < 0.f && !gViewerWindow->getProgressView()->getVisible())
 	{
 		return did_update;
 	}
@@ -1279,7 +1274,8 @@ F32 LLViewerRegion::killInvisibleObjects(F32 max_time)
 		return max_time;
 	}
 
-	size_t max_update = sNewObjectCreationThrottle < 0 ? mImpl->mActiveSet.size() : 64; 
+	bool unstable = sNewObjectCreationThrottle < 0;
+	size_t max_update = unstable ? mImpl->mActiveSet.size() : 64; 
 	if(!mInvisibilityCheckHistory && isViewerCameraStatic())
 	{
 		//history is clean, reduce number of checking
@@ -1299,7 +1295,7 @@ F32 LLViewerRegion::killInvisibleObjects(F32 max_time)
 			iter = mImpl->mActiveSet.begin();
 		}
 
-		if(!(*iter)->isRecentlyVisible() && (*iter)->mLastCameraUpdated < sLastCameraUpdated)
+		if(!(*iter)->isRecentlyVisible() && (unstable || (*iter)->mLastCameraUpdated < sLastCameraUpdated))
 		{
 			killObject((*iter), delete_list);
 		}
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 3c09981f7dc163f222aed7f520ebef26864cdbd0..f0c95466511c84d107f5f8ccd2e820ce4f8b90dd 100755
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -636,6 +636,11 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
 		return 0;
 	}
 
+	if(LLViewerCamera::sCurCameraID >= LLViewerCamera::CAMERA_WATER0)
+	{
+		return 0; //no need for those cameras.
+	}
+
 	if(mCulledTime[LLViewerCamera::sCurCameraID] == LLViewerOctreeEntryData::getCurrentFrame())
 	{
 		return 0; //already culled
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 6e0f3a3c70c651321043ca6aeefe35cbdc784b08..38bef1f4f55b65ec6b960bf950eeab67d1b01bfb 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -2103,6 +2103,13 @@ void LLPipeline::updateMove()
 					part->mOctree->balance();
 				}
 			}
+
+			//balance the VO Cache tree
+			LLVOCachePartition* vo_part = region->getVOCachePartition();
+			if(vo_part)
+			{
+				vo_part->mOctree->balance();
+			}
 		}
 	}
 }
@@ -2895,6 +2902,52 @@ void LLPipeline::clearRebuildGroups()
 	mGroupQ2Locked = false;
 }
 
+void LLPipeline::clearRebuildDrawables()
+{
+	// Clear all drawables on the priority build queue,
+	for (LLDrawable::drawable_list_t::iterator iter = mBuildQ1.begin();
+		 iter != mBuildQ1.end(); ++iter)
+	{
+		LLDrawable* drawablep = *iter;
+		if (drawablep && !drawablep->isDead())
+		{
+			drawablep->clearState(LLDrawable::IN_REBUILD_Q2);
+			drawablep->clearState(LLDrawable::IN_REBUILD_Q1);
+		}
+	}
+	mBuildQ1.clear();
+
+	// clear drawables on the non-priority build queue
+	for (LLDrawable::drawable_list_t::iterator iter = mBuildQ2.begin();
+		 iter != mBuildQ2.end(); ++iter)
+	{
+		LLDrawable* drawablep = *iter;
+		if (!drawablep->isDead())
+		{
+			drawablep->clearState(LLDrawable::IN_REBUILD_Q2);
+		}
+	}	
+	mBuildQ2.clear();
+	
+	//clear all moving bridges
+	for (LLDrawable::drawable_vector_t::iterator iter = mMovedBridge.begin();
+		 iter != mMovedBridge.end(); ++iter)
+	{
+		LLDrawable *drawablep = *iter;
+		drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED | LLDrawable::ON_MOVE_LIST | LLDrawable::ANIMATED_CHILD);
+	}
+	mMovedBridge.clear();
+
+	//clear all moving drawables
+	for (LLDrawable::drawable_vector_t::iterator iter = mMovedList.begin();
+		 iter != mMovedList.end(); ++iter)
+	{
+		LLDrawable *drawablep = *iter;
+		drawablep->clearState(LLDrawable::EARLY_MOVE | LLDrawable::MOVE_UNDAMPED | LLDrawable::ON_MOVE_LIST | LLDrawable::ANIMATED_CHILD);
+	}
+	mMovedList.clear();
+}
+
 void LLPipeline::rebuildPriorityGroups()
 {
 	LL_RECORD_BLOCK_TIME(FTM_REBUILD_PRIORITY_GROUPS);
@@ -7314,7 +7367,13 @@ void LLPipeline::doResetVertexBuffers()
 			}
 		}
 	}
-	LLSpatialPartition::sTeleportRequested = FALSE;
+	if(LLSpatialPartition::sTeleportRequested)
+	{
+		LLSpatialPartition::sTeleportRequested = FALSE;
+
+		clearRebuildGroups();
+		clearRebuildDrawables();
+	}
 
 	resetDrawOrders();
 
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 178a935d987f0688bbab57320eb442967815af80..465ab442946bf152394af88a9c90cd0c09fb386f 100755
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -245,6 +245,7 @@ class LLPipeline
 	void rebuildPriorityGroups();
 	void rebuildGroups();
 	void clearRebuildGroups();
+	void clearRebuildDrawables();
 
 	//calculate pixel area of given box from vantage point of given camera
 	static F32 calcPixelArea(LLVector3 center, LLVector3 size, LLCamera& camera);