diff --git a/Testing/nbproject/project.xml b/Testing/nbproject/project.xml
index bf4478337bdd7667a83f3e7c6138da73e13e1277..cfaf244b7b4b2f0a8d42965b0ca92d2f94a80779 100644
--- a/Testing/nbproject/project.xml
+++ b/Testing/nbproject/project.xml
@@ -6,6 +6,41 @@
             <code-name-base>org.sleuthkit.autopsy.testing</code-name-base>
             <suite-component/>
             <module-dependencies>
+                <dependency>
+                    <code-name-base>org.netbeans.libs.junit4</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.14</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.jellytools.platform</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>3</release-version>
+                        <specification-version>3.28.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.jemmy</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>3</release-version>
+                        <specification-version>3.26.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.nbjunit</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.86.1</specification-version>
+                    </run-dependency>
+                </dependency>
                 <dependency>
                     <code-name-base>org.sleuthkit.autopsy.core</code-name-base>
                     <build-prerequisite/>
@@ -63,7 +98,9 @@
                     </test-dependency>
                 </test-type>
             </test-dependencies>
-            <public-packages/>
+            <public-packages>
+                <package>org.sleuthkit.autopsy.testing</package>
+            </public-packages>
         </data>
     </configuration>
 </project>
diff --git a/Testing/src/org/sleuthkit/autopsy/testing/AutopsyTestCases.java b/Testing/src/org/sleuthkit/autopsy/testing/AutopsyTestCases.java
new file mode 100755
index 0000000000000000000000000000000000000000..6368a5d8d926b0109dcf3ffd68c3167f422ae9d0
--- /dev/null
+++ b/Testing/src/org/sleuthkit/autopsy/testing/AutopsyTestCases.java
@@ -0,0 +1,290 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.sleuthkit.autopsy.testing;
+
+import java.awt.AWTException;
+import java.awt.Rectangle;
+import java.awt.Robot;
+import java.awt.Toolkit;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.imageio.ImageIO;
+import javax.swing.JDialog;
+import javax.swing.text.JTextComponent;
+import org.netbeans.jellytools.MainWindowOperator;
+import org.netbeans.jellytools.NbDialogOperator;
+import org.netbeans.jellytools.WizardOperator;
+import org.netbeans.jemmy.Timeout;
+import org.netbeans.jemmy.operators.JButtonOperator;
+import org.netbeans.jemmy.operators.JCheckBoxOperator;
+import org.netbeans.jemmy.operators.JComboBoxOperator;
+import org.netbeans.jemmy.operators.JDialogOperator;
+import org.netbeans.jemmy.operators.JFileChooserOperator;
+import org.netbeans.jemmy.operators.JLabelOperator;
+import org.netbeans.jemmy.operators.JListOperator;
+import org.netbeans.jemmy.operators.JTabbedPaneOperator;
+import org.netbeans.jemmy.operators.JTableOperator;
+import org.netbeans.jemmy.operators.JTextFieldOperator;
+import org.sleuthkit.autopsy.ingest.IngestManager;
+
+public class AutopsyTestCases {
+
+    private static final Logger logger = Logger.getLogger(AutopsyTestCases.class.getName());
+    private long start;
+    /**
+     * This method is used to escape file/directory path. Example:
+     * \\NetworkLocation\foo\bar get escaped to \\\\NetworkLocation\foo\bar so
+     * that it can be used as intended.
+     *
+     * @param path
+     *
+     * @return escaped path the the file/directory location.
+     */
+    public static String getEscapedPath(String path) {
+        if (path.startsWith("\\\\")) { //already has escaped to \\\\NetworkLocation
+            return path;
+        }
+        if (path.startsWith("\\")) {
+            return "\\" + path;
+        } else {
+            return path;
+        }
+    }
+
+    public AutopsyTestCases () {
+        start = 0;
+    }
+    
+    public void testNewCaseWizardOpen(String title) {
+        logger.info("New Case");
+        NbDialogOperator nbdo = new NbDialogOperator(title);
+        JButtonOperator jbo = new JButtonOperator(nbdo, 0); // the "New Case" button
+        jbo.pushNoBlock();
+    }
+
+    public void testNewCaseWizard() {
+        logger.info("New Case Wizard");
+        WizardOperator wo = new WizardOperator("New Case Information");
+        JTextFieldOperator jtfo0 = new JTextFieldOperator(wo, 1);
+        jtfo0.typeText("AutopsyTestCase"); // Name the case "AutopsyTestCase"
+        JTextFieldOperator jtfo1 = new JTextFieldOperator(wo, 2);
+        jtfo1.typeText(getEscapedPath(System.getProperty("out_path")));
+        wo.btNext().clickMouse();
+        JTextFieldOperator jtfo2 = new JTextFieldOperator(wo, 0);
+        jtfo2.typeText("000"); // Set the case number
+        JTextFieldOperator jtfo3 = new JTextFieldOperator(wo, 1);
+        jtfo3.typeText("Examiner 1"); // Set the case examiner
+        start = System.currentTimeMillis();
+        wo.btFinish().clickMouse();
+    }
+    
+    public void testStartAddImageFileDataSource() {
+        logger.info("Starting Add Image process");
+        WizardOperator wo = new WizardOperator("Add Data");
+        JTextFieldOperator jtfo0 = new JTextFieldOperator(wo, 0);
+        String img_path = getEscapedPath(System.getProperty("img_path"));
+        String imageDir = img_path;
+        ((JTextComponent) jtfo0.getSource()).setText(imageDir);
+        JComboBoxOperator comboBoxOperator = new JComboBoxOperator(wo, 1);
+        comboBoxOperator.setSelectedItem("(GMT-5:00) America/New_York");
+        wo.btNext().clickMouse();
+    }
+
+    public void testStartAddLogicalFilesDataSource() {
+        logger.info("Starting Add Logical Files process");
+        WizardOperator wo = new WizardOperator("Add Data");
+        JComboBoxOperator comboBoxOperator = new JComboBoxOperator(wo);
+        // select the item indexed 2 (Logical Files) from the drop-down list.
+        comboBoxOperator.selectItem(2);
+        JButtonOperator addButtonOperator = new JButtonOperator(wo, "Add");
+        addButtonOperator.pushNoBlock();
+        JFileChooserOperator fileChooserOperator = new JFileChooserOperator();
+        fileChooserOperator.setCurrentDirectory(new File(getEscapedPath(System.getProperty("img_path"))));
+        // set the current directory one level above the directory containing logicalFileSet folder.
+        fileChooserOperator.goUpLevel();
+        fileChooserOperator.chooseFile(new File(getEscapedPath(System.getProperty("img_path"))).getName());
+        wo.btNext().clickMouse();
+    }
+
+    public void testAddSourceWizard1() {
+        WizardOperator wo = new WizardOperator("Add Data");
+        while (!wo.btFinish().isEnabled()) {
+            new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
+        }
+        logger.log(Level.INFO, "Add image took {0}ms", (System.currentTimeMillis() - start));
+        wo.btFinish().clickMouse();
+    }
+
+    public void testConfigureIngest1() {
+        /*
+         * This timeout is to allow the setup for the ingest job settings panel
+         * to complete.
+         */
+        new Timeout("pausing", 10000).sleep();
+
+        logger.info("Looking for hash lookup module in ingest job settings panel");
+        WizardOperator wo = new WizardOperator("Add Data");
+        JTableOperator jto = new JTableOperator(wo, 0);
+        int row = jto.findCellRow("Hash Lookup", 2, 0);
+        jto.clickOnCell(row, 1);
+        logger.info("Selected hash lookup module in ingest job settings panel");
+        JButtonOperator jbo1 = new JButtonOperator(wo, "Global Settings");
+        jbo1.pushNoBlock();
+        logger.info("Pushed Global Settings button for hash lookup module in ingest job settings panel");
+    }
+
+    public void testConfigureHash() {
+        logger.info("Hash Configure");
+        JDialog hashMainDialog = JDialogOperator.waitJDialog("Global Hash Lookup Settings", false, false);
+        JDialogOperator hashMainDialogOperator = new JDialogOperator(hashMainDialog);
+        List<String> databases = new ArrayList<>();
+        databases.add(getEscapedPath(System.getProperty("nsrl_path")));
+        databases.add(getEscapedPath(System.getProperty("known_bad_path")));
+        databases.stream().map((database) -> {
+            JButtonOperator importButtonOperator = new JButtonOperator(hashMainDialogOperator, "Import");
+            importButtonOperator.pushNoBlock();
+            JDialog addDatabaseDialog = JDialogOperator.waitJDialog("Import Hash Database", false, false);
+            JDialogOperator addDatabaseDialogOperator = new JDialogOperator(addDatabaseDialog);
+            JButtonOperator browseButtonOperator = new JButtonOperator(addDatabaseDialogOperator, "Open...", 0);
+            browseButtonOperator.pushNoBlock();
+            JFileChooserOperator fileChooserOperator = new JFileChooserOperator();
+            fileChooserOperator.chooseFile(database);
+            JButtonOperator okButtonOperator = new JButtonOperator(addDatabaseDialogOperator, "OK", 0);
+            return okButtonOperator;
+        }).map((okButtonOperator) -> {
+            okButtonOperator.pushNoBlock();
+            return okButtonOperator;
+        }).forEach((_item) -> {
+            new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
+        });
+        // Used if the database has no index
+        //JDialog jd3 = JDialogOperator.waitJDialog("No Index Exists", false, false);
+        //JDialogOperator jdo3 = new JDialogOperator(jd3);
+        //JButtonOperator jbo3 = new JButtonOperator(jdo3, "Yes", 0);
+        new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
+        //jbo3.pushNoBlock();
+        JButtonOperator jbo4 = new JButtonOperator(hashMainDialogOperator, "OK", 0);
+        jbo4.pushNoBlock();
+    }
+
+    public void testConfigureIngest2() {
+        logger.info("Looking for keyword search module in ingest job settings panel");
+        WizardOperator wo = new WizardOperator("Add Data");
+        JTableOperator jto = new JTableOperator(wo, 0);
+        int row = jto.findCellRow("Keyword Search", 2, 0);
+        jto.clickOnCell(row, 1);
+        logger.info("Selected keyword search module in ingest job settings panel");
+        JButtonOperator jbo1 = new JButtonOperator(wo, "Global Settings");
+        jbo1.pushNoBlock();
+        logger.info("Pushed Global Settings button for keyword search module in ingest job settings panel");
+    }
+
+    public void testConfigureSearch() {
+        logger.info("Search Configure");
+        JDialog jd = JDialogOperator.waitJDialog("Global Keyword Search Settings", false, false);
+        JDialogOperator jdo = new JDialogOperator(jd);
+        String words = getEscapedPath(System.getProperty("keyword_path"));
+        JButtonOperator jbo0 = new JButtonOperator(jdo, "Import List", 0);
+        jbo0.pushNoBlock();
+        JFileChooserOperator jfco0 = new JFileChooserOperator();
+        jfco0.chooseFile(words);
+        JTableOperator jto = new JTableOperator(jdo, 0);
+        jto.clickOnCell(0, 0);
+        new Timeout("pausing", 1000).sleep(); // give it a second to process
+        if (Boolean.parseBoolean(System.getProperty("mugen_mode"))) {
+            JTabbedPaneOperator jtpo = new JTabbedPaneOperator(jdo);
+            jtpo.selectPage("String Extraction");
+            JCheckBoxOperator jcbo0 = new JCheckBoxOperator(jtpo, "Arabic (Arabic)");
+            jcbo0.doClick();
+            JCheckBoxOperator jcbo1 = new JCheckBoxOperator(jtpo, "Han (Chinese, Japanese, Korean)");
+            jcbo1.doClick();
+            new Timeout("pausing", 1000).sleep(); // give it a second to process
+        }
+        JButtonOperator jbo2 = new JButtonOperator(jdo, "OK", 0);
+        jbo2.pushNoBlock();
+        WizardOperator wo = new WizardOperator("Add Data");
+        new Timeout("pausing", 10000).sleep(); // let things catch up
+        wo.btNext().clickMouse();
+    }
+
+    public void testIngest() {
+        logger.info("Ingest 3");
+        new Timeout("pausing", 10000).sleep(); // wait for ingest to actually start
+        long startIngest = System.currentTimeMillis();
+        IngestManager man = IngestManager.getInstance();
+        while (man.isIngestRunning()) {
+            new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
+        }
+        logger.log(Level.INFO, "Ingest (including enqueue) took {0}ms", (System.currentTimeMillis() - startIngest));
+        // allow keyword search to finish saving artifacts, just in case
+        //   but randomize the timing so that we don't always get the same error
+        //   consistently, making it seem like default behavior
+        Random rand = new Random();
+        new Timeout("pausing", 10000 + (rand.nextInt(15000) + 5000)).sleep();
+        screenshot("Finished Ingest");
+
+    }
+
+    public void testGenerateReportToolbar() {
+        logger.info("Generate Report Toolbars");
+        MainWindowOperator mwo = MainWindowOperator.getDefault();
+        JButtonOperator jbo = new JButtonOperator(mwo, "Generate Report");
+        jbo.pushNoBlock();
+        new Timeout("pausing", 5000).sleep();
+    }
+
+    public void testGenerateReportButton() throws IOException {
+        logger.info("Generate Report Button");
+        JDialog reportDialog = JDialogOperator.waitJDialog("Generate Report", false, false);
+        JDialogOperator reportDialogOperator = new JDialogOperator(reportDialog);
+        JListOperator listOperator = new JListOperator(reportDialogOperator);
+        JButtonOperator jbo0 = new JButtonOperator(reportDialogOperator, "Next");
+        DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy-HH-mm-ss");
+        Date date = new Date();
+        String datenotime = dateFormat.format(date);
+        listOperator.clickOnItem(0, 1);
+        new Timeout("pausing", 1000).sleep();
+        jbo0.pushNoBlock();
+        new Timeout("pausing", 1000).sleep();
+        JButtonOperator jbo1 = new JButtonOperator(reportDialogOperator, "Finish");
+        jbo1.pushNoBlock();
+        new Timeout("pausing", 500).sleep();
+        JDialog previewDialog = JDialogOperator.waitJDialog("Progress", false, false);
+        screenshot("Progress");
+        JDialogOperator previewDialogOperator = new JDialogOperator(previewDialog);
+        JLabelOperator.waitJLabel(previewDialog, "Complete", false, false);
+        JButtonOperator jbo2 = new JButtonOperator(previewDialogOperator, "Close");
+        jbo2.pushNoBlock();
+        new Timeout("pausing", 10000).sleep();
+        System.setProperty("ReportStr", datenotime);
+        screenshot("Done Testing");
+    }
+
+    public void screenshot(String name) {
+        logger.info("Taking screenshot.");
+        try {
+            Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
+            BufferedImage capture = new Robot().createScreenCapture(screenRect);
+            String outPath = getEscapedPath(System.getProperty("out_path"));
+            ImageIO.write(capture, "png", new File(outPath + "\\" + name + ".png"));
+            new Timeout("pausing", 1000).sleep(); // give it a second to save
+        } catch (IOException ex) {
+            logger.log(Level.WARNING, "IOException taking screenshot.", ex);
+        } catch (AWTException ex) {
+            logger.log(Level.WARNING, "AWTException taking screenshot.", ex);
+
+        }
+    }
+}
diff --git a/Testing/test/qa-functional/src/org/sleuthkit/autopsy/testing/RegressionTest.java b/Testing/test/qa-functional/src/org/sleuthkit/autopsy/testing/RegressionTest.java
index b0831cf420746202043c1bb9cfad589d8ef75d99..3cebb1cc93214272064358656ad41b590a997d1e 100755
--- a/Testing/test/qa-functional/src/org/sleuthkit/autopsy/testing/RegressionTest.java
+++ b/Testing/test/qa-functional/src/org/sleuthkit/autopsy/testing/RegressionTest.java
@@ -18,43 +18,13 @@
  */
 package org.sleuthkit.autopsy.testing;
 
