diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index c9e88ab72f4fd5c5604eaab2fee4d8d34a91afdd..f3da71fc1584a5c637a37f31e3b3ba24b5cfd75a 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -325,9 +325,19 @@ void LLFolderView::filter( LLFolderViewFilter& filter )
 {
     // Entry point of inventory filtering (CHUI-849)
 	LLFastTimer t2(FTM_FILTER);
-	filter.setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000));
+	//filter.setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000));
+    filter.resetTime(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsMaxTimePerFrame"), 1, 1000));
     // Note: we filter the model, not the view
 	getViewModelItem()->filter(filter);
+    // Test the filter state
+    if (filter.isTimedOut())
+    {
+        llinfos << "Merov : filter of " << mParentPanel->getName() << " not finished, count = " << filter.getFilterCount() << llendl;
+    }
+    else if (filter.getFilterCount() != 0)
+    {
+        llinfos << "Merov : last filter of " << mParentPanel->getName() << " done! count = " << filter.getFilterCount() << llendl;
+    }
 }
 
 void LLFolderView::reshape(S32 width, S32 height, BOOL called_from_parent)
@@ -1614,7 +1624,8 @@ void LLFolderView::update()
     
 	// Clear the modified setting on the filter only if the filter count is non-zero after running the filter process
 	// Note: if the filter count is zero, that means the filter exhausted its count per frame and halted before completing the entire set of items
-	if (getFolderViewModel()->getFilter().isModified() && (getFolderViewModel()->getFilter().getFilterCount() > 0))
+	//if (getFolderViewModel()->getFilter().isModified() && (getFolderViewModel()->getFilter().getFilterCount() > 0))
+    if (getFolderViewModel()->getFilter().isModified() && (!getFolderViewModel()->getFilter().isTimedOut()))
 	{
 		getFolderViewModel()->getFilter().clearModified();
 	}
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 96961e7a4ffa367a9a3fe00c3c3f44d488a0c78b..6c147ccc12eee6e15469be6b6b0816b377f9a07b 100755
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -949,7 +949,7 @@ static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange");
 // * Turn widgets visible/invisible according to their model filtering state
 // * Takes animation state into account for opening/closing of folders (this makes widgets visible/invisible)
 // * Reposition visible widgets so that they line up correctly with no gap
-// * Compute the width and height of the cuurent folder and its children
+// * Compute the width and height of the current folder and its children
 // * Makes sure that this view and its children are the right size
 S32 LLFolderViewFolder::arrange( S32* width, S32* height )
 {
diff --git a/indra/llui/llfolderviewmodel.cpp b/indra/llui/llfolderviewmodel.cpp
index 3593804554aa722b08ed9943423b059b19a6f7a4..b5622756fe3d32df9e5b420512d6ba31498068c1 100644
--- a/indra/llui/llfolderviewmodel.cpp
+++ b/indra/llui/llfolderviewmodel.cpp
@@ -48,7 +48,8 @@ std::string LLFolderViewModelCommon::getStatusText()
 
 void LLFolderViewModelCommon::filter()
 {
-	getFilter().setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000));
+	//getFilter().setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000));
+    getFilter().resetTime(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsMaxTimePerFrame"), 1, 1000));
 	mFolderView->getViewModelItem()->filter(getFilter());
 }
 
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index dbcbb0edebc43629bb6828de57fd0b1ce305da88..64c00c782e6618fcf9fcf480e4f259551005e852 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -93,6 +93,13 @@ class LLFolderViewFilter
 	virtual S32 				getFilterCount() const = 0;
 	virtual void 				decrementFilterCount() = 0;
 
+	// +-------------------------------------------------------------------+
+	// + Time
+	// +-------------------------------------------------------------------+
+	virtual void 				resetTime(S32 timeout) = 0;
+    virtual bool                isTimedOut() = 0;
+	virtual void 				incrementFilterCount() = 0; // Temp!
+    
 	// +-------------------------------------------------------------------+
 	// + Default
 	// +-------------------------------------------------------------------+
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 4c305e1d6017b8823170c38b8fb788b01a9fc8e5..a28c6366c07e2583fbd43920c1a56b0e996de913 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3402,6 +3402,17 @@
       <key>Value</key>
       <integer>500</integer>
     </map>
+    <key>FilterItemsMaxTimePerFrame</key>
+    <map>
+        <key>Comment</key>
+        <string>Max time devoted to items filtering per frame (in milliseconds)</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>S32</string>
+        <key>Value</key>
+        <integer>100</integer>
+    </map>
     <key>FindLandArea</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index 876658504946906aaa1b10747111b26672a85377..5c942b1c40c45e118af7057d991bb3badbc54781 100755
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -256,7 +256,11 @@ class LLConversationFilter : public LLFolderViewFilter
 	void 				setFilterCount(S32 count) { }
 	S32 				getFilterCount() const { return 0; }
 	void 				decrementFilterCount() { }
-		
+
+  	void 				resetTime(S32 timeout) { }
+    bool                isTimedOut() { return false; }
+	void 				incrementFilterCount() { } // Temp!
+   
 	bool 				isDefault() const { return true; }
 	bool 				isNotDefault() const { return false; }
 	void 				markDefault() { }
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index 1894314513597937cf2eefccf7f7c0d5ecbe4895..ce957edcbd080ce5feb99d1d4de5f5de07abc964 100644
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -153,11 +153,11 @@ bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* ite
 {
 	S32 filter_generation = filter.getCurrentGeneration();
 
-	bool new_filtered_item = false;
+	bool continue_filtering = true;
 	if (item->getLastFilterGeneration() < filter_generation)
 	{
 		// Recursive application of the filter for child items (CHUI-849)
-		new_filtered_item = item->filter( filter );
+		continue_filtering = item->filter( filter );
 	}
 
 	// Update latest generation to pass filter in parent and propagate up to root
@@ -172,14 +172,13 @@ bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* ite
 		}
 	}
 
