diff --git a/Core/nbproject/project.properties b/Core/nbproject/project.properties
index a155b333ca2a7872fd999665abe651a569eeb7cb..def49783e558d47a27bc16cad4f6fc11c5771892 100644
--- a/Core/nbproject/project.properties
+++ b/Core/nbproject/project.properties
@@ -17,7 +17,6 @@ file.reference.c3p0-0.9.5.jar=release\\modules\\ext\\c3p0-0.9.5.jar
 file.reference.checker-compat-qual-2.5.3.jar=release\\modules\\ext\\checker-compat-qual-2.5.3.jar
 file.reference.commons-beanutils-1.9.2.jar=release\\modules\\ext\\commons-beanutils-1.9.2.jar
 file.reference.commons-codec-1.11.jar=release\\modules\\ext\\commons-codec-1.11.jar
-file.reference.commons-collections-3.2.2.jar=release\\modules\\ext\\commons-collections-3.2.2.jar
 file.reference.commons-dbcp2-2.1.1.jar=release\\modules\\ext\\commons-dbcp2-2.1.1.jar
 file.reference.commons-digester-1.8.1.jar=release\\modules\\ext\\commons-digester-1.8.1.jar
 file.reference.commons-logging-1.2.jar=release\\modules\\ext\\commons-logging-1.2.jar
diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/ConfigurationModuleManager.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/ConfigurationModuleManager.java
index 4d798bbf29a413781195c2ce9c7406681aa34331..241d13f4f36cde0c6f82bff43e9be3ca52a9118a 100644
--- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/ConfigurationModuleManager.java
+++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/ConfigurationModuleManager.java
@@ -20,7 +20,6 @@
 import org.apache.cxf.common.util.CollectionUtils;
 import org.openide.util.Pair;
 import org.sleuthkit.autopsy.ingest.IngestJobSettings;
-import org.sleuthkit.autopsy.ingest.IngestModuleFactoryService;
 import org.sleuthkit.autopsy.ingest.IngestModuleTemplate;
 import org.sleuthkit.autopsy.integrationtesting.config.ConfigDeserializer;
 import org.sleuthkit.autopsy.integrationtesting.config.ParameterizedResourceConfig;
@@ -100,7 +99,7 @@ private Pair<IngestJobSettings, ConfigurationModule<?>> runConfigurationModule(I
         }
 
         Type configurationModuleType = Stream.of(clazz.getGenericInterfaces())
-                .filter(type -> type.getClass().equals(ConfigurationModule.class) && type instanceof ParameterizedType && type instanceof Class)
+                .filter(type -> type instanceof ParameterizedType && ((ParameterizedType) type).getRawType().equals(ConfigurationModule.class))
                 .map(type -> ((ParameterizedType) type).getActualTypeArguments()[0])
                 .findFirst()
                 .orElse(null);