-import java.awt.AWTException;
-import java.awt.Rectangle;
-import java.awt.Robot;
-import java.awt.Toolkit;
-import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Random;
-import java.util.logging.Level;
 import java.util.logging.Logger;
-import javax.imageio.ImageIO;
-import javax.swing.JDialog;
-import javax.swing.JTextField;
 import junit.framework.Test;
 import junit.framework.TestCase;
-import org.netbeans.jellytools.MainWindowOperator;
-import org.netbeans.jellytools.NbDialogOperator;
-import org.netbeans.jellytools.WizardOperator;
-import org.netbeans.jemmy.Timeout;
 import org.netbeans.jemmy.Timeouts;
-import org.netbeans.jemmy.operators.JButtonOperator;
-import org.netbeans.jemmy.operators.JCheckBoxOperator;
-import org.netbeans.jemmy.operators.JComboBoxOperator;
-import org.netbeans.jemmy.operators.JDialogOperator;
-import org.netbeans.jemmy.operators.JFileChooserOperator;
-import org.netbeans.jemmy.operators.JLabelOperator;
-import org.netbeans.jemmy.operators.JListOperator;
-import org.netbeans.jemmy.operators.JTabbedPaneOperator;
-import org.netbeans.jemmy.operators.JTableOperator;
-import org.netbeans.jemmy.operators.JTextFieldOperator;
 import org.netbeans.junit.NbModuleSuite;
