diff --git a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/AnalysisResultDAO.java b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/AnalysisResultDAO.java
index cddad9b77927d76b624c4b568467005ba351ccf9..118c72cb50a5affc5de49cd19488c323fabb3334 100644
--- a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/AnalysisResultDAO.java
+++ b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/AnalysisResultDAO.java
@@ -22,6 +22,7 @@
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
 import org.openide.util.NbBundle;
 import org.sleuthkit.datamodel.AbstractFile;
@@ -183,16 +184,40 @@ protected void onModuleData(ModuleDataEvent evt) {
         caches.forEach((cache) -> cache.invalidate(evt));
     }
 
-    public EventUpdatableCache<AnalysisResultSearchParam, AnalysisResultTableSearchResultsDTO, ModuleDataEvent> getAnalysisResults() {
-        return this.analysisResultCache;
+    public AnalysisResultTableSearchResultsDTO getAnalysisResultsForTable(AnalysisResultSearchParam artifactKey) throws ExecutionException, IllegalArgumentException {
+        return analysisResultCache.getValue(artifactKey);
     }
 
-    public EventUpdatableCache<HashHitSearchParam, AnalysisResultTableSearchResultsDTO, ModuleDataEvent> getHashsetHits() {
-        return this.hashHitCache;
+    public AnalysisResultTableSearchResultsDTO getAnalysisResultsForTable(AnalysisResultSearchParam artifactKey, boolean hardRefresh) throws ExecutionException, IllegalArgumentException {
+        return analysisResultCache.getValue(artifactKey, hardRefresh);
     }
 
-    public EventUpdatableCache<KeywordHitSearchParam, AnalysisResultTableSearchResultsDTO, ModuleDataEvent> getKeywordHits() {
-        return this.keywordHitCache;
+    public boolean isAnalysisResultsInvalidating(AnalysisResultSearchParam artifactKey, ModuleDataEvent evt) {
+        return analysisResultCache.isInvalidatingEvent(artifactKey, evt);
+    }
+
+    public AnalysisResultTableSearchResultsDTO getHashHitsForTable(HashHitSearchParam artifactKey) throws ExecutionException, IllegalArgumentException {
+        return hashHitCache.getValue(artifactKey);
+    }
+
+    public AnalysisResultTableSearchResultsDTO getHashHitsForTable(HashHitSearchParam artifactKey, boolean hardRefresh) throws ExecutionException, IllegalArgumentException {
+        return hashHitCache.getValue(artifactKey, hardRefresh);
+    }
+
+    public boolean isHashHitsInvalidating(HashHitSearchParam artifactKey, ModuleDataEvent evt) {
+        return hashHitCache.isInvalidatingEvent(artifactKey, evt);
+    }
+
+    public AnalysisResultTableSearchResultsDTO getKeywordHitsForTable(KeywordHitSearchParam artifactKey) throws ExecutionException, IllegalArgumentException {
+        return keywordHitCache.getValue(artifactKey);
+    }
+
+    public AnalysisResultTableSearchResultsDTO getKeywordHitsForTable(KeywordHitSearchParam artifactKey, boolean hardRefresh) throws ExecutionException, IllegalArgumentException {
+        return keywordHitCache.getValue(artifactKey, hardRefresh);
+    }
+
+    public boolean isKeywordHitsInvalidating(KeywordHitSearchParam artifactKey, ModuleDataEvent evt) {
+        return keywordHitCache.isInvalidatingEvent(artifactKey, evt);
     }
 
     private class AnalysisResultCache extends EventUpdatableCacheImpl<AnalysisResultSearchParam, AnalysisResultTableSearchResultsDTO, ModuleDataEvent> {
diff --git a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/DataArtifactDAO.java b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/DataArtifactDAO.java
index aa3d89d713421d8de67f0ef97bdb06aebd517205..f0bc5dd4682e6b3b515253869fe00df569fd12ee 100644
--- a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/DataArtifactDAO.java
+++ b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/DataArtifactDAO.java
@@ -32,7 +32,7 @@
 /**
  * DAO for providing data about data artifacts to populate the results viewer.
  */
-public class DataArtifactDAO extends BlackboardArtifactDAO implements EventUpdatableCache<DataArtifactSearchParam, DataArtifactTableSearchResultsDTO, ModuleDataEvent> {
+public class DataArtifactDAO extends BlackboardArtifactDAO {
 
     private static DataArtifactDAO instance = null;
 
@@ -64,21 +64,20 @@ protected void onModuleData(ModuleDataEvent evt) {
         this.dataArtifactCache.invalidate(evt);
     }
 
-    @Override
-    public DataArtifactTableSearchResultsDTO getValue(DataArtifactSearchParam key) throws IllegalArgumentException, ExecutionException {
-        return dataArtifactCache.getValue(key);
+        
+    public boolean isDataArtifactInvalidating(DataArtifactSearchParam key, ModuleDataEvent eventData) {
+        return dataArtifactCache.isInvalidatingEvent(key, eventData);
     }
 
-    @Override
-    public DataArtifactTableSearchResultsDTO getValue(DataArtifactSearchParam key, boolean hardRefresh) throws IllegalArgumentException, ExecutionException {
-        return dataArtifactCache.getValue(key, hardRefresh);
+    public DataArtifactTableSearchResultsDTO getDataArtifactsForTable(DataArtifactSearchParam key) throws ExecutionException, IllegalArgumentException {
+        return dataArtifactCache.getValue(key);
     }
 
-    @Override
-    public boolean isInvalidatingEvent(DataArtifactSearchParam key, ModuleDataEvent eventData) {
-        return dataArtifactCache.isInvalidatingEvent(key, eventData);
+    public DataArtifactTableSearchResultsDTO getDataArtifactsForTable(DataArtifactSearchParam key, boolean hardRefresh) throws ExecutionException, IllegalArgumentException {
+        return dataArtifactCache.getValue(key, hardRefresh);
     }
 
+    
     private class DataArtifactCache extends EventUpdatableCacheImpl<DataArtifactSearchParam, DataArtifactTableSearchResultsDTO, ModuleDataEvent> {
 
         @Override
diff --git a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/EventUpdatableCacheImpl.java b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/EventUpdatableCacheImpl.java
index 339bbb98f5b3e0f1c91db8ae1dabb77f59afb9f8..df87f371d8a27846d0a5bb75cbbc2a8073a895c2 100644
--- a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/EventUpdatableCacheImpl.java
+++ b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/EventUpdatableCacheImpl.java
@@ -24,6 +24,7 @@
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -45,11 +46,26 @@ abstract class EventUpdatableCacheImpl<K, V, E> implements EventUpdatableCache<K
 
     private static final Logger logger = Logger.getLogger(EventUpdatableCacheImpl.class.getName());
 
-    private final Cache<K, V> cache = CacheBuilder.newBuilder().maximumSize(1000).build();
+    private static final int DEFAULT_CACHE_SIZE = 15; // rule of thumb: 5 entries times number of cached SearchParams sub-types
+    private static final long DEFAULT_CACHE_DURATION = 2;
+    private static final TimeUnit CACHE_DURATION_UNITS = TimeUnit.MINUTES;
+
+    private final Cache<K, V> cache;
 
     // taken from https://stackoverflow.com/questions/66671636/why-is-sinks-many-multicast-onbackpressurebuffer-completing-after-one-of-t
     private final Sinks.Many<Set<K>> invalidatedKeyMulticast = Sinks.many().multicast().onBackpressureBuffer(Queues.SMALL_BUFFER_SIZE, false);
 
+    public EventUpdatableCacheImpl() {
+        this(CacheBuilder.newBuilder()
+                .maximumSize(DEFAULT_CACHE_SIZE)
+                .expireAfterAccess(DEFAULT_CACHE_DURATION, CACHE_DURATION_UNITS)
+                .build());
+    }
+
+    protected EventUpdatableCacheImpl(Cache<K, V> cache) {
+        this.cache = cache;
+    }
+
     @Override
     public V getValue(K key) throws IllegalArgumentException, ExecutionException {
         return cache.get(key, () -> fetch(key));
diff --git a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/ViewsDAO.java b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/ViewsDAO.java
index 32f6b75fc13425c2c4824828a593f111ccdbd73d..c46efe4e2f6828d50954a22cf049aca35c39887d 100644
--- a/Core/src/org/sleuthkit/autopsy/mainui/datamodel/ViewsDAO.java
+++ b/Core/src/org/sleuthkit/autopsy/mainui/datamodel/ViewsDAO.java
@@ -23,6 +23,7 @@
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.commons.lang3.StringUtils;
@@ -153,18 +154,42 @@ private static ExtensionMediaType getExtensionMediaType(String ext) {
     private final FilesBySizeCache sizeCache = new FilesBySizeCache();
     private final List<EventUpdatableCacheImpl<?, ?, Content>> caches = ImmutableList.of(extensionCache, mimeCache, sizeCache);
 
-    public EventUpdatableCache<FileTypeExtensionsSearchParams, SearchResultsDTO, Content> getFileByExtensions() {
-        return this.extensionCache;
+    public SearchResultsDTO getFilesByExtension(FileTypeExtensionsSearchParams key) throws ExecutionException, IllegalArgumentException {
+        return this.extensionCache.getValue(key);
     }
 
-    public EventUpdatableCache<FileTypeMimeSearchParams, SearchResultsDTO, Content> getFileByMimeTypes() {
-        return mimeCache;
+    public SearchResultsDTO getFilesByExtension(FileTypeExtensionsSearchParams key, boolean hardRefresh) throws ExecutionException, IllegalArgumentException {
+        return this.extensionCache.getValue(key, hardRefresh);
+    }
+        
+    public boolean isFilesByExtInvalidating(FileTypeExtensionsSearchParams key, Content changedContent) {
+        return this.extensionCache.isInvalidatingEvent(key, changedContent);
+    }
+            
+    public SearchResultsDTO getFilesByMime(FileTypeMimeSearchParams key) throws ExecutionException, IllegalArgumentException {
+        return this.mimeCache.getValue(key);
     }
 
-    public EventUpdatableCache<FileTypeSizeSearchParams, SearchResultsDTO, Content> getFilesBySize() {
-        return sizeCache;
+    public SearchResultsDTO getFilesByMime(FileTypeMimeSearchParams key, boolean hardRefresh) throws ExecutionException, IllegalArgumentException {
+        return this.mimeCache.getValue(key, hardRefresh);
     }
 
+    public boolean isFilesByMimeInvalidating(FileTypeMimeSearchParams key, Content changedContent) {
+        return this.mimeCache.isInvalidatingEvent(key, changedContent);
+    }
+
+    public SearchResultsDTO getFilesBySize(FileTypeSizeSearchParams key) throws ExecutionException, IllegalArgumentException {
+        return this.sizeCache.getValue(key);
+    }
+
+    public SearchResultsDTO getFilesBySize(FileTypeSizeSearchParams key, boolean hardRefresh) throws ExecutionException, IllegalArgumentException {
+        return this.sizeCache.getValue(key, hardRefresh);
+    }
+
+    public boolean isFilesBySizeInvalidating(FileTypeSizeSearchParams key, Content changedContent) {
+        return this.sizeCache.isInvalidatingEvent(key, changedContent);
+    }
+    
     private SleuthkitCase getCase() throws NoCurrentCaseException {
         return Case.getCurrentCaseThrows().getSleuthkitCase();
     }
diff --git a/Core/src/org/sleuthkit/autopsy/mainui/nodes/SearchResultSupport.java b/Core/src/org/sleuthkit/autopsy/mainui/nodes/SearchResultSupport.java
index 49e337722ecb06ee14261c4ce97d70c94079743a..d1eb057499b6bb4c64215c98baaeb44af0c68742 100644
--- a/Core/src/org/sleuthkit/autopsy/mainui/nodes/SearchResultSupport.java
+++ b/Core/src/org/sleuthkit/autopsy/mainui/nodes/SearchResultSupport.java
@@ -18,6 +18,7 @@
  */
 package org.sleuthkit.autopsy.mainui.nodes;
 
+import java.beans.PropertyChangeEvent;
 import java.text.MessageFormat;
 import java.util.concurrent.ExecutionException;
 import org.sleuthkit.autopsy.mainui.datamodel.DataArtifactSearchParam;
@@ -236,7 +237,7 @@ public synchronized SearchResultsDTO setFileExtensions(final FileTypeExtensionsS
                     fileExtParameters.getDataSourceId(),
                     pageIdx * pageSize,
                     (long) pageSize);
-            return dao.getViewsDAO().getFileByExtensions().getValue(searchParams);
+            return dao.getViewsDAO().getFilesByExtension(searchParams);
         };
 
         return fetchResults();
@@ -262,7 +263,7 @@ public synchronized SearchResultsDTO setDataArtifact(final DataArtifactSearchPar
                     dataArtifactParameters.getDataSourceId(),
                     pageIdx * pageSize,
                     (long) pageSize);
-            return dao.getDataArtifactsDAO().getValue(searchParams);
+            return dao.getDataArtifactsDAO().getDataArtifactsForTable(searchParams);
         };
 
         return fetchResults();
@@ -289,7 +290,7 @@ public synchronized SearchResultsDTO setFileMimes(FileTypeMimeSearchParams fileM
                     fileMimeKey.getDataSourceId(),
                     pageIdx * pageSize,
                     (long) pageSize);
-            return dao.getViewsDAO().getFileByMimeTypes().getValue(searchParams);
+            return dao.getViewsDAO().getFilesByMime(searchParams);
         };
 
         return fetchResults();
@@ -312,4 +313,6 @@ private interface PageFetcher {
          */
         SearchResultsDTO fetch(int pageSize, int pageIdx) throws ExecutionException;
     }
+    
+ 
 }
diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/mainui/datamodel/TableSearchTest.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/mainui/datamodel/TableSearchTest.java
index 08807ad7524afb80de912342d4f36ed6093f7a1e..ce96944514b77be6243adcf6aa63f26ee30907de 100644
--- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/mainui/datamodel/TableSearchTest.java
+++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/mainui/datamodel/TableSearchTest.java
@@ -20,7 +20,6 @@
 
 import com.google.common.collect.ImmutableSet;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.concurrent.ExecutionException;
 import java.util.List;
 import java.util.Set;
@@ -320,28 +319,28 @@ public void dataArtifactSearchTest() {
             DataArtifactSearchParam param = new DataArtifactSearchParam(BlackboardArtifact.Type.TSK_CONTACT, null);
             DataArtifactDAO dataArtifactDAO = MainDAO.getInstance().getDataArtifactsDAO();
 
-            DataArtifactTableSearchResultsDTO results = dataArtifactDAO.getValue(param);
+            DataArtifactTableSearchResultsDTO results = dataArtifactDAO.getDataArtifactsForTable(param);
             assertEquals(BlackboardArtifact.Type.TSK_CONTACT, results.getArtifactType());
             assertEquals(2, results.getTotalResultsCount());
             assertEquals(2, results.getItems().size());
             
             // Get contacts from data source 2
             param = new DataArtifactSearchParam(BlackboardArtifact.Type.TSK_CONTACT, dataSource2.getId());
-            results = dataArtifactDAO.getValue(param);
+            results = dataArtifactDAO.getDataArtifactsForTable(param);
             assertEquals(BlackboardArtifact.Type.TSK_CONTACT, results.getArtifactType());
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
 
             // Get bookmarks from data source 2
             param = new DataArtifactSearchParam(BlackboardArtifact.Type.TSK_WEB_BOOKMARK, dataSource2.getId());
-            results = dataArtifactDAO.getValue(param);
+            results = dataArtifactDAO.getDataArtifactsForTable(param);
             assertEquals(BlackboardArtifact.Type.TSK_WEB_BOOKMARK, results.getArtifactType());
             assertEquals(0, results.getTotalResultsCount());
             assertEquals(0, results.getItems().size());
 
             // Get all custom artifacts
             param = new DataArtifactSearchParam(customDataArtifactType, null);
-            results = dataArtifactDAO.getValue(param);
+            results = dataArtifactDAO.getDataArtifactsForTable(param);
             assertEquals(customDataArtifactType, results.getArtifactType());
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
@@ -387,37 +386,37 @@ public void mimeSearchTest() {
 
             // Get plain text files from data source 1
             FileTypeMimeSearchParams param = new FileTypeMimeSearchParams("text/plain", dataSource1.getId());
-            SearchResultsDTO results = viewsDAO.getFileByMimeTypes().getValue(param);
+            SearchResultsDTO results = viewsDAO.getFilesByMime(param);
             assertEquals(2, results.getTotalResultsCount());
             assertEquals(2, results.getItems().size());
 
             // Get jpeg files from data source 1
             param = new FileTypeMimeSearchParams("image/jpeg", dataSource1.getId());
-            results = viewsDAO.getFileByMimeTypes().getValue(param);
+            results = viewsDAO.getFilesByMime(param);
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
 
             // Get jpeg files from data source 2
             param = new FileTypeMimeSearchParams("image/jpeg", dataSource2.getId());
-            results = viewsDAO.getFileByMimeTypes().getValue(param);
+            results = viewsDAO.getFilesByMime(param);
             assertEquals(0, results.getTotalResultsCount());
             assertEquals(0, results.getItems().size());
 
             // Search for mime type that should produce no results
             param = new FileTypeMimeSearchParams("blah/blah", null);
-            results = viewsDAO.getFileByMimeTypes().getValue(param);
+            results = viewsDAO.getFilesByMime(param);
             assertEquals(0, results.getTotalResultsCount());
             assertEquals(0, results.getItems().size());
 
             // Get plain text files from all data sources
             param = new FileTypeMimeSearchParams("text/plain", null);
-            results = viewsDAO.getFileByMimeTypes().getValue(param);
+            results = viewsDAO.getFilesByMime(param);
             assertEquals(3, results.getTotalResultsCount());
             assertEquals(3, results.getItems().size());
 
             // Get the custom file by MIME type
             param = new FileTypeMimeSearchParams(CUSTOM_MIME_TYPE, null);
-            results = viewsDAO.getFileByMimeTypes().getValue(param);
+            results = viewsDAO.getFilesByMime(param);
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
 
@@ -442,31 +441,31 @@ public void sizeSearchTest() {
 
             // Get "50 - 200MB" files from data source 1
             FileTypeSizeSearchParams param = new FileTypeSizeSearchParams(FileTypeSizeSearchParams.FileSizeFilter.SIZE_50_200, dataSource1.getId());
-            SearchResultsDTO results = viewsDAO.getFilesBySize().getValue(param);
+            SearchResultsDTO results = viewsDAO.getFilesBySize(param);
             assertEquals(2, results.getTotalResultsCount());
             assertEquals(2, results.getItems().size());
 
             // Get "200MB - 1GB" files from data source 1
             param = new FileTypeSizeSearchParams(FileTypeSizeSearchParams.FileSizeFilter.SIZE_200_1000, dataSource1.getId());
-            results = viewsDAO.getFilesBySize().getValue(param);
+            results = viewsDAO.getFilesBySize(param);
             assertEquals(0, results.getTotalResultsCount());
             assertEquals(0, results.getItems().size());
 
             // Get "200MB - 1GB" files from data source 2
             param = new FileTypeSizeSearchParams(FileTypeSizeSearchParams.FileSizeFilter.SIZE_200_1000, dataSource2.getId());
-            results = viewsDAO.getFilesBySize().getValue(param);
+            results = viewsDAO.getFilesBySize(param);
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
 
             // Get "1GB+" files from all data sources
             param = new FileTypeSizeSearchParams(FileTypeSizeSearchParams.FileSizeFilter.SIZE_1000_, null);
-            results = viewsDAO.getFilesBySize().getValue(param);
+            results = viewsDAO.getFilesBySize(param);
             assertEquals(0, results.getTotalResultsCount());
             assertEquals(0, results.getItems().size());
 
             // Get "50 - 200MB" files from all data sources
             param = new FileTypeSizeSearchParams(FileTypeSizeSearchParams.FileSizeFilter.SIZE_50_200, null);
-            results = viewsDAO.getFilesBySize().getValue(param);
+            results = viewsDAO.getFilesBySize(param);
             assertEquals(3, results.getTotalResultsCount());
             assertEquals(3, results.getItems().size());
         } catch (ExecutionException ex) {
@@ -484,21 +483,21 @@ public void analysisResultSearchTest() {
             AnalysisResultSearchParam param = new AnalysisResultSearchParam(BlackboardArtifact.Type.TSK_ENCRYPTION_DETECTED, null);
             AnalysisResultDAO analysisResultDAO = MainDAO.getInstance().getAnalysisResultDAO();
             
-            AnalysisResultTableSearchResultsDTO results = analysisResultDAO.getAnalysisResults().getValue(param);
+            AnalysisResultTableSearchResultsDTO results = analysisResultDAO.getAnalysisResultsForTable(param);
             assertEquals(BlackboardArtifact.Type.TSK_ENCRYPTION_DETECTED, results.getArtifactType());
             assertEquals(3, results.getTotalResultsCount());
             assertEquals(3, results.getItems().size());
             
             // Get encryption detected artifacts from data source 2
             param = new AnalysisResultSearchParam(BlackboardArtifact.Type.TSK_ENCRYPTION_DETECTED, dataSource2.getId());
-            results = analysisResultDAO.getAnalysisResults().getValue(param);
+            results = analysisResultDAO.getAnalysisResultsForTable(param);
             assertEquals(BlackboardArtifact.Type.TSK_ENCRYPTION_DETECTED, results.getArtifactType());
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
             
             // Get all custom artifacts
             param = new AnalysisResultSearchParam(customAnalysisResultType, null);
-            results = analysisResultDAO.getAnalysisResults().getValue(param);
+            results = analysisResultDAO.getAnalysisResultsForTable(param);
             assertEquals(customAnalysisResultType, results.getArtifactType());
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
@@ -538,13 +537,13 @@ private void hashHitSearchTest() {
             // Test hash set hits
             AnalysisResultDAO analysisResultDAO = MainDAO.getInstance().getAnalysisResultDAO();
             HashHitSearchParam hashParam = new HashHitSearchParam(null, HASH_SET_1);
-            AnalysisResultTableSearchResultsDTO results = analysisResultDAO.getHashsetHits().getValue(hashParam);
+            AnalysisResultTableSearchResultsDTO results = analysisResultDAO.getHashHitsForTable(hashParam);
             assertEquals(BlackboardArtifact.Type.TSK_HASHSET_HIT, results.getArtifactType());
             assertEquals(3, results.getTotalResultsCount());
             assertEquals(3, results.getItems().size());
             
             hashParam = new HashHitSearchParam(dataSource2.getId(), HASH_SET_1);
-            results = analysisResultDAO.getHashsetHits().getValue(hashParam);
+            results = analysisResultDAO.getHashHitsForTable(hashParam);
             assertEquals(BlackboardArtifact.Type.TSK_HASHSET_HIT, results.getArtifactType());
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
@@ -577,13 +576,13 @@ private void keywordHitSearchTest() {
             // Test keyword set hits
             AnalysisResultDAO analysisResultDAO = MainDAO.getInstance().getAnalysisResultDAO();
             KeywordHitSearchParam kwParam = new KeywordHitSearchParam(null, KEYWORD_SET_1);
-            AnalysisResultTableSearchResultsDTO results = analysisResultDAO.getKeywordHits().getValue(kwParam);
+            AnalysisResultTableSearchResultsDTO results = analysisResultDAO.getKeywordHitsForTable(kwParam);
             assertEquals(BlackboardArtifact.Type.TSK_KEYWORD_HIT, results.getArtifactType());
             assertEquals(2, results.getTotalResultsCount());
             assertEquals(2, results.getItems().size());
             
             kwParam = new KeywordHitSearchParam(dataSource2.getId(), KEYWORD_SET_1);
-            results = analysisResultDAO.getKeywordHits().getValue(kwParam);
+            results = analysisResultDAO.getKeywordHitsForTable(kwParam);
             assertEquals(BlackboardArtifact.Type.TSK_KEYWORD_HIT, results.getArtifactType());
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
@@ -621,43 +620,43 @@ public void extensionSearchTest() {
 
             // Get all text documents from data source 1
             FileTypeExtensionsSearchParams param = new FileTypeExtensionsSearchParams(FileExtRootFilter.TSK_DOCUMENT_FILTER, dataSource1.getId());
-            SearchResultsDTO results = viewsDAO.getFileByExtensions().getValue(param);
+            SearchResultsDTO results = viewsDAO.getFilesByExtension(param);
             assertEquals(3, results.getTotalResultsCount());
             assertEquals(3, results.getItems().size());
 
             // Get Word documents from data source 1
             param = new FileTypeExtensionsSearchParams(FileExtDocumentFilter.AUT_DOC_OFFICE, dataSource1.getId());
-            results = viewsDAO.getFileByExtensions().getValue(param);
+            results = viewsDAO.getFilesByExtension(param);
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
 
             // Get image/jpeg files from data source 1
             param = new FileTypeExtensionsSearchParams(FileExtRootFilter.TSK_IMAGE_FILTER, dataSource1.getId());
-            results = viewsDAO.getFileByExtensions().getValue(param);
+            results = viewsDAO.getFilesByExtension(param);
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
 
             // Get text documents from all data sources
             param = new FileTypeExtensionsSearchParams(FileExtRootFilter.TSK_DOCUMENT_FILTER, null);
-            results = viewsDAO.getFileByExtensions().getValue(param);
+            results = viewsDAO.getFilesByExtension(param);
             assertEquals(4, results.getTotalResultsCount());
             assertEquals(4, results.getItems().size());
 
             // Get jpeg files from data source 2
             param = new FileTypeExtensionsSearchParams(FileExtRootFilter.TSK_IMAGE_FILTER, dataSource2.getId());
-            results = viewsDAO.getFileByExtensions().getValue(param);
+            results = viewsDAO.getFilesByExtension(param);
             assertEquals(0, results.getTotalResultsCount());
             assertEquals(0, results.getItems().size());
 
             // Search for file extensions that should produce no results
             param = new FileTypeExtensionsSearchParams(CustomRootFilter.EMPTY_RESULT_SET_FILTER, null);
-            results = viewsDAO.getFileByExtensions().getValue(param);
+            results = viewsDAO.getFilesByExtension(param);
             assertEquals(0, results.getTotalResultsCount());
             assertEquals(0, results.getItems().size());
 
             // Get the custom file by extension
             param = new FileTypeExtensionsSearchParams(CustomRootFilter.CUSTOM_FILTER, null);
-            results = viewsDAO.getFileByExtensions().getValue(param);
+            results = viewsDAO.getFilesByExtension(param);
             assertEquals(1, results.getTotalResultsCount());
             assertEquals(1, results.getItems().size());
 
@@ -706,7 +705,7 @@ public String getDisplayName() {
 
         @Override
         public Set<String> getFilter() {
-            return Collections.unmodifiableSet(this.filter);
+            return this.filter;
         }
     }