diff --git a/Experimental/manifest.mf b/Experimental/manifest.mf
index cafb630948788103577845453200bd87de2b4059..a53adc86422d1b3c4dd038ce5b869cf50e68db27 100644
--- a/Experimental/manifest.mf
+++ b/Experimental/manifest.mf
@@ -3,4 +3,5 @@ AutoUpdate-Show-In-Client: true
 OpenIDE-Module: org.sleuthkit.autopsy.experimental
 OpenIDE-Module-Layer: org/sleuthkit/autopsy/experimental/autoingest/layer.xml
 OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties
+OpenIDE-Module-Requires: org.openide.windows.WindowManager
 OpenIDE-Module-Specification-Version: 1.0
diff --git a/Experimental/nbproject/project.xml b/Experimental/nbproject/project.xml
index 280fbc431bc466ae3a2d451bcf13af73bc9b79cb..fe85da26bac9e3d949aabdf904d181a0e21b4473 100644
--- a/Experimental/nbproject/project.xml
+++ b/Experimental/nbproject/project.xml
@@ -24,6 +24,15 @@
                         <specification-version>1.44.1</specification-version>
                     </run-dependency>
                 </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.settings</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.49.1</specification-version>
+                    </run-dependency>
+                </dependency>
                 <dependency>
                     <code-name-base>org.openide.awt</code-name-base>
                     <build-prerequisite/>
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form
old mode 100644
new mode 100755
index b1d90f447966286d514441410ffa46ac46e76fd0..26e14e2176004753c4190e6225af421a5ed7c8cd
--- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.form
@@ -235,9 +235,6 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelJob.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelJobActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JButton" name="bnDeleteCase">
       <Properties>
@@ -248,9 +245,6 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnDeleteCase.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnDeleteCaseActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JLabel" name="lbPending">
       <Properties>
@@ -291,9 +285,6 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnRefresh.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnRefreshActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JButton" name="bnCancelModule">
       <Properties>
@@ -304,9 +295,6 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnCancelModule.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelModuleActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JButton" name="bnExit">
       <Properties>
@@ -331,9 +319,6 @@
         </Property>
         <Property name="enabled" type="boolean" value="false"/>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOptionsActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JButton" name="bnShowProgress">
       <Properties>
@@ -344,9 +329,6 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowProgress.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnShowProgressActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JButton" name="bnPause">
       <Properties>
@@ -357,22 +339,16 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPause.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPauseActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JButton" name="bnPrioritizeCase">
       <Properties>
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
-          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeCase.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
         <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
-          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeCase.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeCase.toolTipText_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPrioritizeCaseActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JButton" name="bnShowCaseLog">
       <Properties>
@@ -383,9 +359,6 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnShowCaseLog.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnShowCaseLogActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JTextField" name="tbStatusMessage">
       <Properties>
@@ -423,9 +396,6 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnPrioritizeJob.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPrioritizeJobActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JLabel" name="lbServicesStatus">
       <Properties>
@@ -457,9 +427,6 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnOpenLogDir.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOpenLogDirActionPerformed"/>
-      </Events>
     </Component>
     <Component class="javax.swing.JButton" name="bnReprocessJob">
       <Properties>
@@ -467,9 +434,6 @@
           <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestDashboard.bnReprocessJob.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
-      <Events>
-        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnReprocessJobActionPerformed"/>
-      </Events>
     </Component>
   </SubComponents>
 </Form>
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java
old mode 100644
new mode 100755
index 157d371eed96333bd953d1eab0df4f1acac26601..875cf9d46f5d66fee11a9b3073e23a9c305c0bc9
--- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboard.java
@@ -1,7 +1,7 @@
 /*
  * Autopsy Forensic Browser
  *
- * Copyright 2015 Basis Technology Corp.
+ * Copyright 2015-2017 Basis Technology Corp.
  * Contact: carrier <at> sleuthkit <dot> org
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,9 +20,7 @@
 
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import java.awt.Cursor;
-import java.awt.Desktop;
 import java.awt.EventQueue;
-import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.time.Instant;
@@ -38,7 +36,6 @@
 import javax.swing.DefaultListSelectionModel;
 import java.awt.Color;
 import java.beans.PropertyChangeEvent;
-import java.io.File;
 import java.util.Collections;
 import java.util.logging.Logger;
 import javax.swing.JOptionPane;
@@ -49,25 +46,12 @@
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableColumn;
-import org.netbeans.api.options.OptionsDisplayer;
-import org.openide.DialogDisplayer;
 import org.openide.LifecycleManager;
-import org.openide.NotifyDescriptor;
-import org.openide.filesystems.FileObject;
-import org.openide.filesystems.FileUtil;
 import org.openide.util.NbBundle;
-import org.openide.util.actions.CallableSystemAction;
 import org.openide.windows.WindowManager;
-import org.sleuthkit.autopsy.casemodule.CaseNewAction;
-import org.sleuthkit.autopsy.casemodule.CaseOpenAction;
 import org.sleuthkit.autopsy.core.ServicesMonitor;
-import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
 import org.sleuthkit.autopsy.coreutils.NetworkUtils;
-import org.sleuthkit.autopsy.coreutils.PlatformUtil;
 import org.sleuthkit.autopsy.ingest.IngestManager;
-import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog;
-import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult;
-import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot;
 
 /**
  * A panel for monitoring automated ingest by a cluster, and for controlling
@@ -105,7 +89,6 @@ public final class AutoIngestDashboard extends JPanel implements Observer {
     private final DefaultTableModel pendingTableModel;
     private final DefaultTableModel runningTableModel;
     private final DefaultTableModel completedTableModel;
-    private AutoIngestManager manager;
     private ExecutorService updateExecutor;
     private boolean isPaused;
     private boolean autoIngestStarted;
@@ -184,8 +167,6 @@ public static AutoIngestDashboard getInstance() {
     private AutoIngestDashboard() {
         //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away)
          WindowManager.getDefault().getMainWindow().setEnabled(false);
-        
-        manager = AutoIngestManager.getInstance();
 
         pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) {
             private static final long serialVersionUID = 1L;
@@ -590,28 +571,7 @@ private void enablePendingTableButtons(Boolean enable) {
      */
     private void startUp() {
 
-        /*
-         * Starts up the auto ingest manager (AIM).
-         */
-        try {
-            manager.startUp();
-            autoIngestStarted = true;
-        } catch (AutoIngestManager.AutoIngestManagerStartupException ex) {
-            SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex);
-            tbStatusMessage.setText(NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupError"));
-            manager = null;
-
-            JOptionPane.showMessageDialog(this,
-                    NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"),
-                    NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"),
-                    JOptionPane.ERROR_MESSAGE);
-            bnOptions.setEnabled(true);
-
-            /*
-             * If the AIM cannot be started, there is nothing more to do.
-             */
-            return;
-        }
+        autoIngestStarted = true;
 
         /*
          * Subscribe to services monitor events.
@@ -620,17 +580,11 @@ private void startUp() {
             setServicesStatusMessage();
         });
 
-        /*
-         * Register with the AIM as an observer.
-         */
-        manager.addObserver(this);
-
         /*
          * Populate the pending, running, and completed auto ingest job tables.
          */
         updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build());
         updateExecutor.submit(new UpdateAllJobsTablesTask());
-        manager.scanInputDirsNow();
 
 		//bnPause.setEnabled(true);
         bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text"));
