diff --git a/src/com/android/documentsui/BaseActivity.java b/src/com/android/documentsui/BaseActivity.java
index d41c521..c96d605 100644
--- a/src/com/android/documentsui/BaseActivity.java
+++ b/src/com/android/documentsui/BaseActivity.java
@@ -152,12 +152,6 @@
      */
     public abstract MenuManager getMenuManager();
 
-    /**
-     * Provides Activity a means of injection into and specialization of
-     * DirectoryFragment.
-     */
-    public abstract DirectoryDetails getDirectoryDetails();
-
     public abstract void onDocumentPicked(DocumentInfo doc, Model model);
     public abstract void onDocumentsPicked(List<DocumentInfo> docs);
 
diff --git a/src/com/android/documentsui/MenuManager.java b/src/com/android/documentsui/MenuManager.java
index 55dffb1..ac45c16 100644
--- a/src/com/android/documentsui/MenuManager.java
+++ b/src/com/android/documentsui/MenuManager.java
@@ -31,12 +31,17 @@
 
 public abstract class MenuManager {
 
-    final protected State mState;
     final protected SearchViewManager mSearchManager;
+    final protected State mState;
+    final protected DirectoryDetails mDirDetails;
 
-    public MenuManager(SearchViewManager searchManager, State displayState) {
+    public MenuManager(
+            SearchViewManager searchManager,
+            State displayState,
+            DirectoryDetails dirDetails) {
         mSearchManager = searchManager;
         mState = displayState;
+        mDirDetails = dirDetails;
     }
 
     /** @see ActionModeController */
@@ -53,14 +58,13 @@
     }
 
     /** @see BaseActivity#onPrepareOptionsMenu */
-    public void updateOptionMenu(Menu menu, DirectoryDetails directoryDetails) {
-        updateCreateDir(menu.findItem(R.id.menu_create_dir), directoryDetails);
-        updateSettings(menu.findItem(R.id.menu_settings), directoryDetails);
-        updateNewWindow(menu.findItem(R.id.menu_new_window), directoryDetails);
-        updateModePicker(menu.findItem(
-                R.id.menu_grid), menu.findItem(R.id.menu_list), directoryDetails);
+    public void updateOptionMenu(Menu menu) {
+        updateCreateDir(menu.findItem(R.id.menu_create_dir));
+        updateSettings(menu.findItem(R.id.menu_settings));
+        updateNewWindow(menu.findItem(R.id.menu_new_window));
+        updateModePicker(menu.findItem(R.id.menu_grid), menu.findItem(R.id.menu_list));
         // Sort menu item is managed by SortMenuManager
-        updateAdvanced(menu.findItem(R.id.menu_advanced), directoryDetails);
+        updateAdvanced(menu.findItem(R.id.menu_advanced));
 
         Menus.disableHiddenItems(menu);
     }
@@ -77,8 +81,7 @@
         // Pickers don't have any context menu at this moment.
     }
 
-    public void inflateContextMenuForContainer(
-            Menu menu, MenuInflater inflater, DirectoryDetails directoryDetails) {
+    public void inflateContextMenuForContainer(Menu menu, MenuInflater inflater) {
         throw new UnsupportedOperationException("Pickers don't allow context menu.");
     }
 
@@ -166,11 +169,11 @@
      * Called when user tries to generate a context menu anchored to an empty pane.
      */
     @VisibleForTesting
-    public void updateContextMenuForContainer(Menu menu, DirectoryDetails directoryDetails) {
+    public void updateContextMenuForContainer(Menu menu) {
         MenuItem paste = menu.findItem(R.id.menu_paste_from_clipboard);
         MenuItem selectAll = menu.findItem(R.id.menu_select_all);
 
-        paste.setEnabled(directoryDetails.hasItemsToPaste() && directoryDetails.canCreateDoc());
+        paste.setEnabled(mDirDetails.hasItemsToPaste() && mDirDetails.canCreateDoc());
         updateSelectAll(selectAll);
     }
 
@@ -185,19 +188,18 @@
         updateEject(eject, root);
     }
 
-    protected void updateModePicker(
-            MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
+    protected void updateModePicker(MenuItem grid, MenuItem list) {
         grid.setVisible(mState.derivedMode != State.MODE_GRID);
         list.setVisible(mState.derivedMode != State.MODE_LIST);
     }
 
-    protected void updateAdvanced(MenuItem advanced, DirectoryDetails directoryDetails) {
+    protected void updateAdvanced(MenuItem advanced) {
         advanced.setVisible(mState.showAdvancedOption);
         advanced.setTitle(mState.showAdvancedOption && mState.showAdvanced
                 ? R.string.menu_advanced_hide : R.string.menu_advanced_show);
     }
 
-    protected void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
+    protected void updateSettings(MenuItem settings) {
         settings.setVisible(false);
     }
 
@@ -209,7 +211,7 @@
         eject.setVisible(false);
     }
 
-    protected void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
+    protected void updateNewWindow(MenuItem newWindow) {
         newWindow.setVisible(false);
     }
 
@@ -253,7 +255,7 @@
     protected abstract void updateOpenInContextMenu(
             MenuItem open, SelectionDetails selectionDetails);
     protected abstract void updateSelectAll(MenuItem selectAll);
-    protected abstract void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails);
+    protected abstract void updateCreateDir(MenuItem createDir);
 
     /**
      * Access to meta data about the selection.
diff --git a/src/com/android/documentsui/dirlist/DirectoryFragment.java b/src/com/android/documentsui/dirlist/DirectoryFragment.java
index bcd1f30..997fc8a 100644
--- a/src/com/android/documentsui/dirlist/DirectoryFragment.java
+++ b/src/com/android/documentsui/dirlist/DirectoryFragment.java
@@ -448,8 +448,7 @@
             // TODO: inject DirectoryDetails into MenuManager constructor
             // Since both classes are supplied by Activity and created
             // at the same time.
-            mMenuManager.inflateContextMenuForContainer(
-                    menu, inflater, getBaseActivity().getDirectoryDetails());
+            mMenuManager.inflateContextMenuForContainer(menu, inflater);
         } else {
             mMenuManager.inflateContextMenuForDocs(menu, inflater, mSelectionMetadata);
         }
diff --git a/src/com/android/documentsui/manager/ManageActivity.java b/src/com/android/documentsui/manager/ManageActivity.java
index 0b4c982..77ff743 100644
--- a/src/com/android/documentsui/manager/ManageActivity.java
+++ b/src/com/android/documentsui/manager/ManageActivity.java
@@ -81,7 +81,6 @@
     private long mDrawerLastFiddled;
     private Tuner mTuner;
     private MenuManager mMenuManager;
-    private DirectoryDetails mDetails;
     private DocumentClipper mClipper;
 
     public ManageActivity() {
@@ -93,14 +92,16 @@
         super.onCreate(icicle);
 
         mClipper = DocumentsApplication.getDocumentClipper(this);
-        mMenuManager = new MenuManager(mSearchManager, mState);
+        mMenuManager = new MenuManager(
+                mSearchManager,
+                mState,
+                new DirectoryDetails(this) {
+                    @Override
+                    public boolean hasItemsToPaste() {
+                        return mClipper.hasItemsToPaste();
+                    }
+                });
         mTuner = new Tuner(this, mState);
-        mDetails = new DirectoryDetails(this) {
-            @Override
-            public boolean hasItemsToPaste() {
-                return mClipper.hasItemsToPaste();
-            }
-        };
         mClipper = DocumentsApplication.getDocumentClipper(this);
 
         RootsFragment.show(getFragmentManager(), this::openRootSettings);
@@ -223,7 +224,7 @@
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
-        mMenuManager.updateOptionMenu(menu, mDetails);
+        mMenuManager.updateOptionMenu(menu);
         return true;
     }
 
@@ -543,11 +544,6 @@
         return mMenuManager;
     }
 
-    @Override
-    public DirectoryDetails getDirectoryDetails() {
-        return mDetails;
-    }
-
     /**
      * Builds a stack for the specific Uris. Multi roots are not supported, as it's impossible
      * to know which root to select. Also, the stack doesn't contain intermediate directories.
diff --git a/src/com/android/documentsui/manager/MenuManager.java b/src/com/android/documentsui/manager/MenuManager.java
index 7fca108..7b611ac 100644
--- a/src/com/android/documentsui/manager/MenuManager.java
+++ b/src/com/android/documentsui/manager/MenuManager.java
@@ -29,13 +29,16 @@
 
 public final class MenuManager extends com.android.documentsui.MenuManager {
 
-    public MenuManager(SearchViewManager searchManager, State displayState) {
-        super(searchManager, displayState);
+    public MenuManager(
+            SearchViewManager searchManager,
+            State displayState,
+            DirectoryDetails dirDetails) {
+        super(searchManager, displayState, dirDetails);
     }
 
     @Override
-    public void updateOptionMenu(Menu menu, DirectoryDetails details) {
-        super.updateOptionMenu(menu, details);
+    public void updateOptionMenu(Menu menu) {
+        super.updateOptionMenu(menu);
 
         // It hides icon if searching in progress
         mSearchManager.updateMenu();
@@ -50,10 +53,9 @@
     }
 
     @Override
-    public void inflateContextMenuForContainer(
-            Menu menu, MenuInflater inflater, DirectoryDetails directoryDetails) {
+    public void inflateContextMenuForContainer(Menu menu, MenuInflater inflater) {
         inflater.inflate(R.menu.container_context_menu, menu);
-        updateContextMenuForContainer(menu, directoryDetails);
+        updateContextMenuForContainer(menu);
     }
 
     @Override
@@ -92,13 +94,13 @@
     }
 
     @Override
-    protected void updateSettings(MenuItem settings, DirectoryDetails directoryDetails) {
-        settings.setVisible(directoryDetails.hasRootSettings());
+    protected void updateSettings(MenuItem settings) {
+        settings.setVisible(mDirDetails.hasRootSettings());
     }
 
     @Override
-    protected void updateNewWindow(MenuItem newWindow, DirectoryDetails directoryDetails) {
-        newWindow.setVisible(directoryDetails.shouldShowFancyFeatures());
+    protected void updateNewWindow(MenuItem newWindow) {
+        newWindow.setVisible(mDirDetails.shouldShowFancyFeatures());
     }
 
     @Override
@@ -143,9 +145,9 @@
     }
 
     @Override
-    protected void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) {
+    protected void updateCreateDir(MenuItem createDir) {
         createDir.setVisible(true);
-        createDir.setEnabled(directoryDetails.canCreateDirectory());
+        createDir.setEnabled(mDirDetails.canCreateDirectory());
     }
 
     @Override
@@ -164,4 +166,4 @@
         rename.setVisible(true);
         rename.setEnabled(!selectionDetails.containsPartialFiles() && selectionDetails.canRename());
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/android/documentsui/picker/MenuManager.java b/src/com/android/documentsui/picker/MenuManager.java
index 5385482..a61081b 100644
--- a/src/com/android/documentsui/picker/MenuManager.java
+++ b/src/com/android/documentsui/picker/MenuManager.java
@@ -30,20 +30,21 @@
 
 public final class MenuManager extends com.android.documentsui.MenuManager {
 
-    private boolean mPicking;
+    public MenuManager(SearchViewManager searchManager, State displayState, DirectoryDetails dirDetails) {
+        super(searchManager, displayState, dirDetails);
 
-    public MenuManager(SearchViewManager searchManager, State displayState) {
-        super(searchManager, displayState);
+    }
 
-        mPicking = mState.action == ACTION_CREATE
+    private boolean picking() {
+        return mState.action == ACTION_CREATE
                 || mState.action == ACTION_OPEN_TREE
                 || mState.action == ACTION_PICK_COPY_DESTINATION;
     }
 
     @Override
-    public void updateOptionMenu(Menu menu, DirectoryDetails details) {
-        super.updateOptionMenu(menu, details);
-        if (mPicking) {
+    public void updateOptionMenu(Menu menu) {
+        super.updateOptionMenu(menu);
+        if (picking()) {
             // May already be hidden because the root
             // doesn't support search.
             mSearchManager.showMenu(false);
@@ -51,14 +52,13 @@
     }
 
     @Override
-    protected void updateModePicker(
-            MenuItem grid, MenuItem list, DirectoryDetails directoryDetails) {
+    protected void updateModePicker(MenuItem grid, MenuItem list) {
         // No display options in recent directories
-        if (mPicking && directoryDetails.isInRecents()) {
+        if (picking() && mDirDetails.isInRecents()) {
             grid.setVisible(false);
             list.setVisible(false);
         } else {
-            super.updateModePicker(grid, list, directoryDetails);
+            super.updateModePicker(grid, list);
         }
     }
 
@@ -68,9 +68,9 @@
     }
 
     @Override
-    protected void updateCreateDir(MenuItem createDir, DirectoryDetails directoryDetails) {
-        createDir.setVisible(mPicking);
-        createDir.setEnabled(mPicking && directoryDetails.canCreateDirectory());
+    protected void updateCreateDir(MenuItem createDir) {
+        createDir.setVisible(picking());
+        createDir.setEnabled(picking() && mDirDetails.canCreateDirectory());
     }
 
     @Override
diff --git a/src/com/android/documentsui/picker/PickActivity.java b/src/com/android/documentsui/picker/PickActivity.java
index 83e446a..2e88c54 100644
--- a/src/com/android/documentsui/picker/PickActivity.java
+++ b/src/com/android/documentsui/picker/PickActivity.java
@@ -69,7 +69,6 @@
     private static final String TAG = "DocumentsActivity";
     private MenuManager mMenuManager;
     private Tuner mTuner;
-    private DirectoryDetails mDetails;
 
     public PickActivity() {
         super(R.layout.documents_activity, TAG);
@@ -79,8 +78,7 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         mTuner = new Tuner(this, mState);
-        mMenuManager = new MenuManager(mSearchManager, mState);
-        mDetails = new DirectoryDetails(this);
+        mMenuManager = new MenuManager(mSearchManager, mState, new DirectoryDetails(this));
 
         if (mState.action == ACTION_CREATE) {
             final String mimeType = getIntent().getType();
@@ -223,7 +221,7 @@
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         super.onPrepareOptionsMenu(menu);
-        mMenuManager.updateOptionMenu(menu, mDetails);
+        mMenuManager.updateOptionMenu(menu);
 
         final DocumentInfo cwd = getCurrentDirectory();
 
@@ -406,11 +404,6 @@
         return mMenuManager;
     }
 
-    @Override
-    public DirectoryDetails getDirectoryDetails() {
-        return mDetails;
-    }
-
     private static final class PickFinishTask extends PairedTask<PickActivity, Void, Void> {
         private final Uri mUri;
 
