diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 985f5a0a1f9ffbc500a2f6749d176c5948f57504..24f419b4b10d87abb4bb4de7a738017c54665b94 100755
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -1178,6 +1178,61 @@ F32 LLViewerRegion::createVisibleObjects(F32 max_time)
 	return max_time - update_timer.getElapsedTimeF32();
 }
 
+void LLViewerRegion::clearCachedVisibleObjects()
+{
+	mImpl->mWaitingList.clear();
+	mImpl->mVisibleGroups.clear();
+
+	//clean visible entries
+	for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mVisibleEntries.begin(); iter != mImpl->mVisibleEntries.end();)
+	{
+		LLVOCacheEntry* entry = *iter;
+		LLVOCacheEntry* parent = getCacheEntry(entry->getParentID());
+
+		if(!entry->getParentID() || parent) //no child or parent is cache-able
+		{
+			if(parent) //has a cache-able parent
+			{
+				parent->addChild(entry);
+			}
+
+			LLVOCacheEntry::vocache_entry_set_t::iterator next_iter = iter;
+			++next_iter;
+			mImpl->mVisibleEntries.erase(iter);
+			iter = next_iter;
+		}
+		else //parent is not cache-able, leave it.
+		{
+			++iter;
+		}
+	}
+
+	//remove all visible entries.
+	mLastVisitedEntry = NULL;
+	std::vector<LLDrawable*> delete_list;
+	for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mActiveSet.begin();
+		iter != mImpl->mActiveSet.end(); ++iter)
+	{
+		LLDrawable* drawablep = (LLDrawable*)(*iter)->getEntry()->getDrawable();
+	
+		if(drawablep && !drawablep->getParent())
+		{
+			delete_list.push_back(drawablep);
+		}
+	}
+
+	if(!delete_list.empty())
+	{
+		for(S32 i = 0; i < delete_list.size(); i++)
+		{
+			gObjectList.killObject(delete_list[i]->getVObj());
+		}
+		delete_list.clear();
+	}
+
+	return;
+}
+
 BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
 {	
 	LLTimer update_timer;
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index b2df8d5325957252155bb7e4988484ca446de38e..8a375610d91a7e1aa5201fe7e8bd0000eaea88f4 100755
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -336,7 +336,7 @@ class LLViewerRegion: public LLCapabilityProvider // implements this interface
 	//remove from object cache if the object receives a full-update or terse update
 	LLViewerObject* forceToRemoveFromCache(U32 local_id, LLViewerObject* objectp);
 	void findOrphans(U32 parent_id);
-
+	void clearCachedVisibleObjects();
 	void dumpCache();
 
 	void unpackRegionHandshake();
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 9009626a03d6f2a6232d24e6f6952dcce375375c..d600abeb0a5f35b8c05e002d8945b1606f1cb739 100755
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -684,6 +684,16 @@ void LLWorld::updateRegions(F32 max_update_time)
 	}
 }
 
+void LLWorld::clearAllVisibleObjects()
+{
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
+	{
+		//clear all cached visible objects.
+		(*iter)->clearCachedVisibleObjects();
+	}
+}
+
 void LLWorld::updateParticles()
 {
 	LLViewerPartSim::getInstance()->updateSimulation();
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index 287e41d323e66323b4b4cb54d8cf98eb20dab748..b2d84180648ddfadc41c3ce0185f9354153451d8 100755
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -147,6 +147,7 @@ class LLWorld : public LLSingleton<LLWorld>
 	void getInfo(LLSD& info);
 	U32  getNumOfActiveCachedObjects() const {return mNumOfActiveCachedObjects;}
 
+	void clearAllVisibleObjects();
 public:
 	typedef std::list<LLViewerRegion*> region_list_t;
 	const region_list_t& getRegionList() const { return mActiveRegionList; }
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 38bef1f4f55b65ec6b960bf950eeab67d1b01bfb..9d8aa849ba06b952fc62bc791fd3c1342c06e2dc 100755
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -7371,6 +7371,7 @@ void LLPipeline::doResetVertexBuffers()
 	{
 		LLSpatialPartition::sTeleportRequested = FALSE;
 
+		LLWorld::getInstance()->clearAllVisibleObjects();
 		clearRebuildGroups();
 		clearRebuildDrawables();
 	}