@@ -659,7 +613,7 @@ public void shutdown() {
             NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.Cancel")};
         int reply = JOptionPane.OK_OPTION;
 
-        if (null != manager && IngestManager.getInstance().isIngestRunning()) {
+        if (IngestManager.getInstance().isIngestRunning()) {
             reply = JOptionPane.showOptionDialog(this,
                     NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ExitConsequences"),
                     NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmExitHeader"),
@@ -684,13 +638,6 @@ public void shutdown() {
                 updateExecutor.shutdownNow();
             }
 
-            /*
-             * Stop observing the auto ingest manager (AIM).
-             */
-            if (null != manager) {
-                manager.deleteObserver(this);
-            }
-
             /*
              * Shut down the AIM and close.
              */
@@ -698,9 +645,6 @@ public void shutdown() {
 
                 @Override
                 protected Void doInBackground() throws Exception {
-                    if (null != manager) {
-                        manager.shutDown();
-                    }
                     return null;
                 }
 
@@ -807,7 +751,6 @@ private void pause(boolean buttonClicked) {
              * Ask the auto ingest manager to pause when it completes the
              * currently running job, if any.
              */
-            manager.pause();
             bnRefresh.setEnabled(false);
         }
     }
@@ -835,11 +778,6 @@ private void resume() {
          */
         pendingTable.setBackground(pendingTableBackground);
         pendingTable.setForeground(pendingTablelForeground);
-
-        /**
-         * Ask the auto ingest manager to resume processing.
-         */
-        manager.resume();
     }
 
     /**
@@ -855,7 +793,6 @@ private class UpdatePendingJobsTableTask implements Runnable {
         @Override
         public void run() {
             List<AutoIngestJob> pendingJobs = new ArrayList<>();
-            manager.getJobs(pendingJobs, null, null);
             EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null));
         }
     }
@@ -873,7 +810,6 @@ private class UpdateRunningJobsTablesTask implements Runnable {
         @Override
         public void run() {
             List<AutoIngestJob> runningJobs = new ArrayList<>();
-            manager.getJobs(null, runningJobs, null);
             EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null));
         }
     }
@@ -897,7 +833,6 @@ public void run() {
             List<AutoIngestJob> pendingJobs = new ArrayList<>();
             List<AutoIngestJob> runningJobs = new ArrayList<>();
             List<AutoIngestJob> completedJobs = new ArrayList<>();
-            manager.getJobs(pendingJobs, runningJobs, completedJobs);
             // Sort the completed jobs list by completed date
             Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator());
             EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs));
@@ -1084,10 +1019,6 @@ private void refreshTable(List<AutoIngestJob> jobs, DefaultTableModel tableModel
      * Get the current lists of jobs and update the UI.
      */
     private void refreshTables(){
-        JobsSnapshot jobsSnapshot = manager.getCurrentJobsSnapshot();
-        refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null);
-        refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null);
-        refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null);
     }
 
     /**
@@ -1182,19 +1113,9 @@ public void setSelectionInterval(int index0, int index1) {
 
         org.openide.awt.Mnemonics.setLocalizedText(bnCancelJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.text")); // NOI18N
         bnCancelJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelJob.toolTipText")); // NOI18N
-        bnCancelJob.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnCancelJobActionPerformed(evt);
-            }
-        });
 
         org.openide.awt.Mnemonics.setLocalizedText(bnDeleteCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.text")); // NOI18N
         bnDeleteCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnDeleteCase.toolTipText")); // NOI18N
-        bnDeleteCase.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnDeleteCaseActionPerformed(evt);
-            }
-        });
 
         lbPending.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
         org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbPending.text")); // NOI18N
@@ -1207,19 +1128,9 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
 
         org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.text")); // NOI18N
         bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnRefresh.toolTipText")); // NOI18N
-        bnRefresh.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnRefreshActionPerformed(evt);
-            }
-        });
 
         org.openide.awt.Mnemonics.setLocalizedText(bnCancelModule, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.text")); // NOI18N
         bnCancelModule.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnCancelModule.toolTipText")); // NOI18N
-        bnCancelModule.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnCancelModuleActionPerformed(evt);
-            }
-        });
 
         org.openide.awt.Mnemonics.setLocalizedText(bnExit, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.text")); // NOI18N
         bnExit.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnExit.toolTipText")); // NOI18N
@@ -1232,43 +1143,18 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
         org.openide.awt.Mnemonics.setLocalizedText(bnOptions, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.text")); // NOI18N
         bnOptions.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOptions.toolTipText")); // NOI18N
         bnOptions.setEnabled(false);
-        bnOptions.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnOptionsActionPerformed(evt);
-            }
-        });
 
         org.openide.awt.Mnemonics.setLocalizedText(bnShowProgress, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.text")); // NOI18N
         bnShowProgress.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowProgress.toolTipText")); // NOI18N
-        bnShowProgress.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnShowProgressActionPerformed(evt);
-            }
-        });
 
         org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.text")); // NOI18N
         bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.toolTipText")); // NOI18N
-        bnPause.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnPauseActionPerformed(evt);
-            }
-        });
 
-        org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.text")); // NOI18N
-        bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.toolTipText")); // NOI18N
-        bnPrioritizeCase.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnPrioritizeCaseActionPerformed(evt);
-            }
-        });
+        org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.text_1")); // NOI18N
+        bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeCase.toolTipText_1")); // NOI18N
 
         org.openide.awt.Mnemonics.setLocalizedText(bnShowCaseLog, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.text")); // NOI18N
         bnShowCaseLog.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnShowCaseLog.toolTipText")); // NOI18N
-        bnShowCaseLog.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnShowCaseLogActionPerformed(evt);
-            }
-        });
 
         tbStatusMessage.setEditable(false);
         tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
@@ -1281,11 +1167,6 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
         org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.text")); // NOI18N
         bnPrioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.toolTipText")); // NOI18N
         bnPrioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPrioritizeJob.actionCommand")); // NOI18N
-        bnPrioritizeJob.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnPrioritizeJobActionPerformed(evt);
-            }
-        });
 
         lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
         org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.lbServicesStatus.text")); // NOI18N
@@ -1296,18 +1177,8 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
         tbServicesStatusMessage.setBorder(null);
 
         org.openide.awt.Mnemonics.setLocalizedText(bnOpenLogDir, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnOpenLogDir.text")); // NOI18N
-        bnOpenLogDir.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnOpenLogDirActionPerformed(evt);
-            }
-        });
 
         org.openide.awt.Mnemonics.setLocalizedText(bnReprocessJob, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnReprocessJob.text")); // NOI18N
-        bnReprocessJob.addActionListener(new java.awt.event.ActionListener() {
-            public void actionPerformed(java.awt.event.ActionEvent evt) {
-                bnReprocessJobActionPerformed(evt);
-            }
-        });
 
         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
         this.setLayout(layout);
@@ -1427,179 +1298,6 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
 
     }// </editor-fold>//GEN-END:initComponents
 
-    /**
-     * Handles a click on the refresh button. Requests an immediate scan of the
-     * input folders for new jobs and queues a refresh of all three of the jobs
-     * tables.
-     *
-     * @param evt - The button click event.
-     */
-    private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed
-        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-        manager.scanInputDirsAndWait();
-        refreshTables();
-        this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
-    }//GEN-LAST:event_bnRefreshActionPerformed
-
-    /**
-     * Handles a click on the delete case button. If an entry is selected that
-     * can be deleted, pops up a confirmation dialog. Upon confirmation, asks
-     * AutoIngestManager to delete the entry and asks for an updated view.
-     *
-     * @param evt The button click event.
-     */
-    private void bnDeleteCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeleteCaseActionPerformed
-        if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) {
-            return;
-        }
-
-        String caseName = (String) completedTable.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal());
-        Object[] options = {
-            org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.Delete"),
-            org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotDelete")
-        };
-        Object[] msgContent = {org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DeleteAreYouSure") + "\"" + caseName + "\"?"};
-        int reply = JOptionPane.showOptionDialog(this,
-                msgContent,
-                org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmDeletionHeader"),
-                JOptionPane.DEFAULT_OPTION,
-                JOptionPane.WARNING_MESSAGE,
-                null,
-                options,
-                options[JOptionPane.NO_OPTION]);
-        if (reply == JOptionPane.YES_OPTION) {
-            bnDeleteCase.setEnabled(false);
-            bnShowCaseLog.setEnabled(false);
-            if (completedTableModel.getRowCount() > 0 && completedTable.getSelectedRow() >= 0) {
-                Path caseDirectoryPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal());
-                completedTable.clearSelection();
-                this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-                CaseDeletionResult result = manager.deleteCase(caseName, caseDirectoryPath);
-                refreshTables();
-                this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
-                if (CaseDeletionResult.FAILED == result) {
-                    JOptionPane.showMessageDialog(this,
-                            String.format("Could not delete case %s. It may be in in use.", caseName),
-                            org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.DeletionFailed"),
-                            JOptionPane.INFORMATION_MESSAGE);
-                } else if (CaseDeletionResult.PARTIALLY_DELETED == result) {
-                    JOptionPane.showMessageDialog(this,
-                            String.format("Could not delete case %s. See system log for details.", caseName),
-                            org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.DeletionFailed"),
-                            JOptionPane.INFORMATION_MESSAGE);
-                }
-            }
-        }
-    }//GEN-LAST:event_bnDeleteCaseActionPerformed
-
-    /**
-     * Handles a click on the cancel auto ingest job button. Cancels the
-     * selected job.
-     *
-     * @param evt The button click event.
-     */
-    private void bnCancelJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelJobActionPerformed
-        Object[] options = {
-            org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelJob"),
-            org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotCancelJob")};
-        int reply = JOptionPane.showOptionDialog(this,
-                NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelJobAreYouSure"),
-                NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"),
-                JOptionPane.DEFAULT_OPTION,
-                JOptionPane.WARNING_MESSAGE,
-                null,
-                options,
-                options[1]);
-        if (reply == 0) {
-            /*
-             * Call setCursor on this to ensure it appears (if there is time to
-             * see it).
-             */
-            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-            manager.cancelCurrentJob();
-            refreshTables();
-            this.setCursor(Cursor.getDefaultCursor());
-        }
-    }//GEN-LAST:event_bnCancelJobActionPerformed
-
-    /**
-     * Handles a click on the show auto ingest job progress button. Displays an
-     * ingest job progress panel.
-     *
-     * @param evt The button click event.
-     */
-    private void bnShowProgressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowProgressActionPerformed
-        IngestProgressSnapshotDialog dialog = new IngestProgressSnapshotDialog(this.getTopLevelAncestor(), true);
-    }//GEN-LAST:event_bnShowProgressActionPerformed
-
-    /**
-     * Handles a click on the pause/resume auto ingest job button. Sends a
-     * pause/resume request to the auto ingest manager.
-     *
-     * @param evt The button click event.
-     */
-    private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed
-        
-        if (!autoIngestStarted) {
-            //put up a wait cursor during the start up operation
-            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-
-            startUp();
-
-            this.setCursor(null);
-            //done for startup
-            return;
-        }
-        if (!isPaused) {
-            tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.bnPause.pausing"));
-            pause(true);
-        } else {
-            resume();
-        }
-        isPaused = !isPaused;
-    }//GEN-LAST:event_bnPauseActionPerformed
-
-    /**
-     * Handles a click on the options button. Displays the options window.
-     *
-     * @param evt The button click event.
-     */
-    private void bnOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOptionsActionPerformed
-        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-        OptionsDisplayer.getDefault().open();
-        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
-    }//GEN-LAST:event_bnOptionsActionPerformed
-
-    /**
-     * Handles a click on the cancel ingest module button. Cancels the currently
-     * running data source level ingest module for the selected job.
-     *
-     * @param evt The button click event.
-     */
-    private void bnCancelModuleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelModuleActionPerformed
-        Object[] options = {
-            org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelModule"),
-            org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.DoNotCancelModule")};
-        int reply = JOptionPane.showOptionDialog(this,
-                NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.CancelModuleAreYouSure"),
-                NbBundle.getMessage(AutoIngestDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"),
-                JOptionPane.DEFAULT_OPTION,
-                JOptionPane.WARNING_MESSAGE,
-                null,
-                options,
-                options[1]);
-        if (reply == 0) {
-            /*
-             * Call setCursor on this to ensure it appears (if there is time to
-             * see it).
-             */
-            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-            manager.cancelCurrentDataSourceLevelIngestModule();
-            refreshTables();
-            this.setCursor(Cursor.getDefaultCursor());
-        }
-    }//GEN-LAST:event_bnCancelModuleActionPerformed
-
     /**
      * Handles a click on the exit button. Shuts down auto ingest.
      *
@@ -1609,96 +1307,6 @@ private void bnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:
         shutdown();
     }//GEN-LAST:event_bnExitActionPerformed
 
-    /**
-     * Handle a click on the prioritize case button. Requests prioritization of
-     * all of the auto ingest jobs for a case.
-     *
-     * @param evt The button click event.
-     */
-    private void bnPrioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeCaseActionPerformed
-        if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) {
-            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-            String caseName = (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal())).toString();
-            manager.prioritizeCase(caseName);
-            refreshTables();
-            pendingTable.clearSelection();
-            enablePendingTableButtons(false);
-            AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor());
-        }
-    }//GEN-LAST:event_bnPrioritizeCaseActionPerformed
-
-    /**
-     * Handles a click on the show log button. Displays the auto ingest job log
-     * for a case in NotePad.
-     *
-     * @param evt The button click event.
-     */
-    private void bnShowCaseLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowCaseLogActionPerformed
-        try {
-            int selectedRow = completedTable.getSelectedRow();
-            if (selectedRow != -1) {
-                Path caseDirectoryPath = (Path) completedTableModel.getValueAt(selectedRow, JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal());
-                if (null != caseDirectoryPath) {
-                    Path pathToLog = AutoIngestJobLogger.getLogPath(caseDirectoryPath);
-                    if (pathToLog.toFile().exists()) {
-                        Desktop.getDesktop().edit(pathToLog.toFile());
-                    } else {
-                        JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ShowLogFailed.Message"),
-                                org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "AutoIngestDashboard.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE);
-                    }
-                } else {
-                    MessageNotifyUtil.Message.warn("The case directory for this job has been deleted.");
-                }
-            }
-        } catch (IOException ex) {
-            SYS_LOGGER.log(Level.SEVERE, "Dashboard error attempting to display case auto ingest log", ex);
-            Object[] options = {org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.okay")};
-            JOptionPane.showOptionDialog(this,
-                    org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.cannotFindLog"),
-                    org.openide.util.NbBundle.getMessage(AutoIngestDashboard.class, "DisplayLogDialog.unableToShowLogFile"),
-                    JOptionPane.DEFAULT_OPTION,
-                    JOptionPane.PLAIN_MESSAGE,
-                    null,
-                    options,
-                    options[0]);
-        }
-    }//GEN-LAST:event_bnShowCaseLogActionPerformed
-
-    private void bnPrioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeJobActionPerformed
-        if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) {
-            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-            Path manifestFilePath = (Path) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal()));
-            manager.prioritizeJob(manifestFilePath);
-            refreshTables();
-            pendingTable.clearSelection();
-            enablePendingTableButtons(false);
-            AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor());
-        }
-    }//GEN-LAST:event_bnPrioritizeJobActionPerformed
-
-    private void bnOpenLogDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOpenLogDirActionPerformed
-        Path logDirPath = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath(), "var", "log");
-        File logDir = logDirPath.toFile();
-        try {
-            Desktop.getDesktop().open(logDir);
-        } catch (IOException ex) {
-            DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(
-                    String.format("Unable to open log directory %s:\n%s", logDirPath, ex.getLocalizedMessage()),
-                    NotifyDescriptor.ERROR_MESSAGE));
-        }
-    }//GEN-LAST:event_bnOpenLogDirActionPerformed
-
-    private void bnReprocessJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnReprocessJobActionPerformed
-        if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) {
-            return;
-        }
-        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-        Path manifestPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal());
-        manager.reprocessJob(manifestPath);
-        refreshTables();
-        AutoIngestDashboard.this.setCursor(Cursor.getDefaultCursor());
-    }//GEN-LAST:event_bnReprocessJobActionPerformed
-
     // Variables declaration - do not modify//GEN-BEGIN:variables
     private javax.swing.JButton bnCancelJob;
     private javax.swing.JButton bnCancelModule;
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java
new file mode 100755
index 0000000000000000000000000000000000000000..7142f3be01e414d342bce9ec6c252f781295bb97
--- /dev/null
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardOpenAction.java
@@ -0,0 +1,115 @@
+/*
+* Autopsy Forensic Browser
+*
+* Copyright 2017 Basis Technology Corp.
+* Contact: carrier <at> sleuthkit <dot> org
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.sleuthkit.autopsy.experimental.autoingest;
+
+import java.awt.Component;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+import org.openide.awt.ActionReferences;
+import org.openide.awt.ActionRegistration;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle.Messages;
+import org.openide.util.actions.CallableSystemAction;
+import org.openide.util.actions.Presenter;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.core.RuntimeProperties;
+import org.sleuthkit.autopsy.core.UserPreferences;
+import static org.sleuthkit.autopsy.core.UserPreferences.SelectedMode.REVIEW;
+import org.sleuthkit.autopsy.coreutils.Logger;
+
+@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardOpenAction")
+@ActionReferences(value = {
+    @ActionReference(path = "Menu/Tools", position = 104),
+    @ActionReference(path = "Toolbars/Case", position = 104)
+})
+@ActionRegistration(displayName = "#CTL_AutoIngestDashboardOpenAction", lazy = false)
+@Messages({"CTL_AutoIngestDashboardOpenAction=Auto Ingest Dashboard"})
+public final class AutoIngestDashboardOpenAction extends CallableSystemAction implements Presenter.Toolbar {
+    
+    private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardOpenAction.class.getName());
+    private static final String VIEW_IMAGES_VIDEOS = Bundle.CTL_AutoIngestDashboardOpenAction();
+    
+    private final JButton toolbarButton = new JButton();
+    private final PropertyChangeListener pcl;
+    
+    public AutoIngestDashboardOpenAction() {
+        super();
+        toolbarButton.addActionListener(actionEvent -> performAction());
+        pcl = (PropertyChangeEvent evt) -> {
+            if (evt.getPropertyName().equals(Case.Events.CURRENT_CASE.toString())) {
+                 setEnabled(RuntimeProperties.runningWithGUI() && evt.getNewValue() != null);
+            }
+        };
+        Case.addPropertyChangeListener(pcl);
+        this.setEnabled(false);
+    }
+    
+    @Override
+    public boolean isEnabled() {
+        UserPreferences.SelectedMode mode = UserPreferences.getMode();
+        return (mode == REVIEW);
+    }
+    
+    /** Returns the toolbar component of this action
+     *
+     * @return component the toolbar button */
+    @Override
+    public Component getToolbarPresenter() {
+        ImageIcon icon = new ImageIcon(getClass().getResource("btn_icon_image_gallery_26.png")); //NON-NLS
+        toolbarButton.setIcon(icon);
+        toolbarButton.setText(this.getName());
+        return toolbarButton;
+    }
+    
+    /**
+     * Set this action to be enabled/disabled
+     *
+     * @param value whether to enable this action or not
+     */
+    @Override
+    public void setEnabled(boolean value) {
+        super.setEnabled(value);
+        toolbarButton.setEnabled(value);
+    }
+    
+    @Override
+    @SuppressWarnings("fallthrough")
+    public void performAction() {
+        AutoIngestDashboardTopComponent.openTopComponent();
+    }
+    
+    @Override
+    public String getName() {
+        return VIEW_IMAGES_VIDEOS;
+    }
+    
+    @Override
+    public HelpCtx getHelpCtx() {
+        return HelpCtx.DEFAULT_HELP;
+    }
+    
+    @Override
+    public boolean asynchronous() {
+        return false; // run on edt
+    }
+}
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form
new file mode 100755
index 0000000000000000000000000000000000000000..5f3eab1a5f91bb18ae28ed94f4701042de7d9b17
--- /dev/null
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.form
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.4" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+</Form>
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java
new file mode 100755
index 0000000000000000000000000000000000000000..61b6cac0acec281ded1be79b50805a026b30545c
--- /dev/null
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestDashboardTopComponent.java
@@ -0,0 +1,143 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2017 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.experimental.autoingest;
+
+import java.util.logging.Level;
+import org.netbeans.api.settings.ConvertAsProperties;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+import org.openide.windows.TopComponent;
+import org.openide.util.NbBundle.Messages;
+import org.openide.windows.Mode;
+import org.openide.windows.WindowManager;
+import org.sleuthkit.autopsy.coreutils.Logger;
+
+/**
+ * Top component which displays the Auto Ingest Dashboard interface.
+ */
+@ConvertAsProperties(
+        dtd = "-//org.sleuthkit.autopsy.experimental.autoingest//AutoIngestDashboard//EN",
+        autostore = false
+)
+@TopComponent.Description(
+        preferredID = "AutoIngestDashboardTopComponent",
+        //iconBase="SET/PATH/TO/ICON/HERE", 
+        persistenceType = TopComponent.PERSISTENCE_NEVER
+)
+@TopComponent.Registration(mode = "dashboard", openAtStartup = false)
+@ActionID(category = "Window", id = "org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardTopComponent")
+@ActionReference(path = "Menu/Window" /*
+ * , position = 333
+ */)
+@TopComponent.OpenActionRegistration(
+        displayName = "#CTL_AutoIngestDashboardAction",
+        preferredID = "AutoIngestDashboardTopComponent"
+)
+@Messages({
+    "CTL_AutoIngestDashboardAction=Auto Ingest Dashboard",
+    "CTL_AutoIngestDashboardTopComponent=Auto Ingest Dashboard",
+    "HINT_AutoIngestDashboardTopComponent=This is an Auto Ingest Dashboard window"
+})
+public final class AutoIngestDashboardTopComponent extends TopComponent {
+    public final static String PREFERRED_ID = "AutoIngestDashboardTopComponent"; // NON-NLS
+    private static final Logger LOGGER = Logger.getLogger(AutoIngestDashboardTopComponent.class.getName());
+    private static boolean topComponentInitialized = false;
+
+    public static void openTopComponent() {
+        final AutoIngestDashboardTopComponent tc = (AutoIngestDashboardTopComponent) WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+        if (tc != null) {
+            topComponentInitialized = true;
+            WindowManager.getDefault().isTopComponentFloating(tc);
+            Mode mode = WindowManager.getDefault().findMode("dashboard"); // NON-NLS
+            if (mode != null) {
+                mode.dockInto(tc);
+            }
+
+            AutoIngestDashboard dashboard = AutoIngestDashboard.getInstance();
+            tc.add(dashboard);
+            dashboard.setSize(dashboard.getPreferredSize());
+            
+            tc.open();
+            tc.requestActive();
+        }
+    }
+
+    public static void closeTopComponent() {
+        if (topComponentInitialized) {
+            final TopComponent etc = WindowManager.getDefault().findTopComponent(PREFERRED_ID);
+            if (etc != null) {
+                try {
+                    etc.close();
+                } catch (Exception e) {
+                    LOGGER.log(Level.SEVERE, "failed to close " + PREFERRED_ID, e); // NON-NLS
+                }
+            }
+        }
+    }
+
+    public AutoIngestDashboardTopComponent() {
+        initComponents();
+        setName(Bundle.CTL_AutoIngestDashboardTopComponent());
+        setToolTipText(Bundle.HINT_AutoIngestDashboardTopComponent());
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 400, Short.MAX_VALUE)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 300, Short.MAX_VALUE)
+        );
+    }// </editor-fold>//GEN-END:initComponents
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    // End of variables declaration//GEN-END:variables
+    @Override
+    public void componentOpened() {
+        // TODO add custom code on component opening
+    }
+
+    @Override
+    public void componentClosed() {
+        // TODO add custom code on component closing
+    }
+
+    void writeProperties(java.util.Properties p) {
+        // better to version settings since initial version as advocated at
+        // http://wiki.apidesign.org/wiki/PropertyFiles
+        p.setProperty("version", "1.0");
+        // TODO store your settings
+    }
+
+    void readProperties(java.util.Properties p) {
+        String version = p.getProperty("version");
+        // TODO read your settings according to their version
+    }
+}
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form
new file mode 100644
index 0000000000000000000000000000000000000000..9d28df9288b03c091c2a12f841fee8878c8d99d8
--- /dev/null
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.form
@@ -0,0 +1,475 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.6" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="0" attributes="0">
+                      <Group type="103" groupAlignment="1" attributes="0">
+                          <Component id="lbPending" alignment="0" min="-2" max="-2" attributes="0"/>
+                          <Component id="pendingScrollPane" min="-2" pref="920" max="-2" attributes="0"/>
+                      </Group>
+                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Component id="bnPrioritizeCase" max="32767" attributes="0"/>
+                          <Component id="bnPrioritizeJob" max="32767" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <Group type="102" attributes="0">
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Group type="102" alignment="0" attributes="0">
+                              <Component id="bnPause" linkSize="1" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
+                              <Component id="bnRefresh" linkSize="1" min="-2" pref="100" max="-2" attributes="0"/>
+                              <EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
+                              <Component id="bnOptions" linkSize="1" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
+                              <Component id="bnOpenLogDir" linkSize="1" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace min="-2" pref="18" max="-2" attributes="0"/>
+                              <Component id="bnExit" linkSize="1" min="-2" pref="94" max="-2" attributes="0"/>
+                          </Group>
+                          <Group type="102" alignment="0" attributes="0">
+                              <Group type="103" groupAlignment="0" attributes="0">
+                                  <Component id="runningScrollPane" min="-2" pref="920" max="-2" attributes="0"/>
+                                  <Component id="completedScrollPane" min="-2" pref="920" max="-2" attributes="0"/>
+                              </Group>
+                              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                              <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                                  <Component id="bnCancelJob" linkSize="1" pref="117" max="32767" attributes="0"/>
+                                  <Component id="bnShowProgress" linkSize="1" pref="116" max="32767" attributes="0"/>
+                                  <Component id="bnCancelModule" linkSize="1" alignment="0" pref="117" max="32767" attributes="0"/>
+                                  <Component id="bnDeleteCase" linkSize="1" alignment="0" pref="117" max="32767" attributes="0"/>
+                                  <Component id="bnShowCaseLog" max="32767" attributes="0"/>
+                                  <Component id="bnReprocessJob" alignment="0" max="32767" attributes="0"/>
+                              </Group>
+                          </Group>
+                          <Group type="102" alignment="0" attributes="0">
+                              <Component id="lbStatus" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                              <Component id="tbStatusMessage" min="-2" pref="861" max="-2" attributes="0"/>
+                          </Group>
+                          <Component id="lbCompleted" alignment="0" min="-2" max="-2" attributes="0"/>
+                          <Component id="lbRunning" alignment="0" min="-2" max="-2" attributes="0"/>
+                          <Group type="102" alignment="0" attributes="0">
+                              <Component id="lbServicesStatus" min="-2" max="-2" attributes="0"/>
+                              <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                              <Component id="tbServicesStatusMessage" min="-2" pref="861" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                      <EmptySpace min="0" pref="0" max="32767" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="1" attributes="0">
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="lbStatus" alignment="3" min="-2" pref="23" max="-2" attributes="0"/>
+                  <Component id="tbStatusMessage" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="lbServicesStatus" alignment="3" min="-2" pref="23" max="-2" attributes="0"/>
+                  <Component id="tbServicesStatusMessage" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="lbPending" min="-2" pref="23" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="pendingScrollPane" min="-2" pref="215" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="-2" pref="82" max="-2" attributes="0"/>
+                      <Component id="bnPrioritizeCase" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="bnPrioritizeJob" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="lbRunning" min="-2" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <EmptySpace min="-2" pref="34" max="-2" attributes="0"/>
+                      <Component id="bnShowProgress" linkSize="2" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="bnCancelJob" linkSize="2" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="bnCancelModule" linkSize="2" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="runningScrollPane" min="-2" pref="133" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="-2" pref="68" max="-2" attributes="0"/>
+                      <Component id="bnReprocessJob" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="bnDeleteCase" linkSize="2" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="bnShowCaseLog" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="lbCompleted" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Component id="completedScrollPane" min="-2" pref="179" max="-2" attributes="0"/>
+                      <EmptySpace max="-2" attributes="0"/>
+                      <Group type="103" groupAlignment="0" attributes="0">
+                          <Group type="103" alignment="0" groupAlignment="3" attributes="0">
+                              <Component id="bnExit" linkSize="2" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="bnOpenLogDir" linkSize="2" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                          <Group type="103" groupAlignment="3" attributes="0">
+                              <Component id="bnPause" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="bnRefresh" linkSize="2" alignment="3" min="-2" max="-2" attributes="0"/>
+                              <Component id="bnOptions" linkSize="2" alignment="3" min="-2" max="-2" attributes="0"/>
+                          </Group>
+                      </Group>
+                  </Group>
+              </Group>
+              <EmptySpace max="-2" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JScrollPane" name="pendingScrollPane">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTable" name="pendingTable">
+          <Properties>
+            <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+              <Connection code="pendingTableModel" type="code"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.pendingTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="autoResizeMode" type="int" value="4"/>
+            <Property name="rowHeight" type="int" value="20" postCode="pendingTable.setSelectionModel(new DefaultListSelectionModel() {&#xa;    private static final long serialVersionUID = 1L;&#xa;    @Override&#xa;    public void setSelectionInterval(int index0, int index1) {&#xa;        if (index0 == pendingTable.getSelectedRow()) {&#xa;            pendingTable.clearSelection();&#xa;        } else {&#xa;            super.setSelectionInterval(index0, index1);&#xa;        }&#xa;    }&#xa;});"/>
+            <Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
+              <JTableSelectionModel selectionMode="0"/>
+            </Property>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JScrollPane" name="runningScrollPane">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTable" name="runningTable">
+          <Properties>
+            <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+              <Connection code="runningTableModel" type="code"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.runningTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="autoResizeMode" type="int" value="4"/>
+            <Property name="rowHeight" type="int" value="20" postCode="runningTable.setSelectionModel(new DefaultListSelectionModel() {&#xa;    private static final long serialVersionUID = 1L;&#xa;    @Override&#xa;    public void setSelectionInterval(int index0, int index1) {&#xa;        if (index0 == runningTable.getSelectedRow()) {&#xa;            runningTable.clearSelection();&#xa;        } else {&#xa;            super.setSelectionInterval(index0, index1);&#xa;        }&#xa;    }&#xa;});"/>
+            <Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
+              <JTableSelectionModel selectionMode="0"/>
+            </Property>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Container class="javax.swing.JScrollPane" name="completedScrollPane">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTable" name="completedTable">
+          <Properties>
+            <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+              <Connection code="completedTableModel" type="code"/>
+            </Property>
+            <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+              <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.completedTable.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+            </Property>
+            <Property name="autoResizeMode" type="int" value="4"/>
+            <Property name="rowHeight" type="int" value="20" postCode="completedTable.setSelectionModel(new DefaultListSelectionModel() {&#xa;    private static final long serialVersionUID = 1L;&#xa;    @Override&#xa;    public void setSelectionInterval(int index0, int index1) {&#xa;        if (index0 == completedTable.getSelectedRow()) {&#xa;            completedTable.clearSelection();&#xa;        } else {&#xa;            super.setSelectionInterval(index0, index1);&#xa;        }&#xa;    }&#xa;});"/>
+            <Property name="selectionModel" type="javax.swing.ListSelectionModel" editor="org.netbeans.modules.form.editors2.JTableSelectionModelEditor">
+              <JTableSelectionModel selectionMode="0"/>
+            </Property>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JButton" name="bnCancelJob">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnCancelJob.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnCancelJob.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelJobActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnDeleteCase">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnDeleteCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnDeleteCase.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnDeleteCaseActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbPending">
+      <Properties>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="14" style="0"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.lbPending.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbRunning">
+      <Properties>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="14" style="0"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.lbRunning.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbCompleted">
+      <Properties>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="14" style="0"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.lbCompleted.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnRefresh">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnRefresh.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnRefresh.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnRefreshActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnCancelModule">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnCancelModule.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnCancelModule.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnCancelModuleActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnExit">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnExit.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnExit.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnExitActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnOptions">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnOptions.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnOptions.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="enabled" type="boolean" value="false"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOptionsActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnShowProgress">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnShowProgress.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnShowProgress.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnShowProgressActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnPause">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnPause.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnPause.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPauseActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnPrioritizeCase">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnPrioritizeCase.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnPrioritizeCase.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPrioritizeCaseActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnShowCaseLog">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnShowCaseLog.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnShowCaseLog.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnShowCaseLogActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JTextField" name="tbStatusMessage">
+      <Properties>
+        <Property name="editable" type="boolean" value="false"/>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="12" style="1"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.tbStatusMessage.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="null"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbStatus">
+      <Properties>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="14" style="0"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.lbStatus.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnPrioritizeJob">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnPrioritizeJob.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnPrioritizeJob.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnPrioritizeJob.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnPrioritizeJobActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JLabel" name="lbServicesStatus">
+      <Properties>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="14" style="0"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.lbServicesStatus.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="tbServicesStatusMessage">
+      <Properties>
+        <Property name="editable" type="boolean" value="false"/>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="12" style="1"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.tbServicesStatusMessage.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+        <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+          <Border info="null"/>
+        </Property>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnOpenLogDir">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnOpenLogDir.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnOpenLogDirActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="bnReprocessJob">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties" key="AutoIngestLegacyDashboard.bnReprocessJob.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="bnReprocessJobActionPerformed"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java
new file mode 100644
index 0000000000000000000000000000000000000000..b043d9c1fbdc60301749f7ee7f8c1bab1762f0d0
--- /dev/null
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/AutoIngestLegacyDashboard.java
@@ -0,0 +1,1731 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2015-2017 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.experimental.autoingest;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import java.awt.Cursor;
+import java.awt.Desktop;
+import java.awt.EventQueue;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Observable;
+import java.util.Observer;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Level;
+import javax.swing.DefaultListSelectionModel;
+import java.awt.Color;
+import java.beans.PropertyChangeEvent;
+import java.io.File;
+import java.util.Collections;
+import java.util.logging.Logger;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTable;
+import javax.swing.SwingWorker;
+import javax.swing.UIManager;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableColumn;
+import org.netbeans.api.options.OptionsDisplayer;
+import org.openide.DialogDisplayer;
+import org.openide.LifecycleManager;
+import org.openide.NotifyDescriptor;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+import org.openide.windows.WindowManager;
+import org.sleuthkit.autopsy.casemodule.CaseNewAction;
+import org.sleuthkit.autopsy.casemodule.CaseOpenAction;
+import org.sleuthkit.autopsy.core.ServicesMonitor;
+import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
+import org.sleuthkit.autopsy.coreutils.NetworkUtils;
+import org.sleuthkit.autopsy.coreutils.PlatformUtil;
+import org.sleuthkit.autopsy.ingest.IngestManager;
+import org.sleuthkit.autopsy.ingest.IngestProgressSnapshotDialog;
+import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.CaseDeletionResult;
+import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestManager.JobsSnapshot;
+
+/**
+ * A panel for monitoring automated ingest by a cluster, and for controlling
+ * automated ingest for a single node within the cluster. There can be at most
+ * one such panel per node.
+ */
+public final class AutoIngestLegacyDashboard extends JPanel implements Observer {
+
+    private static final long serialVersionUID = 1L;
+    private static final int GENERIC_COL_MIN_WIDTH = 30;
+    private static final int GENERIC_COL_MAX_WIDTH = 2000;
+    private static final int PENDING_TABLE_COL_PREFERRED_WIDTH = 280;
+    private static final int RUNNING_TABLE_COL_PREFERRED_WIDTH = 175;
+    private static final int ACTIVITY_TIME_COL_MIN_WIDTH = 250;
+    private static final int ACTIVITY_TIME_COL_MAX_WIDTH = 450;
+    private static final int TIME_COL_MIN_WIDTH = 30;
+    private static final int TIME_COL_MAX_WIDTH = 250;
+    private static final int TIME_COL_PREFERRED_WIDTH = 140;
+    private static final int NAME_COL_MIN_WIDTH = 100;
+    private static final int NAME_COL_MAX_WIDTH = 250;
+    private static final int NAME_COL_PREFERRED_WIDTH = 140;
+    private static final int ACTIVITY_COL_MIN_WIDTH = 70;
+    private static final int ACTIVITY_COL_MAX_WIDTH = 2000;
+    private static final int ACTIVITY_COL_PREFERRED_WIDTH = 300;
+    private static final int STATUS_COL_MIN_WIDTH = 55;
+    private static final int STATUS_COL_MAX_WIDTH = 250;
+    private static final int STATUS_COL_PREFERRED_WIDTH = 55;
+    private static final int COMPLETED_TIME_COL_MIN_WIDTH = 30;
+    private static final int COMPLETED_TIME_COL_MAX_WIDTH = 2000;
+    private static final int COMPLETED_TIME_COL_PREFERRED_WIDTH = 280;
+    private static final String UPDATE_TASKS_THREAD_NAME = "AID-update-tasks-%d";
+    private static final String LOCAL_HOST_NAME = NetworkUtils.getLocalHostName();
+    private static final Logger SYS_LOGGER = AutoIngestSystemLogger.getLogger();
+    private static AutoIngestLegacyDashboard instance;
+    private final DefaultTableModel pendingTableModel;
+    private final DefaultTableModel runningTableModel;
+    private final DefaultTableModel completedTableModel;
+    private AutoIngestManager manager;
+    private ExecutorService updateExecutor;
+    private boolean isPaused;
+    private boolean autoIngestStarted;
+    private Color pendingTableBackground;
+    private Color pendingTablelForeground;
+
+    /*
+     * The enum is used in conjunction with the DefaultTableModel class to
+     * provide table models for the JTables used to display a view of the
+     * pending jobs queue, running jobs list, and completed jobs list. The enum
+     * allows the columns of the table model to be described by either an enum
+     * ordinal or a column header string.
+     */
+    private enum JobsTableModelColumns {
+
+        CASE(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Case")),
+        DATA_SOURCE(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder")),
+        HOST_NAME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName")),
+        CREATED_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CreatedTime")),
+        STARTED_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StartedTime")),
+        COMPLETED_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime")),
+        STAGE(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage")),
+        STAGE_TIME(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime")),
+        STATUS(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.Status")),
+        CASE_DIRECTORY_PATH(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder")),
+        IS_LOCAL_JOB(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob")),
+        MANIFEST_FILE_PATH(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath"));
+
+        private final String header;
+
+        private JobsTableModelColumns(String header) {
+            this.header = header;
+        }
+
+        private String getColumnHeader() {
+            return header;
+        }
+
+        private static final String[] headers = {
+            CASE.getColumnHeader(),
+            DATA_SOURCE.getColumnHeader(),
+            HOST_NAME.getColumnHeader(),
+            CREATED_TIME.getColumnHeader(),
+            STARTED_TIME.getColumnHeader(),
+            COMPLETED_TIME.getColumnHeader(),
+            STAGE.getColumnHeader(),
+            STATUS.getColumnHeader(),
+            STAGE_TIME.getColumnHeader(),
+            CASE_DIRECTORY_PATH.getColumnHeader(),
+            IS_LOCAL_JOB.getColumnHeader(),
+            MANIFEST_FILE_PATH.getColumnHeader()};
+    }
+
+    /**
+     * Gets the singleton automated ingest control and monitoring panel for this
+     * cluster node.
+     *
+     * @return The panel.
+     */
+    public static AutoIngestLegacyDashboard getInstance() {
+        if (null == instance) {
+            /*
+             * Two stage construction is used here to avoid publishing a
+             * reference to the panel to the Observable auto ingest manager
+             * before object construction is complete.
+             */
+            instance = new AutoIngestLegacyDashboard();
+        }
+        return instance;
+    }
+
+    /**
+     * Constructs a panel for monitoring automated ingest by a cluster, and for
+     * controlling automated ingest for a single node within the cluster.
+     */
+    private AutoIngestLegacyDashboard() {
+        //Disable the main window so they can only use the dashboard (if we used setVisible the taskBar icon would go away)
+         WindowManager.getDefault().getMainWindow().setEnabled(false);
+        
+        manager = AutoIngestManager.getInstance();
+
+        pendingTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public boolean isCellEditable(int row, int column) {
+                return false;
+            }
+        };
+
+        runningTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public boolean isCellEditable(int row, int column) {
+                return false;
+            }
+        };
+
+        completedTableModel = new DefaultTableModel(JobsTableModelColumns.headers, 0) {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public boolean isCellEditable(int row, int column) {
+                return false;
+            }
+        };
+
+        initComponents(); // Generated code.
+        setServicesStatusMessage();
+        initPendingJobsTable();
+        initRunningJobsTable();
+        initCompletedJobsTable();
+        initButtons();
+
+        /*
+         * Must set this flag, otherwise pop up menus don't close properly.
+         */
+        UIManager.put("PopupMenu.consumeEventOnClose", false);
+    }
+
+    /**
+     * Queries the services monitor and sets the text for the services status
+     * text box.
+     */
+    private void setServicesStatusMessage() {
+        new SwingWorker<Void, Void>() {
+
+            String caseDatabaseServerStatus = ServicesMonitor.ServiceStatus.DOWN.toString();
+            String keywordSearchServiceStatus = ServicesMonitor.ServiceStatus.DOWN.toString();
+            String messagingStatus = ServicesMonitor.ServiceStatus.DOWN.toString();
+
+            @Override
+            protected Void doInBackground() throws Exception {
+                caseDatabaseServerStatus = getServiceStatus(ServicesMonitor.Service.REMOTE_CASE_DATABASE);
+                keywordSearchServiceStatus = getServiceStatus(ServicesMonitor.Service.REMOTE_KEYWORD_SEARCH);
+                messagingStatus = getServiceStatus(ServicesMonitor.Service.MESSAGING);
+                return null;
+            }
+
+            /**
+             * Gets a status string for a given service.
+             *
+             * @param service The service to test.
+             *
+             * @return The status string.
+             */
+            private String getServiceStatus(ServicesMonitor.Service service) {
+                String serviceStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Unknown");
+                try {
+                    ServicesMonitor servicesMonitor = ServicesMonitor.getInstance();
+                    serviceStatus = servicesMonitor.getServiceStatus(service.toString());
+                    if (serviceStatus.compareTo(ServicesMonitor.ServiceStatus.UP.toString()) == 0) {
+                        serviceStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up");
+                    } else {
+                        serviceStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Down");
+                    }
+                } catch (ServicesMonitor.ServicesMonitorException ex) {
+                    SYS_LOGGER.log(Level.SEVERE, String.format("Dashboard error getting service status for %s", service), ex);
+                }
+                return serviceStatus;
+            }
+
+            @Override
+            protected void done() {
+                tbServicesStatusMessage.setText(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message", caseDatabaseServerStatus, keywordSearchServiceStatus, keywordSearchServiceStatus, messagingStatus));
+                String upStatus = NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.tbServicesStatusMessage.Message.Up");
+                if (caseDatabaseServerStatus.compareTo(upStatus) != 0
+                        || keywordSearchServiceStatus.compareTo(upStatus) != 0
+                        || messagingStatus.compareTo(upStatus) != 0) {
+                    tbServicesStatusMessage.setForeground(Color.RED);
+                } else {
+                    tbServicesStatusMessage.setForeground(Color.BLACK);
+                }
+            }
+
+        }.execute();
+    }
+
+    /**
+     * Sets up the JTable that presents a view of the system-wide pending jobs
+     * queue.
+     */
+    private void initPendingJobsTable() {
+        /*
+         * Remove some of the jobs table model columns from the JTable. This
+         * does not remove the columns from the model, just from this table.
+         */
+        pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader()));
+        pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader()));
+        pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader()));
+        pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader()));
+        pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader()));
+        pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader()));
+        pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader()));
+        pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader()));
+        pendingTable.removeColumn(pendingTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader()));
+
+        /*
+         * Set up a column to display the cases associated with the jobs.
+         */
+        TableColumn column;
+        column = pendingTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader());
+        column.setMinWidth(GENERIC_COL_MIN_WIDTH);
+        column.setMaxWidth(GENERIC_COL_MAX_WIDTH);
+        column.setPreferredWidth(PENDING_TABLE_COL_PREFERRED_WIDTH);
+        column.setWidth(PENDING_TABLE_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the image folders associated with the
+         * jobs.
+         */
+        column = pendingTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader());
+        column.setMaxWidth(GENERIC_COL_MAX_WIDTH);
+        column.setPreferredWidth(PENDING_TABLE_COL_PREFERRED_WIDTH);
+        column.setWidth(PENDING_TABLE_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the create times of the jobs.
+         */
+        column = pendingTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader());
+        column.setCellRenderer(new LongDateCellRenderer());
+        column.setMinWidth(TIME_COL_MIN_WIDTH);
+        column.setMaxWidth(TIME_COL_MAX_WIDTH);
+        column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH);
+        column.setWidth(TIME_COL_PREFERRED_WIDTH);
+
+        /**
+         * Prevent sorting when a column header is clicked.
+         */
+        pendingTable.setAutoCreateRowSorter(false);
+
+        /*
+         * Create a row selection listener to enable/disable the prioritize
+         * folder and prioritize case buttons.
+         */
+        pendingTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
+            if (e.getValueIsAdjusting()) {
+                return;
+            }
+            int row = pendingTable.getSelectedRow();
+            enablePendingTableButtons((row >= 0) && (row < pendingTable.getRowCount()));
+        });
+
+        /*
+         * Save the background color of the table so it can be restored on
+         * resume, after being grayed out on pause. Note the assumption that all
+         * of the tables use the same background color.
+         */
+        pendingTableBackground = pendingTable.getBackground();
+        pendingTablelForeground = pendingTable.getForeground();
+    }
+
+    /**
+     * Sets up the JTable that presents a view of the system-wide running jobs
+     * list.
+     */
+    private void initRunningJobsTable() {
+        /*
+         * Remove some of the jobs table model columns from the JTable. This
+         * does not remove the columns from the model, just from this table.
+         */
+        runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader()));
+        runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader()));
+        runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader()));
+        runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader()));
+        runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader()));
+        runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader()));
+        runningTable.removeColumn(runningTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader()));
+
+        /*
+         * Set up a column to display the cases associated with the jobs.
+         */
+        TableColumn column;
+        column = runningTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader());
+        column.setMinWidth(GENERIC_COL_MIN_WIDTH);
+        column.setMaxWidth(GENERIC_COL_MAX_WIDTH);
+        column.setPreferredWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH);
+        column.setWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the image folders associated with the
+         * jobs.
+         */
+        column = runningTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader());
+        column.setMinWidth(GENERIC_COL_MIN_WIDTH);
+        column.setMaxWidth(GENERIC_COL_MAX_WIDTH);
+        column.setPreferredWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH);
+        column.setWidth(RUNNING_TABLE_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the host names of the cluster nodes
+         * processing the jobs.
+         */
+        column = runningTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader());
+        column.setMinWidth(NAME_COL_MIN_WIDTH);
+        column.setMaxWidth(NAME_COL_MAX_WIDTH);
+        column.setPreferredWidth(NAME_COL_PREFERRED_WIDTH);
+        column.setWidth(NAME_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the ingest activities associated with the
+         * jobs.
+         */
+        column = runningTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader());
+        column.setMinWidth(ACTIVITY_COL_MIN_WIDTH);
+        column.setMaxWidth(ACTIVITY_COL_MAX_WIDTH);
+        column.setPreferredWidth(ACTIVITY_COL_PREFERRED_WIDTH);
+        column.setWidth(ACTIVITY_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the ingest activity times associated with
+         * the jobs.
+         */
+        column = runningTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader());
+        column.setCellRenderer(new DurationCellRenderer());
+        column.setMinWidth(GENERIC_COL_MIN_WIDTH);
+        column.setMaxWidth(ACTIVITY_TIME_COL_MAX_WIDTH);
+        column.setPreferredWidth(ACTIVITY_TIME_COL_MIN_WIDTH);
+        column.setWidth(ACTIVITY_TIME_COL_MIN_WIDTH);
+
+        /*
+         * Prevent sorting when a column header is clicked.
+         */
+        runningTable.setAutoCreateRowSorter(false);
+
+        /*
+         * Create a row selection listener to enable/disable the cancel current
+         * job, cancel current module, and show progress buttons.
+         */
+        runningTable.getSelectionModel().addListSelectionListener((ListSelectionEvent e) -> {
+            if (e.getValueIsAdjusting()) {
+                return;
+            }
+            updateRunningTableButtonsBasedOnSelectedRow();
+        });
+    }
+
+    private void updateRunningTableButtonsBasedOnSelectedRow() {
+        int row = runningTable.getSelectedRow();
+        if (row >= 0 && row < runningTable.getRowCount()) {
+            if ((boolean) runningTableModel.getValueAt(row, JobsTableModelColumns.IS_LOCAL_JOB.ordinal())) {
+                enableRunningTableButtons(true);
+                return;
+            }
+        }
+        enableRunningTableButtons(false);
+    }
+
+    /**
+     * Sets up the JTable that presents a view of the system-wide competed jobs
+     * list.
+     */
+    private void initCompletedJobsTable() {
+        /*
+         * Remove some of the jobs table model columns from the JTable. This
+         * does not remove the columns from the model, just from this table.
+         */
+        completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STARTED_TIME.getColumnHeader()));
+        completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE.getColumnHeader()));
+        completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.STAGE_TIME.getColumnHeader()));
+        completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.IS_LOCAL_JOB.getColumnHeader()));
+        completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.HOST_NAME.getColumnHeader()));
+        completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.CASE_DIRECTORY_PATH.getColumnHeader()));
+        completedTable.removeColumn(completedTable.getColumn(JobsTableModelColumns.MANIFEST_FILE_PATH.getColumnHeader()));
+
+        /*
+         * Set up a column to display the cases associated with the jobs.
+         */
+        TableColumn column;
+        column = completedTable.getColumn(JobsTableModelColumns.CASE.getColumnHeader());
+        column.setMinWidth(COMPLETED_TIME_COL_MIN_WIDTH);
+        column.setMaxWidth(COMPLETED_TIME_COL_MAX_WIDTH);
+        column.setPreferredWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH);
+        column.setWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the image folders associated with the
+         * jobs.
+         */
+        column = completedTable.getColumn(JobsTableModelColumns.DATA_SOURCE.getColumnHeader());
+        column.setMinWidth(COMPLETED_TIME_COL_MIN_WIDTH);
+        column.setMaxWidth(COMPLETED_TIME_COL_MAX_WIDTH);
+        column.setPreferredWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH);
+        column.setWidth(COMPLETED_TIME_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the create times of the jobs.
+         */
+        column = completedTable.getColumn(JobsTableModelColumns.CREATED_TIME.getColumnHeader());
+        column.setCellRenderer(new LongDateCellRenderer());
+        column.setMinWidth(TIME_COL_MIN_WIDTH);
+        column.setMaxWidth(TIME_COL_MAX_WIDTH);
+        column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH);
+        column.setWidth(TIME_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the completed times of the jobs.
+         */
+        column = completedTable.getColumn(JobsTableModelColumns.COMPLETED_TIME.getColumnHeader());
+        column.setCellRenderer(new LongDateCellRenderer());
+        column.setMinWidth(TIME_COL_MIN_WIDTH);
+        column.setMaxWidth(TIME_COL_MAX_WIDTH);
+        column.setPreferredWidth(TIME_COL_PREFERRED_WIDTH);
+        column.setWidth(TIME_COL_PREFERRED_WIDTH);
+
+        /*
+         * Set up a column to display the statuses of the jobs, with a cell
+         * renderer that will choose an icon to represent the job status.
+         */
+        column = completedTable.getColumn(JobsTableModelColumns.STATUS.getColumnHeader());
+        column.setCellRenderer(new CaseStatusIconCellRenderer());
+        column.setMinWidth(STATUS_COL_MIN_WIDTH);
+        column.setMaxWidth(STATUS_COL_MAX_WIDTH);
+        column.setPreferredWidth(STATUS_COL_PREFERRED_WIDTH);
+        column.setWidth(STATUS_COL_PREFERRED_WIDTH);
+
+        /*
+         * Prevent sorting when a column header is clicked.
+         */
+        completedTable.setAutoCreateRowSorter(false);
+
+        /*
+         * Create a row selection listener to enable/disable the delete case and
+         * show log buttons.
+         */
+        completedTable.getSelectionModel()
+                .addListSelectionListener((ListSelectionEvent e) -> {
+                    if (e.getValueIsAdjusting()) {
+                        return;
+                    }
+                    int row = completedTable.getSelectedRow();
+                    boolean enabled = row >= 0 && row < completedTable.getRowCount();
+                    bnDeleteCase.setEnabled(enabled);
+                    bnShowCaseLog.setEnabled(enabled);
+                    bnReprocessJob.setEnabled(enabled);
+                });
+    }
+
+    /**
+     * Sets the initial state of the buttons on the panel.
+     */
+    private void initButtons() {
+        bnOptions.setEnabled(true);
+        bnDeleteCase.setEnabled(false);
+        enablePendingTableButtons(false);
+        bnShowCaseLog.setEnabled(false);
+        bnReprocessJob.setEnabled(false);
+        bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnStart.text"));
+        bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnStart.toolTipText"));
+        bnPause.setEnabled(true);    //initial label for bnPause is 'Start' and it's enabled for user to start the process
+        bnRefresh.setEnabled(false); //at initial stage, nothing to refresh
+        enableRunningTableButtons(false);
+        tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnStart.startMessage"));
+    }
+
+    /**
+     * Enables or disables buttons related to the running jobs table.
+     *
+     * @param enable Enable/disable the buttons.
+     */
+    private void enableRunningTableButtons(Boolean enable) {
+        bnCancelJob.setEnabled(enable);
+        bnCancelModule.setEnabled(enable);
+        bnShowProgress.setEnabled(enable);
+    }
+
+    /**
+     * Enables or disables buttons related to pending jobs table.
+     *
+     * @param enable Enable/disable the buttons.
+     */
+    private void enablePendingTableButtons(Boolean enable) {
+        bnPrioritizeCase.setEnabled(enable);
+        bnPrioritizeJob.setEnabled(enable);
+    }
+
+    /**
+     * Starts up the auto ingest manager and adds this panel as an observer,
+     * subscribes to services monitor events and starts a task to populate the
+     * auto ingest job tables. The Refresh and Pause buttons are enabled.
+     */
+    private void startUp() {
+
+        /*
+         * Starts up the auto ingest manager (AIM).
+         */
+        try {
+            manager.startUp();
+            autoIngestStarted = true;
+        } catch (AutoIngestManager.AutoIngestManagerStartupException ex) {
+            SYS_LOGGER.log(Level.SEVERE, "Dashboard error starting up auto ingest", ex);
+            tbStatusMessage.setText(NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.AutoIngestStartupError"));
+            manager = null;
+
+            JOptionPane.showMessageDialog(this,
+                    NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Message"),
+                    NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.AutoIngestStartupFailed.Title"),
+                    JOptionPane.ERROR_MESSAGE);
+            bnOptions.setEnabled(true);
+
+            /*
+             * If the AIM cannot be started, there is nothing more to do.
+             */
+            return;
+        }
+
+        /*
+         * Subscribe to services monitor events.
+         */
+        ServicesMonitor.getInstance().addSubscriber((PropertyChangeEvent evt) -> {
+            setServicesStatusMessage();
+        });
+
+        /*
+         * Register with the AIM as an observer.
+         */
+        manager.addObserver(this);
+
+        /*
+         * Populate the pending, running, and completed auto ingest job tables.
+         */
+        updateExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat(UPDATE_TASKS_THREAD_NAME).build());
+        updateExecutor.submit(new UpdateAllJobsTablesTask());
+        manager.scanInputDirsNow();
+
+		//bnPause.setEnabled(true);
+        bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.text"));
+        bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.toolTipText"));
+        bnRefresh.setEnabled(true);
+        bnOptions.setEnabled(false);
+        
+        tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.running"));
+    }
+
+    /**
+     * Shuts down auto ingest by shutting down the auto ingest manager and doing
+     * an application exit.
+     */
+    public void shutdown() {
+        /*
+         * Confirm that the user wants to proceed, letting him or her no that if
+         * there is a currently running job it will be cancelled. TODO (RC): If
+         * a wait cursor is provided, this could perhaps be made conditional on
+         * a running job check again. Or the simple check in isLocalJobRunning
+         * could be used. Was this previously used and I removed it thinking it
+         * was grabbing the monitor?
+         */
+        Object[] options = {
+            NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.OK"),
+            NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.Cancel")};
+        int reply = JOptionPane.OK_OPTION;
+
+        if (null != manager && IngestManager.getInstance().isIngestRunning()) {
+            reply = JOptionPane.showOptionDialog(this,
+                    NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ExitConsequences"),
+                    NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmExitHeader"),
+                    JOptionPane.DEFAULT_OPTION,
+                    JOptionPane.WARNING_MESSAGE,
+                    null,
+                    options,
+                    options[JOptionPane.NO_OPTION]);
+        }
+        if (reply == JOptionPane.OK_OPTION) {
+            /*
+             * Provide user feedback. Call setCursor on this to ensure it
+             * appears (if there is time to see it).
+             */
+            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+            tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ExitingStatus"));
+
+            /*
+             * Shut down the table refresh task executor.
+             */
+            if (null != updateExecutor) {
+                updateExecutor.shutdownNow();
+            }
+
+            /*
+             * Stop observing the auto ingest manager (AIM).
+             */
+            if (null != manager) {
+                manager.deleteObserver(this);
+            }
+
+            /*
+             * Shut down the AIM and close.
+             */
+            new SwingWorker<Void, Void>() {
+
+                @Override
+                protected Void doInBackground() throws Exception {
+                    if (null != manager) {
+                        manager.shutDown();
+                    }
+                    return null;
+                }
+
+                @Override
+                protected void done() {
+                    AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor());
+                    LifecycleManager.getDefault().exit();
+                }
+            }.execute();
+        }
+    }
+
+    /**
+     * @inheritDoc
+     */
+    @NbBundle.Messages({
+        "AutoIngestLegacyDashboard.bnPause.paused=Paused",
+        "AutoIngestLegacyDashboard.PauseDueToDatabaseServiceDown=Paused, unable to communicate with case database service.",
+        "AutoIngestLegacyDashboard.PauseDueToKeywordSearchServiceDown=Paused, unable to communicate with keyword search service.",
+        "AutoIngestLegacyDashboard.PauseDueToCoordinationServiceDown=Paused, unable to communicate with coordination service.",
+        "AutoIngestLegacyDashboard.PauseDueToWriteStateFilesFailure=Paused, unable to write to shared images or cases location.",
+        "AutoIngestLegacyDashboard.PauseDueToSharedConfigError=Paused, unable to update shared configuration.",
+        "AutoIngestLegacyDashboard.PauseDueToIngestJobStartFailure=Paused, unable to start ingest job processing.",
+        "AutoIngestLegacyDashboard.PauseDueToFileExporterError=Paused, unable to load File Exporter settings.",
+        "AutoIngestLegacyDashboard.bnPause.running=Running",
+        "AutoIngestLegacyDashboard.bnStart.startMessage=Waiting to start",
+        "AutoIngestLegacyDashboard.bnStart.text=Start",
+        "AutoIngestLegacyDashboard.bnStart.toolTipText=Start processing auto ingest jobs"
+    })
+    @Override
+    public void update(Observable o, Object arg) {
+
+        if (arg instanceof AutoIngestManager.Event) {
+            switch ((AutoIngestManager.Event) arg) {
+                case INPUT_SCAN_COMPLETED:
+                case JOB_STARTED:
+                case JOB_COMPLETED:
+                case CASE_DELETED:
+                    updateExecutor.submit(new UpdateAllJobsTablesTask());
+                    break;
+                case PAUSED_BY_REQUEST:
+                    EventQueue.invokeLater(() -> {
+                        tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.paused"));
+                        bnOptions.setEnabled(true);
+                        bnRefresh.setEnabled(false);
+                        isPaused = true;
+                    });
+                    break;
+                case PAUSED_FOR_SYSTEM_ERROR:
+                    EventQueue.invokeLater(() -> {
+                        tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.PauseDueToSystemError"));
+                        bnOptions.setEnabled(true);
+                        bnRefresh.setEnabled(false);
+                        pause(false);
+                        isPaused = true;
+                        setServicesStatusMessage();
+                    });
+                    break;
+                case RESUMED:
+                    EventQueue.invokeLater(() -> {
+                        tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.running"));
+                    });
+                    break;
+                case CASE_PRIORITIZED:
+                    updateExecutor.submit(new UpdatePendingJobsTableTask());
+                    break;
+                case JOB_STATUS_UPDATED:
+                    updateExecutor.submit(new UpdateRunningJobsTablesTask());
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Requests a pause of auto ingest processing by the auto ingest manager and
+     * handles updates to the components that implement the pause and resume
+     * feature. Note that this feature is needed to get around restrictions on
+     * changing ingest module selections and settings while an ingest job is
+     * running, and that the auto ingest manager will not actually pause until
+     * the current auto ingest job completes.
+     *
+     * @param buttonClicked Is this pause request in response to a user gesture
+     *                      or a nofification from the auto ingest manager
+     *                      (AIM)?
+     */
+    private void pause(boolean buttonClicked) {
+        /**
+         * Gray out the cells in the pending table to give a visual indicator of
+         * the pausing/paused state.
+         */
+        pendingTable.setBackground(Color.LIGHT_GRAY);
+        pendingTable.setForeground(Color.DARK_GRAY);
+
+        /**
+         * Change the pause button text and tool tip to make it a resume button.
+         */
+        bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnResume.text"));
+        bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.toolTipTextResume"));
+
+        if (buttonClicked) {
+            /**
+             * Ask the auto ingest manager to pause when it completes the
+             * currently running job, if any.
+             */
+            manager.pause();
+            bnRefresh.setEnabled(false);
+        }
+    }
+
+    /**
+     * Requests a resume of auto ingest processing by the auto ingest manager
+     * and handles updates to the components that implement the pause and resume
+     * feature. Note that this feature is needed to get around restrictions on
+     * changing ingest module selections and settings while an ingest job is
+     * running, and that the auto ingest manager will not actually pause until
+     * the current auto ingest job completes.
+     */
+    private void resume() {
+        /**
+         * Change the resume button text and tool tip to make it a pause button.
+         */
+        bnOptions.setEnabled(false);
+        bnPause.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.text"));
+        bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.toolTipText"));
+        tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.running"));
+        bnRefresh.setEnabled(true);
+
+        /**
+         * Remove the graying out of the pending table.
+         */
+        pendingTable.setBackground(pendingTableBackground);
+        pendingTable.setForeground(pendingTablelForeground);
+
+        /**
+         * Ask the auto ingest manager to resume processing.
+         */
+        manager.resume();
+    }
+
+    /**
+     * A runnable task that gets the pending auto ingest jobs list from the auto
+     * ingest manager and queues a components refresh task for execution in the
+     * EDT.
+     */
+    private class UpdatePendingJobsTableTask implements Runnable {
+
+        /**
+         * @inheritDoc
+         */
+        @Override
+        public void run() {
+            List<AutoIngestJob> pendingJobs = new ArrayList<>();
+            manager.getJobs(pendingJobs, null, null);
+            EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, null, null));
+        }
+    }
+
+    /**
+     * A runnable task that gets the running auto ingest jobs list from the auto
+     * ingest manager and queues a components refresh task for execution in the
+     * EDT.
+     */
+    private class UpdateRunningJobsTablesTask implements Runnable {
+
+        /**
+         * @inheritDoc
+         */
+        @Override
+        public void run() {
+            List<AutoIngestJob> runningJobs = new ArrayList<>();
+            manager.getJobs(null, runningJobs, null);
+            EventQueue.invokeLater(new RefreshComponentsTask(null, runningJobs, null));
+        }
+    }
+
+    /**
+     * A runnable task that gets the pending, running and completed auto ingest
+     * jobs lists from the auto ingest manager and queues a components refresh
+     * task for execution in the EDT. Note that this task is frequently used
+     * when only the pending and updated lists definitely need to be updated.
+     * This is because the cost of updating the running jobs list is both very
+     * small and it is beneficial to keep running job status up to date if there
+     * is a running job.
+     */
+    private class UpdateAllJobsTablesTask implements Runnable {
+
+        /**
+         * @inheritDoc
+         */
+        @Override
+        public void run() {
+            List<AutoIngestJob> pendingJobs = new ArrayList<>();
+            List<AutoIngestJob> runningJobs = new ArrayList<>();
+            List<AutoIngestJob> completedJobs = new ArrayList<>();
+            manager.getJobs(pendingJobs, runningJobs, completedJobs);
+            // Sort the completed jobs list by completed date
+            Collections.sort(completedJobs, new AutoIngestJob.ReverseDateCompletedComparator());
+            EventQueue.invokeLater(new RefreshComponentsTask(pendingJobs, runningJobs, completedJobs));
+        }
+    }
+
+    /**
+     * A runnable task that refreshes the components on this panel to reflect
+     * the current state of one or more auto ingest job lists obtained from the
+     * auto ingest manager.
+     */
+    private class RefreshComponentsTask implements Runnable {
+
+        private final List<AutoIngestJob> pendingJobs;
+        private final List<AutoIngestJob> runningJobs;
+        private final List<AutoIngestJob> completedJobs;
+
+        /**
+         * Constructs a runnable task that refreshes the components on this
+         * panel to reflect the current state of the auto ingest jobs.
+         *
+         * @param pendingJobs   A list of pending jobs, may be null if the
+         *                      pending jobs are unchanged.
+         * @param runningJobs   A list of running jobs, may be null if the
+         *                      running jobs are unchanged.
+         * @param completedJobs A list of completed jobs, may be null if the
+         *                      completed jobs are unchanged.
+         */
+        RefreshComponentsTask(List<AutoIngestJob> pendingJobs, List<AutoIngestJob> runningJobs, List<AutoIngestJob> completedJobs) {
+            this.pendingJobs = pendingJobs;
+            this.runningJobs = runningJobs;
+            this.completedJobs = completedJobs;
+        }
+
+        /**
+         * @inheritDoc
+         */
+        @Override
+        public void run() {
+            /*
+             * NOTE: There is a problem with our approach of preserving table
+             * row selections - what if the number of rows has changed as result
+             * of calling refreshTable(). Then it is possible for what used to
+             * be (for example) row 1 to now be in some other row or be removed
+             * from the table. This code will re-set the selection back to what
+             * it used to be before calling refreshTable(), i.e. row 1
+             */
+
+            if (null != pendingJobs) {
+                Path currentRow = getSelectedEntry(pendingTable, pendingTableModel);
+                refreshTable(pendingJobs, pendingTableModel, null);
+                setSelectedEntry(pendingTable, pendingTableModel, currentRow);
+            }
+
+            if (null != runningJobs) {
+                if (!isLocalJobRunning()) {
+                    enableRunningTableButtons(false);
+                } else {
+                    updateRunningTableButtonsBasedOnSelectedRow();
+                }
+                Path currentRow = getSelectedEntry(runningTable, runningTableModel);
+                refreshTable(runningJobs, runningTableModel, null);
+                setSelectedEntry(runningTable, runningTableModel, currentRow);
+            }
+
+            if (null != completedJobs) {
+                Path currentRow = getSelectedEntry(completedTable, completedTableModel);
+                refreshTable(completedJobs, completedTableModel, null);
+                setSelectedEntry(completedTable, completedTableModel, currentRow);
+            }
+        }
+
+        /**
+         * Checks whether there is a job that is running on local AIN.
+         *
+         * @return true is local job is found, false otherwise.
+         */
+        private boolean isLocalJobRunning() {
+            for (AutoIngestJob job : runningJobs) {
+                if (isLocalJob(job)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        /**
+         * Checks whether or not an automated ingest job is local to this node.
+         *
+         * @param job The job.
+         *
+         * @return True or fale.
+         */
+        private boolean isLocalJob(AutoIngestJob job) {
+            return job.getNodeName().equals(LOCAL_HOST_NAME);
+        }
+
+        /**
+         * Get a path representing the current selection on the table passed in.
+         * If there is no selection, return null.
+         *
+         * @param table      The table to get
+         * @param tableModel The tableModel of the table to get
+         *
+         * @return a path representing the current selection
+         */
+        Path getSelectedEntry(JTable table, DefaultTableModel tableModel) {
+            try {
+                int currentlySelectedRow = table.getSelectedRow();
+                if (currentlySelectedRow >= 0 && currentlySelectedRow < table.getRowCount()) {
+                    return Paths.get(tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.CASE.ordinal()).toString(),
+                            tableModel.getValueAt(currentlySelectedRow, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString());
+                }
+            } catch (Exception ignored) {
+                return null;
+            }
+            return null;
+        }
+
+        /**
+         * Set the selection on the table to the passed-in path's item, if that
+         * item exists in the table. If it does not, clears the table selection.
+         *
+         * @param table      The table to set
+         * @param tableModel The tableModel of the table to set
+         * @param path       The path of the item to set
+         */
+        void setSelectedEntry(JTable table, DefaultTableModel tableModel, Path path) {
+            if (path != null) {
+                try {
+                    for (int row = 0; row < table.getRowCount(); ++row) {
+                        Path temp = Paths.get(tableModel.getValueAt(row, JobsTableModelColumns.CASE.ordinal()).toString(),
+                                tableModel.getValueAt(row, JobsTableModelColumns.DATA_SOURCE.ordinal()).toString());
+                        if (temp.compareTo(path) == 0) { // found it
+                            table.setRowSelectionInterval(row, row);
+                            return;
+                        }
+                    }
+                } catch (Exception ignored) {
+                    table.clearSelection();
+                }
+            }
+            table.clearSelection();
+        }
+    }
+
+    /**
+     * Reloads the table model for an auto ingest jobs table, refreshing the
+     * JTable that uses the model.
+     *
+     * @param jobs       The list of auto ingest jobs.
+     * @param tableModel The table model.
+     * @param comparator An optional comparator (may be null) for sorting the
+     *                   table model.
+     */
+    private void refreshTable(List<AutoIngestJob> jobs, DefaultTableModel tableModel, Comparator<AutoIngestJob> comparator) {
+        try {
+            if (comparator != null) {
+                jobs.sort(comparator);
+            }
+            tableModel.setRowCount(0);
+            for (AutoIngestJob job : jobs) {
+                AutoIngestJob.StageDetails status = job.getStageDetails();
+                tableModel.addRow(new Object[]{
+                    job.getManifest().getCaseName(), // CASE
+                    job.getManifest().getDataSourcePath().getFileName(), // DATA_SOURCE
+                    job.getNodeName(), // HOST_NAME
+                    job.getManifest().getDateFileCreated(), // CREATED_TIME
+                    job.getStageStartDate(), // STARTED_TIME
+                    job.getCompletedDate(), // COMPLETED_TIME
+                    status.getDescription(), // ACTIVITY
+                    job.hasErrors(), // STATUS
+                    ((Date.from(Instant.now()).getTime()) - (status.getStartDate().getTime())), // ACTIVITY_TIME
+                    job.getCaseDirectoryPath(), // CASE_DIRECTORY_PATH
+                    job.getNodeName().equals(LOCAL_HOST_NAME), // IS_LOCAL_JOB
+                    job.getManifest().getFilePath()}); // MANIFEST_FILE_PATH
+            }
+        } catch (Exception ex) {
+            SYS_LOGGER.log(Level.SEVERE, "Dashboard error refreshing table", ex);
+        }
+    }
+    
+    /**
+     * Get the current lists of jobs and update the UI.
+     */
+    private void refreshTables(){
+        JobsSnapshot jobsSnapshot = manager.getCurrentJobsSnapshot();
+        refreshTable(jobsSnapshot.getCompletedJobs(), completedTableModel, null);
+        refreshTable(jobsSnapshot.getPendingJobs(), pendingTableModel, null);
+        refreshTable(jobsSnapshot.getRunningJobs(), runningTableModel, null);
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        pendingScrollPane = new javax.swing.JScrollPane();
+        pendingTable = new javax.swing.JTable();
+        runningScrollPane = new javax.swing.JScrollPane();
+        runningTable = new javax.swing.JTable();
+        completedScrollPane = new javax.swing.JScrollPane();
+        completedTable = new javax.swing.JTable();
+        bnCancelJob = new javax.swing.JButton();
+        bnDeleteCase = new javax.swing.JButton();
+        lbPending = new javax.swing.JLabel();
+        lbRunning = new javax.swing.JLabel();
+        lbCompleted = new javax.swing.JLabel();
+        bnRefresh = new javax.swing.JButton();
+        bnCancelModule = new javax.swing.JButton();
+        bnExit = new javax.swing.JButton();
+        bnOptions = new javax.swing.JButton();
+        bnShowProgress = new javax.swing.JButton();
+        bnPause = new javax.swing.JButton();
+        bnPrioritizeCase = new javax.swing.JButton();
+        bnShowCaseLog = new javax.swing.JButton();
+        tbStatusMessage = new javax.swing.JTextField();
+        lbStatus = new javax.swing.JLabel();
+        bnPrioritizeJob = new javax.swing.JButton();
+        lbServicesStatus = new javax.swing.JLabel();
+        tbServicesStatusMessage = new javax.swing.JTextField();
+        bnOpenLogDir = new javax.swing.JButton();
+        bnReprocessJob = new javax.swing.JButton();
+
+        pendingTable.setModel(pendingTableModel);
+        pendingTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.pendingTable.toolTipText")); // NOI18N
+        pendingTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
+        pendingTable.setRowHeight(20);
+        pendingTable.setSelectionModel(new DefaultListSelectionModel() {
+            private static final long serialVersionUID = 1L;
+            @Override
+            public void setSelectionInterval(int index0, int index1) {
+                if (index0 == pendingTable.getSelectedRow()) {
+                    pendingTable.clearSelection();
+                } else {
+                    super.setSelectionInterval(index0, index1);
+                }
+            }
+        });
+        pendingTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
+        pendingScrollPane.setViewportView(pendingTable);
+
+        runningTable.setModel(runningTableModel);
+        runningTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.runningTable.toolTipText")); // NOI18N
+        runningTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
+        runningTable.setRowHeight(20);
+        runningTable.setSelectionModel(new DefaultListSelectionModel() {
+            private static final long serialVersionUID = 1L;
+            @Override
+            public void setSelectionInterval(int index0, int index1) {
+                if (index0 == runningTable.getSelectedRow()) {
+                    runningTable.clearSelection();
+                } else {
+                    super.setSelectionInterval(index0, index1);
+                }
+            }
+        });
+        runningTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
+        runningScrollPane.setViewportView(runningTable);
+
+        completedTable.setModel(completedTableModel);
+        completedTable.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.completedTable.toolTipText")); // NOI18N
+        completedTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
+        completedTable.setRowHeight(20);
+        completedTable.setSelectionModel(new DefaultListSelectionModel() {
+            private static final long serialVersionUID = 1L;
+            @Override
+            public void setSelectionInterval(int index0, int index1) {
+                if (index0 == completedTable.getSelectedRow()) {
+                    completedTable.clearSelection();
+                } else {
+                    super.setSelectionInterval(index0, index1);
+                }
+            }
+        });
+        completedTable.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
+        completedScrollPane.setViewportView(completedTable);
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnCancelJob, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelJob.text")); // NOI18N
+        bnCancelJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelJob.toolTipText")); // NOI18N
+        bnCancelJob.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnCancelJobActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnDeleteCase, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnDeleteCase.text")); // NOI18N
+        bnDeleteCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnDeleteCase.toolTipText")); // NOI18N
+        bnDeleteCase.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnDeleteCaseActionPerformed(evt);
+            }
+        });
+
+        lbPending.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
+        org.openide.awt.Mnemonics.setLocalizedText(lbPending, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbPending.text")); // NOI18N
+
+        lbRunning.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
+        org.openide.awt.Mnemonics.setLocalizedText(lbRunning, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbRunning.text")); // NOI18N
+
+        lbCompleted.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
+        org.openide.awt.Mnemonics.setLocalizedText(lbCompleted, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbCompleted.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnRefresh, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnRefresh.text")); // NOI18N
+        bnRefresh.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnRefresh.toolTipText")); // NOI18N
+        bnRefresh.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnRefreshActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnCancelModule, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelModule.text")); // NOI18N
+        bnCancelModule.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnCancelModule.toolTipText")); // NOI18N
+        bnCancelModule.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnCancelModuleActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnExit, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnExit.text")); // NOI18N
+        bnExit.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnExit.toolTipText")); // NOI18N
+        bnExit.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnExitActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnOptions, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnOptions.text")); // NOI18N
+        bnOptions.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnOptions.toolTipText")); // NOI18N
+        bnOptions.setEnabled(false);
+        bnOptions.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnOptionsActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnShowProgress, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowProgress.text")); // NOI18N
+        bnShowProgress.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowProgress.toolTipText")); // NOI18N
+        bnShowProgress.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnShowProgressActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnPause, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.text")); // NOI18N
+        bnPause.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPause.toolTipText")); // NOI18N
+        bnPause.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnPauseActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeCase, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeCase.text")); // NOI18N
+        bnPrioritizeCase.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeCase.toolTipText")); // NOI18N
+        bnPrioritizeCase.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnPrioritizeCaseActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnShowCaseLog, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowCaseLog.text")); // NOI18N
+        bnShowCaseLog.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnShowCaseLog.toolTipText")); // NOI18N
+        bnShowCaseLog.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnShowCaseLogActionPerformed(evt);
+            }
+        });
+
+        tbStatusMessage.setEditable(false);
+        tbStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
+        tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.tbStatusMessage.text")); // NOI18N
+        tbStatusMessage.setBorder(null);
+
+        lbStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
+        org.openide.awt.Mnemonics.setLocalizedText(lbStatus, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbStatus.text")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnPrioritizeJob, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeJob.text")); // NOI18N
+        bnPrioritizeJob.setToolTipText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeJob.toolTipText")); // NOI18N
+        bnPrioritizeJob.setActionCommand(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnPrioritizeJob.actionCommand")); // NOI18N
+        bnPrioritizeJob.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnPrioritizeJobActionPerformed(evt);
+            }
+        });
+
+        lbServicesStatus.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
+        org.openide.awt.Mnemonics.setLocalizedText(lbServicesStatus, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.lbServicesStatus.text")); // NOI18N
+
+        tbServicesStatusMessage.setEditable(false);
+        tbServicesStatusMessage.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
+        tbServicesStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.tbServicesStatusMessage.text")); // NOI18N
+        tbServicesStatusMessage.setBorder(null);
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnOpenLogDir, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnOpenLogDir.text")); // NOI18N
+        bnOpenLogDir.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnOpenLogDirActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(bnReprocessJob, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestLegacyDashboard.bnReprocessJob.text")); // NOI18N
+        bnReprocessJob.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bnReprocessJobActionPerformed(evt);
+            }
+        });
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+                            .addComponent(lbPending, javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE))
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addComponent(bnPrioritizeCase, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                            .addComponent(bnPrioritizeJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addGroup(layout.createSequentialGroup()
+                                .addComponent(bnPause)
+                                .addGap(18, 18, 18)
+                                .addComponent(bnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                .addGap(18, 18, 18)
+                                .addComponent(bnOptions)
+                                .addGap(18, 18, 18)
+                                .addComponent(bnOpenLogDir)
+                                .addGap(18, 18, 18)
+                                .addComponent(bnExit, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE))
+                            .addGroup(layout.createSequentialGroup()
+                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                                    .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE)
+                                    .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 920, javax.swing.GroupLayout.PREFERRED_SIZE))
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+                                    .addComponent(bnCancelJob, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE)
+                                    .addComponent(bnShowProgress, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE)
+                                    .addComponent(bnCancelModule, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE)
+                                    .addComponent(bnDeleteCase, javax.swing.GroupLayout.DEFAULT_SIZE, 117, Short.MAX_VALUE)
+                                    .addComponent(bnShowCaseLog, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                                    .addComponent(bnReprocessJob, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
+                            .addGroup(layout.createSequentialGroup()
+                                .addComponent(lbStatus)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                                .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE))
+                            .addComponent(lbCompleted)
+                            .addComponent(lbRunning)
+                            .addGroup(layout.createSequentialGroup()
+                                .addComponent(lbServicesStatus)
+                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                                .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, 861, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                        .addGap(0, 0, Short.MAX_VALUE)))
+                .addContainerGap())
+        );
+
+        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnPause, bnRefresh, bnShowProgress});
+
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(lbStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(tbStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(lbServicesStatus, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
+                    .addComponent(tbServicesStatusMessage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(lbPending, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(pendingScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 215, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(82, 82, 82)
+                        .addComponent(bnPrioritizeCase)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(bnPrioritizeJob)))
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(lbRunning)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(34, 34, 34)
+                        .addComponent(bnShowProgress)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(bnCancelJob)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(bnCancelModule))
+                    .addGroup(layout.createSequentialGroup()
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(runningScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(68, 68, 68)
+                        .addComponent(bnReprocessJob)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(bnDeleteCase)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(bnShowCaseLog))
+                    .addGroup(layout.createSequentialGroup()
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(lbCompleted)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addComponent(completedScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                                .addComponent(bnExit)
+                                .addComponent(bnOpenLogDir))
+                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                                .addComponent(bnPause)
+                                .addComponent(bnRefresh)
+                                .addComponent(bnOptions)))))
+                .addContainerGap())
+        );
+
+        layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {bnCancelJob, bnCancelModule, bnDeleteCase, bnExit, bnOpenLogDir, bnOptions, bnRefresh, bnShowProgress});
+
+    }// </editor-fold>//GEN-END:initComponents
+
+    /**
+     * Handles a click on the refresh button. Requests an immediate scan of the
+     * input folders for new jobs and queues a refresh of all three of the jobs
+     * tables.
+     *
+     * @param evt - The button click event.
+     */
+    private void bnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnRefreshActionPerformed
+        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+        manager.scanInputDirsAndWait();
+        refreshTables();
+        this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+    }//GEN-LAST:event_bnRefreshActionPerformed
+
+    /**
+     * Handles a click on the delete case button. If an entry is selected that
+     * can be deleted, pops up a confirmation dialog. Upon confirmation, asks
+     * AutoIngestManager to delete the entry and asks for an updated view.
+     *
+     * @param evt The button click event.
+     */
+    private void bnDeleteCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnDeleteCaseActionPerformed
+        if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) {
+            return;
+        }
+
+        String caseName = (String) completedTable.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal());
+        Object[] options = {
+            org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.Delete"),
+            org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DoNotDelete")
+        };
+        Object[] msgContent = {org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DeleteAreYouSure") + "\"" + caseName + "\"?"};
+        int reply = JOptionPane.showOptionDialog(this,
+                msgContent,
+                org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmDeletionHeader"),
+                JOptionPane.DEFAULT_OPTION,
+                JOptionPane.WARNING_MESSAGE,
+                null,
+                options,
+                options[JOptionPane.NO_OPTION]);
+        if (reply == JOptionPane.YES_OPTION) {
+            bnDeleteCase.setEnabled(false);
+            bnShowCaseLog.setEnabled(false);
+            if (completedTableModel.getRowCount() > 0 && completedTable.getSelectedRow() >= 0) {
+                Path caseDirectoryPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal());
+                completedTable.clearSelection();
+                this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+                CaseDeletionResult result = manager.deleteCase(caseName, caseDirectoryPath);
+                refreshTables();
+                this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+                if (CaseDeletionResult.FAILED == result) {
+                    JOptionPane.showMessageDialog(this,
+                            String.format("Could not delete case %s. It may be in in use.", caseName),
+                            org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.DeletionFailed"),
+                            JOptionPane.INFORMATION_MESSAGE);
+                } else if (CaseDeletionResult.PARTIALLY_DELETED == result) {
+                    JOptionPane.showMessageDialog(this,
+                            String.format("Could not delete case %s. See system log for details.", caseName),
+                            org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.DeletionFailed"),
+                            JOptionPane.INFORMATION_MESSAGE);
+                }
+            }
+        }
+    }//GEN-LAST:event_bnDeleteCaseActionPerformed
+
+    /**
+     * Handles a click on the cancel auto ingest job button. Cancels the
+     * selected job.
+     *
+     * @param evt The button click event.
+     */
+    private void bnCancelJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelJobActionPerformed
+        Object[] options = {
+            org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelJob"),
+            org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DoNotCancelJob")};
+        int reply = JOptionPane.showOptionDialog(this,
+                NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelJobAreYouSure"),
+                NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"),
+                JOptionPane.DEFAULT_OPTION,
+                JOptionPane.WARNING_MESSAGE,
+                null,
+                options,
+                options[1]);
+        if (reply == 0) {
+            /*
+             * Call setCursor on this to ensure it appears (if there is time to
+             * see it).
+             */
+            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+            manager.cancelCurrentJob();
+            refreshTables();
+            this.setCursor(Cursor.getDefaultCursor());
+        }
+    }//GEN-LAST:event_bnCancelJobActionPerformed
+
+    /**
+     * Handles a click on the show auto ingest job progress button. Displays an
+     * ingest job progress panel.
+     *
+     * @param evt The button click event.
+     */
+    private void bnShowProgressActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowProgressActionPerformed
+        IngestProgressSnapshotDialog dialog = new IngestProgressSnapshotDialog(this.getTopLevelAncestor(), true);
+    }//GEN-LAST:event_bnShowProgressActionPerformed
+
+    /**
+     * Handles a click on the pause/resume auto ingest job button. Sends a
+     * pause/resume request to the auto ingest manager.
+     *
+     * @param evt The button click event.
+     */
+    private void bnPauseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPauseActionPerformed
+        
+        if (!autoIngestStarted) {
+            //put up a wait cursor during the start up operation
+            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+
+            startUp();
+
+            this.setCursor(null);
+            //done for startup
+            return;
+        }
+        if (!isPaused) {
+            tbStatusMessage.setText(org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.bnPause.pausing"));
+            pause(true);
+        } else {
+            resume();
+        }
+        isPaused = !isPaused;
+    }//GEN-LAST:event_bnPauseActionPerformed
+
+    /**
+     * Handles a click on the options button. Displays the options window.
+     *
+     * @param evt The button click event.
+     */
+    private void bnOptionsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOptionsActionPerformed
+        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+        OptionsDisplayer.getDefault().open();
+        setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+    }//GEN-LAST:event_bnOptionsActionPerformed
+
+    /**
+     * Handles a click on the cancel ingest module button. Cancels the currently
+     * running data source level ingest module for the selected job.
+     *
+     * @param evt The button click event.
+     */
+    private void bnCancelModuleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnCancelModuleActionPerformed
+        Object[] options = {
+            org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelModule"),
+            org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.DoNotCancelModule")};
+        int reply = JOptionPane.showOptionDialog(this,
+                NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.CancelModuleAreYouSure"),
+                NbBundle.getMessage(AutoIngestLegacyDashboard.class, "ConfirmationDialog.ConfirmCancellationHeader"),
+                JOptionPane.DEFAULT_OPTION,
+                JOptionPane.WARNING_MESSAGE,
+                null,
+                options,
+                options[1]);
+        if (reply == 0) {
+            /*
+             * Call setCursor on this to ensure it appears (if there is time to
+             * see it).
+             */
+            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+            manager.cancelCurrentDataSourceLevelIngestModule();
+            refreshTables();
+            this.setCursor(Cursor.getDefaultCursor());
+        }
+    }//GEN-LAST:event_bnCancelModuleActionPerformed
+
+    /**
+     * Handles a click on the exit button. Shuts down auto ingest.
+     *
+     * @param evt The button click event.
+     */
+    private void bnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnExitActionPerformed
+        shutdown();
+    }//GEN-LAST:event_bnExitActionPerformed
+
+    /**
+     * Handle a click on the prioritize case button. Requests prioritization of
+     * all of the auto ingest jobs for a case.
+     *
+     * @param evt The button click event.
+     */
+    private void bnPrioritizeCaseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeCaseActionPerformed
+        if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) {
+            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+            String caseName = (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.CASE.ordinal())).toString();
+            manager.prioritizeCase(caseName);
+            refreshTables();
+            pendingTable.clearSelection();
+            enablePendingTableButtons(false);
+            AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor());
+        }
+    }//GEN-LAST:event_bnPrioritizeCaseActionPerformed
+
+    /**
+     * Handles a click on the show log button. Displays the auto ingest job log
+     * for a case in NotePad.
+     *
+     * @param evt The button click event.
+     */
+    private void bnShowCaseLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnShowCaseLogActionPerformed
+        try {
+            int selectedRow = completedTable.getSelectedRow();
+            if (selectedRow != -1) {
+                Path caseDirectoryPath = (Path) completedTableModel.getValueAt(selectedRow, JobsTableModelColumns.CASE_DIRECTORY_PATH.ordinal());
+                if (null != caseDirectoryPath) {
+                    Path pathToLog = AutoIngestJobLogger.getLogPath(caseDirectoryPath);
+                    if (pathToLog.toFile().exists()) {
+                        Desktop.getDesktop().edit(pathToLog.toFile());
+                    } else {
+                        JOptionPane.showMessageDialog(this, org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ShowLogFailed.Message"),
+                                org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "AutoIngestDashboard.ShowLogFailed.Title"), JOptionPane.ERROR_MESSAGE);
+                    }
+                } else {
+                    MessageNotifyUtil.Message.warn("The case directory for this job has been deleted.");
+                }
+            }
+        } catch (IOException ex) {
+            SYS_LOGGER.log(Level.SEVERE, "Dashboard error attempting to display case auto ingest log", ex);
+            Object[] options = {org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "DisplayLogDialog.okay")};
+            JOptionPane.showOptionDialog(this,
+                    org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "DisplayLogDialog.cannotFindLog"),
+                    org.openide.util.NbBundle.getMessage(AutoIngestLegacyDashboard.class, "DisplayLogDialog.unableToShowLogFile"),
+                    JOptionPane.DEFAULT_OPTION,
+                    JOptionPane.PLAIN_MESSAGE,
+                    null,
+                    options,
+                    options[0]);
+        }
+    }//GEN-LAST:event_bnShowCaseLogActionPerformed
+
+    private void bnPrioritizeJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnPrioritizeJobActionPerformed
+        if (pendingTableModel.getRowCount() > 0 && pendingTable.getSelectedRow() >= 0) {
+            this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+            Path manifestFilePath = (Path) (pendingTableModel.getValueAt(pendingTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal()));
+            manager.prioritizeJob(manifestFilePath);
+            refreshTables();
+            pendingTable.clearSelection();
+            enablePendingTableButtons(false);
+            AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor());
+        }
+    }//GEN-LAST:event_bnPrioritizeJobActionPerformed
+
+    private void bnOpenLogDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnOpenLogDirActionPerformed
+        Path logDirPath = Paths.get(PlatformUtil.getUserDirectory().getAbsolutePath(), "var", "log");
+        File logDir = logDirPath.toFile();
+        try {
+            Desktop.getDesktop().open(logDir);
+        } catch (IOException ex) {
+            DialogDisplayer.getDefault().notify(new NotifyDescriptor.Message(
+                    String.format("Unable to open log directory %s:\n%s", logDirPath, ex.getLocalizedMessage()),
+                    NotifyDescriptor.ERROR_MESSAGE));
+        }
+    }//GEN-LAST:event_bnOpenLogDirActionPerformed
+
+    private void bnReprocessJobActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bnReprocessJobActionPerformed
+        if (completedTableModel.getRowCount() < 0 || completedTable.getSelectedRow() < 0) {
+            return;
+        }
+        this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+        Path manifestPath = (Path) completedTableModel.getValueAt(completedTable.getSelectedRow(), JobsTableModelColumns.MANIFEST_FILE_PATH.ordinal());
+        manager.reprocessJob(manifestPath);
+        refreshTables();
+        AutoIngestLegacyDashboard.this.setCursor(Cursor.getDefaultCursor());
+    }//GEN-LAST:event_bnReprocessJobActionPerformed
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton bnCancelJob;
+    private javax.swing.JButton bnCancelModule;
+    private javax.swing.JButton bnDeleteCase;
+    private javax.swing.JButton bnExit;
+    private javax.swing.JButton bnOpenLogDir;
+    private javax.swing.JButton bnOptions;
+    private javax.swing.JButton bnPause;
+    private javax.swing.JButton bnPrioritizeCase;
+    private javax.swing.JButton bnPrioritizeJob;
+    private javax.swing.JButton bnRefresh;
+    private javax.swing.JButton bnReprocessJob;
+    private javax.swing.JButton bnShowCaseLog;
+    private javax.swing.JButton bnShowProgress;
+    private javax.swing.JScrollPane completedScrollPane;
+    private javax.swing.JTable completedTable;
+    private javax.swing.JLabel lbCompleted;
+    private javax.swing.JLabel lbPending;
+    private javax.swing.JLabel lbRunning;
+    private javax.swing.JLabel lbServicesStatus;
+    private javax.swing.JLabel lbStatus;
+    private javax.swing.JScrollPane pendingScrollPane;
+    private javax.swing.JTable pendingTable;
+    private javax.swing.JScrollPane runningScrollPane;
+    private javax.swing.JTable runningTable;
+    private javax.swing.JTextField tbServicesStatusMessage;
+    private javax.swing.JTextField tbStatusMessage;
+    // End of variables declaration//GEN-END:variables
+
+}
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties
index cddf2ed8609923e0c853573628215ba8bde41c1f..5b755dfb011ebb1d4fe55dc8107020ca07c0b7d6 100644
--- a/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/autoingest/Bundle.properties
@@ -1,11 +1,4 @@
 CTL_OpenAction=Open Case...
