diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 8f66bbc39d132c5181a8f6c7c827add075e667e3..d552d3ddaa5df12cfbeabe19cf49d63444bfc0be 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -1510,6 +1510,9 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
 
 	S32 num_removed = 0;
 	LLViewerObject *objectp;
+
+	static const F64 max_time = 0.01; // Let's try 10ms per frame
+	LLTimer timer;
 	
 	vobj_list_t::reverse_iterator target = mObjects.rbegin();
 
@@ -1525,12 +1528,16 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
 
 		if (objectp->isDead())
 		{
+			if (use_timer)
+			{
+				mDeadObjects.erase(objectp->mID); // <FS:Ansariel> Use timer for cleaning up dead objects
+			}
 			LLPointer<LLViewerObject>::swap(*iter, *target);
 			*target = NULL;
 			++target;
 			num_removed++;
 
-			if (num_removed == mNumDeadObjects || iter->isNull())
+			if (num_removed == mNumDeadObjects || iter->isNull() || (use_timer && timer.getElapsedTimeF64() > max_time))
 			{
 				// We've cleaned up all of the dead objects or caught up to the dead tail
 				break;
@@ -1542,15 +1549,29 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
 		}
 	}
 
-	llassert(num_removed == mNumDeadObjects);
+	// Use timer for cleaning up dead objects per-frame, slam otherwise.
+	if (use_timer)
+	{
+		mObjects.erase(mObjects.begin() + (mObjects.size() - num_removed), mObjects.end());
+		mNumDeadObjects -= num_removed;
+	}
+	else
+	{
+		llassert(num_removed == mNumDeadObjects);
 
-	//erase as a block
-	mObjects.erase(mObjects.begin()+(mObjects.size()-mNumDeadObjects), mObjects.end());
+		//erase as a block
+		mObjects.erase(mObjects.begin() + (mObjects.size() - mNumDeadObjects), mObjects.end());
 
-	// We've cleaned the global object list, now let's do some paranoia testing on objects
-	// before blowing away the dead list.
-	mDeadObjects.clear();
-	mNumDeadObjects = 0;
+		// We've cleaned the global object list, now let's do some paranoia testing on objects
+		// before blowing away the dead list.
+		mDeadObjects.clear();
+		mNumDeadObjects = 0;
+	}
+
+	if (mNumDeadObjects != mDeadObjects.size())
+	{
+		LL_WARNS() << "Num dead objects != dead object list size (" << mNumDeadObjects << " != " << mDeadObjects.size() << ")" << LL_ENDL;
+	}
 }
 
 void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)