diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index adf7f08702ecbc28c09a9bbe87fb4e5a42f1e444..640b0d7d8f84e39ba50cc7eeeb70d4a6388ca79f 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -748,6 +748,12 @@ void LLFolderView::sanitizeSelection()
 				}
 			}
 		}
+
+		// Don't allow invisible items (such as root folders) to be selected.
+		if (item->getDontShowInHierarchy())
+		{
+			items_to_remove.push_back(item);
+		}
 	}
 
 	std::vector<LLFolderViewItem*>::iterator item_it;
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 135821f662db00b9acfcc115425097a360d80f9c..c2607dcc9a1d77e9838d6cdab60ae7883a6f1436 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -198,7 +198,9 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
 	}
 
 	LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
-	while(itemp && !itemp->getVisible())
+
+	// Skip over items that are invisible or are hidden from the UI.
+	while(itemp && (!itemp->getVisible() || itemp->getDontShowInHierarchy()))
 	{
 		LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
 		if (itemp == next_itemp)