-AutoIngestDashboard.bnRefresh.text=&Refresh
-AutoIngestDashboard.lbCompleted.text=Completed Jobs
-AutoIngestDashboard.lbRunning.text=Running Jobs
-AutoIngestDashboard.lbPending.text=Pending Jobs
-AutoIngestDashboard.bnCancelModule.text=Cancel &Module
-AutoIngestDashboard.bnExit.text=&Exit
-AutoIngestDashboard.bnOptions.text=&Options
 AutoIngestDashboard.JobsTableModel.ColumnHeader.Case=Case
 AutoIngestDashboard.JobsTableModel.ColumnHeader.ImageFolder=Data Source
 AutoIngestDashboard.JobsTableModel.ColumnHeader.HostName=Host Name
@@ -15,23 +8,12 @@ AutoIngestDashboard.JobsTableModel.ColumnHeader.CompletedTime=Job Completed
 AutoIngestDashboard.JobsTableModel.ColumnHeader.Stage=Stage
 AutoIngestDashboard.JobsTableModel.ColumnHeader.Status=Status
 AutoIngestDashboard.JobsTableModel.ColumnHeader.ManifestFilePath= Manifest File Path
-AutoIngestDashboard.bnShowProgress.text=Ingest Progress
 AutoIngestDashboard.bnResume.text=Resume
