diff --git a/bindings/java/nbproject/project.xml b/bindings/java/nbproject/project.xml
index 2454ae23433c1f048679810db9b5b49bd19e33ea..28547940761d03c42bd0f4bc0250e5dc012ef42e 100755
--- a/bindings/java/nbproject/project.xml
+++ b/bindings/java/nbproject/project.xml
@@ -114,7 +114,7 @@
         <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/3">
             <compilation-unit>
                 <package-root>src</package-root>
-                <classpath mode="compile">lib;lib/diffutils-1.2.1.jar;lib/junit-4.8.2.jar;lib/sqlite-jdbc-3.8.0-SNAPSHOT.jar</classpath>
+                <classpath mode="compile">lib;lib/diffutils-1.2.1.jar;lib/junit-4.8.2.jar;lib/sqlite-jdbc-3.7.15-M1.jar</classpath>
                 <built-to>build</built-to>
                 <source-level>1.6</source-level>
             </compilation-unit>
diff --git a/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java b/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java
index 04945b04f2477a28326d05876d9be9b2623c0b66..353961bc829ba46837f4f5eacebb32349480c2c9 100755
--- a/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java
@@ -119,7 +119,7 @@ public synchronized Content getParent() throws TskCoreException {
 			try {
 				parentInfo = db.getParentInfo(this);
 			} catch (TskCoreException ex) {
-				// there is not parent; not an error if we've got an Image
+				// there is not parent; not an error if we've got a data source
 				return null;
 			}
 			parent = db.getContentById(parentInfo.id);
@@ -146,14 +146,14 @@ public long getId() {
 		return this.objId;
 	}
 
+	// classes should override this if they can be a data source 
 	@Override
-	public Image getImage() throws TskCoreException {
-		Image image = null;
+	public Content getDataSource() throws TskCoreException {
 		Content myParent = getParent();
-		if (myParent != null) {
-			image = myParent.getImage();
-		}
-		return image;
+		if (myParent == null) 
+			return null;
+			
+		return myParent.getDataSource();
 	}
 
 	/**
diff --git a/bindings/java/src/org/sleuthkit/datamodel/Content.java b/bindings/java/src/org/sleuthkit/datamodel/Content.java
index 1be30287a9bfef4d21f00433875863d2d0ba1c54..6ef99e193bba0a91ba8235da6c2c8f4b3f3b1130 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/Content.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/Content.java
@@ -91,13 +91,12 @@ public interface Content extends SleuthkitVisitableItem {
 	public long getId();
 
 	/**
-	 * Get the root image of this content, of null if there is no image associated with this content
-	 * (such as for LocalFile)
+	 * Get the root data source of this content (image, virtual directory, etc.)
 	 *
-	 * @return image associated with this Content or null if there isn't any
+	 * @return Content associated with data source or null if one can't be found
 	 * @throws TskCoreException if critical error occurred within tsk core
 	 */
-	public Image getImage() throws TskCoreException;
+	public Content getDataSource() throws TskCoreException;
 
 	/**
 	 * Gets the child content objects of this content.
diff --git a/bindings/java/src/org/sleuthkit/datamodel/DerivedFile.java b/bindings/java/src/org/sleuthkit/datamodel/DerivedFile.java
index a221c162c241eb4fd0addef46c4055a89e87ef4c..689e108f441b3de6ad2d04c672ed7e422b15c73a 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/DerivedFile.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/DerivedFile.java
@@ -87,20 +87,19 @@ public boolean isRoot() {
 	}
 
 	@Override
-	public Image getImage() throws TskCoreException {
+	public Content getDataSource() throws TskCoreException {
 		//TODO need schema support to implement this more efficiently
-		Image image = null;
-		Content ancestor = getParent();
-		image = ancestor.getImage();
-		while (image == null) {
-			ancestor = ancestor.getParent();
-			if (ancestor == null) {
+		Content parent = getParent();
+		Content dataSource = parent.getDataSource();
+		while (dataSource == null) {
+			parent = parent.getParent();
+			if (parent == null) {
 				//should never happen
 				break;
 			}
-			image = ancestor.getImage();
+			dataSource = parent.getDataSource();
 		}
-		return image;
+		return dataSource;
 	}
 
 	@Override
diff --git a/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java b/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java
index da965128478718a879a3f213f2deb4825da17681..2ae60ebdc3cdd45227016eb373dfdc2419df6d48 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java
@@ -92,7 +92,14 @@ long getFileSystemHandle() throws TskCoreException {
 		if (filesystemHandle == 0) {
 			synchronized (this) {
 				if (filesystemHandle == 0) {
-					filesystemHandle = SleuthkitJNI.openFs(getImage().getImageHandle(), imgOffset);
+					Content dataSource = getDataSource();
+					if ((dataSource != null) && (dataSource instanceof Image)) {
+						Image image = (Image)dataSource;
+						filesystemHandle = SleuthkitJNI.openFs(image.getImageHandle(), imgOffset);
+					}
+					else {
+						throw new TskCoreException ("Data Source of File System is not an image");
+					}
 				}
 			}
 		}
@@ -208,11 +215,6 @@ public List<Long> getChildrenIds() throws TskCoreException {
 		return getSleuthkitCase().getAbstractFileChildrenIds(this);
 	}
 
-	@Override
-	public Image getImage() throws TskCoreException {
-		return getParent().getImage();
-	}
-
 	@Override
 	public String toString(boolean preserveState) {
 		return super.toString(preserveState) + "FileSystem [\t" + " blockCount " + blockCount + "\t" + "blockSize " + blockSize + "\t" + "firstInum " + firstInum + "\t" + "fsType " + fsType + "\t" + "imgOffset " + imgOffset + "\t" + "lastInum " + lastInum + "\t" + "rootInum " + rootInum + "\t" + "]"; //NON-NLS
diff --git a/bindings/java/src/org/sleuthkit/datamodel/FsContent.java b/bindings/java/src/org/sleuthkit/datamodel/FsContent.java
index 57cf9cab4e794fe798614dfa42fbc5ad9120a7e0..4a987335a11ec5bea935611a15a663e80493882e 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/FsContent.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/FsContent.java
@@ -143,9 +143,13 @@ protected int readInt(byte[] buf, long offset, long len) throws TskCoreException
 			return SleuthkitJNI.readFile(fileHandle, buf, offset, len);
 		}
 		catch (TskCoreException ex) {
-			if (!getImage().imageFileExists()) {
-				tskCase.submitError(bundle.getString("FsContent.readInt.err.context.text"),
+			Content dataSource = getDataSource();
+			if ((dataSource != null) && (dataSource instanceof Image)) {
+				Image image = (Image)dataSource;
+				if (!image.imageFileExists()) {
+					tskCase.submitError(bundle.getString("FsContent.readInt.err.context.text"),
                                     bundle.getString("FsContent.readInt.err.msg.text"));
+				}
 			}
 			throw ex;
 		}
@@ -179,8 +183,8 @@ public AbstractFile getParentDirectory() throws TskCoreException {
 	}
 
 	@Override
-	public Image getImage() throws TskCoreException {
-		return getFileSystem().getImage();
+	public Content getDataSource() throws TskCoreException {
+		return getFileSystem().getDataSource();
 	}
 
 	@Override
diff --git a/bindings/java/src/org/sleuthkit/datamodel/Image.java b/bindings/java/src/org/sleuthkit/datamodel/Image.java
index 394b7287e8496a46b12c657763f7296723be9887..8c4d1ca81f21296dd58d1476248d961590df6dc9 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/Image.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/Image.java
@@ -78,7 +78,7 @@ public synchronized long getImageHandle() throws TskCoreException {
 	}
 
 	@Override
-	public Image getImage() {
+	public Content getDataSource() {
 		return this;
 	}
 
diff --git a/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java b/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java
index 349c95dd3a679fbcd1e86141b4e1ecc8b59613c1..e079c62af75a9611c32dea0d3759e80961faf114 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java
@@ -39,7 +39,9 @@
  * 
  * The class also supports reads of layout files, reading blocks across ranges in a sequence
  */
-public class LayoutFile extends AbstractFile{
+public class LayoutFile extends AbstractFile {
+	
+	private long imageHandle = -1;
 	
 	protected LayoutFile(SleuthkitCase db, long objId, String name, 
 			TSK_DB_FILES_TYPE_ENUM fileType, 
@@ -101,6 +103,17 @@ protected int readInt(byte[] buf, long offset, long len) throws TskCoreException
         long offsetInThisLayoutContent = 0; // current offset in this LayoutContent
         int bytesRead = 0; // Bytes read so far
 		
+		if (imageHandle == -1) {
+			Content dataSource = getDataSource();
+			if ((dataSource != null) && (dataSource instanceof Image)) {
+				Image image = (Image)dataSource;
+				imageHandle = image.getImageHandle();
+			}
+			else {
+				throw new TskCoreException ("Data Source of LayoutFile is not Image");
+			}
+		}
+		
         for (TskFileRange range : getRanges()) {
             if (bytesRead < len) { // we haven't read enough yet
                 if (offset < offsetInThisLayoutContent + range.getByteLen()) { // if we are in a range object we want to read from
@@ -110,7 +123,7 @@ protected int readInt(byte[] buf, long offset, long len) throws TskCoreException
                     }
                     long offsetInImage = range.getByteStart() + offsetInRange; // how far into the image to start reading
                     long lenToRead = Math.min(range.getByteLen() - offsetInRange, len-bytesRead); // how much we can read this time
-                    int lenRead = readImgToOffset(getImage().getImageHandle(), buf, bytesRead, offsetInImage, (int) lenToRead);
+                    int lenRead = readImgToOffset(imageHandle, buf, bytesRead, offsetInImage, (int) lenToRead);
                     bytesRead += lenRead;
                     if(lenToRead != lenRead) { // If image read failed or was cut short
                         break;
@@ -153,11 +166,6 @@ public <T> T accept(SleuthkitItemVisitor<T> v) {
 		return v.visit(this);
 	}
 
-	@Override
-	public Image getImage() throws TskCoreException{
-		return getParent().getImage();
-	}
-
 	
 	@Override
 	public boolean isRoot() {
diff --git a/bindings/java/src/org/sleuthkit/datamodel/LocalFile.java b/bindings/java/src/org/sleuthkit/datamodel/LocalFile.java
index ddd2eeec6721946aaecb5bb71cf98ac4cafe0a93..a271ccd2cdf1e6c7ff1a9ff9d3be7c4498a29b8b 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/LocalFile.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/LocalFile.java
@@ -132,13 +132,6 @@ protected LocalFile(SleuthkitCase db, long objId, String name, TSK_FS_NAME_TYPE_
 		this(db, objId, name, TSK_DB_FILES_TYPE_ENUM.LOCAL, dirType, metaType, dirFlag, metaFlags, size, ctime, crtime, atime, mtime, md5Hash, knownState, parentPath, localPath);
 	}
 
-
-	@Override
-	public Image getImage() throws TskCoreException {
-		//true local file have no tsk image associated
-		return null;
-	}
-
 	@Override
 	public List<TskFileRange> getRanges() throws TskCoreException {
 		return Collections.<TskFileRange>emptyList();
diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
index 17135e269cb4588ccb7d4781ebc4cabd71b5094d..9207e2f8bfc3c1ccd89b29e9d8fbe644b24e2620 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
@@ -2382,27 +2382,7 @@ private long getFileSystemId(long fileId) {
 		return ret;
 	}
 
-	/**
-	 * Gets the root-level data source object id (such as Image or
-	 * VirtualDirectory representing filesets) for the file
-	 *
-	 * @param file file to get the root-level object id for
-	 * @return the root content object id in the hierarchy, or -1 if not found
-	 * (such as when invalid file object passed in)
-	 * @throws TskCoreException thrown if check failed due to a critical tsk
-	 * error
-	 */
-	public long getFileDataSource(AbstractFile file) throws TskCoreException {
-		final Image image = file.getImage();
-		if (image != null) {
-			//case for image data source
-			return image.getId();
-		} else {
-			//otherwise, get the root non-image data source id
-			//note, we are currently using fs_id internally to store data source id for such files
-			return getFileSystemId(file.getId());
-		}
-	}
+
 
 	/**
 	 * Checks if the file is a (sub)child of the data source (parentless Content
diff --git a/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java b/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java
index 966c00d756200afec0e4a35527d7e479a2405ce6..9a4637044f43fc15fb6190d7c56c9800052cb2da 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java
@@ -87,16 +87,15 @@ public <T> T accept(SleuthkitItemVisitor<T> v) {
 	}
 
 	@Override
-	public Image getImage() throws TskCoreException {
+	public Content getDataSource() throws TskCoreException {
 		Content parent =  getParent();
 		if (parent != null) {
-			return parent.getImage();
+			return parent.getDataSource();
 		}
 		else {
 			//root-level VirtualDirectory, such as local files container
-			return null;
+			return this;
 		}
-
 	}
 
 	@Override
diff --git a/bindings/java/src/org/sleuthkit/datamodel/Volume.java b/bindings/java/src/org/sleuthkit/datamodel/Volume.java
index f129b355a66429c3a74be446d4a48cbdd5589112..6fda16e927f83baf8a74e3f96a32761c626279f5 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/Volume.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/Volume.java
@@ -262,10 +262,6 @@ public List<Long> getChildrenIds() throws TskCoreException {
 		return getSleuthkitCase().getVolumeChildrenIds(this);
 	}
 
-	@Override
-	public Image getImage() throws TskCoreException {
-		return getParent().getImage();
-	}
 
 	/**
 	 * @return a list of FileSystem that are direct descendents of this Image.
diff --git a/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java b/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java
index bee84fcb877dc75735a03e0d33bb39642ed19bc8..481b247a87526411b825234e6500e5bf3a5ce2ed 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java
@@ -51,7 +51,7 @@ protected VolumeSystem(SleuthkitCase db, long obj_id, String name, long type, lo
 	public int read(byte[] readBuffer, long offset, long len) throws TskCoreException {
 		synchronized (this) {
 			if (volumeSystemHandle == 0) {
-				volumeSystemHandle = SleuthkitJNI.openVs(getImage().getImageHandle(), imgOffset);
+				getVolumeSystemHandle();
 			}
 		}
 		return SleuthkitJNI.readVs(volumeSystemHandle, readBuffer, offset, len);
@@ -98,7 +98,14 @@ public long getBlockSize() {
 	 */
 	protected synchronized long getVolumeSystemHandle() throws TskCoreException {
 		if (volumeSystemHandle == 0) {
-			volumeSystemHandle = SleuthkitJNI.openVs(getImage().getImageHandle(), imgOffset);
+			Content dataSource = getDataSource();
+			if ((dataSource != null) && (dataSource instanceof Image)) {
+				Image image = (Image)dataSource;
+				volumeSystemHandle = SleuthkitJNI.openVs(image.getImageHandle(), imgOffset);
+			}
+			else {
+				throw new TskCoreException ("Volume System data source is not an image");
+			}
 		}
 
 		return volumeSystemHandle;
@@ -145,11 +152,6 @@ public List<Long> getChildrenIds() throws TskCoreException {
 		return getSleuthkitCase().getVolumeSystemChildrenIds(this);
 	}
 
-	@Override
-	public Image getImage() throws TskCoreException {
-		return getParent().getImage();
-	}
-
 	/**
 	 * @return a list of Volumes that are direct children of this VolumeSystem
 	 * @throws TskCoreException