-import org.sleuthkit.autopsy.ingest.IngestManager;
 
 /**
  * This test expects the following system properties to be set: img_path: The
@@ -71,7 +41,7 @@
 public class RegressionTest extends TestCase {
 
     private static final Logger logger = Logger.getLogger(RegressionTest.class.getName());
-    long start;
+    private static final AutopsyTestCases autopsyTests = new AutopsyTestCases();
 
     /**
      * Constructor required by JUnit
@@ -80,32 +50,12 @@ public RegressionTest(String name) {
         super(name);
     }
 
-    /**
-     * This method is used to escape file/directory path. Example:
-     * \\NetworkLocation\foo\bar get escaped to \\\\NetworkLocation\foo\bar so
-     * that it can be used as intended.
-     *
-     * @param path
-     *
-     * @return escaped path the the file/directory location.
-     */
-    private static String getEscapedPath(String path) {
-        if (path.startsWith("\\\\")) { //already has escaped to \\\\NetworkLocation
-            return path;
-        }
-        else if (path.startsWith("\\")) {
-            return "\\" + path;
-        } else {
-            return path;
-        }
-    }
-
     /**
      * Creates suite from particular test cases.
      */
     public static Test suite() {
         // run tests with specific configuration
-        File img_path = new File(getEscapedPath(System.getProperty("img_path")));
+        File img_path = new File(AutopsyTestCases.getEscapedPath(System.getProperty("img_path")));
         NbModuleSuite.Configuration conf = NbModuleSuite.createConfiguration(RegressionTest.class).
                 clusters(".*").
                 enableModules(".*");
@@ -146,8 +96,7 @@ public static Test suite() {
      */
     @Override
     public void setUp() {
-
-        logger.info("########  " + getEscapedPath(System.getProperty("img_path")) + "  #######");
+        logger.info("########  " + AutopsyTestCases.getEscapedPath(System.getProperty("img_path")) + "  #######");
         Timeouts.setDefault("ComponentOperator.WaitComponentTimeout", 1000000);
     }
 
@@ -159,219 +108,50 @@ public void tearDown() {
     }
 
     public void testNewCaseWizardOpen() {
-        logger.info("New Case");
-        NbDialogOperator nbdo = new NbDialogOperator("Welcome");
-        JButtonOperator jbo = new JButtonOperator(nbdo, 0); // the "New Case" button
-        jbo.pushNoBlock();
+        autopsyTests.testNewCaseWizardOpen("Welcome");
     }
 
     public void testNewCaseWizard() {
-        logger.info("New Case Wizard");
-        WizardOperator wo = new WizardOperator("New Case Information");
-        JTextFieldOperator jtfo0 = new JTextFieldOperator(wo, 1);
-        jtfo0.typeText("AutopsyTestCase"); // Name the case "AutopsyTestCase"
-        JTextFieldOperator jtfo1 = new JTextFieldOperator(wo, 2);
-        jtfo1.typeText(getEscapedPath(System.getProperty("out_path")));
-        wo.btNext().clickMouse();
-        JTextFieldOperator jtfo2 = new JTextFieldOperator(wo, 0);
-        jtfo2.typeText("000"); // Set the case number
-        JTextFieldOperator jtfo3 = new JTextFieldOperator(wo, 1);
-        jtfo3.typeText("Examiner 1"); // Set the case examiner
-        start = System.currentTimeMillis();
-        wo.btFinish().clickMouse();
+        autopsyTests.testNewCaseWizard();
     }
-
+    
     public void testStartAddImageFileDataSource() {
-        logger.info("Starting Add Image process");
-        WizardOperator wo = new WizardOperator("Add Data");
-        JTextFieldOperator jtfo0 = new JTextFieldOperator(wo, 0);
-        String img_path = getEscapedPath(System.getProperty("img_path"));
-        String imageDir = img_path;
-        ((JTextField) jtfo0.getSource()).setText(imageDir);
-        JComboBoxOperator comboBoxOperator = new JComboBoxOperator(wo, 1);
-        comboBoxOperator.setSelectedItem("(GMT-5:00) America/New_York");
-        wo.btNext().clickMouse();
+        autopsyTests.testStartAddImageFileDataSource();
     }
 
     public void testStartAddLogicalFilesDataSource() {
-        logger.info("Starting Add Logical Files process");
-        WizardOperator wo = new WizardOperator("Add Data");
-        JComboBoxOperator comboBoxOperator = new JComboBoxOperator(wo);
-        // select the item indexed 2 (Logical Files) from the drop-down list.
-        comboBoxOperator.selectItem(2);
-        JButtonOperator addButtonOperator = new JButtonOperator(wo, "Add");
-        addButtonOperator.pushNoBlock();
-        JFileChooserOperator fileChooserOperator = new JFileChooserOperator();
-        fileChooserOperator.setCurrentDirectory(new File(getEscapedPath(System.getProperty("img_path"))));
-        // set the current directory one level above the directory containing logicalFileSet folder.
-        fileChooserOperator.goUpLevel();
-        fileChooserOperator.chooseFile(new File(getEscapedPath(System.getProperty("img_path"))).getName());
-        wo.btNext().clickMouse();
+        autopsyTests.testStartAddLogicalFilesDataSource();
     }
 
     public void testAddSourceWizard1() {
-        WizardOperator wo = new WizardOperator("Add Data");
-        while (!wo.btFinish().isEnabled()) {
-            new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
-        }
-        logger.info("Add image took " + (System.currentTimeMillis() - start) + "ms");
-        wo.btFinish().clickMouse();
+        autopsyTests.testAddSourceWizard1();
     }
 
     public void testConfigureIngest1() {
-        /*
-         * This timeout is to allow the setup for the ingest job settings panel
-         * to complete.
-         */
-        new Timeout("pausing", 10000).sleep();
-
-        logger.info("Looking for hash lookup module in ingest job settings panel");
-        WizardOperator wo = new WizardOperator("Add Data");
-        JTableOperator jto = new JTableOperator(wo, 0);
-        int row = jto.findCellRow("Hash Lookup", 2, 0);
-        jto.clickOnCell(row, 1);
-        logger.info("Selected hash lookup module in ingest job settings panel");
-        JButtonOperator jbo1 = new JButtonOperator(wo, "Global Settings");
-        jbo1.pushNoBlock();
-        logger.info("Pushed Global Settings button for hash lookup module in ingest job settings panel");
+        autopsyTests.testConfigureIngest1();
     }
 
     public void testConfigureHash() {
-        logger.info("Hash Configure");
-        JDialog hashMainDialog = JDialogOperator.waitJDialog("Global Hash Lookup Settings", false, false);
-        JDialogOperator hashMainDialogOperator = new JDialogOperator(hashMainDialog);
-        List<String> databases = new ArrayList<String>();
-        databases.add(getEscapedPath(System.getProperty("nsrl_path")));
-        databases.add(getEscapedPath(System.getProperty("known_bad_path")));
-        for (String database : databases) {
-            JButtonOperator importButtonOperator = new JButtonOperator(hashMainDialogOperator, "Import");
-            importButtonOperator.pushNoBlock();
-            JDialog addDatabaseDialog = JDialogOperator.waitJDialog("Import Hash Database", false, false);
-            JDialogOperator addDatabaseDialogOperator = new JDialogOperator(addDatabaseDialog);
-            JButtonOperator browseButtonOperator = new JButtonOperator(addDatabaseDialogOperator, "Open...", 0);
-            browseButtonOperator.pushNoBlock();
-            JFileChooserOperator fileChooserOperator = new JFileChooserOperator();
-            fileChooserOperator.chooseFile(database);
-            JButtonOperator okButtonOperator = new JButtonOperator(addDatabaseDialogOperator, "OK", 0);
-            okButtonOperator.pushNoBlock();
-            new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
-        }
-        // Used if the database has no index
-        //JDialog jd3 = JDialogOperator.waitJDialog("No Index Exists", false, false);
-        //JDialogOperator jdo3 = new JDialogOperator(jd3);
-        //JButtonOperator jbo3 = new JButtonOperator(jdo3, "Yes", 0);
-        new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
-        //jbo3.pushNoBlock();
-        JButtonOperator jbo4 = new JButtonOperator(hashMainDialogOperator, "OK", 0);
-        jbo4.pushNoBlock();
+        autopsyTests.testConfigureHash();
     }
 
     public void testConfigureIngest2() {
-        logger.info("Looking for keyword search module in ingest job settings panel");
-        WizardOperator wo = new WizardOperator("Add Data");
-        JTableOperator jto = new JTableOperator(wo, 0);
-        int row = jto.findCellRow("Keyword Search", 2, 0);
-        jto.clickOnCell(row, 1);
-        logger.info("Selected keyword search module in ingest job settings panel");
-        JButtonOperator jbo1 = new JButtonOperator(wo, "Global Settings");
-        jbo1.pushNoBlock();
-        logger.info("Pushed Global Settings button for keyword search module in ingest job settings panel");
+        autopsyTests.testConfigureIngest2();
     }
 
     public void testConfigureSearch() {
-        logger.info("Search Configure");
-        JDialog jd = JDialogOperator.waitJDialog("Global Keyword Search Settings", false, false);
-        JDialogOperator jdo = new JDialogOperator(jd);
-        String words = getEscapedPath(System.getProperty("keyword_path"));
-        JButtonOperator jbo0 = new JButtonOperator(jdo, "Import List", 0);
-        jbo0.pushNoBlock();
-        JFileChooserOperator jfco0 = new JFileChooserOperator();
-        jfco0.chooseFile(words);
-        JTableOperator jto = new JTableOperator(jdo, 0);
-        jto.clickOnCell(0, 0);
-        new Timeout("pausing", 1000).sleep(); // give it a second to process
-        if (Boolean.parseBoolean(System.getProperty("mugen_mode"))) {
-            JTabbedPaneOperator jtpo = new JTabbedPaneOperator(jdo);
-            jtpo.selectPage("String Extraction");
-            JCheckBoxOperator jcbo0 = new JCheckBoxOperator(jtpo, "Arabic (Arabic)");
-            jcbo0.doClick();
-            JCheckBoxOperator jcbo1 = new JCheckBoxOperator(jtpo, "Han (Chinese, Japanese, Korean)");
-            jcbo1.doClick();
-            new Timeout("pausing", 1000).sleep(); // give it a second to process
-        }
-        JButtonOperator jbo2 = new JButtonOperator(jdo, "OK", 0);
-        jbo2.pushNoBlock();
-        WizardOperator wo = new WizardOperator("Add Data");
-        new Timeout("pausing", 10000).sleep(); // let things catch up
-        wo.btNext().clickMouse();
+        autopsyTests.testConfigureSearch();
     }
 
     public void testIngest() {
-        logger.info("Ingest 3");
-        new Timeout("pausing", 10000).sleep(); // wait for ingest to actually start
-        long startIngest = System.currentTimeMillis();
-        IngestManager man = IngestManager.getInstance();
-        while (man.isIngestRunning()) {
-            new Timeout("pausing", 1000).sleep(); // give it a second (or five) to process
-        }
-        logger.log(Level.INFO, "Ingest (including enqueue) took {0}ms", (System.currentTimeMillis() - startIngest));
-        // allow keyword search to finish saving artifacts, just in case
-        //   but randomize the timing so that we don't always get the same error
-        //   consistently, making it seem like default behavior
-        Random rand = new Random();
-        new Timeout("pausing", 10000 + (rand.nextInt(15000) + 5000)).sleep();
-        screenshot("Finished Ingest");
-
+        autopsyTests.testIngest();
     }
 
     public void testGenerateReportToolbar() {
-        logger.info("Generate Report Toolbars");
-        MainWindowOperator mwo = MainWindowOperator.getDefault();
-        JButtonOperator jbo = new JButtonOperator(mwo, "Generate Report");
-        jbo.pushNoBlock();
-        new Timeout("pausing", 5000).sleep();
+        autopsyTests.testGenerateReportToolbar();
     }
 
     public void testGenerateReportButton() throws IOException {
-        logger.info("Generate Report Button");
-        JDialog reportDialog = JDialogOperator.waitJDialog("Generate Report", false, false);
-        JDialogOperator reportDialogOperator = new JDialogOperator(reportDialog);
-        JListOperator listOperator = new JListOperator(reportDialogOperator);
-        JButtonOperator jbo0 = new JButtonOperator(reportDialogOperator, "Next");
-        DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy-HH-mm-ss");
-        Date date = new Date();
-        String datenotime = dateFormat.format(date);
-        listOperator.clickOnItem(0, 1);
-        new Timeout("pausing", 1000).sleep();
-        jbo0.pushNoBlock();
-        new Timeout("pausing", 1000).sleep();
-        JButtonOperator jbo1 = new JButtonOperator(reportDialogOperator, "Finish");
-        jbo1.pushNoBlock();
-        new Timeout("pausing", 500).sleep();
-        JDialog previewDialog = JDialogOperator.waitJDialog("Progress", false, false);
-        screenshot("Progress");
-        JDialogOperator previewDialogOperator = new JDialogOperator(previewDialog);
-        JLabelOperator.waitJLabel(previewDialog, "Complete", false, false);
-        JButtonOperator jbo2 = new JButtonOperator(previewDialogOperator, "Close");
-        jbo2.pushNoBlock();
-        new Timeout("pausing", 10000).sleep();
-        System.setProperty("ReportStr", datenotime);
-        screenshot("Done Testing");
-    }
-
-    public void screenshot(String name) {
-        logger.info("Taking screenshot.");
-        try {
-            Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
-            BufferedImage capture = new Robot().createScreenCapture(screenRect);
-            String outPath = getEscapedPath(System.getProperty("out_path"));
-            ImageIO.write(capture, "png", new File(outPath + "\\" + name + ".png"));
-            new Timeout("pausing", 1000).sleep(); // give it a second to save
-        } catch (IOException ex) {
-            logger.log(Level.WARNING, "IOException taking screenshot.", ex);
-        } catch (AWTException ex) {
-            logger.log(Level.WARNING, "AWTException taking screenshot.", ex);
-
-        }
+        autopsyTests.testGenerateReportButton();
     }
 }
diff --git a/test/script/regression.py b/test/script/regression.py
index 02139419213d74e78fd27f6bae85f37a0561a1a4..4ba9fc2174040192a43d22134104036e62bb4ee1 100755
--- a/test/script/regression.py
+++ b/test/script/regression.py
@@ -404,7 +404,7 @@ def _run_ant(test_data):
         test_data.ant = ["ant"]
         test_data.ant.append("-v")
         test_data.ant.append("-f")
-        test_data.ant.append(make_local_path(test_data.main_config.build_path))
+        test_data.ant.append(make_local_path(test_data.main_config.build_path, "build.xml"))
         test_data.ant.append("regression-test")
         test_data.ant.append("-l")
         test_data.ant.append(test_data.antlog_dir)
@@ -1485,7 +1485,7 @@ def copy_logs(test_data):
         shutil.copytree(log_dir, test_data.logs_dir)
 
         # copy logs from userdir0/var/log
-        log_dir = os.path.join("..", "..", "Testing","build","test","qa-functional","work","userdir0","var","log/")
+        log_dir = os.path.join(test_data.main_config.build_path,"build","test","qa-functional","work","userdir0","var","log/")
         for log in os.listdir(log_dir):
             if log.find("log"):
                 new_name = log_dir + "userdir0." + log