-AutoIngestDashboard.bnPause.text=Pause
 AutoIngestDashboard.bnPause.confirmHeader=Are you sure you want to pause?
 AutoIngestDashboard.bnPause.warningText=Pause will occur after the current job completes processing. This could take a long time. Continue?
-AutoIngestDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs
 AutoIngestDashboard.bnPause.toolTipTextResume=Resume processing of Pending Jobs
 AutoIngestDashboard.bnPause.pausing=Pausing after current job completes...
-AutoIngestDashboard.bnRefresh.toolTipText=Refresh displayed tables
-AutoIngestDashboard.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node.
-AutoIngestDashboard.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node.
-AutoIngestDashboard.bnExit.toolTipText=Exit Application
 AutoIngestDashboard.Cancelling=Cancelling...
-AutoIngestDashboard.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel.
-AutoIngestDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first
-AutoIngestDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it
-AutoIngestDashboard.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already
 AutoIngestDashboard.JobsTableModel.ColumnHeader.StageTime=Time in Stage
 AutoIngestDashboard.JobsTableModel.ColumnHeader.CaseFolder=Case Folder
 AutoIngestDashboard.JobsTableModel.ColumnHeader.LocalJob= Local Job?
@@ -163,20 +145,12 @@ CopyFilesPanel.ConfirmCopyAdd=exists. Do you really want to copy more files to t
 CopyFilesPanel.ConfirmCopyYes=Copy
 CopyFilesPanel.ConfirmCopyNo=Do not copy
 ConfirmationDialog.ConfirmUnlockHeader=Confirm Case Unlock
