diff --git a/src/com/android/documentsui/dirlist/Model.java b/src/com/android/documentsui/dirlist/Model.java
index 3de9c73..43aed9a 100644
--- a/src/com/android/documentsui/dirlist/Model.java
+++ b/src/com/android/documentsui/dirlist/Model.java
@@ -16,10 +16,8 @@
 
 package com.android.documentsui.dirlist;
 
-import static com.android.documentsui.base.DocumentInfo.getCursorInt;
 import static com.android.documentsui.base.DocumentInfo.getCursorString;
 import static com.android.documentsui.base.Shared.DEBUG;
-import static com.android.documentsui.base.Shared.ENABLE_OMC_API_FEATURES;
 import static com.android.documentsui.base.Shared.VERBOSE;
 
 import android.annotation.IntDef;
@@ -35,10 +33,10 @@
 import android.util.Log;
 
 import com.android.documentsui.DirectoryResult;
-import com.android.documentsui.archives.ArchivesProvider;
+import com.android.documentsui.base.DocumentFilters;
 import com.android.documentsui.base.DocumentInfo;
 import com.android.documentsui.base.EventListener;
-import com.android.documentsui.base.Shared;
+import com.android.documentsui.base.Features;
 import com.android.documentsui.roots.RootCursorWrapper;
 import com.android.documentsui.selection.Selection;
 
@@ -58,46 +56,26 @@
 @VisibleForTesting
 public class Model {
 
-    /**
-     * Filter that passes (returns true) for all files which can be shared.
-     */
-    public static final Predicate<Cursor> SHARABLE_FILE_FILTER = (Cursor c) -> {
-        int flags = getCursorInt(c, Document.COLUMN_FLAGS);
-        String authority = getCursorString(c, RootCursorWrapper.COLUMN_AUTHORITY);
-        if (!ENABLE_OMC_API_FEATURES) {
-            return (flags & Document.FLAG_PARTIAL) == 0
-                    && (flags & Document.FLAG_VIRTUAL_DOCUMENT) == 0
-                    && !ArchivesProvider.AUTHORITY.equals(authority);
-        }
-        return (flags & Document.FLAG_PARTIAL) == 0
-                && !ArchivesProvider.AUTHORITY.equals(authority);
-    };
-
-    /**
-     * Filter that passes (returns true) only virtual documents.
-     */
-    public static final Predicate<Cursor> VIRTUAL_DOCUMENT_FILTER  = (Cursor c) -> {
-        int flags = getCursorInt(c, Document.COLUMN_FLAGS);
-        return (flags & Document.FLAG_VIRTUAL_DOCUMENT) != 0;
-    };
-
-    private static final Predicate<Cursor> ANY_FILE_FILTER = (Cursor c) -> true;
-
     private static final String TAG = "Model";
 
+    @Nullable String info;
+    @Nullable String error;
+    @Nullable DocumentInfo doc;
+
+    private final Features mFeatures;
     /** Maps Model ID to cursor positions, for looking up items by Model ID. */
     private final Map<String, Integer> mPositions = new HashMap<>();
     private final Set<String> mFileNames = new HashSet<>();
 
     private boolean mIsLoading;
     private List<EventListener<Update>> mUpdateListeners = new ArrayList<>();
-    @Nullable private Cursor mCursor;
+    private @Nullable Cursor mCursor;
     private int mCursorCount;
     private String mIds[] = new String[0];
 
-    @Nullable String info;
-    @Nullable String error;
-    @Nullable DocumentInfo doc;
+    public Model(Features features) {
+        mFeatures = features;
+    }
 
     public void addUpdateListener(EventListener<Update> listener) {
         mUpdateListeners.add(listener);
@@ -114,7 +92,7 @@
     }
 
     private void notifyUpdateListeners(Exception e) {
-        Update error = new Update(e);
+        Update error = new Update(e, mFeatures.isRemoteActionsEnabled());
         for (EventListener<Update> handler: mUpdateListeners) {
             handler.accept(error);
         }
@@ -227,7 +205,7 @@
     }
 
     public List<DocumentInfo> getDocuments(Selection selection) {
-        return loadDocuments(selection, ANY_FILE_FILTER);
+        return loadDocuments(selection, DocumentFilters.ANY);
     }
 
     public @Nullable DocumentInfo getDocument(String modelId) {
@@ -307,16 +285,19 @@
 
         private final @UpdateType int mUpdateType;
         private final @Nullable Exception mException;
+        private final boolean mRemoteActionEnabled;
 
         private Update() {
             mUpdateType = TYPE_UPDATE;
             mException = null;
+            mRemoteActionEnabled = false;
         }
 
-        public Update(Exception exception) {
+        public Update(Exception exception, boolean remoteActionsEnabled) {
             assert(exception != null);
             mUpdateType = TYPE_UPDATE_EXCEPTION;
             mException = exception;
+            mRemoteActionEnabled = remoteActionsEnabled;
         }
 
         public boolean isUpdate() {
@@ -328,7 +309,8 @@
         }
 
         public boolean hasRecoverableException() {
-            return Shared.ENABLE_OMC_API_FEATURES && hasException()
+            return mRemoteActionEnabled
+                    && hasException()
                     && mException instanceof RecoverableSecurityException;
         }
 