-	return new_filtered_item;
+	return continue_filtering;
 }
 
 bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 {
 	const S32 filter_generation = filter.getCurrentGeneration();
 	const S32 must_pass_generation = filter.getFirstRequiredGeneration();
-    const S32 sufficient_pass_generation = filter.getFirstSuccessGeneration();
 
     if (getLastFilterGeneration() >= must_pass_generation
 		&& getLastFolderFilterGeneration() >= must_pass_generation
@@ -189,9 +188,11 @@ bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 		// go ahead and flag this item as not pass
 		setPassedFilter(false, filter_generation);
 		setPassedFolderFilter(false, filter_generation);
-		return false;
+		return true;
 	}
 
+    /*
+     const S32 sufficient_pass_generation = filter.getFirstSuccessGeneration();
     if (getLastFilterGeneration() >= sufficient_pass_generation
 		&& getLastFolderFilterGeneration() >= sufficient_pass_generation
 		&& passedFilter(sufficient_pass_generation))
@@ -202,23 +203,23 @@ bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 		setPassedFolderFilter(true, filter_generation);
 		return true;
 	}
+     */
     
 	const bool passed_filter_folder = (getInventoryType() == LLInventoryType::IT_CATEGORY) ? filter.checkFolder(this) : true;
 	setPassedFolderFilter(passed_filter_folder, filter_generation);
 
-	bool new_filtered_item = false;
+	bool continue_filtering = true;
 
 	if (!mChildren.empty()
 		&& (getLastFilterGeneration() < must_pass_generation // haven't checked descendants against minimum required generation to pass
             || descendantsPassedFilter(must_pass_generation))) // or at least one descendant has passed the minimum requirement
 	{
 		// now query children
-		for (child_list_t::iterator iter = mChildren.begin(), end_iter = mChildren.end();
-			iter != end_iter && filter.getFilterCount() > 0;
-			++iter)
+		for (child_list_t::iterator iter = mChildren.begin(), end_iter = mChildren.end(); iter != end_iter; ++iter)
 		{
-			new_filtered_item |= filterChildItem((*iter), filter);
-            if (filter.getFilterCount() <= 0)
+			continue_filtering = filterChildItem((*iter), filter);
+            //if (filter.getFilterCount() <= 0)
+            if (!continue_filtering)
 			{
 				break;
 			}
@@ -226,15 +227,17 @@ bool LLFolderViewModelItemInventory::filter( LLFolderViewFilter& filter)
 	}
 
 	// If we didn't use all filter iterations that means we filtered all of our descendants so filter ourselves now
-	if (filter.getFilterCount() > 0)
+	//if (filter.getFilterCount() > 0)
+    if (continue_filtering)
 	{
         // This is where filter count is hit and filter check on the item done (CHUI-849)
-		filter.decrementFilterCount();
+		//filter.decrementFilterCount();
+		filter.incrementFilterCount(); // Temp
 		const bool passed_filter = filter.check(this);
 		setPassedFilter(passed_filter, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());
-        new_filtered_item |= passed_filter;
+        continue_filtering = !filter.isTimedOut();
 	}
-    return new_filtered_item;
+    return continue_filtering;
 }
 
 LLFolderViewModelInventory* LLInventoryPanel::getFolderViewModel()
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index b0c75cb176a4705e782cb92800d44fa0536240f7..3b712925e1ce1187a44224e8cbdb098529e89248 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -1026,6 +1026,26 @@ void LLInventoryFilter::decrementFilterCount()
 	mFilterCount--; 
 }
 
+void LLInventoryFilter::incrementFilterCount()
+{
+	mFilterCount++;
+}
+
+bool LLInventoryFilter::isTimedOut()
+{
+	return mFilterTime.hasExpired();
+}
+
+void LLInventoryFilter::resetTime(S32 timeout)
+{
+    mFilterCount = 0;
+	mFilterTime.reset();
+    F32 time_in_sec = (F32)(timeout)/1000.0;
+	mFilterTime.setTimerExpirySec(time_in_sec);
+}
+
+
+
 S32 LLInventoryFilter::getCurrentGeneration() const 
 { 
 	return mCurrentGeneration;
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index ac6be196efa97a44253a4940a7d9ea90cedebf6b..034fcf4a6268f21b0a2e40698daa6d3a47956cca 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -221,6 +221,13 @@ class LLInventoryFilter : public LLFolderViewFilter
 	S32 				getFilterCount() const;
 	void 				decrementFilterCount();
 
+	// +-------------------------------------------------------------------+
+	// + Time
+	// +-------------------------------------------------------------------+
+	void 				resetTime(S32 timeout);
+    bool                isTimedOut();
+	void 				incrementFilterCount(); // Temp!
+    
 	// +-------------------------------------------------------------------+
 	// + Default
 	// +-------------------------------------------------------------------+
@@ -271,6 +278,8 @@ class LLInventoryFilter : public LLFolderViewFilter
 	S32						mFilterCount;
 	EFilterModified 		mFilterModified;
 
+	LLTimer                 mFilterTime;
+    
 	std::string 			mFilterText;
 	std::string 			mEmptyLookupMessage;
 };