-AutoIngestDashboard.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.
-AutoIngestDashboard.bnPrioritizeCase.text=Prioriti&ze Case
-AutoIngestDashboard.bnShowCaseLog.toolTipText=Display case log file for selected case
-AutoIngestDashboard.bnShowCaseLog.text=Show Case &Log
 CopyFilesPanel.bnCancelPendingJob.text=Ca&ncel
 CopyFilesPanel.tbDestinationCase.text=
 CopyFilesPanel.cbThrottleNetwork.text=&Throttle Network
 CopyFilesPanel.cbThrottleNetwork.toolTipText=<html>Select this box if a low-bandwidth network connection is involved in this copy job.<br>\nSelecting this box will artificially limit the transfer speed by inserting strategic delays.<br>\nThis helps copy files across low-bandwidth networks where the transfer would<br>\notherwise fail. Only select this if you are having problems copying across the network.</html>
 CopyFilesPanel.bnShowCurrentLog.text=Show &Log
 CopyFilesPanel.bnShowCurrentLog.text=Show &Log
-AutoIngestDashboard.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node.
-AutoIngestDashboard.bnCancelJob.text=&Cancel Job
-AutoIngestDashboard.bnDeleteCase.toolTipText=Delete the selected Case in its entirety
-AutoIngestDashboard.bnDeleteCase.text=&Delete Case
 CopyFilesPanel.lbCaseName.text=Case Name
 CaseStatusIconCellRenderer.tooltiptext.ok=Images processed successfully
 CaseStatusIconCellRenderer.tooltiptext.warning=An error occurred or processing was canceled for at least one image - please check the log