@@ -121,7 +120,7 @@ private Pair<IngestJobSettings, ConfigurationModule<?>> runConfigurationModule(I
         }
 
         if (result instanceof IngestJobSettings) {
-            return Pair.of(curConfig, configModuleObj);
+            return Pair.of((IngestJobSettings) result, configModuleObj);
         } else {
             logger.log(Level.SEVERE, String.format("Could not retrieve IngestJobSettings from %s", configModule.getResource()));
             return null;
diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryService.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/IngestModuleFactoryService.java
similarity index 57%
rename from Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryService.java
rename to Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/IngestModuleFactoryService.java
index 982b20908bc67892e4f6b0d5d1a0c237a4833be4..1e4b8aefec0240149a4b535768af623359b3445f 100644
--- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/ingest/IngestModuleFactoryService.java
+++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/IngestModuleFactoryService.java
@@ -3,9 +3,12 @@
  * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
-package org.sleuthkit.autopsy.ingest;
+package org.sleuthkit.autopsy.integrationtesting;
 
+import java.util.ArrayList;
 import java.util.List;
+import org.openide.util.Lookup;
+import org.sleuthkit.autopsy.ingest.IngestModuleFactory;
 
 /**
  *
@@ -13,6 +16,6 @@
  */
 public class IngestModuleFactoryService {
     public List<IngestModuleFactory> getFactories() {
-        return IngestModuleFactoryLoader.getIngestModuleFactories();
+        return new ArrayList<>(Lookup.getDefault().lookupAll(IngestModuleFactory.class));
     }
 }
diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/IngestModuleSetupManager.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/IngestModuleSetupManager.java
index e3646ad5218a6a740c0c7dc5d746e3b5b977331e..47b9354bbc36083741d8d073207530f5a9bee781 100644
--- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/IngestModuleSetupManager.java
+++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/IngestModuleSetupManager.java
@@ -26,7 +26,6 @@
 import org.apache.commons.lang.StringUtils;
 import org.sleuthkit.autopsy.ingest.IngestJobSettings;
 import org.sleuthkit.autopsy.ingest.IngestModuleFactory;
-import org.sleuthkit.autopsy.ingest.IngestModuleFactoryService;
 import org.sleuthkit.autopsy.ingest.IngestModuleTemplate;
 
 /**
@@ -65,7 +64,7 @@ public IngestJobSettings configure(IngestJobSettings curSettings, IngestModuleSe
         
         List<IngestModuleTemplate> newTemplates = new ArrayList<>(curTemplates.values());
         
-        if (parameters != null && CollectionUtils.isEmpty(parameters.getModules())) {
+        if (parameters != null && !CollectionUtils.isEmpty(parameters.getModules())) {
             List<IngestModuleTemplate> templatesToAdd = parameters.getModules().stream()
                     .filter((className) -> !curTemplates.containsKey(className))
                     .map((className) -> allFactories.get(className))
diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/MainTestRunner.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/MainTestRunner.java
index 175ae1b78727e53b799fe3f5ba3d1107ddd399d3..a78f211bf5b7d62c830ecd6226a40ccc2e31336e 100644
--- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/MainTestRunner.java
+++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/MainTestRunner.java
@@ -18,6 +18,7 @@
  */
 package org.sleuthkit.autopsy.integrationtesting;
 
+import java.io.File;
 import org.sleuthkit.autopsy.integrationtesting.config.TestSuiteConfig;
 import org.sleuthkit.autopsy.integrationtesting.config.IntegrationTestConfig;
 import org.sleuthkit.autopsy.integrationtesting.config.IntegrationCaseType;
@@ -36,7 +37,6 @@
 import junit.framework.TestCase;
 import org.apache.cxf.common.util.CollectionUtils;
 import org.netbeans.junit.NbModuleSuite;
-import org.openide.util.Exceptions;
 import org.openide.util.Lookup;
 import org.openide.util.Pair;
 import org.sleuthkit.autopsy.casemodule.Case;
@@ -54,6 +54,7 @@
 import org.sleuthkit.autopsy.integrationtesting.config.TestingConfig;
 import org.sleuthkit.autopsy.testutils.IngestUtils;
 import org.sleuthkit.datamodel.TskCoreException;
+import static ucar.unidata.util.Format.i;
 
 /**
  * Main entry point for running integration tests. Handles processing
@@ -159,6 +160,10 @@ private Case createCaseWithDataSources(EnvConfig envConfig, String caseName, Cas
         String uniqueCaseName = String.format("%s_%s", caseName, TimeStampUtils.createTimeStamp());
         String outputFolder = PathUtil.getAbsolutePath(envConfig.getWorkingDirectory(), envConfig.getRootCaseOutputPath());
         String caseOutputFolder = Paths.get(outputFolder, uniqueCaseName).toString();
+        File caseOutputFolderFile = new File(caseOutputFolder);
+        if (!caseOutputFolderFile.exists()) {
+            caseOutputFolderFile.mkdirs();
+        }
 
         switch (caseType) {
             case SINGLE_USER_CASE: {
diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/OutputResults.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/OutputResults.java
index 449b0969c1ffb2fd2cfecaf0fb681fb3d024d215..fc65a1ef5a7c9e9aeed5591d0fc067103a8b8fc9 100644
--- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/OutputResults.java
+++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/OutputResults.java
@@ -101,12 +101,12 @@ private static <K, V> V getOrCreate(Map<K, V> map, K key, Supplier<V> onNotPrese
         }
         return curValue;
     }
-    
+
     /**
      * A mapping of package -> test suite -> test -> output data
      */
     private final Map<String, Map<String, Map<String, Object>>> data = new HashMap<>();
-    
+
     /**
      * Adds a result for a particular test in a test suite.
      *
@@ -193,20 +193,27 @@ protected MappingNode representJavaBean(Set<Property> properties, Object javaBea
     public void serializeToFile(String outputFolder, String caseName, Case.CaseType caseType) {
         serializeToFile(getSerializationPath(outputFolder, caseName, caseType));
     }
-    
+
     private String getSerializationPath(String outputFolder, String caseName, Case.CaseType caseType) {
         String outputExtension = ".yml";
         Path outputPath = Paths.get(outputFolder, String.format("%s-%s%s", caseName, getCaseTypeId(caseType), outputExtension));
         return outputPath.toString();
     }
-        
+
     /**
      * Serializes results of a test to a yaml file.
+     *
      * @param outputPath The output path.
      */
     public void serializeToFile(String outputPath) {
+        File outputFile = new File(outputPath);
+        
+        if (!outputFile.getParentFile().exists()) {
+            outputFile.getParentFile().mkdirs();
+        }
+        
         try {
-            FileWriter writer = new FileWriter(new File(outputPath));
+            FileWriter writer = new FileWriter(outputFile);
             YAML_SERIALIZER.dump(getSerializableData(), writer);
         } catch (IOException ex) {
             logger.log(Level.WARNING, "There was an error writing results to outputPath: " + outputPath, ex);
diff --git a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/config/ParameterizedResourceConfig.java b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/config/ParameterizedResourceConfig.java
index 23150cbd0686eaecb27d56859ecc2c6961ffb279..520b0771dd63ed0dd4b31f0bcf01fe3913b28417 100644
--- a/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/config/ParameterizedResourceConfig.java
+++ b/Core/test/qa-functional/src/org/sleuthkit/autopsy/integrationtesting/config/ParameterizedResourceConfig.java
@@ -25,10 +25,17 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.fasterxml.jackson.databind.node.TextNode;
+import com.fasterxml.jackson.databind.node.ValueNode;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import org.sleuthkit.autopsy.integrationtesting.config.ParameterizedResourceConfig.ParameterizedResourceConfigDeserializer;
 
@@ -61,14 +68,68 @@ public ParameterizedResourceConfig deserialize(JsonParser jp, DeserializationCon
             } else if (node instanceof TextNode) {
                 return new ParameterizedResourceConfig(((TextNode) node).textValue());
             } else {
-                String resource = (node.get("resource") != null) ? node.get("resource").asText() : null;
-                Map<String, Object> parameters = (node.get("parameters") != null) ?
-                        node.get("parameters").traverse().readValueAs(Map.class) : 
-                        null;
+                JsonNode resourceNode = node.get("resource");
+                String resource = (resourceNode != null) ? resourceNode.asText() : null;
+
+                Map<String, Object> parameters = null;
+                JsonNode parametersNode = node.get("parameters");
+                if (parametersNode != null && parametersNode.isObject()) {
+                    parameters = readMap((ObjectNode) parametersNode);
+                }
 
                 return new ParameterizedResourceConfig(resource, parameters);
             }
         }
+
+        Map<String, Object> readMap(ObjectNode node) {
+            Map<String, Object> jsonObject = new LinkedHashMap<>();
+            Iterator<Map.Entry<String, JsonNode>> keyValIter = node.fields();
+            while (keyValIter.hasNext()) {
+                Map.Entry<String, JsonNode> keyVal = keyValIter.next();
+                jsonObject.put(keyVal.getKey(), readItem(keyVal.getValue()));
+            }
+            return jsonObject;
+        }
+
+        List<Object> readList(ArrayNode node) {
+            List<Object> objArr = new ArrayList<>();
+            for (JsonNode childNode : node) {
+                objArr.add(readItem(childNode));
+            }
+            return objArr;
+        }
+
+        Object readJsonPrimitive(ValueNode vNode) {
+            if (vNode.isTextual()) {
+                return vNode.asText();
+            } else if (vNode.isBoolean()) {
+                return vNode.asBoolean();
+            } else if (vNode.isLong()) {
+                return vNode.asLong();
+            } else if (vNode.isInt()) {
+                return vNode.asInt();
+            } else if (vNode.isDouble()) {
+                return vNode.asDouble();
+            }
+
+            return null;
+        }
+
+        Object readItem(JsonNode node) {
+            if (node == null) {
+                return null;
+            }
+
+            if (node.isObject()) {
+                return readMap((ObjectNode) node);
+            } else if (node.isArray()) {
+                return readList((ArrayNode) node);
+            } else if (node.isValueNode()) {
+                return readJsonPrimitive((ValueNode) node);
+            }
+
+            return null;
+        }
     }
 
     private final String resource;
diff --git a/KeywordSearch/nbproject/project.properties b/KeywordSearch/nbproject/project.properties
index ffc82a095b3a5ad3e37a308a554ac5189cee263d..a12c865767816d51056f8b6a28920ea5484d612c 100644
--- a/KeywordSearch/nbproject/project.properties
+++ b/KeywordSearch/nbproject/project.properties
@@ -1,6 +1,5 @@
 file.reference.annotations-12.0.jar=release\\modules\\ext\\annotations-12.0.jar
 file.reference.commons-beanutils-1.9.2.jar=release\\modules\\ext\\commons-beanutils-1.9.2.jar
-file.reference.commons-collections-3.2.2.jar=release\\modules\\ext\\commons-collections-3.2.2.jar
 file.reference.commons-digester-1.8.1.jar=release\\modules\\ext\\commons-digester-1.8.1.jar
 file.reference.commons-logging-1.2.jar=release\\modules\\ext\\commons-logging-1.2.jar
 file.reference.commons-validator-1.5.1.jar=release\\modules\\ext\\commons-validator-1.5.1.jar
diff --git a/KeywordSearch/nbproject/project.xml b/KeywordSearch/nbproject/project.xml
index 5c2ba104617c359f8acf6898f575d76949f70ca8..930acbf4dbf897a4244c3343d6bf386dca35c93b 100644
--- a/KeywordSearch/nbproject/project.xml
+++ b/KeywordSearch/nbproject/project.xml
@@ -290,10 +290,6 @@
                 <runtime-relative-path>ext/annotations-12.0.jar</runtime-relative-path>
                 <binary-origin>release\modules\ext\annotations-12.0.jar</binary-origin>
             </class-path-extension>
-            <class-path-extension>
-                <runtime-relative-path>ext/commons-collections-3.2.2.jar</runtime-relative-path>
-                <binary-origin>release\modules\ext\commons-collections-3.2.2.jar</binary-origin>
-            </class-path-extension>
             <class-path-extension>
                 <runtime-relative-path>ext/noggit-0.5.jar</runtime-relative-path>
                 <binary-origin>release\modules\ext\noggit-0.5.jar</binary-origin>