diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp
index 4a1fbe520e0ab5fd1a3cc35c5249da3b1a228565..dd3df9d32e6f2032bf52584df1914628ad435b58 100644
--- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp
+++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp
@@ -978,40 +978,47 @@ JNIEXPORT jlong JNICALL
 }
 
 
-
 /*
- * Create a database for the given image using a pre-created process which can be cancelled.
+ * Add an image to a database using a pre-created process, which can be cancelled.
  * MUST call commitAddImg or revertAddImg afterwards once runAddImg returns.  If there is an 
  * error, you do not need to call revert or commit and the 'process' handle will be deleted.
  * @return the 0 for success 1 for failure
  * @param env pointer to java environment this was called from
  * @param obj the java object this was called from
  * @param process the add-image process created by initAddImgNat
+ * @param dataSrcId An ascii-printable identifier for the data source that is unique across multiple cases (e.g., a UUID)
  * @param paths array of strings from java, the paths to the image parts
- * @param num_imgs number of image parts
- * @param timezone the timezone the image is from
+ * @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, jobjectArray paths, jint num_imgs, jstring timezone) {
-    jboolean isCopy;
+    jclass obj, jlong process, jstring dataSrcId, jobjectArray paths, jint numImgs, jstring timeZone) {
 
     TskAutoDb *tskAuto = ((TskAutoDb *) process);
     if (!tskAuto || tskAuto->m_tag != TSK_AUTO_TAG) {
-        setThrowTskCoreError(env,
-            "runAddImgNat: Invalid TskAutoDb object passed in");
+        setThrowTskCoreError(env, 
+            "runAddDataSourceNat: Invalid TskAutoDb object passed in");
         return;
     }
 
-    // move the strings into the C++ world
+    jboolean isCopy;
+    const char *data_src_id = NULL;
+    if (NULL != dataSrcId) {    
+        data_src_id = (const char *) env->GetStringUTFChars(dataSrcId, &isCopy);
+        if (NULL == data_src_id) {
+            setThrowTskCoreError(env, "runAddDataSourceNat: Can't convert data source id string");
+            return;
+        }
+    }
 
-    // get pointers to each of the file names
-    char **imagepaths8 = (char **) tsk_malloc(num_imgs * sizeof(char *));
+    // Get pointers to each of the image file names.
+    char **imagepaths8 = (char **) tsk_malloc(numImgs * sizeof(char *));
     if (imagepaths8 == NULL) {
         setThrowTskCoreError(env);
         return;
     }
-    for (int i = 0; i < num_imgs; i++) {
+    for (int i = 0; i < numImgs; i++) {
         jstring jsPath = (jstring) env->GetObjectArrayElement(paths,
                 i);
         imagepaths8[i] =
@@ -1024,19 +1031,18 @@ JNIEXPORT void JNICALL
             return;
         }
     }
-    
-    if (env->GetStringLength(timezone) > 0) {
-        const char * tzchar = env->
-            GetStringUTFChars(timezone, &isCopy);
 
-        tskAuto->setTz(string(tzchar));
-        env->ReleaseStringUTFChars(timezone, tzchar);
+    // Set the time zone.
+    if (env->GetStringLength(timeZone) > 0) {
+        const char *time_zone = env->GetStringUTFChars(timeZone, &isCopy);
+        tskAuto->setTz(string(time_zone));
+        env->ReleaseStringUTFChars(timeZone, time_zone);
     }
 
-    // process the image (parts)
+    // Add the data source.
     uint8_t ret = 0;
-    if ( (ret = tskAuto->startAddImage((int) num_imgs, imagepaths8,
-        TSK_IMG_TYPE_DETECT, 0)) != 0) {
+    if ( (ret = tskAuto->startAddImage((int) numImgs, imagepaths8,
+        TSK_IMG_TYPE_DETECT, 0, data_src_id)) != 0) {
         stringstream msgss;
         msgss << "Errors occured while ingesting image " << std::endl;
         vector<TskAuto::error_record> errors = tskAuto->getErrorList();
@@ -1066,8 +1072,8 @@ JNIEXPORT void JNICALL
     //close image first before freeing the image paths
     tskAuto->closeImage();
 
-    // cleanup
-    for (int i = 0; i < num_imgs; i++) {
+    // Cleanup
+    for (int i = 0; i < numImgs; i++) {
         jstring jsPath = (jstring)
             env->GetObjectArrayElement(paths, i);
         env->
@@ -1075,95 +1081,6 @@ JNIEXPORT void JNICALL
         env->DeleteLocalRef(jsPath);
     }
     free(imagepaths8);
-
-    // if process completes successfully, must call revertAddImgNat or commitAddImgNat to free the TskAutoDb
-}
-
-/*
- * Create a database for the given image using a pre-created process which can be cancelled.
- * MUST call commitAddImg or revertAddImg afterwards once runAddImg returns.  If there is an 
- * error, you do not need to call revert or commit and the 'process' handle will be deleted.
- * @return the 0 for success 1 for failure
- * @param env pointer to java environment this was called from
- * @param obj the java object this was called from
- * @param process the add-image process created by initAddImgNat
- * @param dataSrcId An identifier for the data source that is unique across multiple cases (e.g., a UUID)
- * @param imgPath The full path to the image
- * @param timezone the timezone the image is from
- */
-JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddDataSourceNat(JNIEnv * env, jclass obj, jlong process, jstring dataSrcId, jstring imgPath, jstring timeZone) {
-
-    // Validate arguments.
-    TskAutoDb *tskAuto = ((TskAutoDb *) process);
-    if (!tskAuto || tskAuto->m_tag != TSK_AUTO_TAG) {
-        setThrowTskCoreError(env, "runAddImgNat: Invalid process argument");
-        return;
-    }
-    if (env->GetStringLength(dataSrcId) <= 0) {    
-        setThrowTskCoreError(env, "runAddImgNat: Invalid data source id argument");
-        return;
-    }
-    if (env->GetStringLength(imgPath) <= 0) {    
-        setThrowTskCoreError(env, "runAddImgNat: Invalid image path argument");
-        return;
-    }
-
-    // Convert the string arguments into native strings.
-    jboolean isCopy;
-    const char *data_src_id = (const char *) env->GetStringUTFChars(dataSrcId, &isCopy);
-    if (NULL == data_src_id) {
-        setThrowTskCoreError(env, "runAddImgNat: Can't convert data source id string");
-        return;
-    }
-    char **image_paths = (char **) tsk_malloc(1 * sizeof(char *));
-    if (NULL == image_paths) {
-        setThrowTskCoreError(env, "runAddImgNat: Can't malloc array for image path string");
-        env->ReleaseStringUTFChars(dataSrcId, (const char *) data_src_id);
-        return;
-    }
-    image_paths[0] = (char *) env->GetStringUTFChars(imgPath, &isCopy);    
-
-    // Set the time zone.
-    if (env->GetStringLength(timeZone) > 0) {
-        const char *time_zone = env->GetStringUTFChars(timeZone, &isCopy);
-        tskAuto->setTz(string(time_zone));
-        env->ReleaseStringUTFChars(timeZone, time_zone);
-    }
-
-    // Add the image.
-    uint8_t ret = 0;
-    if ( (ret = tskAuto->startAddImage(1, image_paths, TSK_IMG_TYPE_DETECT, 0)) != 0) {
-        stringstream msgss;
-        msgss << "runAddImgNat: Errors occured while ingesting image " << std::endl;
-        vector<TskAuto::error_record> errors = tskAuto->getErrorList();
-        for (size_t i = 0; i < errors.size(); i++) {
-            msgss << (i+1) << ". ";
-            msgss << (TskAuto::errorRecordToString(errors[i]));
-            msgss << " " << std::endl;
-        }
-        if (ret == 1) {
-            //fatal error
-            setThrowTskCoreError(env, msgss.str().c_str());
-        }
-        else if (ret == 2) {
-			if(tskAuto->isDbOpen()) {
-				// if we can still talk to the database, it's a non-fatal error
-				setThrowTskDataError(env, msgss.str().c_str());
-			}
-			else {
-				// we cannot talk to the database, fatal error
-				setThrowTskCoreError(env, msgss.str().c_str());
-			}
-        }
-    }
-
-    // @@@ SHOULD WE CLOSE HERE before we commit / revert etc.
-    //close image first before freeing the image paths
-    tskAuto->closeImage();
-
-    // cleanup
-    env->ReleaseStringUTFChars(imgPath, (const char *) image_paths[0]);
-    free(image_paths);
     env->ReleaseStringUTFChars(dataSrcId, (const char *) data_src_id);
 
     // if process completes successfully, must call revertAddImgNat or commitAddImgNat to free the TskAutoDb
diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.h b/bindings/java/jni/dataModel_SleuthkitJNI.h
index 1e205fa53e62b748c7802249912b3a6fed563fe4..07b59c69fd3fe1439f4f676da7fccae1504b6721 100644
--- a/bindings/java/jni/dataModel_SleuthkitJNI.h
+++ b/bindings/java/jni/dataModel_SleuthkitJNI.h
@@ -218,18 +218,10 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_initAddImgNat
 /*
  * Class:     org_sleuthkit_datamodel_SleuthkitJNI
  * Method:    runAddImgNat
- * Signature: (J[Ljava/lang/String;ILjava/lang/String;)V
+ * Signature: (JLjava/lang/String;[Ljava/lang/String;ILjava/lang/String;)V
  */
 JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddImgNat
-  (JNIEnv *, jclass, jlong, jobjectArray, jint, jstring);
-
-/*
- * Class:     org_sleuthkit_datamodel_SleuthkitJNI
- * Method:    runAddDataSourceNat
- * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
- */
-JNIEXPORT void JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_runAddDataSourceNat
-  (JNIEnv *, jclass, jlong, jstring, jstring, jstring);
+  (JNIEnv *, jclass, jlong, jstring, jobjectArray, jint, jstring);
 
 /*
  * Class:     org_sleuthkit_datamodel_SleuthkitJNI
diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
index b3c7952bcc686d162c04541e7f291b699f25aab2..f97c551dc052f0132f9f93a35a58bc6c4e6e1fe3 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
@@ -100,9 +100,7 @@ public class SleuthkitJNI {
 	//add image
 	private static native long initAddImgNat(long db, String timezone, boolean addUnallocSpace, boolean noFatFsOrphans) throws TskCoreException;
 
-	private static native void runAddImgNat(long process, String[] imgPath, int splits, String timezone) throws TskCoreException, TskDataException; // if runAddImg finishes without being stopped, revertAddImg or commitAddImg MUST be called
-
-	private static native void runAddDataSourceNat(long process, String dataSourceId, String imgPath, String timezone) throws TskCoreException, TskDataException; // if runAddImg finishes without being stopped, revertAddImg or commitAddImg MUST be called
+	private static native void runAddImgNat(long process, String dataSourceId, String[] imgPath, int splits, String timezone) throws TskCoreException, TskDataException; // if runAddImg finishes without being stopped, revertAddImg or commitAddImg MUST be called
 
 	private static native void stopAddImgNat(long process) throws TskCoreException;
 
@@ -249,40 +247,32 @@ private AddImageProcess(String timezone, boolean addUnallocSpace, boolean noFatF
 			 * Start the process of adding an image to the case database. MUST
 			 * call either commit() or revert() after calling run().
 			 *
-			 * @param imgPath Full path(s) to the image file(s).
+			 * @param imageFilePaths Full path(s) to the image file(s).
 			 * @throws TskCoreException exception thrown if critical error
 			 * occurs within TSK
 			 * @throws TskDataException exception thrown if non-critical error
 			 * occurs within TSK (should be OK to continue)
+			 * @deprecated Use run(String dataSourceId, String[] imageFilePaths)
+			 * instead
 			 */
-			public void run(String[] imgPath) throws TskCoreException, TskDataException {
-				if (autoDbPointer != 0) {
-					throw new TskCoreException("AddImgProcess:run: AutoDB pointer is already set");
-				}
-
-				synchronized (this) {
-					autoDbPointer = initAddImgNat(caseDbPointer, timezoneLongToShort(timezone), addUnallocSpace, noFatFsOrphans);
-				}
-				if (autoDbPointer == 0) {
-					//additional check in case initAddImgNat didn't throw exception
-					throw new TskCoreException("AddImgProcess::run: AutoDB pointer is NULL after initAddImgNat");
-				}
-				runAddImgNat(autoDbPointer, imgPath, imgPath.length, timezone);
+			@Deprecated
+			public void run(String[] imageFilePaths) throws TskCoreException, TskDataException {
+				run(null, imageFilePaths);
 			}
 
 			/**
 			 * Start the process of adding an image to the case database. MUST
 			 * call either commit() or revert() after calling run().
 			 *
-			 * @param dataSourceId An identifier for the data source that is
-			 * unique across multiple cases (e.g., a UUID).
-			 * @param imgPath Full path to the image file.
+			 * @param dataSourceId An ASCII-printable identifier for the data
+			 * source that is unique across multiple cases (e.g., a UUID).
+			 * @param imageFilePaths Full paths to the image files.
 			 * @throws TskCoreException exception thrown if critical error
 			 * occurs within TSK
 			 * @throws TskDataException exception thrown if non-critical error
 			 * occurs within TSK (should be OK to continue)
 			 */
-			public void run(String dataSourceId, String imagePath) throws TskCoreException, TskDataException {
+			public void run(String dataSourceId, String[] imageFilePaths) throws TskCoreException, TskDataException {
 				if (autoDbPointer != 0) {
 					throw new TskCoreException("AddImgProcess:run: AutoDB pointer is already set");
 				}
@@ -294,7 +284,7 @@ public void run(String dataSourceId, String imagePath) throws TskCoreException,
 					//additional check in case initAddImgNat didn't throw exception
 					throw new TskCoreException("AddImgProcess::run: AutoDB pointer is NULL after initAddImgNat");
 				}
-				runAddDataSourceNat(autoDbPointer, dataSourceId, imagePath, timezone);
+				runAddImgNat(autoDbPointer, dataSourceId, imageFilePaths, imageFilePaths.length, timezone);
 			}
 
 			/**
diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp
index 70eaf9143e114f8773933810536eccf364ae386e..3d764dc30576d6f905b3b9554d6cea37d46860a4 100644
--- a/tsk/auto/auto_db.cpp
+++ b/tsk/auto/auto_db.cpp
@@ -108,7 +108,7 @@ void TskAutoDb::setAddUnallocSpace(bool addUnallocSpace, int64_t chunkSize)
 
 uint8_t
     TskAutoDb::openImageUtf8(int a_num, const char *const a_images[],
-    TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize)
+    TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize, const char* dataSourceId)
 {
     uint8_t retval =
         TskAuto::openImageUtf8(a_num, a_images, a_type, a_ssize);
@@ -116,7 +116,7 @@ uint8_t
         return retval;
     }
 
-    if (addImageDetails(a_images, a_num)) {
+    if (addImageDetails(dataSourceId, a_images, a_num)) {
         return 1;
     }
     return 0;
@@ -124,7 +124,7 @@ uint8_t
 
 uint8_t
     TskAutoDb::openImage(int a_num, const TSK_TCHAR * const a_images[],
-    TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize)
+    TSK_IMG_TYPE_ENUM a_type, unsigned int a_ssize, const char* dataSourceId)
 {
 
 // make name of database
@@ -164,7 +164,7 @@ uint8_t
         img_ptrs[i] = img2;
     }
 
-    if (addImageDetails(img_ptrs, a_num)) {
+    if (addImageDetails(dataSourceId, img_ptrs, a_num)) {
         //cleanup
         for (int i = 0; i < a_num; ++i) {
             free(img_ptrs[i]);
@@ -181,7 +181,7 @@ uint8_t
 
     return 0;
 #else
-    return openImageUtf8(a_num, a_images, a_type, a_ssize);
+    return openImageUtf8(a_num, a_images, a_type, a_ssize, dataSourceId);
 #endif
 }
 
@@ -191,10 +191,10 @@ uint8_t
  * @return Returns 1 on error
  */
 uint8_t
-TskAutoDb::addImageDetails(const char *const img_ptrs[], int a_num)
+TskAutoDb::addImageDetails(const char* dataSourceId, const char *const img_ptrs[], int a_num)
 {
-   string md5 = "";
 #if HAVE_LIBEWF 
+   string md5 = "";
    if (m_img_info->itype == TSK_IMG_TYPE_EWF_EWF) {
      // @@@ This shoudl really probably be inside of a tsk_img_ method
        IMG_EWF_INFO *ewf_info = (IMG_EWF_INFO *)m_img_info;
@@ -204,8 +204,14 @@ TskAutoDb::addImageDetails(const char *const img_ptrs[], int a_num)
    }
 #endif
 
+    string dataSrcId;
+    if (NULL != dataSourceId) {
+        dataSrcId = dataSourceId; 
+    } else {
+        dataSourceId = "";
+    }
     if (m_db->addImageInfo(m_img_info->itype, m_img_info->sector_size,
-          m_curImgId, m_curImgTZone, m_img_info->size, md5)) {
+          m_curImgId, m_curImgTZone, m_img_info->size, md5, dataSourceId)) {
         registerError();
         return 1;
     }
@@ -378,7 +384,7 @@ uint8_t TskAutoDb::addFilesInImgToDb()
  */
 uint8_t
     TskAutoDb::startAddImage(int numImg, const TSK_TCHAR * const imagePaths[],
-    TSK_IMG_TYPE_ENUM imgType, unsigned int sSize)
+    TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* dataSourceId)
 {
     if (tsk_verbose)
         tsk_fprintf(stderr, "TskAutoDb::startAddImage: Starting add image process\n");
@@ -407,7 +413,7 @@ uint8_t
 
     m_imgTransactionOpen = true;
 
-    if (openImage(numImg, imagePaths, imgType, sSize)) {
+    if (openImage(numImg, imagePaths, imgType, sSize, dataSourceId)) {
         tsk_error_set_errstr2("TskAutoDb::startAddImage");
         registerError();
         if (revertAddImage())
@@ -418,10 +424,11 @@ uint8_t
     return addFilesInImgToDb();
 }
 
+
 #ifdef WIN32
 uint8_t
     TskAutoDb::startAddImage(int numImg, const char *const imagePaths[],
-    TSK_IMG_TYPE_ENUM imgType, unsigned int sSize)
+    TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* dataSourceId)
 {
     if (tsk_verbose)
         tsk_fprintf(stderr, "TskAutoDb::startAddImage_utf8: Starting add image process\n");
@@ -452,7 +459,7 @@ uint8_t
 
     m_imgTransactionOpen = true;
 
-    if (openImageUtf8(numImg, imagePaths, imgType, sSize)) {
+    if (openImageUtf8(numImg, imagePaths, imgType, sSize, dataSourceId)) {
         tsk_error_set_errstr2("TskAutoDb::startAddImage");
         registerError();
         if (revertAddImage())
diff --git a/tsk/auto/db_postgresql.cpp b/tsk/auto/db_postgresql.cpp
index 832339715221f27cb0abb638c4c17f108c3cf134..7e670dbe91c86cbda696f0bc4c5474fd8900999b 100755
--- a/tsk/auto/db_postgresql.cpp
+++ b/tsk/auto/db_postgresql.cpp
@@ -299,7 +299,7 @@ int TskDbPostgreSQL::attempt_exec(const char *sql, const char *errfmt)
 * Validate string that was escaped by a call to PQescapeLiteral(). Sets TSK error values on error.
 * @returns 1 if string is valid, 0 otherwise
 */
-int TskDbPostgreSQL::isEscapedStringValid(char *sql_str, char *orig_str, const char *errfmt){
+int TskDbPostgreSQL::isEscapedStringValid(const char *sql_str, const char *orig_str, const char *errfmt){
 
     if (!sql_str){
         tsk_error_reset();
@@ -680,7 +680,7 @@ TSK_RETVAL_ENUM TskDbPostgreSQL::getVsInfo(int64_t objId, TSK_DB_VS_INFO & vsInf
 }
 
 /**
-* deprecated
+* @deprecated
 */
 int TskDbPostgreSQL::addImageInfo(int type, int size, int64_t & objId, const string & timezone)
 {
@@ -692,29 +692,30 @@ int TskDbPostgreSQL::addImageInfo(int type, int size, int64_t & objId, const str
 */
 int TskDbPostgreSQL::addImageInfo(int type, int ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5)
 {
-    char stmt[2048];
-    int expectedNumFileds = 1;
+    return addImageInfo(type, size, objId, timezone, 0, "", "");
+}
 
+/**
+* @returns 1 on error, 0 on success
+*/
+int TskDbPostgreSQL::addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5, const string& dataSourceId)
+{
+    // Add the data source to the tsk_objects table.
     // We don't use addObject because we're passing in NULL as the parent
+    char stmt[2048];
+    int expectedNumFileds = 1;
     snprintf(stmt, 2048, "INSERT INTO tsk_objects (par_obj_id, type) VALUES (NULL, %d) RETURNING obj_id;", TSK_DB_OBJECT_TYPE_IMG);
     PGresult *res = get_query_result_set(stmt, "TskDbPostgreSQL::addObj: Error adding object to row: %s (result code %d)\n");
-
-    // check if a valid result set was returned
     if (verifyNonEmptyResultSetSize(stmt, res, expectedNumFileds, "TskDbPostgreSQL::addObj: Unexpected number of results: Expected %d, Received %d\n")) {
         return 1;
     }
-
-    // Returned value is objId
     objId = atoll(PQgetvalue(res, 0, 0));
 
-    // replace all non-UTF8 characters
+    // Add the data source to the tsk_image_info table.
     char timeZone_local[MAX_DB_STRING_LENGTH];
     removeNonUtf8(timeZone_local, MAX_DB_STRING_LENGTH - 1, timezone.c_str());
-
     char md5_local[MAX_DB_STRING_LENGTH];
     removeNonUtf8(md5_local, MAX_DB_STRING_LENGTH - 1, md5.c_str());
-
-    // escape strings for use within an SQL command
     char *timezone_sql = PQescapeLiteral(conn, timeZone_local, strlen(timeZone_local));
     char *md5_sql = PQescapeLiteral(conn, md5_local, strlen(md5_local));
     if (!isEscapedStringValid(timezone_sql, timeZone_local, "TskDbPostgreSQL::addImageInfo: Unable to escape time zone string: %s (Error: %s)\n") 
@@ -723,15 +724,25 @@ int TskDbPostgreSQL::addImageInfo(int type, int ssize, int64_t & objId, const st
         PQfreemem(md5_sql);
         return 1;
     }
-
     snprintf(stmt, 2048, "INSERT INTO tsk_image_info (obj_id, type, ssize, tzone, size, md5) VALUES (%lld, %d, %d, %s, %"PRIuOFF", %s);",
         objId, type, ssize, timezone_sql, size, md5_sql);
-
     int ret = attempt_exec(stmt, "Error adding data to tsk_image_info table: %s\n");
-
-    // cleanup
     PQfreemem(timezone_sql);
     PQfreemem(md5_sql);
+    if (1 == ret || dataSourceId.empty()) {
+        return ret;
+    }
+
+    // Add the data source to the data_source_info table.
+    char *dataSourceId_sql = PQescapeLiteral(conn, dataSourceId.c_str(), strlen(dataSourceId.c_str()));
+    if (!isEscapedStringValid(dataSourceId_sql, dataSourceId.c_str(), "TskDbPostgreSQL::addImageInfo: Unable to escape data source string: %s (Error: %s)\n")) {
+        PQfreemem(dataSourceId_sql);
+        return 1;
+    }
+    snprintf(stmt, 2048, "INSERT INTO data_source_info (obj_id, data_src_id) VALUES (%lld, %s);",
+        objId, dataSourceId_sql);
+    ret = attempt_exec(stmt, "Error adding data source id to data_source_info table: %s\n");
+    PQfreemem(dataSourceId_sql);
     return ret;
 }
 
diff --git a/tsk/auto/db_sqlite.cpp b/tsk/auto/db_sqlite.cpp
index 0f9e6d1c0a8d39aaf5f840a36fdba7f8a533fd8e..a3baa4c1df32b626739102d7596a038dd10ac40f 100755
--- a/tsk/auto/db_sqlite.cpp
+++ b/tsk/auto/db_sqlite.cpp
@@ -484,6 +484,38 @@ int
     return ret;
 }
 
+int TskDbSqlite::addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5, const string& dataSourceId)
+{
+    // Add the data source to the tsk_objects table.
+    // We don't use addObject because we're passing in NULL as the parent
+    char stmt[1024];
+    snprintf(stmt, 1024,
+        "INSERT INTO tsk_objects (obj_id, par_obj_id, type) VALUES (NULL, NULL, %d);",
+        TSK_DB_OBJECT_TYPE_IMG);
+    if (attempt_exec(stmt, "Error adding data to tsk_objects table: %s\n")) {
+        return 1;
+    }
+    objId = sqlite3_last_insert_rowid(m_db);
+
+    // Add the data source to the tsk_image_info table.
+    char *zSQL;
+    zSQL = sqlite3_mprintf("INSERT INTO tsk_image_info (obj_id, type, ssize, tzone, size, md5) VALUES (%lld, %d, %d, '%q', %"PRIuOFF", '%q');",
+        objId, type, ssize, timezone.c_str(), size, md5.c_str());
+    int ret = attempt_exec(zSQL,
+        "Error adding data to tsk_image_info table: %s\n");
+    sqlite3_free(zSQL);
+    if (1 == ret || dataSourceId.empty()) {
+        return ret;
+    }
+
+    // Add the data source to the data_source_info table.
+    zSQL = sqlite3_mprintf("INSERT INTO data_source_info (obj_id, data_src_id) VALUES (%lld, '%s');",
+        objId, dataSourceId.c_str());
+    ret = attempt_exec(zSQL, "Error adding data to tsk_image_info table: %s\n");
+    sqlite3_free(zSQL);
+    return ret;
+}
+
 /**
 * @returns 1 on error, 0 on success
 */
diff --git a/tsk/auto/tsk_case_db.h b/tsk/auto/tsk_case_db.h
index 004d4502494b747524c9bea1fbc14d9e55ac2286..0673201713847d3c5c6e301795d2caff34cba071 100644
--- a/tsk/auto/tsk_case_db.h
+++ b/tsk/auto/tsk_case_db.h
@@ -36,9 +36,9 @@ class TskAutoDb:public TskAuto {
     TskAutoDb(TskDb * a_db, TSK_HDB_INFO * a_NSRLDb, TSK_HDB_INFO * a_knownBadDb);
     virtual ~ TskAutoDb();
     virtual uint8_t openImage(int, const TSK_TCHAR * const images[],
-        TSK_IMG_TYPE_ENUM, unsigned int a_ssize);
+        TSK_IMG_TYPE_ENUM, unsigned int a_ssize, const char* dataSourceId = NULL);
     virtual uint8_t openImageUtf8(int, const char *const images[],
-        TSK_IMG_TYPE_ENUM, unsigned int a_ssize);
+        TSK_IMG_TYPE_ENUM, unsigned int a_ssize, const char* dataSourceId = NULL);
     virtual void closeImage();
     virtual void setTz(string tzone);
 
@@ -90,10 +90,10 @@ class TskAutoDb:public TskAuto {
     uint8_t addFilesInImgToDb();
 
     uint8_t startAddImage(int numImg, const TSK_TCHAR * const imagePaths[],
-        TSK_IMG_TYPE_ENUM imgType, unsigned int sSize);
+        TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* dataSourceId = NULL);
 #ifdef WIN32
     uint8_t startAddImage(int numImg, const char *const imagePaths[],
-        TSK_IMG_TYPE_ENUM imgType, unsigned int sSize);
+        TSK_IMG_TYPE_ENUM imgType, unsigned int sSize, const char* dataSourceId = NULL);
 #endif
     void stopAddImage();
     int revertAddImage();
@@ -145,7 +145,7 @@ class TskAutoDb:public TskAuto {
         uint32_t nextSequenceNo;
     } UNALLOC_BLOCK_WLK_TRACK;
 
-    uint8_t addImageDetails(const char *const images[], int);
+    uint8_t addImageDetails(const char *, const char *const images[], int);
     TSK_RETVAL_ENUM insertFileData(TSK_FS_FILE * fs_file,
         const TSK_FS_ATTR *, const char *path,
         const unsigned char *const md5,
diff --git a/tsk/auto/tsk_db.h b/tsk/auto/tsk_db.h
index 94c77a641f9b9ca161a03570ea35a9bf13b74aeb..4c1e0575f161e40c28724254377f4644d97f339f 100755
--- a/tsk/auto/tsk_db.h
+++ b/tsk/auto/tsk_db.h
@@ -162,6 +162,7 @@ class TskDb {
     virtual TSK_RETVAL_ENUM setConnectionInfo(CaseDbConnectionInfo * info);
     virtual int addImageInfo(int type, int size, int64_t & objId, const string & timezone) = 0;
     virtual int addImageInfo(int type, int size, int64_t & objId, const string & timezone, TSK_OFF_T, const string &md5) = 0;
+    virtual int addImageInfo(int type, TSK_OFF_T size, int64_t & objId, const string & timezone, TSK_OFF_T, const string &md5, const string& dataSourceId) = 0;
     virtual int addImageName(int64_t objId, char const *imgName, int sequence) = 0;
     virtual int addVsInfo(const TSK_VS_INFO * vs_info, int64_t parObjId, int64_t & objId) = 0;
     virtual int addVolumeInfo(const TSK_VS_PART_INFO * vs_part, int64_t parObjId, int64_t & objId) = 0;
diff --git a/tsk/auto/tsk_db_postgresql.h b/tsk/auto/tsk_db_postgresql.h
index 472799effd60bcf0fa712529a401060e44139b21..2905cf565203927d8f24b7b3269a9fa0b573325e 100755
--- a/tsk/auto/tsk_db_postgresql.h
+++ b/tsk/auto/tsk_db_postgresql.h
@@ -48,6 +48,7 @@ class TskDbPostgreSQL : public TskDb {
 
     int addImageInfo(int type, int size, int64_t & objId, const string & timezone);
     int addImageInfo(int type, int size, int64_t & objId, const string & timezone, TSK_OFF_T, const string &md5);
+    int addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5, const string& dataSourceId);
     int addImageName(int64_t objId, char const *imgName, int sequence);
     int addVsInfo(const TSK_VS_INFO * vs_info, int64_t parObjId,
         int64_t & objId);
@@ -110,7 +111,7 @@ class TskDbPostgreSQL : public TskDb {
     PGresult* get_query_result_set(const char *sql, const char *errfmt);
     PGresult* get_query_result_set_binary(const char *sql, const char *errfmt);
     bool isQueryResultValid(PGresult *res, const char *sql);
-    int isEscapedStringValid(char *sql_str, char *orig_str, const char *errfmt);
+    int isEscapedStringValid(const char *sql_str, const char *orig_str, const char *errfmt);
     int createIndexes();
 
     void removeNonUtf8(char* newStr, int newStrMaxSize, const char* origStr);
diff --git a/tsk/auto/tsk_db_sqlite.h b/tsk/auto/tsk_db_sqlite.h
index 4424c892968d498460f78f2b753aed54641c404e..d4728456776bc3f17fa6bd9523910b0542ca50e1 100755
--- a/tsk/auto/tsk_db_sqlite.h
+++ b/tsk/auto/tsk_db_sqlite.h
@@ -40,6 +40,7 @@ class TskDbSqlite : public TskDb {
     int close();
     int addImageInfo(int type, int size, int64_t & objId, const string & timezone);
     int addImageInfo(int type, int size, int64_t & objId, const string & timezone, TSK_OFF_T, const string &md5);
+    int addImageInfo(int type, TSK_OFF_T ssize, int64_t & objId, const string & timezone, TSK_OFF_T size, const string &md5, const string& dataSourceId);
     int addImageName(int64_t objId, char const *imgName, int sequence);
     int addVsInfo(const TSK_VS_INFO * vs_info, int64_t parObjId,
         int64_t & objId);