@@ -199,7 +173,6 @@ CaseImportPanel.Error=Error
 CaseImportPanel.Complete=Complete
 CaseImportPanel.Blank=
 CaseImportPanel.DeleteWarning=Make sure no important files are in the case source directory
-AutoIngestDashboard.lbStatus.text=Status:
 SingleUserCaseImporter.NonUniqueOutputFolder=Output folder not unique. Skipping 
 SingleUserCaseImporter.WillImport=Will import:
 SingleUserCaseImporter.None=None
@@ -222,9 +195,6 @@ ReviewModeCasePanel.StatusIconHeaderText=Status
 ReviewModeCasePanel.OutputFolderHeaderText=Output Folder
 ReviewModeCasePanel.LastAccessedTimeHeaderText=Last Accessed Time
 CopyFilesPanel.bnOptions.text=&Options
-AutoIngestDashboard.lbServicesStatus.text=Services Status:
-AutoIngestDashboard.tbServicesStatusMessage.text=
-AutoIngestDashboard.tbStatusMessage.text=
 FileExporterSettingsPanel.ChooseRootDirectory=Choose a root directory for file output
 FileExporterSettingsPanel.ChooseReportDirectory=Choose a report directory
 FileExporterSettingsPanel.RuleName=Rule Name
@@ -283,12 +253,7 @@ FileExporterSettingsPanel.BrowseReportTooltip_1=Browse for the Reports Folder
 FileExporterSettingsPanel.NewRuleTooltip_1=Clear the rule editor to begin a new rule
 FileExporterSettingsPanel.DeleteTooltip_1=Delete the selected rule
 FileExporterSettingsPanel.SaveTooltip_1=Save the current rule
