diff --git a/packages/DocumentsUI/res/layout/fragment_directory.xml b/packages/DocumentsUI/res/layout/fragment_directory.xml
index 7ae7eea..910a702 100644
--- a/packages/DocumentsUI/res/layout/fragment_directory.xml
+++ b/packages/DocumentsUI/res/layout/fragment_directory.xml
@@ -45,6 +45,7 @@
         android:paddingBottom="@dimen/grid_padding_vert"
         android:clipToPadding="false"
         android:scrollbarStyle="outsideOverlay"
-        android:drawSelectorOnTop="true" />
+        android:drawSelectorOnTop="true"
+        android:background="@color/item_doc_grid_background" />
 
 </com.android.documentsui.DirectoryView>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index 0554601..37e267c 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -65,7 +65,6 @@
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.RecyclerView.LayoutManager;
-import android.support.v7.widget.RecyclerView.OnItemTouchListener;
 import android.support.v7.widget.RecyclerView.RecyclerListener;
 import android.support.v7.widget.RecyclerView.ViewHolder;
 import android.text.TextUtils;
@@ -83,7 +82,6 @@
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.ViewParent;
 import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.TextView;
@@ -510,18 +508,18 @@
         final LayoutManager layout;
         switch (mode) {
             case MODE_GRID:
-                if (mGridLayout == null) {
-                    // TODO: Determine appropriate column count.
-                    mGridLayout = new GridLayoutManager(getContext(), 4);
-                }
                 thumbSize = getResources().getDimensionPixelSize(R.dimen.grid_width);
+                if (mGridLayout == null) {
+                    int columnCount = Math.max(1, mRecView.getWidth() / thumbSize);
+                    mGridLayout = new GridLayoutManager(getContext(), columnCount);
+                }
                 layout = mGridLayout;
                 break;
             case MODE_LIST:
+                thumbSize = getResources().getDimensionPixelSize(R.dimen.icon_size);
                 if (mListLayout == null) {
                     mListLayout = new LinearLayoutManager(getContext());
                 }
-                thumbSize = getResources().getDimensionPixelSize(R.dimen.icon_size);
                 layout = mListLayout;
                 break;
             case MODE_UNKNOWN:
@@ -544,6 +542,8 @@
 
         private Selection mSelected = new Selection();
         private ActionMode mActionMode;
+        private int mNoDeleteCount = 0;
+        private Menu mMenu;
 
         @Override
         public boolean onBeforeItemStateChange(int position, boolean selected) {
@@ -560,18 +560,28 @@
 
         @Override
         public void onItemStateChanged(int position, boolean selected) {
+
+            final Cursor cursor = mAdapter.getItem(position);
+            checkNotNull(cursor, "Cursor cannot be null.");
+
+            final int docFlags = getCursorInt(cursor, Document.COLUMN_FLAGS);
+            if ((docFlags & Document.FLAG_SUPPORTS_DELETE) == 0) {
+                mNoDeleteCount += selected ? 1 : -1;
+            }
+
             mSelectionManager.getSelection(mSelected);
-            if (mSelected.size() == 0) {
-                if (DEBUG) Log.d(TAG, "Finishing action mode.");
-                if (mActionMode != null) {
-                    mActionMode.finish();
-                }
-            } else {
+            if (mSelected.size() > 0) {
                 if (DEBUG) Log.d(TAG, "Maybe starting action mode.");
                 if (mActionMode == null) {
                     if (DEBUG) Log.d(TAG, "Yeah. Starting action mode.");
                     mActionMode = getActivity().startActionMode(this);
                 }
+                updateActionMenu();
+            } else {
+                if (DEBUG) Log.d(TAG, "Finishing action mode.");
+                if (mActionMode != null) {
+                    mActionMode.finish();
+                }
             }
 
             if (mActionMode != null) {
@@ -586,6 +596,8 @@
             mActionMode = null;
             // clear selection
             mSelectionManager.clearSelection();
+            mSelected.clear();
+            mNoDeleteCount = 0;
         }
 
         @Override
@@ -597,12 +609,17 @@
 
         @Override
         public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-            // Delegate update logic to our owning action, since specialized
-            // logic is desired.
-            mFragmentTuner.updateActionMenu(menu, mType);
+            mMenu = menu;
+            updateActionMenu();
             return true;
         }
 
+        private void updateActionMenu() {
+            checkNotNull(mMenu);
+            // Delegate update logic to our owning action, since specialized logic is desired.
+            mFragmentTuner.updateActionMenu(mMenu, mType, mNoDeleteCount == 0);
+        }
+
         @Override
         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
 
@@ -1608,7 +1625,7 @@
      * Feel free to expand the role of this class to handle other specializations.
      */
     private interface FragmentTuner {
-        void updateActionMenu(Menu menu, int dirType);
+        void updateActionMenu(Menu menu, int dirType, boolean canDelete);
     }
 
     /**
@@ -1643,7 +1660,7 @@
         }
 
         @Override
-        public void updateActionMenu(Menu menu, int dirType) {
+        public void updateActionMenu(Menu menu, int dirType, boolean canDelete) {
             Preconditions.checkState(mState.action != ACTION_BROWSE_ALL);
 
             final MenuItem open = menu.findItem(R.id.menu_open);
@@ -1658,7 +1675,7 @@
 
             open.setVisible(!manageOrBrowse);
             share.setVisible(manageOrBrowse);
-            delete.setVisible(manageOrBrowse);
+            delete.setVisible(manageOrBrowse && canDelete);
             // Disable copying from the Recents view.
             copyTo.setVisible(manageOrBrowse && dirType != TYPE_RECENT_OPEN);
             moveTo.setVisible(SystemProperties.getBoolean("debug.documentsui.enable_move", false));
@@ -1673,9 +1690,9 @@
      */
     private static final class StandaloneTuner implements FragmentTuner {
         @Override
-        public void updateActionMenu(Menu menu, int dirType) {
+        public void updateActionMenu(Menu menu, int dirType, boolean canDelete) {
             menu.findItem(R.id.menu_share).setVisible(true);
-            menu.findItem(R.id.menu_delete).setVisible(true);
+            menu.findItem(R.id.menu_delete).setVisible(canDelete);
             menu.findItem(R.id.menu_copy_to_clipboard).setVisible(true);
 
             menu.findItem(R.id.menu_open).setVisible(false);
