diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp
index 8293dc6922c0f56ab83247423769828f6b385919..fbdf08d8aaa10098bfd3ad7e10f5c2ad1011293e 100644
--- a/indra/newview/llconversationmodel.cpp
+++ b/indra/newview/llconversationmodel.cpp
@@ -349,6 +349,20 @@ void LLConversationItemSession::clearParticipants()
 	mNeedsRefresh = true;
 }
 
+
+void LLConversationItemSession::deleteParticipantModels()
+{
+    // Make sure that no views exist before use and that view-owned items were removed!
+    //
+    // Normally we are not supposed to delete models directly, they should be
+    // owned by views and this action will result in crashes, but LLParticipantList
+    // creates models separately from views (it probably shouldn't) and then those
+    // models wait for idle cycles to be assigned to view.
+    // this code is meant to delete 'waiting' models 
+    std::for_each(mChildren.begin(), mChildren.end(), DeletePointer());
+    mChildren.clear();
+}
+
 LLConversationItemParticipant* LLConversationItemSession::findParticipant(const LLUUID& participant_id)
 {
 	// This is *not* a general tree parsing algorithm. It assumes that a session contains only 
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index 30c74818648a1dc83a21453f2c35ec06e43b349b..e30bfbb7591fb738edf0dbb80540d5bb3ecbbb91 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -165,6 +165,7 @@ class LLConversationItemSession : public LLConversationItem
 	void removeParticipant(LLConversationItemParticipant* participant);
 	void removeParticipant(const LLUUID& participant_id);
 	void clearParticipants();
+	void deleteParticipantModels(); // do not use while there are existing participant views
 	LLConversationItemParticipant* findParticipant(const LLUUID& participant_id);
 
 	void setParticipantIsMuted(const LLUUID& participant_id, bool is_muted);
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index 25971a7d52942a40eebdd6c49db98bfc2bf54cc4..71346b4b43c6ffa72c9be193cdceb2c316a9ced6 100644
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -103,6 +103,57 @@ LLConversationViewSession::~LLConversationViewSession()
 	mFlashTimer->unset();
 }
 
+void LLConversationViewSession::destroyView()
+{
+    // Chat can create and parent models(listeners) to session's model before creating
+    // coresponding views, such participant's models normally will wait for idle cycles
+    // but since we are deleting session and won't be processing any more events, make
+    // sure unowned models are removed as well.
+    // Might be good idea to just have an LLPointer list somewhere in LLConversationItemSession
+
+    LLConversationItemSession* vmi = dynamic_cast<LLConversationItemSession*>(getViewModelItem());
+
+    // CONV_SESSION_1_ON_1 stores participants as two models that belong to views independent
+    // from session (nasty! These views are widgets in LLFloaterIMSessionTab, see buildConversationViewParticipant)
+    if (vmi && vmi->getType() != LLConversationItem::CONV_SESSION_1_ON_1)
+    {
+        // Destroy existing views
+        while (!mItems.empty())
+        {
+            LLFolderViewItem *itemp = mItems.back();
+            mItems.pop_back();
+
+            LLFolderViewModelItem* item_vmi = itemp->getViewModelItem();
+            if (item_vmi) // supposed to exist
+            {
+                // unparent to remove from child list
+                vmi->removeChild(item_vmi);
+            }
+            itemp->destroyView();
+        }
+
+        // Not needed in scope of sessions, but just in case
+        while (!mFolders.empty())
+        {
+            LLFolderViewFolder *folderp = mFolders.back();
+            mFolders.pop_back();
+
+            LLFolderViewModelItem* folder_vmi = folderp->getViewModelItem();
+            if (folder_vmi)
+            {
+                vmi->removeChild(folder_vmi);
+            }
+            folderp->destroyView();
+        }
+
+        // Now everything that is left in model(listener) is unowned,
+        // it is safe to remove
+        vmi->deleteParticipantModels();
+    }
+
+    LLFolderViewFolder::destroyView();
+}
+
 void LLConversationViewSession::setFlashState(bool flash_state)
 {
 	if (flash_state && !mFlashStateOn)
diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h
index 9762d56d57f5a45a43ff263e649a093a5dc6c47c..0932d24dfe22abcceb3cab1d9a54fd12ba81e36e 100644
--- a/indra/newview/llconversationview.h
+++ b/indra/newview/llconversationview.h
@@ -67,6 +67,8 @@ class LLConversationViewSession : public LLFolderViewFolder
 public:
 	virtual ~LLConversationViewSession();
 
+	/*virtual*/ void destroyView();
+
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void draw();
 	/*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 61b0fda18ff6583b44d3030246630e47bda44ac6..86c79791b896019d352b210e9959ae68d77c3ce7 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -1822,6 +1822,8 @@ bool LLFloaterIMContainer::removeConversationListItem(const LLUUID& uuid, bool c
 		{
 			new_selection = mConversationsRoot->getPreviousFromChild(widget, FALSE);
 		}
+
+		// Will destroy views and delete models that are not assigned to any views
 		widget->destroyView();
 	}
 	
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index fd3f8b21ce87fb5d6010b232b07f0f88f3d8178a..e7f428c06a7e9ee0477108dd2fd6ee126dacc014 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -534,8 +534,7 @@ void LLFloaterIMSessionTab::removeConversationViewParticipant(const LLUUID& part
 	LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,participant_id);
 	if (widget)
 	{
-		mConversationsRoot->extractItem(widget);
-		delete widget;
+		widget->destroyView();
 	}
 	mConversationsWidgets.erase(participant_id);
 }