-AutoIngestDashboard.bnOpenLogDir.text=Open System Logs Directory
-AutoIngestDashboard.bnPrioritizeJob.text=Prioritize Job
-AutoIngestDashboard.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue.
-AutoIngestDashboard.bnReprocessJob.text=Reprocess Job
 AutoIngestDashboard.bnPrioritizeFolder.label=<AutoIngestDashboard.bnPrioritizeJob.text>
-AutoIngestDashboard.bnPrioritizeJob.actionCommand=<AutoIngestDashboard.bnPrioritizeJob.text>
 AutoIngestCasePanel.rbDays.text=Days
 AutoIngestCasePanel.rbWeeks.text=Weeks
 AutoIngestCasePanel.rbMonths.text=Months
@@ -298,3 +263,73 @@ AutoIngestCasePanel.bnOpen.text=&Open
 AutoIngestCasePanel.bnShowLog.toolTipText=Display case log file for selected case
 AutoIngestCasePanel.bnShowLog.text=&Show Log
 AutoIngestCasePanel.rbGroupLabel.text=Show Last 10:
+AutoIngestLegacyDashboard.tbStatusMessage.text=
+AutoIngestLegacyDashboard.bnShowCaseLog.toolTipText=Display case log file for selected case
+AutoIngestLegacyDashboard.bnShowCaseLog.text=Show Case &Log
+AutoIngestLegacyDashboard.bnDeleteCase.toolTipText=Delete the selected Case in its entirety
+AutoIngestLegacyDashboard.bnDeleteCase.text=&Delete Case
+AutoIngestLegacyDashboard.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node.
+AutoIngestLegacyDashboard.bnCancelJob.text=&Cancel Job
+AutoIngestLegacyDashboard.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already
+AutoIngestLegacyDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it
+AutoIngestLegacyDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first
+AutoIngestLegacyDashboard.bnPrioritizeCase.toolTipText=Move all images associated with a case to top of Pending queue.
+AutoIngestLegacyDashboard.bnPrioritizeCase.text=Prioriti&ze Case
+AutoIngestLegacyDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs
+AutoIngestLegacyDashboard.bnPause.text=Pause
+AutoIngestLegacyDashboard.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node.
+AutoIngestLegacyDashboard.bnShowProgress.text=Ingest Progress
+AutoIngestLegacyDashboard.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel.
+AutoIngestLegacyDashboard.bnOptions.text=&Options
+AutoIngestLegacyDashboard.bnExit.toolTipText=Exit Application
+AutoIngestLegacyDashboard.bnExit.text=&Exit
+AutoIngestLegacyDashboard.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node.
+AutoIngestLegacyDashboard.bnCancelModule.text=Cancel &Module
+AutoIngestLegacyDashboard.bnRefresh.toolTipText=Refresh displayed tables
+AutoIngestLegacyDashboard.bnRefresh.text=&Refresh
+AutoIngestLegacyDashboard.lbCompleted.text=Completed Jobs
+AutoIngestLegacyDashboard.lbRunning.text=Running Jobs
+AutoIngestLegacyDashboard.lbPending.text=Pending Jobs
+AutoIngestLegacyDashboard.bnReprocessJob.text=Reprocess Job
+AutoIngestLegacyDashboard.bnOpenLogDir.text=Open System Logs Directory
+AutoIngestLegacyDashboard.tbServicesStatusMessage.text=
+AutoIngestLegacyDashboard.lbServicesStatus.text=Services Status:
+AutoIngestLegacyDashboard.bnPrioritizeJob.actionCommand=<AutoIngestDashboard.bnPrioritizeJob.text>
+AutoIngestLegacyDashboard.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue.
+AutoIngestLegacyDashboard.bnPrioritizeJob.text=Prioritize Job
+AutoIngestLegacyDashboard.lbStatus.text=Status:
+AutoIngestDashboard.bnRefresh.text=&Refresh
+AutoIngestDashboard.lbCompleted.text=Completed Jobs
+AutoIngestDashboard.lbRunning.text=Running Jobs
+AutoIngestDashboard.lbPending.text=Pending Jobs
+AutoIngestDashboard.bnDeleteCase.toolTipText=Delete the selected Case in its entirety
+AutoIngestDashboard.bnDeleteCase.text=&Delete Case
+AutoIngestDashboard.bnCancelJob.toolTipText=Cancel processing of the current Job and move on to the next Job. This functionality is only available for jobs running on current AIM node.
+AutoIngestDashboard.bnCancelJob.text=&Cancel Job
+AutoIngestDashboard.completedTable.toolTipText=The Completed table shows all Jobs that have been processed already
+AutoIngestDashboard.bnReprocessJob.text=Reprocess Job
+AutoIngestDashboard.bnOpenLogDir.text=Open System Logs Directory
+AutoIngestDashboard.runningTable.toolTipText=The Running table displays the currently running Job and information about it
+AutoIngestDashboard.tbServicesStatusMessage.text=
+AutoIngestDashboard.pendingTable.toolTipText=The Pending table displays the order upcoming Jobs will be processed with the top of the list first
+AutoIngestDashboard.lbServicesStatus.text=Services Status:
+AutoIngestDashboard.bnPrioritizeJob.actionCommand=<AutoIngestDashboard.bnPrioritizeJob.text>
+AutoIngestDashboard.bnPrioritizeJob.toolTipText=Move this folder to the top of the Pending queue.
+AutoIngestDashboard.bnPrioritizeJob.text=Prioritize Job
+AutoIngestDashboard.lbStatus.text=Status:
+AutoIngestDashboard.tbStatusMessage.text=
+AutoIngestDashboard.bnShowCaseLog.toolTipText=Display case log file for selected case
+AutoIngestDashboard.bnShowCaseLog.text=Show Case &Log
+AutoIngestDashboard.bnPrioritizeCase.toolTipText_1=Move all images associated with a case to top of Pending queue.
+AutoIngestDashboard.bnPrioritizeCase.text_1=Prioriti&ze Case
+AutoIngestDashboard.bnPause.toolTipText=Suspend processing of Pending Jobs
+AutoIngestDashboard.bnPause.text=Pause
+AutoIngestDashboard.bnShowProgress.toolTipText=Show the progress of the currently running Job. This functionality is only available for jobs running on current AIM node.
+AutoIngestDashboard.bnShowProgress.text=Ingest Progress
+AutoIngestDashboard.bnOptions.toolTipText=Display options panel. All processing must be paused to open the options panel.
+AutoIngestDashboard.bnOptions.text=&Options
+AutoIngestDashboard.bnExit.toolTipText=Exit Application
+AutoIngestDashboard.bnExit.text=&Exit
+AutoIngestDashboard.bnCancelModule.toolTipText=Cancel processing of the current module within the Job and move on to the next module within the Job. This functionality is only available for jobs running on current AIM node.
+AutoIngestDashboard.bnCancelModule.text=Cancel &Module
+AutoIngestDashboard.bnRefresh.toolTipText=Refresh displayed tables
diff --git a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java
index e0cae099c9dc81a6d7c287801cce9deaa7e909eb..a9a6a0d269d6e85d9ed0d963cac1f5f95ea52f56 100644
--- a/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java
+++ b/Experimental/src/org/sleuthkit/autopsy/experimental/configuration/StartupWindow.java
@@ -26,17 +26,20 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import javax.swing.JDialog;
+import javax.swing.SwingUtilities;
 import javax.swing.WindowConstants;
 import org.openide.util.ImageUtilities;
 import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
 import org.openide.util.lookup.ServiceProvider;
 import org.openide.windows.WindowManager;
 import org.sleuthkit.autopsy.casemodule.CueBannerPanel;
 import org.sleuthkit.autopsy.casemodule.StartupWindowInterface;
 import org.sleuthkit.autopsy.core.UserPreferences;
 import org.sleuthkit.autopsy.coreutils.NetworkUtils;
