diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index 3ca549ae72c50caf3a6d07162cdce153e2e19341..c9e88ab72f4fd5c5604eaab2fee4d8d34a91afdd 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -323,17 +323,11 @@ static LLFastTimer::DeclareTimer FTM_FILTER("Filter Folder View");
 
 void LLFolderView::filter( LLFolderViewFilter& filter )
 {
-    //llinfos << "Merov : LLFolderView::filter (fast timed)" << llendl;
+    // Entry point of inventory filtering (CHUI-849)
 	LLFastTimer t2(FTM_FILTER);
 	filter.setFilterCount(llclamp(LLUI::sSettingGroups["config"]->getS32("FilterItemsPerFrame"), 1, 5000));
-
-	bool filtered_items = getViewModelItem()->filter(filter);
-    //if (getViewModelItem()->descendantsPassedFilter(filter.getCurrentGeneration()))
-    if (filtered_items)
-    {
-        llinfos << "Merov : LLFolderView::filter, request arrange, new elements passed the filter" << llendl;
-        requestArrange();
-    }
+    // Note: we filter the model, not the view
+	getViewModelItem()->filter(filter);
 }
 
 void LLFolderView::reshape(S32 width, S32 height, BOOL called_from_parent)
@@ -1614,16 +1608,17 @@ void LLFolderView::update()
 	{
 		mNeedsAutoSelect = TRUE;
 	}
-	// filter to determine visibility before arranging
+    
+	// Filter to determine visibility before arranging
 	filter(getFolderViewModel()->getFilter());
+    
 	// 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, then the filter most likely halted before completing the entire set of items
+	// 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))
 	{
 		getFolderViewModel()->getFilter().clearModified();
 	}
-    llinfos << "Merov : LLFolderView::update: parent = " << mParentPanel->getName() << ", modified = " << getFolderViewModel()->getFilter().isModified() << ", not default = " << getFolderViewModel()->getFilter().isNotDefault() << ", count = " << getFolderViewModel()->getFilter().getFilterCount() << llendl;
-
+    
 	// automatically show matching items, and select first one if we had a selection
 	if (mNeedsAutoSelect)
 	{
@@ -1663,22 +1658,19 @@ void LLFolderView::update()
 
   BOOL is_visible = isInVisibleChain();
 
-  //Puts folders/items in proper positions
-  if ( is_visible )
+  // Puts folders/items in proper positions
+  // arrange() takes the model filter flag into account and call sort() if necessary (CHUI-849)
+  // It also handles the open/close folder animation
+  if (is_visible)
   {
     sanitizeSelection();
-    if( needsArrange() )
+    if (needsArrange())
     {
       S32 height = 0;
       S32 width = 0;
-        llinfos << "Merov : LLFolderView::update: parent = " << mParentPanel->getName() << ", is been arranged, last arrange = " << mLastArrangeGeneration << ", root arrange = " << getRoot()->getArrangeGeneration() << llendl;
       S32 total_height = arrange( &width, &height );
       notifyParent(LLSD().with("action", "size_changes").with("height", total_height));
     }
-      else
-      {
-          llinfos << "Merov : LLFolderView::update: parent = " << mParentPanel->getName() << ", doesn't need arranging, last arrange = " << mLastArrangeGeneration << ", root arrange = " << getRoot()->getArrangeGeneration() << llendl;
-      }
   }
 
 	// during filtering process, try to pin selected item's location on screen
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 43267b428e4e9dc43d3d67ef01ebcaf3d2c583dc..96961e7a4ffa367a9a3fe00c3c3f44d488a0c78b 100755
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -274,11 +274,7 @@ void LLFolderViewItem::refresh()
 	}
 
 	mLabelWidthDirty = true;
-    // Merov ??
-    if (vmi.getSearchableName() == "A NOUNOURS")
-    {
-        llinfos << "Merov : LLFolderViewItem::refresh : Dirty filter for NOUNOURS" << llendl;
-    }
+    // Dirty the filter flag of the model from the view (CHUI-849)
 	vmi.dirtyFilter();
 }
 
