diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp
index 266ddc3db5075572a53ef1275b0e0c57af92f6fa..311afd02ce31f8259b87a826683e8cfa4955626c 100644
--- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp
+++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp
@@ -1032,7 +1032,7 @@ JNIEXPORT jlong JNICALL
  * @param timeZone the timezone the image is from
  */
 JNIEXPORT void JNICALL
-    Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat(JNIEnv * env,
+    Java_org_sleuthkit_datamodel_SleuthkitJNI_runOpenAndAddImgNat(JNIEnv * env,
     jclass obj, jlong process, jstring deviceId, jobjectArray paths, jint numImgs, jstring timeZone) {
 
     TskAutoDb *tskAuto = ((TskAutoDb *) process);
@@ -1136,12 +1136,11 @@ JNIEXPORT void JNICALL
 * @param process the add-image process created by initAddImgNat
 * @param deviceId An ASCII-printable identifier for the device associated with the data source that is intended to be unique across multiple cases (e.g., a UUID)
 * @param a_img_info image info object
-* @param numImgs number of image parts
 * @param timeZone the timezone the image is from
 */
 JNIEXPORT void JNICALL
 Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat(JNIEnv * env,
-	jclass obj, jlong process, jstring deviceId, jlong a_img_info, jint numImgs, jstring timeZone) {
+	jclass obj, jlong process, jstring deviceId, jlong a_img_info, jstring timeZone) {
 	
 	TskAutoDb *tskAuto = ((TskAutoDb *)process);
 	if (!tskAuto || tskAuto->m_tag != TSK_AUTO_TAG) {
@@ -1167,11 +1166,13 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat(JNIEnv * env,
 		env->ReleaseStringUTFChars(timeZone, time_zone);
 	}
 
+	// Save the image handle to the TskAutoDb object
+	TSK_IMG_INFO *img_info = castImgInfo(env, a_img_info);
+	tskAuto->openImageHandle(img_info);
+
 	// Add the data source.
 	uint8_t ret = 0;
-	tskAuto->
-	if ((ret = tskAuto->startAddImage((int)numImgs, a_img_info,
-		TSK_IMG_TYPE_DETECT, 0, device_id)) != 0) {
+	if ((ret = tskAuto->startAddImage(device_id)) != 0) {
 		stringstream msgss;
 		msgss << "Errors occured while ingesting image " << std::endl;
 		vector<TskAuto::error_record> errors = tskAuto->getErrorList();
diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.h b/bindings/java/jni/dataModel_SleuthkitJNI.h
index e283fd074fc109f7d29452c0289d3ffc2f066e94..b5c260866d3e75c87901db4b4cb3b55780257558 100644
--- a/bindings/java/jni/dataModel_SleuthkitJNI.h
+++ b/bindings/java/jni/dataModel_SleuthkitJNI.h
@@ -225,12 +225,20 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_initializeAddI
 
 /*
  * Class:     org_sleuthkit_datamodel_SleuthkitJNI
- * Method:    runAddImgNat
+ * Method:    runOpenAndAddImgNat
  * Signature: (JLjava/lang/String;[Ljava/lang/String;ILjava/lang/String;)V
  */
-JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat
+JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runOpenAndAddImgNat
   (JNIEnv *, jclass, jlong, jstring, jobjectArray, jint, jstring);
 
+/*
+ * Class:     org_sleuthkit_datamodel_SleuthkitJNI
+ * Method:    runAddImgNat
+ * Signature: (JLjava/lang/String;JLjava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat
+  (JNIEnv *, jclass, jlong, jstring, jlong, jstring);
+
 /*
  * Class:     org_sleuthkit_datamodel_SleuthkitJNI
  * Method:    stopAddImgNat
diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
index 972e06380cc06bc8ce1d60b0851c1a3f81ca4b7d..9149ed012fdb1992ae5c1b8c413923872f0a3c11 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
@@ -152,7 +152,7 @@ void free() throws TskCoreException {
 		long addImageInfo(long deviceObjId, List<String> imageFilePaths, String timeZone) throws TskCoreException {
 			try {
 				long tskAutoDbPointer = initializeAddImgNat(caseDbPointer, timezoneLongToShort(timeZone), false, false, false);
-				runAddImgNat(tskAutoDbPointer, UUID.randomUUID().toString(), imageFilePaths.toArray(new String[0]), imageFilePaths.size(), timeZone);
+				runOpenAndAddImgNat(tskAutoDbPointer, UUID.randomUUID().toString(), imageFilePaths.toArray(new String[0]), imageFilePaths.size(), timeZone);
 				return commitAddImgNat(tskAutoDbPointer);
 			} catch (TskDataException ex) {
 				throw new TskCoreException("Error adding image to case database", ex);
@@ -226,13 +226,16 @@ public void run(String deviceId, String[] imageFilePaths) throws TskCoreExceptio
 					throw new TskCoreException("Add image process already started");
 				}
 
-				synchronized (this) {
+				long imageHandle = openImage(imageFilePaths);
+				
+				synchronized (this) {					
 					tskAutoDbPointer = initAddImgNat(caseDbPointer, timezoneLongToShort(timeZone), addUnallocSpace, skipFatFsOrphans);
 				}
 				if (0 == tskAutoDbPointer) {
 					throw new TskCoreException("initAddImgNat returned a NULL TskAutoDb pointer");
 				}
-				runAddImgNat(tskAutoDbPointer, deviceId, imageFilePaths, imageFilePaths.length, timeZone);
+				//runAddImgNat(tskAutoDbPointer, deviceId, imageFilePaths, imageFilePaths.length, timeZone);
+				runAddImgNat(tskAutoDbPointer, deviceId, imageHandle, timeZone);
 			}
 
 			/**
@@ -1039,7 +1042,9 @@ public static boolean isImageSupported(String imagePath){
 
 	private static native long initializeAddImgNat(long db, String timezone, boolean addFileSystems, boolean addUnallocSpace, boolean skipFatFsOrphans) throws TskCoreException;
 
-	private static native void runAddImgNat(long process, String deviceId, String[] imgPath, int splits, String timezone) throws TskCoreException, TskDataException;
+	private static native void runOpenAndAddImgNat(long process, String deviceId, String[] imgPath, int splits, String timezone) throws TskCoreException, TskDataException;
+	
+	private static native void runAddImgNat(long process, String deviceId, long a_img_info, String timeZone) throws TskCoreException, TskDataException;
 
 	private static native void stopAddImgNat(long process) throws TskCoreException;
 
diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp
index 1cfe71e1cce57da7979b0958c359300369497bf4..0571089ce649ce8cc35ed05498e6e122b089494d 100644
--- a/tsk/auto/auto_db.cpp
+++ b/tsk/auto/auto_db.cpp
@@ -132,7 +132,7 @@ uint8_t
         return retval;
     }
 
-    if (addImageDetails(a_images, a_num, a_deviceId)) {
+    if (addImageDetails(a_deviceId)) {
         return 1;
     }
     return 0;
@@ -162,134 +162,36 @@ uint8_t
         return retval;
     }
 
-    // convert image paths to UTF-8
-    char **img_ptrs = (char **) tsk_malloc(a_num * sizeof(char *));
-    if (img_ptrs == NULL) {
-        return 1;
-    }
-
-    for (int i = 0; i < a_num; i++) {
-        char * img2 = (char*) tsk_malloc(1024 * sizeof(char));
-        UTF8 *ptr8;
-        UTF16 *ptr16;
-
-        ptr8 = (UTF8 *) img2;
-        ptr16 = (UTF16 *) a_images[i];
-
-        retval =
-            tsk_UTF16toUTF8_lclorder((const UTF16 **) &ptr16, (UTF16 *)
-            & ptr16[TSTRLEN(a_images[i]) + 1], &ptr8,
-            (UTF8 *) ((uintptr_t) ptr8 + 1024), TSKlenientConversion);
-        if (retval != TSKconversionOK) {
-            tsk_error_reset();
-            tsk_error_set_errno(TSK_ERR_AUTO_UNICODE);
-            tsk_error_set_errstr("Error converting image to UTF-8\n");
-            return 1;
-        }
-        img_ptrs[i] = img2;
-    }
-
-    if (addImageDetails(img_ptrs, a_num, a_deviceId)) {
-        //cleanup
-        for (int i = 0; i < a_num; ++i) {
-            free(img_ptrs[i]);
-        }
-        free(img_ptrs);
-        return 1;
-    }
-
-    //cleanup
-    for (int i = 0; i < a_num; ++i) {
-        free(img_ptrs[i]);
-    }
-    free(img_ptrs);
-    
-    return 0;
+	return (addImageDetails(a_deviceId));
 #else
     return openImageUtf8(a_num, a_images, a_type, a_ssize, a_deviceId);
 #endif
 }
 
 /**
-* Adds an image to the database.
+* Adds an image to the database. Requires that m_img_info is already initialized
 *
-* @param a_num Number of image parts
-* @param a_img_info Image info handle
-* @param a_images Array of paths to the image parts
-* @param a_type Image type
-* @param a_ssize Size of device sector in bytes (or 0 for default)
 * @param a_deviceId An ASCII-printable identifier for the device associated with the data source that is intended to be unique across multiple cases (e.g., a UUID).
 * @return 0 for success, 1 for failure
 */
-#ifdef TSK_WIN32
 uint8_t
-TskAutoDb::openImage(int a_num, TSK_IMG_INFO * a_img_info, const TSK_TCHAR * const a_images[],
-	TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize, const char* a_deviceId)
+TskAutoDb::openImage(const char* a_deviceId)
 {
-
-	// make name of database
-	uint8_t retval = TskAuto::openImageHandle(a_img_info);
-
-	if (retval != 0) {
-		return retval;
-	}
-
-	// convert image paths to UTF-8
-	char **img_ptrs = (char **)tsk_malloc(a_num * sizeof(char *));
-	if (img_ptrs == NULL) {
-		return 1;
-	}
-
-	for (int i = 0; i < a_num; i++) {
-		char * img2 = (char*)tsk_malloc(1024 * sizeof(char));
-		UTF8 *ptr8;
-		UTF16 *ptr16;
-
-		ptr8 = (UTF8 *)img2;
-		ptr16 = (UTF16 *)a_images[i];
-
-		retval =
-			tsk_UTF16toUTF8_lclorder((const UTF16 **)&ptr16, (UTF16 *)
-				& ptr16[TSTRLEN(a_images[i]) + 1], &ptr8,
-				(UTF8 *)((uintptr_t)ptr8 + 1024), TSKlenientConversion);
-		if (retval != TSKconversionOK) {
-			tsk_error_reset();
-			tsk_error_set_errno(TSK_ERR_AUTO_UNICODE);
-			tsk_error_set_errstr("Error converting image to UTF-8\n");
-			return 1;
-		}
-		img_ptrs[i] = img2;
-	}
-
-	if (addImageDetails(img_ptrs, a_num, a_deviceId)) {
-		//cleanup
-		for (int i = 0; i < a_num; ++i) {
-			free(img_ptrs[i]);
-		}
-		free(img_ptrs);
+	if (m_img_info == NULL) {
 		return 1;
 	}
 
-	//cleanup
-	for (int i = 0; i < a_num; ++i) {
-		free(img_ptrs[i]);
-	}
-	free(img_ptrs);
-
-	return 0;
+	return(addImageDetails(a_deviceId));
 }
-#endif
 
 /**
  * Adds image details to the existing database tables.
  *
- * @param imgPaths The paths to the image splits
- * @param numPaths The number of paths
  * @param deviceId An ASCII-printable identifier for the device associated with the data source that is intended to be unique across multiple cases (e.g., a UUID).
  * @return Returns 0 for success, 1 for failure
  */
 uint8_t
-TskAutoDb::addImageDetails(const char *const imgPaths[], int numPaths, const char* deviceId)
+TskAutoDb::addImageDetails(const char* deviceId)
 {
    string md5 = "";
 #if HAVE_LIBEWF 
@@ -314,10 +216,42 @@ TskAutoDb::addImageDetails(const char *const imgPaths[], int numPaths, const cha
         return 1;
     }
 
+	char **img_ptrs;
+#ifdef TSK_WIN32
+	// convert image paths to UTF-8
+	img_ptrs = (char **)tsk_malloc(m_img_info->num_img * sizeof(char *));
+	if (img_ptrs == NULL) {
+		return 1;
+	}
+
+	for (int i = 0; i < m_img_info->num_img; i++) {
+		char * img2 = (char*)tsk_malloc(1024 * sizeof(char));
+		UTF8 *ptr8;
+		UTF16 *ptr16;
+
+		ptr8 = (UTF8 *)img2;
+		ptr16 = (UTF16 *)m_img_info->images[i];
+
+		uint8_t retval =
+			tsk_UTF16toUTF8_lclorder((const UTF16 **)&ptr16, (UTF16 *)
+				& ptr16[TSTRLEN(m_img_info->images[i]) + 1], &ptr8,
+				(UTF8 *)((uintptr_t)ptr8 + 1024), TSKlenientConversion);
+		if (retval != TSKconversionOK) {
+			tsk_error_reset();
+			tsk_error_set_errno(TSK_ERR_AUTO_UNICODE);
+			tsk_error_set_errstr("Error converting image to UTF-8\n");
+			return 1;
+		}
+		img_ptrs[i] = img2;
+	}
+#else 
+	img_ptrs = m_img_info->images;
+#endif
+
     // Add the image names
-    for (int i = 0; i < numPaths; i++) {
+    for (int i = 0; i < m_img_info->num_img; i++) {
         const char *img_ptr = NULL;
-        img_ptr = imgPaths[i];
+        img_ptr = img_ptrs[i];
 
         if (m_db->addImageName(m_curImgId, img_ptr, i)) {
             registerError();
@@ -325,6 +259,14 @@ TskAutoDb::addImageDetails(const char *const imgPaths[], int numPaths, const cha
         }
     }
 
+#ifdef TSK_WIN32
+	//cleanup
+	for (int i = 0; i < m_img_info->num_img; ++i) {
+		free(img_ptrs[i]);
+	}
+	free(img_ptrs);
+#endif
+
     return 0;
 }
 
@@ -535,18 +477,19 @@ uint8_t
 * Start the process to add image/file metadata to database inside of a transaction.
 * User must call either commitAddImage() to commit the changes,
 * or revertAddImage() to revert them.
+* This version of startAddImage assumes that m_img_info has already been set up.
 *
-* @param numImg Number of image parts
-* @param imagePaths Array of paths to the image parts
-* @param imgType Image type
-* @param sSize Size of device sector in bytes (or 0 for default)
 * @param deviceId An ASCII-printable identifier for the device associated with the data source that is intended to be unique across multiple cases (e.g., a UUID)
 * @return 0 for success, 1 for failure
 */
 uint8_t
-TskAutoDb::startAddImage(int numImg, TSK_IMG_INFO * a_img_info,
-	TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* deviceId)
+TskAutoDb::startAddImage(const char* deviceId)
 {
+
+	if (m_img_info == NULL) {
+		return 1;
+	}
+
 	if (tsk_verbose)
 		tsk_fprintf(stderr, "TskAutoDb::startAddImage: Starting add image process\n");
 
@@ -573,8 +516,7 @@ TskAutoDb::startAddImage(int numImg, TSK_IMG_INFO * a_img_info,
 	}
 
 	m_imgTransactionOpen = true;
-	openImageHandle(a_img_info);
-	if (openImage(numImg, imagePaths, imgType, sSize, deviceId)) {
+	if (openImage(deviceId)) {
 		tsk_error_set_errstr2("TskAutoDb::startAddImage");
 		registerError();
 		if (revertAddImage())
diff --git a/tsk/auto/tsk_case_db.h b/tsk/auto/tsk_case_db.h
index c69a8ac1597e1969abd47d08ddc4f9453276c380..0d821095cec6a965db93dc81e479ab275e865f75 100644
--- a/tsk/auto/tsk_case_db.h
+++ b/tsk/auto/tsk_case_db.h
@@ -37,10 +37,7 @@ class TskAutoDb:public TskAuto {
     virtual ~ TskAutoDb();
     virtual uint8_t openImage(int, const TSK_TCHAR * const images[],
         TSK_IMG_TYPE_ENUM, unsigned int a_ssize, const char* deviceId = NULL);
-#ifdef WIN32
-	virtual uint8_t openImage(int a_num, TSK_IMG_INFO * a_img_info, const TSK_TCHAR * const a_images[],
-		TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize, const char* a_deviceId);
-#endif
+	virtual uint8_t openImage(const char* a_deviceId = NULL);
     virtual uint8_t openImageUtf8(int, const char *const images[],
         TSK_IMG_TYPE_ENUM, unsigned int a_ssize, const char* deviceId = NULL);
     virtual void closeImage();
@@ -105,8 +102,7 @@ class TskAutoDb:public TskAuto {
     uint8_t startAddImage(int numImg, const TSK_TCHAR * const imagePaths[],
         TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* deviceId = NULL);
 #ifdef WIN32
-	uint8_t startAddImage(int numImg, TSK_IMG_INFO * a_img_info,
-		TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* deviceId = NULL);
+	uint8_t startAddImage(const char* deviceId = NULL);
     uint8_t startAddImage(int numImg, const char *const imagePaths[],
         TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* deviceId = NULL);
 #endif
@@ -161,7 +157,7 @@ class TskAutoDb:public TskAuto {
         uint32_t nextSequenceNo;
     } UNALLOC_BLOCK_WLK_TRACK;
 
-    uint8_t addImageDetails(const char *const images[], int, const char *);
+    uint8_t addImageDetails(const char *);
     TSK_RETVAL_ENUM insertFileData(TSK_FS_FILE * fs_file,
         const TSK_FS_ATTR *, const char *path,
         const unsigned char *const md5,