-import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboard;
+import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestLegacyDashboard;
 import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestCasePanel;
+import org.sleuthkit.autopsy.experimental.autoingest.AutoIngestDashboardOpenAction;
 
 /**
  * The default implementation of the Autopsy startup window
@@ -113,17 +116,20 @@ private void addPanelForMode() {
                 this.addWindowListener(new WindowAdapter() {
                     @Override
                     public void windowClosing(WindowEvent e) {
-                        AutoIngestDashboard.getInstance().shutdown();
+                        AutoIngestLegacyDashboard.getInstance().shutdown();
                     }
                 });
                 setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
-                add(AutoIngestDashboard.getInstance());
+                add(AutoIngestLegacyDashboard.getInstance());
                 break;
             case REVIEW:
                 this.setTitle(NbBundle.getMessage(StartupWindow.class, "StartupWindow.ReviewMode") + " (" + LOCAL_HOST_NAME + ")");
                 caseManagementPanel = new AutoIngestCasePanel(this);
                 setIconImage(ImageUtilities.loadImage("org/sleuthkit/autopsy/experimental/images/frame.gif", false)); //NON-NLS
                 add(caseManagementPanel);
+                SwingUtilities.invokeLater(() -> {
+                    CallableSystemAction.get(AutoIngestDashboardOpenAction.class).setEnabled(true);
+                });
                 break;
             default:                
                 welcomeWindow = new CueBannerPanel();