@@ -795,12 +791,6 @@ void LLFolderViewItem::drawLabel(const LLFontGL * font, const F32 x, const F32 y
 
 void LLFolderViewItem::draw()
 {
-	LLFolderViewModelItem& vmi = *getViewModelItem();
-    if (vmi.getSearchableName() == "A NOUNOURS")
-    {
-        llinfos << "Merov : LLFolderViewItem::draw : Special NOUNOURS, draw it!" << llendl;
-    }
-
     const BOOL show_context = (getRoot() ? getRoot()->getShowSelectionContext() : FALSE);
     const BOOL filled = show_context || (getRoot() ? getRoot()->getParentPanel()->hasFocus() : FALSE); // If we have keyboard focus, draw selection filled
 
@@ -954,15 +944,20 @@ void LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder)
 
 static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange");
 
-// Finds width and height of this object and its children. Also
-// makes sure that this view and its children are the right size.
+// Make everything right and in the right place ready for drawing (CHUI-849)
+// * Sort everything correctly if necessary
+// * 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
+// * Makes sure that this view and its children are the right size
 S32 LLFolderViewFolder::arrange( S32* width, S32* height )
 {
-	// sort before laying out contents
+	// Sort before laying out contents
+    // Note that we sort from the root (CHUI-849)
 	getRoot()->getFolderViewModel()->sort(this);
 
 	LLFastTimer t2(FTM_ARRANGE);
-    llinfos << "Merov : LLFolderViewFolder::arrange" << llendl;
 
 	// evaluate mHasVisibleChildren
 	mHasVisibleChildren = false;
@@ -1625,16 +1620,13 @@ void LLFolderViewFolder::addFolder(LLFolderViewFolder* folder)
 }
 
 void LLFolderViewFolder::requestArrange()
-{ 
-	if ( mLastArrangeGeneration != -1)
-	{
-		mLastArrangeGeneration = -1; 
-		// flag all items up to root
-		if (mParentFolder)
-		{
-			mParentFolder->requestArrange();
-		}
-	}
+{
+    mLastArrangeGeneration = -1;
+    // flag all items up to root
+    if (mParentFolder)
+    {
+        mParentFolder->requestArrange();
+    }
 }
 
 void LLFolderViewFolder::toggleOpen()
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index 1b61212c0eadf6e9de74777a52de31e8df456ab2..dbcbb0edebc43629bb6828de57fd0b1ce305da88 100644
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -308,26 +308,28 @@ class LLFolderViewModelItemCommon : public LLFolderViewModelItem
 	virtual bool potentiallyVisible()
 	{
 		return passedFilter() // we've passed the filter
-			|| getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration() // or we don't know yet
+			|| (getLastFilterGeneration() < mRootViewModel.getFilter().getFirstSuccessGeneration()) // or we don't know yet
 			|| descendantsPassedFilter();
 	}
 
 	virtual bool passedFilter(S32 filter_generation = -1) 
 	{ 
-		if (filter_generation < 0) 
+		if (filter_generation < 0)
+        {
 			filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration();
-
-		bool passed_folder_filter = mPassedFolderFilter && mLastFolderFilterGeneration >= filter_generation;
-		bool passed_filter = mPassedFilter && mLastFilterGeneration >= filter_generation;
-		return passed_folder_filter
-				&& (descendantsPassedFilter(filter_generation)
-					|| passed_filter);
+        }
+		bool passed_folder_filter = mPassedFolderFilter && (mLastFolderFilterGeneration >= filter_generation);
+		bool passed_filter = mPassedFilter && (mLastFilterGeneration >= filter_generation);
+		return passed_folder_filter && (passed_filter || descendantsPassedFilter(filter_generation));
 	}
 
 	virtual bool descendantsPassedFilter(S32 filter_generation = -1)
 	{ 
-		if (filter_generation < 0) filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration();
-		return mMostFilteredDescendantGeneration >= filter_generation; 
+		if (filter_generation < 0)
+        {
+            filter_generation = mRootViewModel.getFilter().getFirstSuccessGeneration();
+        }
+		return mMostFilteredDescendantGeneration >= filter_generation;
 	}
 
 
diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp
index 49b72485e0a624a6402837abb7729589d4734cf5..1894314513597937cf2eefccf7f7c0d5ecbe4895 100644
--- a/indra/newview/llfolderviewmodelinventory.cpp
+++ b/indra/newview/llfolderviewmodelinventory.cpp
@@ -40,7 +40,6 @@ static S32 sModelInstance = 0;
 LLFolderViewModelInventory::LLFolderViewModelInventory()
 {
     mModelInstance = sModelInstance++;
-    llinfos << "Merov : LLFolderViewModelInventory::LLFolderViewModelInventory, instance = " << mModelInstance << llendl;
 }
 
 bool LLFolderViewModelInventory::startDrag(std::vector<LLFolderViewModelItem*>& items)
@@ -71,7 +70,6 @@ bool LLFolderViewModelInventory::startDrag(std::vector<LLFolderViewModelItem*>&
 void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )
 {
 	LLFastTimer _(FTM_INVENTORY_SORT);
-    llinfos << "Merov : LLFolderViewModelInventory::sort of instance = " << mModelInstance << ", folder = " << folder->getName() << llendl;
 
 	if (!needsSort(folder->getViewModelItem())) return;
 
@@ -82,6 +80,7 @@ void LLFolderViewModelInventory::sort( LLFolderViewFolder* folder )
 		it != end_it;
 		++it)
 	{
+        // Recursive call to sort() on child (CHUI-849)
 		LLFolderViewFolder* child_folderp = *it;
 		sort(child_folderp);
 
@@ -136,13 +135,12 @@ void LLFolderViewModelItemInventory::requestSort()
 
 void LLFolderViewModelItemInventory::setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset, std::string::size_type string_size)
 {
+	bool before = passedFilter();
 	LLFolderViewModelItemCommon::setPassedFilter(passed, filter_generation, string_offset, string_size);
 
-	bool passed_filter_before = mPrevPassedAllFilters;
-	mPrevPassedAllFilters = passedFilter(filter_generation);
-
-	if (passed_filter_before != mPrevPassedAllFilters)
+    if (before != passed)
 	{
+        // Need to rearrange the folder if the filtered state of the item changed
 		LLFolderViewFolder* parent_folder = mFolderViewItem->getParentFolder();
 		if (parent_folder)
 		{
@@ -155,15 +153,14 @@ bool LLFolderViewModelItemInventory::filterChildItem( LLFolderViewModelItem* ite
 {
 	S32 filter_generation = filter.getCurrentGeneration();
 
-//	bool continue_filtering = true;
 	bool new_filtered_item = false;
 	if (item->getLastFilterGeneration() < filter_generation)
 	{
-		// recursive application of the filter for child items
+		// Recursive application of the filter for child items (CHUI-849)
 		new_filtered_item = item->filter( filter );
 	}
 
-	// track latest generation to pass any child items, for each folder up to root
+	// Update latest generation to pass filter in parent and propagate up to root
 	if (item->passedFilter())
 	{
 		LLFolderViewModelItemInventory* view_model = this;
@@ -182,23 +179,30 @@ 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 (getSearchableName() == "A NOUNOURS")
-    {
-        llinfos << "Merov : LLFolderViewModelItemInventory::filter : special NOUNOURS case, filter count = " << filter.getFilterCount() << ", must pass = " << must_pass_generation << ", current = " << filter_generation << ", item last = " << getLastFilterGeneration() << ", folder last = " << getLastFolderFilterGeneration() << llendl;
-    }
-   
     if (getLastFilterGeneration() >= must_pass_generation
 		&& getLastFolderFilterGeneration() >= must_pass_generation
 		&& !passedFilter(must_pass_generation))
 	{
 		// failed to pass an earlier filter that was a subset of the current one
-		// go ahead and flag this item as done
+		// go ahead and flag this item as not pass
 		setPassedFilter(false, filter_generation);
 		setPassedFolderFilter(false, filter_generation);
 		return false;
 	}
 
+    if (getLastFilterGeneration() >= sufficient_pass_generation
+		&& getLastFolderFilterGeneration() >= sufficient_pass_generation
+		&& passedFilter(sufficient_pass_generation))
+	{
+		// passed an earlier filter that was a superset of the current one
+		// go ahead and flag this item as pass
+		setPassedFilter(true, filter_generation);
+		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);
 
@@ -221,13 +225,11 @@ 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 we didn't use all filter iterations that means we filtered all of our descendants so filter ourselves now
 	if (filter.getFilterCount() > 0)
 	{
+        // This is where filter count is hit and filter check on the item done (CHUI-849)
 		filter.decrementFilterCount();
-
 		const bool passed_filter = filter.check(this);
 		setPassedFilter(passed_filter, filter_generation, filter.getStringMatchOffset(this), filter.getFilterStringSize());
         new_filtered_item |= passed_filter;
@@ -320,7 +322,6 @@ bool LLInventorySort::operator()(const LLFolderViewModelItemInventory* const& a,
 }
 
 LLFolderViewModelItemInventory::LLFolderViewModelItemInventory( class LLFolderViewModelInventory& root_view_model ) 
-	:	LLFolderViewModelItemCommon(root_view_model),
-	mPrevPassedAllFilters(false)
+	:	LLFolderViewModelItemCommon(root_view_model)
 {
 }
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index 3201acf91eee20dfb02458110e6ab9dcd698634f..540a87354d84db73addd70af044009586c0c32f1 100644
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -59,9 +59,6 @@ class LLFolderViewModelItemInventory
 
 	virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const = 0;
 	virtual LLToolDragAndDrop::ESource getDragSource() const = 0;
-
-protected:
-	bool								mPrevPassedAllFilters;
 };
 
 class LLInventorySort
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index d3f5d68708d6ab9438adb7f35efe15f1ad8db586..b0c75cb176a4705e782cb92800d44fa0536240f7 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -73,8 +73,6 @@ LLInventoryFilter::LLInventoryFilter(const Params& p)
 	mFirstSuccessGeneration(0),
 	mFilterCount(0)
 {
-	mNextFilterGeneration = mCurrentGeneration + 1;
-
 	// copy mFilterOps into mDefaultFilterOps
 	markDefault();
 }
@@ -92,35 +90,23 @@ bool LLInventoryFilter::check(const LLFolderViewModelItem* item)
 		return passed_clipboard;
 	}
 
-	std::string::size_type string_offset = mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) : std::string::npos;
-
-	BOOL passed = (mFilterSubString.size() == 0 || string_offset != std::string::npos);
+	bool passed = (mFilterSubString.size() ? listener->getSearchableName().find(mFilterSubString) != std::string::npos : true);
 	passed = passed && checkAgainstFilterType(listener);
 	passed = passed && checkAgainstPermissions(listener);
 	passed = passed && checkAgainstFilterLinks(listener);
 	passed = passed && passed_clipboard;
 
-    if (listener->getSearchableName() == "A NOUNOURS")
-    {
-        llinfos << "Merov : LLInventoryFilter::check : Here we go with our special NOUNOURS case, checked for string '" << mFilterSubString << "', passed = " << passed << ", name = " << listener->getSearchableName() << llendl;
-    }
-
 	return passed;
 }
 
 bool LLInventoryFilter::check(const LLInventoryItem* item)
 {
-	std::string::size_type string_offset = mFilterSubString.size() ? item->getName().find(mFilterSubString) : std::string::npos;
-
+	const bool passed_string = (mFilterSubString.size() ? item->getName().find(mFilterSubString) != std::string::npos : true);
 	const bool passed_filtertype = checkAgainstFilterType(item);
 	const bool passed_permissions = checkAgainstPermissions(item);
-	const BOOL passed_clipboard = checkAgainstClipboard(item->getUUID());
-	const bool passed = (passed_filtertype 
-		&& passed_permissions
-		&& passed_clipboard 
-		&&	(mFilterSubString.size() == 0 || string_offset != std::string::npos));
+	const bool passed_clipboard = checkAgainstClipboard(item->getUUID());
 
-	return passed;
+	return passed_filtertype && passed_permissions && passed_clipboard && passed_string;
 }
 
 bool LLInventoryFilter::checkFolder(const LLFolderViewModelItem* item) const
@@ -444,7 +430,7 @@ void LLInventoryFilter::updateFilterTypes(U64 types, U64& current_types)
 		current_types = types;
 		if (more_bits_set && fewer_bits_set)
 		{
-			// neither less or more restrive, both simultaneously
+			// neither less or more restrictive, both simultaneously
 			// so we need to filter from scratch
 			setModified(FILTER_RESTART);
 		}
@@ -719,7 +705,7 @@ void LLInventoryFilter::resetDefault()
 void LLInventoryFilter::setModified(EFilterModified behavior)
 {
 	mFilterText.clear();
-	mCurrentGeneration = mNextFilterGeneration++;
+	mCurrentGeneration++;
 
 	if (mFilterModified == FILTER_NONE)
 	{
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 4912b5ca9162ed1c128f09137b6faf4b62ea31f3..ac6be196efa97a44253a4940a7d9ea90cedebf6b 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -262,9 +262,11 @@ class LLInventoryFilter : public LLFolderViewFilter
 	const std::string		mName;
 
 	S32						mCurrentGeneration;
+    // The following makes checking for pass/no pass possible even if the item is not checked against the current generation
+    // Any item that *did not pass* the "required generation" will *not pass* the current one
+    // Any item that *passes* the "success generation" will *pass* the current one
 	S32						mFirstRequiredGeneration;
 	S32						mFirstSuccessGeneration;
-	S32						mNextFilterGeneration;
 
 	S32						mFilterCount;
 	EFilterModified 		mFilterModified;
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 17dd3024ea88caf18a1fdb793e5efc68d4ab4966..db8370e9944150b5752ecde65aa94ee8da7394ff 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -148,8 +148,6 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
 	mViewsInitialized(false),
 	mInvFVBridgeBuilder(NULL)
 {
-    llinfos << "Merov : LLInventoryPanel::LLInventoryPanel, name = " << getName() << ", label = " << getLabel() << llendl;
-
 	mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
 
 	if (!sColorSetInitialized)
@@ -195,8 +193,6 @@ LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
     p.root = NULL;
     p.options_menu = "menu_inventory.xml";
 
-    llinfos << "Merov : LLInventoryPanel::createFolderRoot, name = " << getName() << ", label = " << getLabel() << ", root id = " << root_id << llendl;
-
     return LLUICtrlFactory::create<LLFolderView>(p);
 }
 
@@ -400,13 +396,12 @@ LLInventoryFilter::EFolderShow LLInventoryPanel::getShowFolderState()
 	return getFilter().getShowFolderState();
 }
 
+// Called when something changed in the global model (new item, item coming through the wire, rename, move, etc...) (CHUI-849)
 void LLInventoryPanel::modelChanged(U32 mask)
 {
 	static LLFastTimer::DeclareTimer FTM_REFRESH("Inventory Refresh");
 	LLFastTimer t2(FTM_REFRESH);
 
-    llinfos << "Merov : LLInventoryPanel::modelChanged, mask = " << mask << ", name = " << getName() << ", label = " << getLabel() << llendl;
-
 	bool handled = false;
 
 	if (!mViewsInitialized) return;
@@ -482,7 +477,6 @@ void LLInventoryPanel::modelChanged(U32 mask)
 		{
 			if (view_item)
 			{
-                // Merov??
 				view_item->refresh();
 			}
 		}
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 4d8fa073360723cd2cb3cec8787058522f5216ad..7555ac7b2caf9510ce5ee0d3351fc2517c6ae165 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1492,7 +1492,6 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par
 	mIsInventoryEmpty(TRUE),
 	mInventoryNeedsUpdate(FALSE)
 {
-    llinfos << "Merov : LLPanelObjectInventory::LLPanelObjectInventory, name = " << getName() << ", label = " << getLabel() << llendl;
 	// Setup context menu callbacks
 	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2));
 	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH));