diff --git a/.gitignore b/.gitignore
index 6d28ff7d057ff60446874ffb1562d52be9f318b9..d5205772823da74734ee01b901dcf31baab67b41 100755
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,12 @@
 /bindings/java/lib/
 /bindings/java/build/
 /bindings/java/dist
+/bindings/java/test/output
+/bindings/java/test/input
+/bindings/java/nbproject/genfiles.properties
+/bindings/java/nbproject/nbjdk.properties
+/bindings/java/nbproject/jdk.xml
+/bindings/java/nbproject/nbjdk.xml
 
 # Windows build folders
 /win32/Debug_NoLibs/
diff --git a/bindings/java/build.xml b/bindings/java/build.xml
index 05ebf157e773f68a4c6a88df1e651652d95f24f6..68f7fadde6ecc19d34f32b883074cc425fc8ee74 100755
--- a/bindings/java/build.xml
+++ b/bindings/java/build.xml
@@ -7,7 +7,12 @@
   <!-- some dlls come from LIBEWF_HOME -->
 	<property environment="env"/>
 	<condition property="ewfFound">
-		<isset property="env.LIBEWF_HOME"/>
+		<and>
+			<isset property="env.LIBEWF_HOME"/>
+			<not>
+				<os family="mac"/>
+			</not>
+		</and>
 	</condition>
 	
   <!-- set global properties for this build -->
@@ -16,7 +21,10 @@
 	<property name="dist"  location="dist"/>
 	<property name="lib" location="lib"/>
 	<property name="test" location="test"/>
-	<property name="test-standards" location="teststandards"/>
+	<property name="test-standards" location="test/output/gold"/>
+	<property name="test-results" location="test/output/results"/>
+	<property name="test-input" location="test/input"/>
+	<property name="test-types" location="test/org/sleuthkit/datamodel"/>
 	<property name="dlls" value="${env.LIBEWF_HOME}/msvscpp/zlib;${env.LIBEWF_HOME}/msvscpp/Release;../../win32/Release"/>
   
 	<path id="libraries">
@@ -31,7 +39,9 @@
 		<mkdir dir="${build}"/>
 		<mkdir dir="${dist}"/>
 		<mkdir dir="${lib}"/>
+		<mkdir dir="${test-input}"/>
 		<mkdir dir="${test-standards}"/>
+		<mkdir dir="${test-results}"/>
 	</target>
   
 	<property name="ivy.install.version" value="2.1.0-rc2" />
@@ -71,27 +81,35 @@ pattern="lib/[artifact]-[revision](-[classifier]).[ext]" />
   
 	<target name="compile-test" depends="compile"
         description="compile the tests" >
-		<javac debug="on" srcdir="${test}" destdir="${build}">
+		<javac debug="on" srcdir="${test}" destdir="${build}" includeantruntime="false">
 			<classpath refid="libraries"/>
 		</javac>
 	</target>
   
-	<target name="create-standards" depends="compile-test"
-        description="create gold standards to run the datamodel tests against" >
+	<target name="test-create-standards"
+			description="Traverses the Images stored in the path represented by test-input variable and creates then stores them to the path represented by the test-standards variable, run test-download-imgs at least once before this."
+			depends="compile-test" >
 		<fail unless="ewfFound" message="LIBEWF_HOME must be set as an environment variable."/>
-		<java classname="org.sleuthkit.datamodel.DiffUtil" classpathref="libraries"	fork="true" failonerror="true">
+		<java classname="org.sleuthkit.datamodel.DataModelTestSuite" classpathref="libraries"	fork="true" failonerror="true">
 			<sysproperty key="java.library.path" value="${dlls}"/>
+			<sysproperty key="gold" value="${test-standards}"/>
+			<sysproperty key="inpt" value="${test-input}"/>
+			<sysproperty key="types" value="${test-types}"/>
 		</java>
 	</target>
   
-	<target name="test" depends="compile-test"
-        description="run the tests" >
+	<target name="test" 
+			description="Traverses the Images stored in the path represented by test-input variable, creates results files stored in the path represented by test-results, and compares them to the standards stored in the path represented by the test-standards variable, always run test-create-standards at least once before before running test."
+			depends="compile-test" >
 		<fail unless="ewfFound" message="LIBEWF_HOME must be set as an environment variable."/>
 		<junit fork="on" haltonfailure="yes" dir=".">
 			<sysproperty key="java.library.path" value="${dlls}"/>
+			<sysproperty key="rslt" value="${test-results}"/>
+			<sysproperty key="gold" value="${test-standards}"/>
+			<sysproperty key="inpt" value="${test-input}"/>
 			<classpath refid="libraries" />
 			<formatter type="plain" usefile="false" />
-			<test name="org.sleuthkit.datamodel.DiffTest" />
+			<test name="org.sleuthkit.datamodel.DataModelTestSuite" />
 		</junit>
 	</target>
  
@@ -127,5 +145,9 @@ pattern="lib/[artifact]-[revision](-[classifier]).[ext]" />
 		<mkdir dir="javadoc"/>
 		<javadoc sourcepath="src" destdir="javadoc" overview="src/overview.html" />
 	</target>
-
+	<target name="test-download-imgs" description="Get test images and store them in the path represented by the test-input variable.">
+		<mkdir dir="${test-input}" />
+		<get src="http://digitalcorpora.org/corp/nps/drives/nps-2009-canon2/nps-2009-canon2-gen5.raw" dest="${test-input}"/>
+		<get src="http://digitalcorpora.org/corp/nps/drives/nps-2009-ntfs1/ntfs1-gen2.raw" dest="${test-input}"/>
+	</target>
 </project>
diff --git a/bindings/java/nbproject/project.xml b/bindings/java/nbproject/project.xml
index 2a778c026c9bf6649f4d779c2cdec1d15b322d53..7be1d26b299adbb2688a9aaf79be66d1e3f14061 100755
--- a/bindings/java/nbproject/project.xml
+++ b/bindings/java/nbproject/project.xml
@@ -1,155 +1,163 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
-    <type>org.netbeans.modules.ant.freeform</type>
-    <configuration>
-        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
-            <name>DataModel</name>
-        </general-data>
-        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/2">
-            <!-- Do not use Project Properties customizer when editing this file manually. -->
-            <name>DataModel</name>
-            <properties/>
-            <folders>
-                <source-folder>
-                    <label>DataModel</label>
-                    <location>.</location>
-                    <encoding>windows-1252</encoding>
-                </source-folder>
-                <source-folder>
-                    <label>src</label>
-                    <type>java</type>
-                    <location>src</location>
-                    <encoding>windows-1252</encoding>
-                </source-folder>
-                <source-folder>
-                    <label>test</label>
-                    <type>java</type>
-                    <location>test</location>
-                    <encoding>windows-1252</encoding>
-                </source-folder>
-            </folders>
-            <ide-actions>
-                <action name="build">
-                    <target>dist</target>
-                </action>
-                <action name="clean">
-                    <target>clean</target>
-                </action>
-                <action name="rebuild">
-                    <target>clean</target>
-                    <target>dist</target>
-                </action>
-                <action name="run.single">
-                    <script>nbproject/ide-file-targets.xml</script>
-                    <target>run-selected-file-in-test</target>
-                    <context>
-                        <property>run.class</property>
-                        <folder>test</folder>
-                        <pattern>\.java$</pattern>
-                        <format>java-name</format>
-                        <arity>
-                            <one-file-only/>
-                        </arity>
-                    </context>
-                </action>
-                <action name="compile.single">
-                    <script>nbproject/ide-file-targets.xml</script>
-                    <target>compile-selected-files-in-test</target>
-                    <context>
-                        <property>files</property>
-                        <folder>test</folder>
-                        <pattern>\.java$</pattern>
-                        <format>relative-path</format>
-                        <arity>
-                            <separated-files>,</separated-files>
-                        </arity>
-                    </context>
-                </action>
-                <action name="test">
-                    <target>test</target>
-                </action>
-                <action name="javadoc">
-                    <target>javadoc</target>
-                </action>
-            </ide-actions>
-            <export>
-                <type>folder</type>
-                <location>build</location>
-                <build-target>dist</build-target>
-            </export>
-            <export>
-                <type>folder</type>
-                <location>build</location>
-                <build-target>dist</build-target>
-            </export>
-            <export>
-                <type>folder</type>
-                <location>test</location>
-                <build-target>dist</build-target>
-            </export>
-            <view>
-                <items>
-                    <source-folder style="packages">
-                        <label>src</label>
-                        <location>src</location>
-                    </source-folder>
-                    <source-folder style="packages">
-                        <label>test</label>
-                        <location>test</location>
-                    </source-folder>
-                    <source-file>
-                        <location>build.xml</location>
-                    </source-file>
-                </items>
-                <context-menu>
-                    <ide-action name="build"/>
-                    <ide-action name="rebuild"/>
-                    <ide-action name="clean"/>
-                    <ide-action name="javadoc"/>
-                    <ide-action name="test"/>
-                </context-menu>
-            </view>
-            <subprojects/>
-        </general-data>
-        <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/sqlite-jdbc-3.7.8-SNAPSHOT.jar;lib/junit-4.8.2.jar</classpath>
-                <built-to>build</built-to>
-                <source-level>1.7</source-level>
-            </compilation-unit>
-            <compilation-unit>
-                <package-root>test</package-root>
-                <unit-tests/>
-                <classpath mode="compile">build;lib/diffutils-1.2.1.jar;lib/diffutils-1.2.1-javadoc.jar;lib/diffutils-1.2.1-sources.jar;lib/junit-4.8.2.jar</classpath>
-                <built-to>build</built-to>
-                <built-to>test</built-to>
-                <source-level>1.7</source-level>
-            </compilation-unit>
-        </java-data>
-        <preferences xmlns="http://www.netbeans.org/ns/auxiliary-configuration-preferences/1">
-            <module name="org-netbeans-modules-html-editor-lib"/>
-            <module name="org-netbeans-modules-editor-indent">
-                <node name="CodeStyle">
-                    <property name="usedProfile" value="project"/>
-                    <node name="project">
-                        <property name="spaces-per-tab" value="4"/>
-                        <property name="tab-size" value="4"/>
-                        <property name="indent-shift-width" value="4"/>
-                        <property name="expand-tabs" value="false"/>
-                        <property name="text-limit-width" value="80"/>
-                        <property name="text-line-wrap" value="none"/>
-                    </node>
-                </node>
-                <node name="text">
-                    <node name="x-java">
-                        <node name="CodeStyle">
-                            <node name="project"/>
-                        </node>
-                    </node>
-                </node>
-            </module>
-            <module name="org-netbeans-modules-projectimport-eclipse-core"/>
-        </preferences>
-    </configuration>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ant.freeform</type>
+    <configuration>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
+            <name>DataModel</name>
+        </general-data>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/2">
+            <!-- Do not use Project Properties customizer when editing this file manually. -->
+            <name>DataModel</name>
+            <properties/>
+            <folders>
+                <source-folder>
+                    <label>DataModel</label>
+                    <location>.</location>
+                    <encoding>windows-1252</encoding>
+                </source-folder>
+                <source-folder>
+                    <label>src</label>
+                    <type>java</type>
+                    <location>src</location>
+                    <encoding>windows-1252</encoding>
+                </source-folder>
+                <source-folder>
+                    <label>test</label>
+                    <type>java</type>
+                    <location>test</location>
+                    <encoding>windows-1252</encoding>
+                </source-folder>
+            </folders>
+            <ide-actions>
+                <action name="build">
+                    <script>nbproject/nbjdk.xml</script>
+                    <target>dist</target>
+                </action>
+                <action name="clean">
+                    <script>nbproject/nbjdk.xml</script>
+                    <target>clean</target>
+                </action>
+                <action name="rebuild">
+                    <script>nbproject/nbjdk.xml</script>
+                    <target>clean</target>
+                    <target>dist</target>
+                </action>
+                <action name="run.single">
+                    <script>nbproject/nbjdk.xml</script>
+                    <target>run-selected-file-in-test</target>
+                    <context>
+                        <property>run.class</property>
+                        <folder>test</folder>
+                        <pattern>\.java$</pattern>
+                        <format>java-name</format>
+                        <arity>
+                            <one-file-only/>
+                        </arity>
+                    </context>
+                </action>
+                <action name="compile.single">
+                    <script>nbproject/nbjdk.xml</script>
+                    <target>compile-selected-files-in-test</target>
+                    <context>
+                        <property>files</property>
+                        <folder>test</folder>
+                        <pattern>\.java$</pattern>
+                        <format>relative-path</format>
+                        <arity>
+                            <separated-files>,</separated-files>
+                        </arity>
+                    </context>
+                </action>
+                <action name="test">
+                    <script>nbproject/nbjdk.xml</script>
+                    <target>test</target>
+                </action>
+                <action name="javadoc">
+                    <script>nbproject/nbjdk.xml</script>
+                    <target>javadoc</target>
+                </action>
+            </ide-actions>
+            <export>
+                <type>folder</type>
+                <location>build</location>
+                <script>nbproject/nbjdk.xml</script>
+                <build-target>dist</build-target>
+            </export>
+            <export>
+                <type>folder</type>
+                <location>build</location>
+                <script>nbproject/nbjdk.xml</script>
+                <build-target>dist</build-target>
+            </export>
+            <export>
+                <type>folder</type>
+                <location>test</location>
+                <script>nbproject/nbjdk.xml</script>
+                <build-target>dist</build-target>
+            </export>
+            <view>
+                <items>
+                    <source-folder style="packages">
+                        <label>src</label>
+                        <location>src</location>
+                    </source-folder>
+                    <source-folder style="packages">
+                        <label>test</label>
+                        <location>test</location>
+                    </source-folder>
+                    <source-file>
+                        <location>build.xml</location>
+                    </source-file>
+                </items>
+                <context-menu>
+                    <ide-action name="build"/>
+                    <ide-action name="rebuild"/>
+                    <ide-action name="clean"/>
+                    <ide-action name="javadoc"/>
+                    <ide-action name="test"/>
+                </context-menu>
+            </view>
+            <subprojects/>
+        </general-data>
+        <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/sqlite-jdbc-3.7.8-SNAPSHOT.jar;lib/junit-4.8.2.jar</classpath>
+                <built-to>build</built-to>
+                <source-level>1.6</source-level>
+            </compilation-unit>
+            <compilation-unit>
+                <package-root>test</package-root>
+                <unit-tests/>
+                <classpath mode="compile">build;lib/diffutils-1.2.1.jar;lib/diffutils-1.2.1-javadoc.jar;lib/diffutils-1.2.1-sources.jar;lib/junit-4.8.2.jar</classpath>
+                <built-to>build</built-to>
+                <built-to>test</built-to>
+                <source-level>1.6</source-level>
+            </compilation-unit>
+        </java-data>
+        <preferences xmlns="http://www.netbeans.org/ns/auxiliary-configuration-preferences/1">
+            <module name="org-netbeans-modules-html-editor-lib"/>
+            <module name="org-netbeans-modules-editor-indent">
+                <node name="CodeStyle">
+                    <property name="usedProfile" value="project"/>
+                    <node name="project">
+                        <property name="spaces-per-tab" value="4"/>
+                        <property name="tab-size" value="4"/>
+                        <property name="indent-shift-width" value="4"/>
+                        <property name="expand-tabs" value="false"/>
+                        <property name="text-limit-width" value="80"/>
+                        <property name="text-line-wrap" value="none"/>
+                    </node>
+                </node>
+                <node name="text">
+                    <node name="x-java">
+                        <node name="CodeStyle">
+                            <node name="project"/>
+                        </node>
+                    </node>
+                </node>
+            </module>
+            <module name="org-netbeans-modules-projectimport-eclipse-core"/>
+        </preferences>
+    </configuration>
+</project>
diff --git a/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java b/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java
index a0870ca3519bd1aa511df78d23c7e56c6f24dd55..f3383224e5c26c29db88cfaf17b011c48725d8dc 100755
--- a/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/AbstractContent.java
@@ -19,6 +19,8 @@
 package org.sleuthkit.datamodel;
 
 import java.util.ArrayList;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
 import org.sleuthkit.datamodel.SleuthkitCase.ObjectInfo;
 
@@ -29,14 +31,12 @@
 public abstract class AbstractContent implements Content {
 
 	public final static long UNKNOWN_ID = -1;
-	
 	private SleuthkitCase db;
 	private long objId;
 	private String name;
 	private Content parent;
 	private String uniquePath;
 	protected long parentId;
-	
 
 	protected AbstractContent(SleuthkitCase db, long obj_id, String name) {
 		this.db = db;
@@ -195,4 +195,26 @@ public long getArtifactsCount(ARTIFACT_TYPE type) throws TskCoreException {
 	public long getAllArtifactsCount() throws TskCoreException {
 		return db.getBlackboardArtifactsCount(objId);
 	}
+
+	@Override
+	public String toString() {
+		return toString(true);
+	}
+
+	public String toString(boolean preserveState){
+		if (preserveState) {
+			return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" + "name " + name + "\t" + "parentId " + parentId + "\t" + "uniquePath " + uniquePath + "]\t";
+		} else {
+			try {
+				if (getParent() != null) {
+					return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" + "name " + name + "\t" + "getUniquePath " + getUniquePath() + "\t" + "getParent " + getParent().getId() + "]\t";
+				} else {
+					return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" + "name " + name + "\t" + "uniquePath " + getUniquePath() + "\t" + "parentId " + parentId + "]\t";
+				}
+			} catch (TskCoreException ex) {
+				Logger.getLogger(AbstractContent.class.getName()).log(Level.SEVERE, "Could not find Parent", ex);
+				return "AbstractContent [\t" + "objId " + String.format("%010d", objId) + "\t" + "name " + name + "\t" + "parentId " + parentId + "\t" + "uniquePath " + uniquePath + "]\t";
+			}
+		}
+	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java b/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java
index ae8a8e11754d360d957526108d99a4da9d47fa6c..d08769acbf0c2b57fa365db97b6a3394cd16c749 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/AbstractFile.java
@@ -20,7 +20,6 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.StringTokenizer;
 
 /**
  * Common fields methods for objects stored in tsk_files table
@@ -138,5 +137,8 @@ public List<AbstractFile> listFiles() throws TskCoreException {
 		}
 		return files;
 	}
-    
+	@Override
+    public String toString(boolean preserveState){
+		return super.toString(preserveState) + "AbstractFile [\t" + "type " + type + "\t" + "isDir " + isDir() + "\t" + "isFile " + isFile() + "\t" + "isRoot " + isRoot() + "\t" + "isVirtual\t" + isVirtual() + "]\t";
+	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/Directory.java b/bindings/java/src/org/sleuthkit/datamodel/Directory.java
index 1c8a2485b7b12cc4bc006d83cefebe6f4e31c18d..03c8bf29273117b5ae357df6fa554aa06ef068a9 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/Directory.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/Directory.java
@@ -79,4 +79,9 @@ public boolean isDir() {
 	public boolean isFile() {
 		return false;
 	}
+	
+	@Override
+	public String toString(boolean preserveState){
+		return super.toString(preserveState) + "Directory [\t" + "]\t";
+	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/File.java b/bindings/java/src/org/sleuthkit/datamodel/File.java
index f2b6b71c4a35ec1f1f497de6c6f4e25d9bd737a8..356594edeb26e705972cece18c96cf80f6b2faf1 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/File.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/File.java
@@ -81,4 +81,8 @@ public boolean isDir() {
 	public boolean isFile() {
 		return true;
 	}
+	@Override
+	public String toString(boolean preserveState){
+		return super.toString(preserveState) + "File [\t" + "]\t";
+	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java b/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java
index 22983e5d2d7bff5938b2bcbf1ccf836f25f766dc..b370a6baf8daa9347ea90c937db14edec59f30f9 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java
@@ -198,4 +198,9 @@ public List<Long> getChildrenIds() throws TskCoreException {
 	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" + "]";
+	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/FsContent.java b/bindings/java/src/org/sleuthkit/datamodel/FsContent.java
index c12efebca0a0b7cc307979fb9ca77b6ef4dd5878..8a670a89f45c785a3a8f13b762363df9ea1eda9d 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/FsContent.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/FsContent.java
@@ -615,4 +615,8 @@ public static long timeToEpoch(String time) {
 
 		return epoch;
 	}
+	@Override
+	public String toString(boolean preserveState){
+		return super.toString(preserveState) + "FsContent [\t" + "\tcrtime " + crtime + "\t" + "mtime " + mtime + "\t" + "atime " + atime + "\t" + "attrId " + attrId + "\t" + "dirFlag " + dirFlag + "\t" + "dirType " + dirType + "\t"  + "fsObjId " + fsObjId + "\t" + "gid " + gid + "\t" + "metaAddr " + metaAddr + "\t" + "metaFlags " + metaFlags + "\t" + "metaType " + metaType + "\t" + "modes " + modes + "\t" + "parentPath " + parentPath + "\t" + "size " + size + "\t" + "uid " + uid + "\t" + "uniquePath " + uniquePath + "]\t";
+	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/Image.java b/bindings/java/src/org/sleuthkit/datamodel/Image.java
index b0dcdcbdaf4c6adf7bbc91f22fe5c5954024b068..387f5ce829a334dc321049d5e95d070f82848d11 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/Image.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/Image.java
@@ -19,6 +19,7 @@
 package org.sleuthkit.datamodel;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -303,4 +304,8 @@ public List<Content> getChildren() throws TskCoreException {
 	public List<Long> getChildrenIds() throws TskCoreException {
 		return getSleuthkitCase().getImageChildrenIds(this);
 	}
+	@Override
+	public String toString(boolean preserveState){
+		return super.toString(preserveState) + "Image [\t" + "\t" + "paths " + Arrays.toString(paths) + "\t" + "size " + size + "\t" + "ssize " + ssize + "\t" + "timezone " + timezone + "\t" + "type " + type + "]\t";
+	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java b/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java
index cbb4a22ec14b6a8bb38d2be05c8f1e0dbd57cb3b..ca7adf4dc446804fe1f7db5d8af9681815dfc01e 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/LayoutFile.java
@@ -189,4 +189,8 @@ public boolean isVirtual() {
 	public boolean isRoot() {
 		return false;
 	}
+	@Override
+	public String toString(boolean preserveState){
+		return super.toString(preserveState) + "LayoutFile [\t" + "]\t";
+	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
index b96573df9bebaf17474d118008825842573a27ca..1ef1cb65e2cb5190b77bdd9b33610a9fd34c78cf 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
@@ -695,12 +695,10 @@ private static String timezoneLongToShort(String timezone) {
 		}
 		
 		String result = "";
-
 		TimeZone zone = TimeZone.getTimeZone(timezone);
 		int offset = zone.getRawOffset() / 1000;
 		int hour = offset / 3600;
 		int min = (offset % 3600) / 60;
-
 		DateFormat dfm = new SimpleDateFormat("z");
 		dfm.setTimeZone(zone);
 		boolean hasDaylight = zone.useDaylightTime();
diff --git a/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java b/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java
index d847096932998053a2cf16c311f3614fcca8733d..c0249535d3aadc06165a6b498f5b9b9d4305925f 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/VirtualDirectory.java
@@ -137,4 +137,8 @@ public Image getImage() throws TskCoreException {
 	public boolean isVirtual() {
 		return true;
 	}
+	@Override
+	public String toString(boolean preserveState){
+		return super.toString(preserveState) + "VirtualDirectory [\t" + "\tdirFlags " + dirFlags + "\t" + "dirType " + dirType + "\t" + "metaFlags " + metaFlags + "\t" + "metaType " + metaType + "\t" + "parent_path " + parent_path + "\t" + "size " + size + "]\t";
+	}		
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/Volume.java b/bindings/java/src/org/sleuthkit/datamodel/Volume.java
index 31a6d681ae419948eeb6f0223634ed2566fe2a48..19dc97d2d020dd886c4f3ea714768f74656cd7f4 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/Volume.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/Volume.java
@@ -258,4 +258,10 @@ public List<FileSystem> getFileSystems() throws TskCoreException {
 		
 		return fileSystems;
 	}
+	
+	@Override
+	public String toString(boolean preserveState){
+		return super.toString(preserveState) + "Volume [\t" + "addr " + addr + "\t" + "desc " + desc + "\t" + "flags " + flags + "\t" + "length " + length + "\t" + "start " + start + "]\t";
+	}
+	
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java b/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java
index 71ff78526e2d9db2bf3d8981e731794eb1ae5fd7..9f48376ded3d88d8ed326f26dfdc8b4372e24403 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/VolumeSystem.java
@@ -154,4 +154,8 @@ public List<Volume> getVolumes() throws TskCoreException {
 		}
 		return volumes;
 	}
+	@Override
+	public String toString(boolean preserveState){
+		return super.toString(preserveState) + "VolumeSystem [\t" + "blockSize " + blockSize + "\t" + "imgOffset " + imgOffset + "\t" + "type " + type + "]\t";
+	}
 }
diff --git a/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java b/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..2bcdeef88dc6eb51a544fa7662f2e06a70e69b97
--- /dev/null
+++ b/bindings/java/test/org/sleuthkit/datamodel/BottomUpTest.java
@@ -0,0 +1,110 @@
+/*
+ * Sleuth Kit Data Model
+ *
+ * Copyright 2013 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.datamodel;
+
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Scanner;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/**
+ *
+ * Verifies that getParent works as intended.
+ */
+@RunWith(Parameterized.class)
+public class BottomUpTest {
+
+	static final String BU = "_BU";
+	private List<String> imagePaths;
+
+	public BottomUpTest(List<String> imagePaths) {
+		this.imagePaths = imagePaths;
+	}
+
+	/**
+	 * Get the sets of filenames for each test image, they should be located in
+	 * the folder specified by the build.xml
+	 *
+	 * @return A Collection of one-element Object arrays, where that one element
+	 * is a List<String> containing the image file paths (the type is weird
+	 * because that's what JUnit wants for parameters).
+	 */
+	@Parameterized.Parameters
+	public static Collection<Object[]> testImageData() {
+		Collection<Object[]> data = new ArrayList<Object[]>();
+
+		for (Object imagePaths : DataModelTestSuite.getImagePaths()) {
+			data.add(new Object[]{imagePaths});
+		}
+		return data;
+	}
+
+	/**
+	 * Runs a bottom up traversal of the image, starting at each leaf and going
+	 * until it reaches the top
+	 */
+	@Test
+	public void testBottomUpDiff() {
+		String title = DataModelTestSuite.getImgName(imagePaths.get(0));
+		String exFile = DataModelTestSuite.buildPath(DataModelTestSuite.getRsltPath(), title, BU, ".txt");
+		try {
+			java.io.File dbFile = new java.io.File(DataModelTestSuite.getRsltPath());
+			String tempDirPath = dbFile.getAbsolutePath();
+			String dbPath = DataModelTestSuite.buildPath(tempDirPath, title, BU, ".db");
+			dbFile.delete();
+			SleuthkitCase sk = SleuthkitCase.newCase(dbPath);
+			String timezone = "";
+			title = title + DataModelTestSuite.LVS + ".txt";
+			SleuthkitJNI.CaseDbHandle.AddImageProcess process = sk.makeAddImageProcess(timezone, true, false);
+			try {
+				process.run(imagePaths.toArray(new String[imagePaths.size()]));
+			} catch (TskDataException ex) {
+				DataModelTestSuite.writeExceptions(exFile, ex);
+			}
+			process.commit();
+			java.io.File lvs = new java.io.File(dbFile.getAbsolutePath() + java.io.File.separator + title);
+			Scanner climber;
+			climber = new Scanner(lvs);
+			while (climber.hasNextLine()) {
+				String cliNL = climber.nextLine();
+				cliNL = cliNL.substring(1);
+				String[] ids = cliNL.split("[\\],]\\s?+");
+				Content c = sk.getContentById(Integer.parseInt(ids[0]));
+				for (int x = 0; x < ids.length; x++) {
+					assertEquals("Got ID " + c.getId() + " should have gotten ID " + ids[x], ids[x].equals(((Long) c.getId()).toString()), true);
+					c = c.getParent();
+				}
+			}
+		} catch (NumberFormatException ex) {
+			System.out.println(ex.toString());
+			fail("Failed to run BottomUp test");
+		} catch (TskCoreException ex) {
+			DataModelTestSuite.writeExceptions(exFile, ex);
+		} catch (FileNotFoundException ex) {
+			DataModelTestSuite.writeExceptions(exFile, ex);
+		}
+	}
+}
diff --git a/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java b/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java
new file mode 100644
index 0000000000000000000000000000000000000000..ddf469deaf9f5db4ff9bc81628dcb4d2e1669cdc
--- /dev/null
+++ b/bindings/java/test/org/sleuthkit/datamodel/CPPtoJavaCompare.java
@@ -0,0 +1,138 @@
+/*
+ * Sleuth Kit Data Model
+ *
+ * Copyright 2013 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.datamodel;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/**
+ *
+ * Compares the Java test output to the C++ test output
+ */
+@RunWith(Parameterized.class)
+public class CPPtoJavaCompare extends ImgTraverser {
+
+	private static final Logger logg = Logger.getLogger(CPPtoJavaCompare.class.getName());
+
+	public CPPtoJavaCompare(List<String> imagePaths) {
+		this.imagePaths = imagePaths;
+	}
+
+	/**
+	 * Get the sets of filenames for each test image
+	 *
+	 * @return A Collection of one-element Object arrays, where that one element
+	 * is a List<String> containing the image file paths (the type is weird
+	 * because that's what JUnit wants for parameters).
+	 */
+	@Parameterized.Parameters
+	public static Collection<Object[]> testImageData() {
+		Collection<Object[]> data = new ArrayList<Object[]>();
+
+		for (Object imagePaths : DataModelTestSuite.getImagePaths()) {
+			data.add(new Object[]{imagePaths});
+		}
+		return data;
+	}
+
+	/**
+	 * Runs the test
+	 */
+	@Test
+	public void CPPtoJavaCompare() {
+		try {
+			List<Boolean> test = basicTest();
+			assertEquals("Generated results (" + oldStandardPath + ") differ with gold standard (" + testStandardPath + ") .", test.get(0), true);
+		} catch (Exception ex) {
+			fail("Couldn't open gold standard file.");
+		}
+	}
+
+	/**
+	 * Extends basicTest to compare the sorted files and not the output files
+	 */
+	@Override
+	public List<Boolean> basicTest() {
+		super.basicTest();
+		oldStandardPath = DataModelTestSuite.sortedFlPth(oldStandardPath);
+		testStandardPath = DataModelTestSuite.sortedFlPth(testStandardPath);
+		List<Boolean> ret = new ArrayList<Boolean>(1);
+		ret.add(DataModelTestSuite.comparecontent(oldStandardPath, testStandardPath));
+		return ret;
+	}
+
+	/**
+	 * Traverses through an image and generates a TSK gettimes like
+	 * representation
+	 *
+	 * @param sk the sleuthkit case used for the traversal
+	 * @param path the location of the output file
+	 * @return the file writer to be closed by testStandard
+	 */
+	@Override
+	public FileWriter traverse(SleuthkitCase sk, String path) {
+		FileWriter reslt;
+		try {
+			reslt = new FileWriter(path);
+			try {
+				tskTraverse(sk.getRootObjects(), reslt);
+				return reslt;
+			} catch (TskCoreException ex) {
+				DataModelTestSuite.writeExceptions(testStandardPath, ex);
+			}
+		} catch (IOException ex) {
+			logg.log(Level.SEVERE, "Failed to Traverse", ex);
+		}
+		return null;
+	}
+
+	/**
+	 * Traverses through an image and generates a TSK gettimes like
+	 * representation
+	 *
+	 * @param lc the list of content to be traversed
+	 * @param reslt the filewriter to append output to
+	 */
+	private void tskTraverse(List<Content> lc, Appendable reslt) {
+		for (Content c : lc) {
+			try {
+				if (c instanceof FsContent && !c.getUniquePath().endsWith(".") && !c.getUniquePath().endsWith("/")) {
+					try {
+						reslt.append(DataModelTestSuite.getFsCData((FsContent) c));
+						reslt.append("\n");
+					} catch (IOException ex) {
+						logg.log(Level.SEVERE, "Failed to Traverse", ex);
+					}
+				}
+				tskTraverse(c.getChildren(), reslt);
+			} catch (TskCoreException ex) {
+				DataModelTestSuite.writeExceptions(testStandardPath, ex);
+			}
+		}
+	}
+}
diff --git a/bindings/java/test/org/sleuthkit/datamodel/CrossCompare.java b/bindings/java/test/org/sleuthkit/datamodel/CrossCompare.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae76095cb8d3631da4b32b4fd0016aad9d444ff0
--- /dev/null
+++ b/bindings/java/test/org/sleuthkit/datamodel/CrossCompare.java
@@ -0,0 +1,82 @@
+/*
+ * Sleuth Kit Data Model
+ *
+ * Copyright 2013 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.datamodel;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/**
+ *
+ * Ensures that a sequential traversal of a given image produces the same result
+ * as a Top Down depth first traversal.
+ */
+@RunWith(Parameterized.class)
+public class CrossCompare {
+
+	private List<String> imagePaths;
+	private String Seq, TD;
+
+	public CrossCompare(List<String> imagePaths, String Seq, String TD) {
+		this.imagePaths = imagePaths;
+		this.Seq = Seq;
+		this.TD = TD;
+	}
+
+	/**
+	 * Get the sets of filenames for each test image, they should be located in
+	 * the folder specified by the build.xml
+	 *
+	 * @return A Collection of one-element Object arrays, where that one element
+	 * is a List<String> containing the image file paths (the type is weird
+	 * because that's what JUnit wants for parameters).
+	 */
+	@Parameterized.Parameters
+	public static Collection<Object[]> testImageData() {
+		Collection<Object[]> data = new ArrayList<Object[]>();
+
+		for (Object imagePaths : DataModelTestSuite.getImagePaths()) {
+			data.add(new Object[]{imagePaths, SequentialTraversal.class.getSimpleName(), TopDownTraversal.class.getSimpleName()});
+		}
+		return data;
+	}
+
+	/**
+	 * Compares the sorted results of the different traversals against each
+	 * other
+	 */
+	@Test
+	public void CrossCompare() {
+		try {
+			String title = DataModelTestSuite.getImgName(imagePaths.get(0));
+			java.io.File testFolder = new java.io.File(DataModelTestSuite.getRsltPath());
+			java.io.File testStandard1 = new java.io.File(DataModelTestSuite.buildPath(testFolder.getAbsolutePath(), title, Seq, "_sorted.txt"));
+			java.io.File testStandard2 = new java.io.File(DataModelTestSuite.buildPath(testFolder.getAbsolutePath(), title, TD, "_sorted.txt"));
+			String testStandardPath1 = testStandard1.getPath();
+			String testStandardPath2 = testStandard2.getPath();
+			assertEquals("Generated results (" + testStandardPath1 + ") differ with gold standard (" + testStandardPath2 + ") .", DataModelTestSuite.comparecontent(testStandardPath1, testStandardPath2), true);
+		} catch (Exception ex) {
+			fail("Couldn't open gold standard file.");
+		}
+	}
+}
diff --git a/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java b/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java
new file mode 100644
index 0000000000000000000000000000000000000000..c18d8953b7fe2814840366537d913967dde552c8
--- /dev/null
+++ b/bindings/java/test/org/sleuthkit/datamodel/DataModelTestSuite.java
@@ -0,0 +1,534 @@
+/*
+ * Sleuth Kit Data Model
+ *
+ * Copyright 2013 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.datamodel;
+
+import java.io.FileFilter;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ *
+ * Runs all regression tests and contains utility methods for the tests
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({org.sleuthkit.datamodel.TopDownTraversal.class, org.sleuthkit.datamodel.SequentialTraversal.class, org.sleuthkit.datamodel.CrossCompare.class, org.sleuthkit.datamodel.BottomUpTest.class, org.sleuthkit.datamodel.CPPtoJavaCompare.class})
+public class DataModelTestSuite {
+
+	static final String TEST_IMAGE_DIR_NAME = "test" + java.io.File.separator + "Input";
+	static final String INPT = "inpt";
+	static final String GOLD = "gold";
+	static final String RSLT = "rslt";
+	static final String SEQ = "_Seq";
+	static final String TD = "_TD";
+	static final String LVS = "_Leaves";
+	static final String EX = "_Exceptions";
+	static final String TST = "types";
+	static final int READ_BUFFER_SIZE = 8192;
+	static final String HASH_ALGORITHM = "MD5";
+	private static final Logger logg = Logger.getLogger(DataModelTestSuite.class.getName());
+
+	/**
+	 * Empties the results directory
+	 *
+	 * @throws Exception
+	 */
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+		java.io.File results = new java.io.File(getRsltPath());
+		for (java.io.File del : results.listFiles()) {
+			del.delete();
+		}
+	}
+
+	/**
+	 * Generates a list of the traversals to be used for standard creations
+	 *
+	 * @return
+	 */
+	public static List<ImgTraverser> getTests() {
+		List<ImgTraverser> ret = new ArrayList<ImgTraverser>();
+		ret.add(new SequentialTraversal(null));
+		ret.add(new TopDownTraversal(null));
+		return ret;
+	}
+
+	/**
+	 * Creates the Sleuth Kit database for an image, then generates a string
+	 * representation of the given traversal type of the resulting database to
+	 * use as a standard for comparison, and saves the the standard to a file.
+	 *
+	 * @param standardPath The path to save the standard file to (will be
+	 * overwritten if it already exists)
+	 * @param tempDirPath An existing directory to create the test database in
+	 * @param imagePaths The path(s) to the image file(s)
+	 * @param type The type of traversal to run.
+	 * @param exFile The exceptions file, will be used for logging purposes
+	 */
+	public static void createStandard(String standardPath, String tempDirPath, List<String> imagePaths, ImgTraverser type) {
+		java.io.File standardFile = new java.io.File(standardPath);
+		String exFile = standardFile.getAbsolutePath().replace(".txt", EX + ".txt");
+		try {
+			String firstImageFile = getImgName(imagePaths.get(0));
+			String dbPath = buildPath(tempDirPath, firstImageFile, type.getClass().getSimpleName(), ".db");
+			java.io.File dbFile = new java.io.File(dbPath);
+			standardFile.createNewFile();
+			dbFile.delete();
+			SleuthkitCase sk = SleuthkitCase.newCase(dbPath);
+			String timezone = "";
+			SleuthkitJNI.CaseDbHandle.AddImageProcess process = sk.makeAddImageProcess(timezone, true, false);
+			java.io.File xfile = new java.io.File(exFile);
+			xfile.createNewFile();
+			try {
+				process.run(imagePaths.toArray(new String[imagePaths.size()]));
+			} catch (TskDataException ex) {
+				writeExceptions(standardFile.getAbsolutePath(), ex);
+			}
+			process.commit();
+			FileWriter standardWriter = type.traverse(sk, standardFile.getAbsolutePath());
+			standardWriter.flush();
+			runSort(standardFile.getAbsolutePath());
+		} catch (IOException ex) {
+			logg.log(Level.SEVERE, "Couldn't create Standard", ex);
+			throw new RuntimeException(ex);
+		} catch (TskCoreException ex) {
+			writeExceptions(standardFile.getAbsolutePath(), ex);
+		}
+	}
+
+	/**
+	 * Gets the paths to the test image files by looking for a test image in the
+	 * given output directory
+	 *
+	 * @return A list of lists of paths to image parts
+	 */
+	static List<List<String>> getImagePaths() {
+
+		// needs to be absolute file because we're going to walk up its path
+		java.io.File dir = new java.io.File(System.getProperty(INPT, TEST_IMAGE_DIR_NAME));
+
+		FileFilter imageFilter = new FileFilter() {
+			@Override
+			public boolean accept(java.io.File f) {
+				return isImgFile(f.getName());
+			}
+		};
+		List<List<String>> images = new ArrayList<List<String>>();
+		for (java.io.File imageSet : dir.listFiles(imageFilter)) {
+			ArrayList<String> imgs = new ArrayList<String>();
+			imgs.add(imageSet.getAbsolutePath());
+			images.add(imgs);
+		}
+		return images;
+	}
+
+	/**
+	 * Get the path for a standard corresponding to the given image path.
+	 *
+	 * @param imagePaths path of the image to get a standard for
+	 * @return path to put/find the standard at
+	 */
+	static String standardPath(List<String> imagePaths, String type) {
+		String firstImage = getImgName(imagePaths.get(0));
+		String standardPath = goldStandardPath() + java.io.File.separator + firstImage + "_" + type + ".txt";
+		return standardPath;
+	}
+
+	/**
+	 * removes the files with the file name from the from the given path
+	 *
+	 * @param path the path to the folder where files are to be deleted
+	 * @param filename the name of the files to be deleted
+	 */
+	public static void emptyResults(String path, String filename) {
+		final String filt = filename.replace(TD, "").replace(".txt", "").replace(SEQ, "");
+		FileFilter imageResFilter = new FileFilter() {
+			@Override
+			public boolean accept(java.io.File f) {
+				return f.getName().contains(filt) & !f.getName().contains(LVS) & !f.getName().contains("Sorted");
+			}
+		};
+		java.io.File pth = new java.io.File(path);
+		for (java.io.File del : pth.listFiles(imageResFilter)) {
+			del.deleteOnExit();
+		}
+	}
+
+	/**
+	 * Runs tsk_gettimes to create a standard for comparing DataModel and TSK
+	 * output.
+	 *
+	 * @param standardPath The path to the file to put the tsk data in
+	 * @param img the path to the image, is a list for compatability reasons
+	 */
+	private static void getTSKData(String standardPath, List<String> img) {
+		String tsk_loc;
+		java.io.File  up = new java.io.File(System.getProperty("user.dir"));
+		up = up.getParentFile();
+		up = up.getParentFile();
+		if (System.getProperty("os.name").contains("Windows")) {
+			tsk_loc = up.getAbsolutePath() + "\\win32\\Release\\tsk_gettimes";
+		} else {
+			return;
+		}
+		String[] cmd = {tsk_loc, img.get(0)};
+		try {
+			Process p = Runtime.getRuntime().exec(cmd);
+			Scanner read = new Scanner(p.getInputStream());
+			Scanner error1 = new Scanner(p.getErrorStream());
+			FileWriter out = new FileWriter(standardPath);
+			while (read.hasNextLine()) {
+				String line = read.nextLine();
+				line = line.replace(" (deleted)", "");
+				line = line.replace("(null)", "");
+				//removes unknown data attached to metaAddr
+				String[] linecontents = line.split("\\|");
+				String metaaddrcon = linecontents[2];
+				String mtad = metaaddrcon.split("\\-")[0];
+				line = line.replace(metaaddrcon, mtad);
+				out.append(line);
+				out.flush();
+				out.append("\n");
+			}
+			runSort(standardPath);
+		} catch (Exception ex) {
+			logg.log(Level.SEVERE, "Failed to run CPP program", ex);
+		}
+		java.io.File xfile = new java.io.File(standardPath.replace(".txt", DataModelTestSuite.EX + ".txt"));
+		try {
+			xfile.createNewFile();
+		} catch (IOException ex) {
+			logg.log(Level.SEVERE, "Failed to create exceptions file", ex);
+		}
+	}
+
+	/**
+	 * Strips the file extension from the given string
+	 *
+	 * @param title the file to have its extension stripped
+	 * @return
+	 */
+	private static String stripExtension(String title) {
+		return title.substring(0, title.lastIndexOf("."));
+	}
+
+	/**
+	 * builds the path for an output file
+	 *
+	 * @param path the path to the directory for the file to be stored in
+	 * @param name the name of the file
+	 * @param type the output type of the file
+	 * @param Ext the file extension
+	 * @return the path for an output file
+	 */
+	public static String buildPath(String path, String name, String type, String Ext) {
+		return path + java.io.File.separator + name + "_" + type + Ext;
+	}
+
+	/**
+	 * Returns the name of an image from the given path
+	 *
+	 * @param img
+	 * @return
+	 */
+	public static String getImgName(String img) {
+		String[] imgSp = img.split("\\\\");
+		return stripExtension(imgSp[imgSp.length - 1]);
+	}
+
+	/**
+	 * Gets the location results are stored in.
+	 *
+	 * @return
+	 */
+	public static String getRsltPath() {
+		return System.getProperty(RSLT, "test" + java.io.File.separator + "output" + java.io.File.separator + "results");
+	}
+
+	/**
+	 * returns the path to the sort command
+	 *
+	 * @return
+	 */
+	private static String getSortPath() {
+		if (!System.getProperty("os.name").contains("Windows")) {
+			return "sort";
+		} else {
+			return "\\cygwin\\bin\\sort.exe";
+		}
+	}
+
+	/**
+	 * returns the path to the diff command
+	 *
+	 * @return
+	 */
+	private static String getDiffPath() {
+		if (!System.getProperty("os.name").contains("Windows")) {
+			return "diff";
+		} else {
+			return "\\cygwin\\bin\\diff.exe";
+		}
+	}
+
+	/**
+	 * Writes the given exception to the given file
+	 *
+	 * @param filename the path of the file that exceptions are being stored for
+	 * @param ex the exception to be written
+	 */
+	protected static void writeExceptions(String filename, Exception ex) {
+		filename = filename.replace(".txt", EX + ".txt");
+		FileWriter exWriter;
+		try {
+			exWriter = new FileWriter(filename, true);
+			exWriter.append(ex.toString());
+			exWriter.flush();
+			exWriter.close();
+		} catch (IOException ex1) {
+			logg.log(Level.SEVERE, "Couldn't log Exception", ex1);
+		}
+	}
+
+	/**
+	 * returns the gold standard path
+	 *
+	 * @return
+	 */
+	private static String goldStandardPath() {
+		return System.getProperty(GOLD, ("test" + java.io.File.separator + "output" + java.io.File.separator + "gold"));
+	}
+
+	/**
+	 * Reads the data for a given content object, used to create hashes
+	 *
+	 * @param c the content object to be read
+	 * @param result the appendable to append the results to
+	 * @param StrgFile the file path that the content is being read for
+	 */
+	public static void readContent(Content c, Appendable result, String StrgFile) {
+		long size = c.getSize();
+		byte[] readBuffer = new byte[READ_BUFFER_SIZE];
+		try {
+			MessageDigest md5 = MessageDigest.getInstance("MD5");
+
+			for (long i = 0; i < size; i = i + READ_BUFFER_SIZE) {
+				c.read(readBuffer, i, Math.min(size - i, READ_BUFFER_SIZE));
+				md5.update(readBuffer);
+			}
+			String hash = toHex(md5.digest());
+
+			result.append("md5=" + hash);
+
+		} catch (NoSuchAlgorithmException ex) {
+			logg.log(Level.SEVERE, "Failed to generate Hash", ex);
+		} catch (IOException ex){
+			logg.log(Level.SEVERE, "Failed to generate Hash", ex);
+		} catch (TskCoreException ex) {
+			writeExceptions(StrgFile, ex);
+		}
+	}
+
+	/**
+	 * Helper method for Read Content, converts a byte array to a Hexadecimal
+	 * String
+	 *
+	 * @param bytes given byte array.
+	 * @return a Hexadecimal String
+	 */
+	private static String toHex(byte[] bytes) {
+		StringBuilder hex = new StringBuilder();
+		for (byte b : bytes) {
+			hex.append(String.format("%02x", b & 0xFF));
+		}
+		return hex.toString();
+	}
+
+	/**
+	 * gets the metadata from a datamodel file object
+	 *
+	 * @param fi
+	 * @return
+	 * @throws TskCoreException
+	 */
+	protected static String getFsCData(FsContent fi) throws TskCoreException {
+		String[] path = fi.getUniquePath().split("/", 3);
+		String name;
+		if (path[2].contains("vol_")) {
+			String[] pthget = path[2].split("_", 2);
+			name = pthget[pthget.length - 1];
+		} else {
+			name = path[2];
+		}
+		name = name.replaceAll("[^\\x20-\\x7e]", "");
+		String prpnd;
+		if (fi.isFile()) {
+			prpnd = "r/";
+		} else {
+			prpnd = "d/";
+		}
+		if (fi.isVirtual() && !fi.isDir()) {
+			prpnd = "v/";
+		}
+		return ("0|" + name + "|" + fi.metaAddr + "|" + fi.getMetaTypeAsString() + "/" + fi.getModesAsString() + "|" + fi.getUid() + "|0|" + fi.getSize() + "|" + fi.getAtime() + "|" + fi.getMtime() + "|" + fi.getCtime() + "|" + fi.getCrtime());
+	}
+
+	/**
+	 * Calls {@link #createStandard(String, String, String[]) createStandard}
+	 * with default arguments
+	 *
+	 * @param args Ignored
+	 */
+	public static void main(String[] args) {
+		String tempDirPath = System.getProperty("java.io.tmpdir");
+		tempDirPath = tempDirPath.substring(0, tempDirPath.length() - 1);
+		java.io.File pth = new java.io.File(DataModelTestSuite.goldStandardPath());
+		FileFilter testExFilter = new FileFilter() {
+			@Override
+			public boolean accept(java.io.File f) {
+				return f.getName().contains(EX);
+			}
+		};
+		for (java.io.File del : pth.listFiles(testExFilter)) {
+			del.delete();
+		}
+		List<ImgTraverser> tests = DataModelTestSuite.getTests();
+		List<List<String>> imagePaths = DataModelTestSuite.getImagePaths();
+		for (List<String> paths : imagePaths) {
+			for (ImgTraverser tstrn : tests) {
+				String standardPath = DataModelTestSuite.standardPath(paths, tstrn.getClass().getSimpleName());
+				System.out.println("Creating " + tstrn.getClass().getSimpleName() + " standard for: " + paths.get(0));
+				DataModelTestSuite.createStandard(standardPath, tempDirPath, paths, tstrn);
+			}
+			String standardPathCPP = DataModelTestSuite.standardPath(paths, CPPtoJavaCompare.class.getSimpleName());
+			DataModelTestSuite.getTSKData(standardPathCPP, paths);
+		}
+	}
+
+	/**
+	 * Compares the content of two files to determine if they are equal, if they
+	 * are it removes the file from the results folder
+	 *
+	 * @param original is the first file to be compared
+	 * @param results is the second file to be compared
+	 */
+	protected static boolean comparecontent(String original, String results) {
+		try {
+			java.io.File fi1 = new java.io.File(original);
+			java.io.File fi2 = new java.io.File(results);
+			FileReader f1 = new FileReader(new java.io.File(original).getAbsolutePath());
+			FileReader f2 = new FileReader(new java.io.File(results).getAbsolutePath());
+			Scanner in1 = new Scanner(f1);
+			Scanner in2 = new Scanner(f2);
+			while (in1.hasNextLine() || in2.hasNextLine()) {
+				if ((in1.hasNextLine() ^ in2.hasNextLine()) || !(in1.nextLine().equals(in2.nextLine()))) {
+					in1.close();
+					in2.close();
+					f1.close();
+					f2.close();
+					DiffUtil.getDiff(fi1.getAbsolutePath(), fi2.getAbsolutePath(), original.substring(original.lastIndexOf(java.io.File.separator) + 1));
+					return false;
+				}
+			}
+			//DataModelTestSuite.emptyResults(fi2.getParent(), fi2.getName());
+			return true;
+		} catch (IOException ex) {
+			logg.log(Level.SEVERE, "Couldn't compare content", ex);
+			return false;
+		}
+	}
+
+	/**
+	 * runs sort on the given file
+	 *
+	 * @param inp
+	 */
+	private static void runSort(String inp) {
+		String outp = sortedFlPth(inp);
+		String cygpath = getSortPath();
+		String[] cmd = {cygpath, inp, "-o", outp};
+		try {
+			Runtime.getRuntime().exec(cmd).waitFor();
+		} catch (InterruptedException ex) {
+			logg.log(Level.SEVERE, "Couldn't create Standard", ex);
+			throw new RuntimeException(ex);
+		} catch(IOException ex){
+			logg.log(Level.SEVERE, "Couldn't create Standard", ex);
+			throw new RuntimeException(ex);
+		}
+	}
+
+	/**
+	 * Returns the name of the sorted file
+	 *
+	 * @param path the original name of the file
+	 * @return
+	 */
+	protected static String sortedFlPth(String path) {
+		return path.replace(".txt", "_Sorted.txt");
+	}
+
+	/**
+	 * Runs the Cygwin Diff algorithm on two files, is currently unused
+	 *
+	 * @param path1 is the path to the first file
+	 * @param path2 is the path to the second file
+	 */
+	private static void runDiff(String path1, String path2) {
+		String diffPath = getDiffPath();
+		String outputLoc = path2.replace(".txt", "_Diff.txt");
+		String[] cmd = {diffPath, path1, path2};
+		try {
+			Process p = Runtime.getRuntime().exec(cmd);
+			Scanner read = new Scanner(p.getInputStream());
+			Scanner error1 = new Scanner(p.getErrorStream());
+			FileWriter out = new FileWriter(outputLoc);
+			while (read.hasNextLine()) {
+				String line = read.nextLine();
+				out.append(line);
+				out.flush();
+				out.append("\n");
+				out.flush();
+			}
+		} catch (Exception ex) {
+			logg.log(Level.SEVERE, "Failed to run Diff program", ex);
+		}
+	}
+
+	/**
+	 * Returns whether or not a file is an image file
+	 *
+	 * @param name the name of the file
+	 * @return a boolean that is true if the name ends with an image file
+	 * extension
+	 */
+	protected static boolean isImgFile(String name) {
+		return name.endsWith(".001") || name.endsWith(".raw") || name.endsWith(".img") || name.endsWith(".E01") || name.endsWith(".dd");
+	}
+}
diff --git a/bindings/java/test/org/sleuthkit/datamodel/DiffTest.java b/bindings/java/test/org/sleuthkit/datamodel/DiffTest.java
deleted file mode 100644
index 1d04d86a3995ea00de5eff94ae3b665a80350edd..0000000000000000000000000000000000000000
--- a/bindings/java/test/org/sleuthkit/datamodel/DiffTest.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Sleuth Kit Data Model
- *
- * Copyright 2011 Basis Technology Corp.
- * Contact: carrier <at> sleuthkit <dot> org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.sleuthkit.datamodel;
-
-import java.io.FileFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-import org.junit.rules.TemporaryFolder;
-import static org.junit.Assert.*;
-
-/**
- * Tests the DataModel by printing 
- * @author pmartel
- */
-@RunWith(Parameterized.class)
-public class DiffTest {
-	
-	static final String TEST_IMAGE_DIR_NAME = "testimages";
-	
-
-	@Rule
-	public TemporaryFolder testFolder = new TemporaryFolder();
-	private List<String> imagePaths;
-
-	
-	public DiffTest(List<String> imagePaths) {
-		this.imagePaths = imagePaths;
-	}
-	/**
-	 * Gets the paths to the test image files by looking for a test image
-	 * directory above the local SVN trunk/branch.
-	 * @return A list of lists of paths to image parts
-	 */
-	static List<List<String>> getImagePaths() {
-		FileFilter imageDirFilter = new FileFilter() {
-			@Override
-			public boolean accept(java.io.File f) {
-				return f.isDirectory() && f.getName().equalsIgnoreCase(TEST_IMAGE_DIR_NAME);
-			}
-		};
-		
-		
-		// needs to be absolute file because we're going to walk up its path
-		java.io.File dir = (new java.io.File(".")).getAbsoluteFile();
-		dir = dir.getParentFile().getParentFile().getParentFile().getParentFile();
-		
-		// image dir is either one level above trunk/ or in tags/
-		if (dir.listFiles(imageDirFilter).length == 1) {
-			// above trunk/
-			dir = dir.listFiles(imageDirFilter)[0];
-		} else {
-			// in tags/, go up one more level
-			dir = dir.getParentFile().listFiles(imageDirFilter)[0];
-		}
-		
-		List<List<String>> images = new ArrayList<List<String>>();
-		for (java.io.File imageSet : dir.listFiles()) {
-			List<String> absolutePaths = new ArrayList();
-			for (String filename : imageSet.list()) {
-				absolutePaths.add(imageSet.getAbsolutePath() + java.io.File.separator + filename);
-			}
-			
-			images.add(absolutePaths);
-		}
-		return images;
-	}
-	/**
-	 * Get the sets of filenames for each test image
-	 * @return A Collection of one-element Object arrays, where that one element
-	 * is a List<String> containing the image file paths (the type is weird
-	 * because that's what JUnit wants for parameters).
-	 */
-	@Parameters
-	public static Collection<Object[]> testImageData() {
-		Collection<Object[]> data = new ArrayList<Object[]>();
-		
-		for (Object imagePaths : getImagePaths()) {
-			data.add(new Object[]{imagePaths});
-		}
-		return data;
-	}
-
-	/**
-	 * Get the path for a standard corresponding to the given image path.
-	 * @param imagePaths path of the image to get a standard for
-	 * @return path to put/find the standard at
-	 */
-	static String standardPath(List<String> imagePaths) {
-		java.io.File firstImage = new java.io.File(imagePaths.get(0));
-		String standardPath = "teststandards" + java.io.File.separator + firstImage.getName().split("\\.")[0] + "_standard.txt";
-		return standardPath;
-	}
-
-	
-	@Test
-	public void testDataModelDiff() {
-		try {
-			java.io.File testStandard = testFolder.newFile("test_standard.txt");
-
-			String testStandardPath = testStandard.getPath();
-			String oldStandardPath = standardPath(imagePaths);
-
-			DiffUtil.createStandard(testStandardPath, testFolder.getRoot().getPath(), imagePaths);
-			String diff = DiffUtil.getDiff(oldStandardPath, testStandardPath);
-
-			assertEquals("Generated results ("+testStandardPath+") differ with gold standard ("+oldStandardPath+") .", "", diff);
-		} catch (IOException ex) {
-			fail("Couldn't open gold standard file.");
-		}
-	}
-}
diff --git a/bindings/java/test/org/sleuthkit/datamodel/DiffUtil.java b/bindings/java/test/org/sleuthkit/datamodel/DiffUtil.java
index 6f0a7a2a284bd73101d9198c072075d5aeabf3db..a6b648bdf63726cd42f55ea0967aeaac77a0785a 100644
--- a/bindings/java/test/org/sleuthkit/datamodel/DiffUtil.java
+++ b/bindings/java/test/org/sleuthkit/datamodel/DiffUtil.java
@@ -27,75 +27,30 @@
 import java.io.IOException;
 import java.util.LinkedList;
 import java.util.List;
-import org.sleuthkit.datamodel.SleuthkitJNI.CaseDbHandle.AddImageProcess;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
- *
- * @author pmartel
+ * This class gets the Diff of two files.
  */
 public class DiffUtil {
 
 	/**
-	 * Creates the Sleuth Kit database for an image, generates a string
-	 * representation of the resulting database to use as a standard for
-	 * comparison, and saves the the standard to a file.
-	 * @param standardPath The path to save the standard file to (will be
-	 * overwritten if it already exists)
-	 * @param tempDirPath An existing directory to create the test database in
-	 * @param imagePaths The path(s) to the image file(s)
+	 * converts a file to a series of lines
+	 *
+	 * @param filename the name of the file
+	 * @return
 	 */
-	public static void createStandard(String standardPath, String tempDirPath, List<String> imagePaths) {
-		java.io.File standardFile = new java.io.File(standardPath);
-		try {
-			java.io.File firstImageFile = new java.io.File(imagePaths.get(0));
-			java.io.File tempDir = new java.io.File(tempDirPath);
-			String dbPath = tempDir.getPath() + java.io.File.separator + firstImageFile.getName() + ".db";
-			java.io.File dbFile = new java.io.File(dbPath);
-
-			standardFile.createNewFile();
-			FileWriter standardWriter = new FileWriter(standardFile);
-			ReprDataModel repr = new ReprDataModel(standardWriter);
-
-			dbFile.delete();
-			
-			SleuthkitCase sk = SleuthkitCase.newCase(dbPath);
-			
-			String timezone = "";
-			AddImageProcess process = sk.makeAddImageProcess(timezone, true, false);
-			process.run(imagePaths.toArray(new String[imagePaths.size()]));
-			process.commit();
-			repr.start(sk.getRootObjects());
-			standardWriter.close();
-
-		} catch (Exception ex) {
-			throw new RuntimeException(ex);
-		}
-	}
-
-	/**
-	 * Calls {@link #createStandard(String, String, String[]) createStandard}
-	 * with default arguments
-	 * @param args Ignored 
-	 */
-	public static void main(String[] args) {
-		String tempDirPath = System.getProperty("java.io.tmpdir");
-		List<List<String>> imagePaths = DiffTest.getImagePaths();
-		for(List<String> paths : imagePaths) {
-			String standardPath = DiffTest.standardPath(paths);
-			System.out.println("Creating standard for: " + paths.get(0));
-			createStandard(standardPath, tempDirPath, paths);
-		}
-	}
-
 	private static List<String> fileToLines(String filename) {
 		List<String> lines = new LinkedList<String>();
-		String line = "";
+		String line;
 		try {
 			BufferedReader in = new BufferedReader(new FileReader(new java.io.File(filename).getAbsolutePath()));
 			while ((line = in.readLine()) != null) {
 				lines.add(line);
 			}
 		} catch (IOException ex) {
+			Logger.getLogger(DiffUtil.class.getName()).log(Level.SEVERE, "Couldn't read file", ex);
 			throw new RuntimeException(ex);
 		}
 		return lines;
@@ -103,15 +58,16 @@ private static List<String> fileToLines(String filename) {
 
 	/**
 	 * Returns the diff between the two given files
+	 *
 	 * @param pathOriginal The path to the original file
 	 * @param pathRevised The path to the revised (new) file
 	 * @return A representation of the diff
 	 */
-	public static String getDiff(String pathOriginal, String pathRevised) {
+	public static void getDiff(String pathOriginal, String pathRevised, String title) {
 		List<String> originalLines, revisedLines;
 		originalLines = fileToLines(pathOriginal);
 		revisedLines = fileToLines(pathRevised);
-
+		java.io.File outp = new java.io.File(DataModelTestSuite.getRsltPath() + java.io.File.separator + title.replace(".txt", "_Diff.txt"));
 		// Compute diff. Get the Patch object. Patch is the container for computed deltas.
 		Patch patch = DiffUtils.diff(originalLines, revisedLines);
 		StringBuilder diff = new StringBuilder();
@@ -120,7 +76,12 @@ public static String getDiff(String pathOriginal, String pathRevised) {
 			diff.append(delta.toString());
 			diff.append("\n");
 		}
-
-		return diff.toString();
+		try {
+			FileWriter out = new FileWriter(outp);
+			out.append(diff);
+			out.flush();
+		} catch (IOException ex) {
+			Logger.getLogger(DiffUtil.class.getName()).log(Level.SEVERE, "Couldn't write Diff to file", ex);
+		}
 	}
-}
+}
\ No newline at end of file
diff --git a/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java b/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java
new file mode 100644
index 0000000000000000000000000000000000000000..e390e9b1aef6a08f419db164b6206e7375adde6b
--- /dev/null
+++ b/bindings/java/test/org/sleuthkit/datamodel/ImgTraverser.java
@@ -0,0 +1,58 @@
+/*
+ * Sleuth Kit Data Model
+ *
+ * Copyright 2013 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.datamodel;
+
+import java.io.FileWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A basic implementation of traverser, has a standard test that allows for easy
+ * modification of the way tests are run
+ */
+public abstract class ImgTraverser{
+
+	protected List<String> imagePaths;
+	protected String exFile;
+	protected String testStandardPath;
+	protected String oldStandardPath;
+	protected String oldExceptionsPath;
+
+	/**
+	 * sets up the variables for a basic test, method can be called for any
+	 * traversal test
+	 *
+	 * @return
+	 */
+	public List<Boolean> basicTest() {
+		String title = DataModelTestSuite.getImgName(imagePaths.get(0));
+		java.io.File testFolder = new java.io.File(DataModelTestSuite.getRsltPath());
+		java.io.File testStandard = new java.io.File(DataModelTestSuite.buildPath(testFolder.getAbsolutePath(), title, this.getClass().getSimpleName(), ".txt"));
+		testStandardPath = testStandard.getPath();
+		exFile = testStandardPath.replace(".txt", DataModelTestSuite.EX + ".txt");
+		oldStandardPath = DataModelTestSuite.standardPath(imagePaths, this.getClass().getSimpleName());
+		DataModelTestSuite.createStandard(testStandardPath, testFolder.getAbsolutePath(), imagePaths, this);
+		oldExceptionsPath = oldStandardPath.replace(".txt", DataModelTestSuite.EX + ".txt");
+		List<Boolean> ret = new ArrayList<Boolean>(2);
+		ret.add(DataModelTestSuite.comparecontent(oldExceptionsPath, exFile));
+		ret.add(DataModelTestSuite.comparecontent(oldStandardPath, testStandardPath));
+		return ret;
+	}
+	abstract public FileWriter traverse(SleuthkitCase sk, String path);
+}
diff --git a/bindings/java/test/org/sleuthkit/datamodel/ReprDataModel.java b/bindings/java/test/org/sleuthkit/datamodel/ReprDataModel.java
deleted file mode 100644
index df40c6f295fa285f9148998c2f6053ffc7c76d18..0000000000000000000000000000000000000000
--- a/bindings/java/test/org/sleuthkit/datamodel/ReprDataModel.java
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- * Sleuth Kit Data Model
- *
- * Copyright 2011 Basis Technology Corp.
- * Contact: carrier <at> sleuthkit <dot> org
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *	 http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.sleuthkit.datamodel;
-
-import java.io.IOException;
-import java.nio.CharBuffer;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.List;
-import org.sleuthkit.datamodel.TskData.TSK_FS_META_MODE_ENUM;
-
-/**
- * ReprDataModel writes a String representation (containing the results of all
- * public method calls) of a Content object and its children to the given
- * Appendable.
- *
- * @author pmartel
- */
-public class ReprDataModel {
-
-	int indentLevel = 0;
-	Appendable result;
-	ContentVisitor reprVisitor = new ReprVisitor();
-	static final int READ_BUFFER_SIZE = 8192;
-	static final String HASH_ALGORITHM = "MD5";
-
-	/**
-	 * 
-	 * @param result what to append the generated representation to.
-	 */
-	ReprDataModel(Appendable result) {
-		this.result = result;
-	}
-
-	/**
-	 * Entry point to represent a Content object and it's children
-	 * @param c the root Content object
-	 */
-	public void start(List<Content> lc) {
-		for(Content c : lc) {
-			reprContent(c);
-		}
-	}
-
-	private void title(String title) {
-		indent();
-		append(title);
-		append(" >");
-		indentLevel++;
-		nl();
-	}
-
-	private void tail() {
-		indentLevel--;
-	}
-
-	private void indent() {
-		char[] indentation = new char[indentLevel];
-		Arrays.fill(indentation, '\t');
-		append(CharBuffer.wrap(indentation));
-	}
-
-	private void nl() {
-		append("\n");
-	}
-
-	private void name(String name) {
-		append(name);
-		append(": ");
-	}
-
-	private void reprContent(Content c) {
-		title(c.getClass().getSimpleName());
-		c.accept(reprVisitor);
-		readContent(c);
-		try {
-			reprChildren(c.getChildren());
-		} catch (TskCoreException ex) {
-			throw new RuntimeException(ex);
-		}
-		tail();
-	}
-
-	private void readContent(Content c) {
-		long size = c.getSize();
-		byte[] readBuffer = new byte[READ_BUFFER_SIZE];
-		try {
-			MessageDigest md5 = MessageDigest.getInstance("MD5");
-
-			for (long i = 0; i < size; i = i + READ_BUFFER_SIZE) {
-				int read = c.read(readBuffer, i, Math.min(size - i, READ_BUFFER_SIZE));
-				md5.update(readBuffer);
-			}
-			String hash = toHex(md5.digest());
-
-			repr("read", "md5=" + hash);
-
-		} catch (TskCoreException ex) {
-			repr("read", ex);
-		} catch (NoSuchAlgorithmException ex) {
-			throw new RuntimeException(ex);
-		}
-		nl();
-
-	}
-
-	private String toHex(byte[] bytes) {
-		StringBuilder hex = new StringBuilder();
-		for (byte b : bytes) {
-			hex.append(String.format("%02x", b & 0xFF));
-		}
-		return hex.toString();
-	}
-
-	private void reprChildren(List<? extends Content> lc) {
-		for (Content c : lc) {
-			reprContent(c);
-		}
-	}
-
-	// Files and Directories can be handled the same
-	private void reprFsContent(FsContent fsc) {
-		repr("getAtime", fsc.getAtime());
-		repr("getAtimeAsDate", fsc.getAtimeAsDate());
-		repr("getAttr_id", fsc.getAttrId());
-		repr("getAttr_type", fsc.getAttrType().toString());
-		repr("getCrtime", fsc.getCrtime());
-		repr("getCrtimeAsDate", fsc.getCrtimeAsDate());
-		repr("getCtime", fsc.getCtime());
-		repr("getCtimeAsDate", fsc.getCtimeAsDate());
-		repr("getDirFlagsAsString", fsc.getDirFlagAsString());
-		repr("getDirType", fsc.getDirType().getValue());
-		repr("getDirTypeAsString", fsc.getDirTypeAsString());
-		repr("getGid", fsc.getGid());
-		repr("getMetaFlagsAsString", fsc.getMetaFlagsAsString());
-		repr("getMetaTypeAsString", fsc.getMetaTypeAsString());
-		repr("getMetaAddr", fsc.getMetaAddr());
-		repr("getMetaType", fsc.getMetaType().getValue());
-		repr("getMtime", fsc.getMtime());
-		repr("getMtimeAsDate", fsc.getMtimeAsDate());
-		repr("getName", fsc.getName());
-		repr("getParentPath", fsc.getParentPath());
-		repr("getSize", fsc.getSize());
-		repr("getUid", fsc.getUid());
-	}
-	
-	private void reprLayoutFile(LayoutFile lf) {
-		repr("getSize", lf.getSize());
-		repr("getId", lf.getId());
-		repr("getName", lf.getName());
-		repr("getNumPartsu", (long)lf.getNumParts());
-		
-	}
-	
-	private void reprLayoutDirectory(VirtualDirectory ld) {
-		repr("getSize", ld.getSize());
-		repr("getId", ld.getId());
-		repr("getName", ld.getName());
-	}
-
-	private void reprFileSystem(FileSystem fs) {
-		repr("getBlock_count", fs.getBlock_count());
-		repr("getBlock_size", fs.getBlock_size());
-		
-		/* 
-		 * Don't get handle, it's not consistent (a memory pointer).
-		 * 
-		try {
-			repr("getFileSystemHandle", fs.getFileSystemHandle());
-		} catch (TskException ex) {
-			throw new RuntimeException(ex);
-		}
-		 * 
-		 */
-		repr("getFirst_inum", fs.getFirst_inum());
-		repr("getFs_type", fs.getFsType().getValue());
-		repr("getImg_offset", fs.getImageOffset());
-		repr("getLast_inum", fs.getLastInum());
-		repr("getRoot_inum", fs.getRoot_inum());
-		repr("getSize", fs.getSize());
-	}
-
-	private void reprImage(Image i) {
-		/* 
-		 * Don't get handle, it's not consistent (a memory pointer).
-		 * 
-		repr("getImageHandle", i.getImageHandle());
-		 * 
-		 */
-		repr("getName", i.getName());
-		/**
-		 * Don't get paths, they're system specific.
-		 * 
-		repr("getPaths", i.getPaths());
-		 * 
-		 */
-		repr("getSize", i.getSize());
-		repr("getSsize", i.getSsize());
-		repr("getType", i.getType());
-		try {
-			int typeID = i.getSleuthkitCase().addArtifactType("Test_Artifact", "Test Artifact");
-			BlackboardArtifact art1;
-			BlackboardArtifact art2;
-			BlackboardArtifact art3;
-			art1 = i.newArtifact(BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO);
-			art2 = i.newArtifact(typeID);
-			art3 = i.newArtifact(1);
-			byte[] bytearray1 = new byte[2];
-			bytearray1[0] = 1;
-			bytearray1[1] = 2;
-			byte[] bytearray2 = new byte[2];
-			bytearray2[0] = 3;
-			bytearray2[1] = 4;
-			byte[] bytearray3 = new byte[2];
-			bytearray3[0] = 5;
-			bytearray3[1] = 6;
-			
-			int attrTypeID = i.getSleuthkitCase().addAttrType("testattr", "Test Attribute");
-			
-			art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "first_call", (int) 23));
-			art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "second_call", (long) 5));
-			art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "third_call", (double) 7.412));
-			art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "fourth_call", "test"));
-			art1.addAttribute(new BlackboardAttribute(attrTypeID, "regressionTest", "fifth_call", bytearray1));
-			art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID(), "regressionTest", "sixth_call", (int) 23));
-			art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_FLAG.getTypeID(), "regressionTest", "seventh_call", (long) 5));
-			art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE.getTypeID(), "regressionTest", "eighth_call", (double) 7.412));
-			art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD.getTypeID(), "regressionTest", "nineth_call", "test"));
-			art2.addAttribute(new BlackboardAttribute(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_KEYWORD_SET.getTypeID(), "regressionTest", "tenth_call", bytearray2));
-			art3.addAttribute(new BlackboardAttribute(1, "regressionTest", "eleventh_call", (int) 29));
-			art3.addAttribute(new BlackboardAttribute(1, "regressionTest", "twelfth_call", (long) 565413));
-			art3.addAttribute(new BlackboardAttribute(1, "regressionTest", "thirteenth_call", (double) 1.987));
-			art3.addAttribute(new BlackboardAttribute(2, "regressionTest", "fourteenth_call", "test2"));
-			art3.addAttribute(new BlackboardAttribute(2, "regressionTest", "fifteenth_call", bytearray3));
-			
-			for(BlackboardArtifact art : i.getAllArtifacts()){
-				repr("ArtifactGetArtifactID", art.getArtifactID());
-				repr("ArtifactGetArtifactTypeID", new Integer(art.getArtifactTypeID()).toString());
-				repr("ArtifactGetArtifactTypeName", art.getArtifactTypeName());
-				repr("ArtifactGetDisplayName", art.getDisplayName());
-				repr("ArtifactGetObjectID", art.getObjectID());
-				for(BlackboardAttribute attr : art.getAttributes()){
-					repr("AttributeGetArtifactID", attr.getArtifactID());
-					repr("AttributeGetAttributeTypeID", new Integer(attr.getAttributeTypeID()).toString());
-					repr("AttributeGetAttributeTypeName", i.getSleuthkitCase().getAttrTypeString(attr.getAttributeTypeID()));
-					repr("AttributeGetDisplayName", i.getSleuthkitCase().getAttrTypeDisplayName(attr.getAttributeTypeID()));
-					repr("AttributeGetContext", attr.getContext());
-					repr("AttributeGetSource", attr.getModuleName());
-					BlackboardAttribute.TSK_BLACKBOARD_ATTRIBUTE_VALUE_TYPE val_type = attr.getValueType();
-					repr("AttributeGetValueType", val_type.getLabel());
-					switch(val_type){
-						case STRING:
-							repr("AttributeGetValue" + val_type.getLabel(), attr.getValueString());
-							break;
-						case BYTE:
-							repr("AttributeGetValue" + val_type.getLabel(), Arrays.toString(attr.getValueBytes()));
-							break;
-						case INTEGER:
-							repr("AttributeGetValue" + val_type.getLabel(), new Integer(attr.getValueInt()).toString());
-							break;
-						case LONG:
-							repr("AttributeGetValue" + val_type.getLabel(), attr.getValueLong());
-							break;
-						case DOUBLE:
-							repr("AttributeGetValue" + val_type.getLabel(), new Double(attr.getValueDouble()).toString());
-							break;
-					}
-				}
-			}
-			
-		} catch (TskCoreException ex) {
-			throw new RuntimeException(ex);
-		}
-	}
-
-	private void reprVolume(Volume v) {
-		repr("getAddr", v.getAddr());
-		repr("getDescription", v.getDescription());
-		repr("getFlags", v.getFlags());
-		repr("getFlagsAsString", v.getFlagsAsString());
-		repr("getLength", v.getLength());
-		repr("getSize", v.getSize());
-		repr("getStart", v.getStart());
-	}
-
-	private void reprVolumeSystem(VolumeSystem vs) {
-		repr("getBlockSize", vs.getBlockSize());
-		repr("getOffset", vs.getOffset());
-		repr("getSize", vs.getSize());
-		repr("getType", vs.getType());
-		/* 
-		 * Don't get handle, it's not consistent (a memory pointer).
-		 * 
-		try {
-			repr("getVolumeSystemHandle", vs.getVolumeSystemHandle());
-		} catch (TskException ex) {
-			throw new RuntimeException(ex);
-		}
-		 * 
-		 */
-	}
-
-	private void repr(String method, Long l) {
-		indent();
-		name(method);
-		append(l.toString());
-		nl();
-	}
-	
-	private void repr(String method, Integer l) {
-		indent();
-		name(method);
-		append(l.toString());
-		nl();
-	}
-	
-	private void repr(String method, Short l) {
-		indent();
-		name(method);
-		append(l.toString());
-		nl();
-	}
-	
-	private void repr(String method, Byte l) {
-		indent();
-		name(method);
-		append(l.toString());
-		nl();
-	}
-
-	private void repr(String method, String[] sArray) {
-		indent();
-		name(method);
-		append(Arrays.toString(sArray));
-		nl();
-	}
-
-	private void repr(String method, String s) {
-		indent();
-		name(method);
-		append(s);
-		nl();
-	}
-
-	private void repr(String method, Exception ex) {
-		indent();
-		name(method);
-		nl();
-		append(ex.toString());
-		nl();
-	}
-
-	private void append(CharSequence s) {
-		try {
-			System.out.append(s);
-			System.out.flush();
-			result.append(s);
-		} catch (IOException ex) {
-			throw new RuntimeException(ex);
-		}
-	}
-
-	private class ReprVisitor implements ContentVisitor<Void> {
-
-		@Override
-		public Void visit(LayoutFile u) {
-			reprLayoutFile(u);
-			return null;
-		}
-		
-		@Override
-		public Void visit(VirtualDirectory u) {
-			reprLayoutDirectory(u);
-			return null;
-		}
-		
-		
-
-		@Override
-		public Void visit(Directory d) {
-			reprFsContent(d);
-			return null;
-		}
-
-		@Override
-		public Void visit(File f) {
-			reprFsContent(f);
-			return null;
-		}
-
-		@Override
-		public Void visit(FileSystem fs) {
-			reprFileSystem(fs);
-			return null;
-		}
-
-		@Override
-		public Void visit(Image i) {
-			reprImage(i);
-			return null;
-		}
-
-		@Override
-		public Void visit(Volume v) {
-			reprVolume(v);
-			return null;
-		}
-
-		@Override
-		public Void visit(VolumeSystem vs) {
-			reprVolumeSystem(vs);
-			return null;
-		}
-	}
-}
diff --git a/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java b/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java
new file mode 100644
index 0000000000000000000000000000000000000000..dd2b60756580f11a337ffc40607c6852be1124cc
--- /dev/null
+++ b/bindings/java/test/org/sleuthkit/datamodel/SequentialTraversal.java
@@ -0,0 +1,113 @@
+/*
+ * Sleuth Kit Data Model
+ *
+ * Copyright 2013 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.datamodel;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/**
+ *
+ * Traverses an image by running through item Ids ascending.
+ */
+@RunWith(Parameterized.class)
+public class SequentialTraversal extends ImgTraverser {
+
+	private static final Logger logg = Logger.getLogger(SequentialTraversal.class.getName());
+
+	public SequentialTraversal(List<String> imagePaths) {
+		this.imagePaths = imagePaths;
+	}
+
+	/**
+	 * Get the sets of filenames for each test image, they should be located in
+	 * the folder specified by the build.xml
+	 *
+	 * @return A Collection of one-element Object arrays, where that one element
+	 * is a List<String> containing the image file paths (the type is weird
+	 * because that's what JUnit wants for parameters).
+	 */
+	@Parameterized.Parameters
+	public static Collection<Object[]> testImageData() {
+		Collection<Object[]> data = new ArrayList<Object[]>();
+
+		for (Object imagePaths : DataModelTestSuite.getImagePaths()) {
+			data.add(new Object[]{imagePaths});
+		}
+		return data;
+	}
+
+	/**
+	 * Runs the test
+	 */
+	@Test
+	public void testSequentialDiff() {
+		try {
+			List<Boolean> test = basicTest();
+			assertEquals("Generated results (" + exFile + ") differ with gold standard (" + oldExceptionsPath + ") .", test.get(0), true);
+			assertEquals("Generated results (" + testStandardPath + ") differ with gold standard (" + oldStandardPath + ") .", test.get(1), true);
+		} catch (Exception ex) {
+			fail("Couldn't open gold standard file.");
+		}
+	}
+
+	/**
+	 * Traverses through an image and generates a sequential representation of
+	 * the image
+	 *
+	 * @param sk the sleuthkit case used for the traversal
+	 * @param path the location of the output file
+	 * @param exFile the exFile to store exceptions, is only used for
+	 * compatability with basic test
+	 * @return the file writer to be closed by testStandard
+	 */
+	@Override
+	public FileWriter traverse(SleuthkitCase sk, String path) {
+		FileWriter reslt;
+		try {
+			reslt = new FileWriter(path);
+			int x = 1;
+			Content c;
+			try {
+				while ((c = sk.getContentById(x)) != null) {
+					reslt.append(((AbstractContent) c).toString(false));
+					if (c instanceof File) {
+						DataModelTestSuite.readContent(c, reslt, exFile);
+					}
+					reslt.append("\n");
+					x++;
+				}
+			} catch (TskCoreException ex) {
+				DataModelTestSuite.writeExceptions(testStandardPath, ex);
+			}
+			return reslt;
+		} catch (IOException ex) {
+			logg.log(Level.SEVERE, "Failed to Traverse", ex);
+			return null;
+		}
+	}
+}
diff --git a/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java b/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java
new file mode 100644
index 0000000000000000000000000000000000000000..cbdcc35c8c061e6343d19864eada0b26529bdfc0
--- /dev/null
+++ b/bindings/java/test/org/sleuthkit/datamodel/TopDownTraversal.java
@@ -0,0 +1,149 @@
+/*
+ * Sleuth Kit Data Model
+ *
+ * Copyright 2013 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.datamodel;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ *
+ * Verifies that the current version of TSK produces the same output of previous
+ * versions by doing a TopDown Depth first traversal of the given images.
+ */
+@RunWith(Parameterized.class)
+public class TopDownTraversal extends ImgTraverser {
+
+	private static final Logger logg = Logger.getLogger(TopDownTraversal.class.getName());
+
+	public TopDownTraversal(List<String> imagePaths) {
+		this.imagePaths = imagePaths;
+	}
+
+	/**
+	 * Get the sets of filenames for each test image, they should be located in
+	 * the folder specified by the build.xml
+	 *
+	 * @return A Collection of one-element Object arrays, where that one element
+	 * is a List<String> containing the image file paths (the type is weird
+	 * because that's what JUnit wants for parameters).
+	 */
+	@Parameters
+	public static Collection<Object[]> testImageData() {
+		Collection<Object[]> data = new ArrayList<Object[]>();
+
+		for (Object imagePaths : DataModelTestSuite.getImagePaths()) {
+			data.add(new Object[]{imagePaths});
+		}
+		return data;
+	}
+
+	/**
+	 * Runs the test
+	 */
+	@Test
+	public void testTopDownDiff() {
+		try {
+			List<Boolean> test = basicTest();
+			assertEquals("Generated results (" + exFile + ") differ with gold standard (" + oldExceptionsPath + ") .", test.get(0), true);
+			assertEquals("Generated results (" + testStandardPath + ") differ with gold standard (" + oldStandardPath + ") .", test.get(1), true);
+		} catch (Exception ex) {
+			fail("Couldn't open gold standard file.");
+		}
+	}
+
+	/**
+	 * Traverses through an image and generates a top down representation the
+	 * image
+	 *
+	 * @param sk the sleuthkit case used for the traversal
+	 * @param path the location of the output file
+	 * @param exFile the exFile to store exceptions
+	 * @return the file writer to be closed by testStandard
+	 */
+	@Override
+	public FileWriter traverse(SleuthkitCase sk, String path) {
+		List<Content> lc = null;
+		try {
+			lc = sk.getRootObjects();
+		} catch (TskCoreException ex) {
+			DataModelTestSuite.writeExceptions(testStandardPath, ex);
+		}
+		List<Long> lp = new ArrayList<Long>();
+		try {
+			FileWriter reslt = new FileWriter(path);
+			FileWriter levs = new FileWriter(path.replace("_" + this.getClass().getSimpleName() + ".txt", DataModelTestSuite.LVS + ".txt"));
+			topDownDF(lc, lp, reslt, levs);
+			levs.flush();
+			return reslt;
+		} catch (IOException ex) {
+			logg.log(Level.SEVERE, "Failed to Traverse", ex);
+			return null;
+		}
+	}
+
+	/**
+	 * Traverses through an image and generates a TSK gettimes like
+	 * representation
+	 *
+	 * @param lc the list of content to be traversed
+	 * @param lp the list of a content's parents
+	 * @param reslt the filewriter to append output to
+	 * @param levs the filewriter to append leaves to
+	 */
+	private void topDownDF(List<Content> lc, List<Long> lp, Appendable reslt, Appendable levs) {
+		for (Content c : lc) {
+			try {
+				reslt.append(((AbstractContent) c).toString(false));
+			} catch (IOException ex) {
+				logg.log(Level.SEVERE, "Failed to Traverse", ex);
+			}
+			if (c instanceof File) {
+				DataModelTestSuite.readContent(c, reslt, testStandardPath);
+			}
+			try {
+				reslt.append("\n");
+			} catch (IOException ex) {
+				logg.log(Level.SEVERE, "Failed to Traverse", ex);
+			}
+			lp.add(0, c.getId());
+			try {
+				if (c.getChildren().isEmpty()) {
+					levs.append(lp.toString() + "\n");
+				} else {
+					topDownDF(c.getChildren(), new ArrayList<Long>(lp), reslt, levs);
+				}
+			} catch (IOException ex) {
+				logg.log(Level.SEVERE, "Failed to Traverse", ex);
+			} catch (TskCoreException ex) {
+				DataModelTestSuite.writeExceptions(testStandardPath, ex);
+			}
+			lp.remove(0);
+		}
+	}
+}
\ No newline at end of file
diff --git a/bindings/java/teststandards/fe_test_4_standard.txt b/bindings/java/teststandards/fe_test_4_standard.txt
deleted file mode 100644
index dc5f9a4599ed106df7970a92198c7eabbeef7eef..0000000000000000000000000000000000000000
--- a/bindings/java/teststandards/fe_test_4_standard.txt
+++ /dev/null
@@ -1,1231 +0,0 @@
-Image >
-	getName: fe_test_4.img
-	getSize: 0
-	getSsize: 512
-	getType: 2
-	ArtifactGetArtifactID: 1
-	ArtifactGetArtifactTypeID: 1
-	ArtifactGetArtifactTypeName: TSK_GEN_INFO
-	ArtifactGetDisplayName: General Info
-	ArtifactGetObjectID: 1
-	AttributeGetArtifactID: 1
-	AttributeGetAttributeTypeID: 1001
-	AttributeGetAttributeTypeName: testattr
-	AttributeGetDisplayName: Test Attribute
-	AttributeGetContext: first_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Integer
-	AttributeGetValueInteger: 23
-	AttributeGetArtifactID: 1
-	AttributeGetAttributeTypeID: 1001
-	AttributeGetAttributeTypeName: testattr
-	AttributeGetDisplayName: Test Attribute
-	AttributeGetContext: second_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Long
-	AttributeGetValueLong: 5
-	AttributeGetArtifactID: 1
-	AttributeGetAttributeTypeID: 1001
-	AttributeGetAttributeTypeName: testattr
-	AttributeGetDisplayName: Test Attribute
-	AttributeGetContext: third_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Double
-	AttributeGetValueDouble: 7.412
-	AttributeGetArtifactID: 1
-	AttributeGetAttributeTypeID: 1001
-	AttributeGetAttributeTypeName: testattr
-	AttributeGetDisplayName: Test Attribute
-	AttributeGetContext: fourth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: String
-	AttributeGetValueString: test
-	AttributeGetArtifactID: 1
-	AttributeGetAttributeTypeID: 1001
-	AttributeGetAttributeTypeName: testattr
-	AttributeGetDisplayName: Test Attribute
-	AttributeGetContext: fifth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Byte
-	AttributeGetValueByte: [1, 2]
-	ArtifactGetArtifactID: 2
-	ArtifactGetArtifactTypeID: 1001
-	ArtifactGetArtifactTypeName: Test_Artifact
-	ArtifactGetDisplayName: Test Artifact
-	ArtifactGetObjectID: 1
-	AttributeGetArtifactID: 2
-	AttributeGetAttributeTypeID: 2
-	AttributeGetAttributeTypeName: TSK_DATETIME
-	AttributeGetDisplayName: Date Time
-	AttributeGetContext: sixth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Integer
-	AttributeGetValueInteger: 23
-	AttributeGetArtifactID: 2
-	AttributeGetAttributeTypeID: 7
-	AttributeGetAttributeTypeName: TSK_FLAG
-	AttributeGetDisplayName: Flag
-	AttributeGetContext: seventh_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Long
-	AttributeGetValueLong: 5
-	AttributeGetArtifactID: 2
-	AttributeGetAttributeTypeID: 9
-	AttributeGetAttributeTypeName: TSK_GEO
-	AttributeGetDisplayName: Geo
-	AttributeGetContext: eighth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Double
-	AttributeGetValueDouble: 7.412
-	AttributeGetArtifactID: 2
-	AttributeGetAttributeTypeID: 10
-	AttributeGetAttributeTypeName: TSK_KEYWORD
-	AttributeGetDisplayName: Keyword
-	AttributeGetContext: nineth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: String
-	AttributeGetValueString: test
-	AttributeGetArtifactID: 2
-	AttributeGetAttributeTypeID: 13
-	AttributeGetAttributeTypeName: TSK_KEYWORD_SET
-	AttributeGetDisplayName: Keyword Set
-	AttributeGetContext: tenth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Byte
-	AttributeGetValueByte: [3, 4]
-	ArtifactGetArtifactID: 3
-	ArtifactGetArtifactTypeID: 1
-	ArtifactGetArtifactTypeName: TSK_GEN_INFO
-	ArtifactGetDisplayName: General Info
-	ArtifactGetObjectID: 1
-	AttributeGetArtifactID: 3
-	AttributeGetAttributeTypeID: 1
-	AttributeGetAttributeTypeName: TSK_URL
-	AttributeGetDisplayName: URL
-	AttributeGetContext: eleventh_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Integer
-	AttributeGetValueInteger: 29
-	AttributeGetArtifactID: 3
-	AttributeGetAttributeTypeID: 1
-	AttributeGetAttributeTypeName: TSK_URL
-	AttributeGetDisplayName: URL
-	AttributeGetContext: twelfth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Long
-	AttributeGetValueLong: 565413
-	AttributeGetArtifactID: 3
-	AttributeGetAttributeTypeID: 1
-	AttributeGetAttributeTypeName: TSK_URL
-	AttributeGetDisplayName: URL
-	AttributeGetContext: thirteenth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Double
-	AttributeGetValueDouble: 1.987
-	AttributeGetArtifactID: 3
-	AttributeGetAttributeTypeID: 2
-	AttributeGetAttributeTypeName: TSK_DATETIME
-	AttributeGetDisplayName: Date Time
-	AttributeGetContext: fourteenth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: String
-	AttributeGetValueString: test2
-	AttributeGetArtifactID: 3
-	AttributeGetAttributeTypeID: 2
-	AttributeGetAttributeTypeName: TSK_DATETIME
-	AttributeGetDisplayName: Date Time
-	AttributeGetContext: fifteenth_call
-	AttributeGetSource: regressionTest
-	AttributeGetValueType: Byte
-	AttributeGetValueByte: [5, 6]
-	read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-	VolumeSystem >
-		getBlockSize: 512
-		getOffset: 0
-		getSize: 0
-		getType: 1
-		read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-		Volume >
-			getAddr: 1
-			getDescription: Unallocated
-			getFlags: 2
-			getFlagsAsString: Unallocated
-			getLength: 63
-			getSize: 63
-			getStart: 0
-			read: md5=19471762cfa7d159173589cc1f7eaf8f
-
-		Volume >
-			getAddr: 2
-			getDescription: Win95 FAT32 (0x0B)
-			getFlags: 1
-			getFlagsAsString: Allocated
-			getLength: 32067
-			getSize: 32067
-			getStart: 63
-			read: md5=2698a303804310c068569cd12830a6b2
-
-			FileSystem >
-				getBlock_count: 32066
-				getBlock_size: 512
-				getFirst_inum: 2
-				getFs_type: 2
-				getImg_offset: 32256
-				getLast_inum: 512662
-				getRoot_inum: 2
-				getSize: 16417792
-				read: md5=153555ba7e27f520282851b78b260fb8
-
-				Directory >
-					getAtime: 0
-					getAtimeAsDate: 0000-00-00 00:00:00
-					getAttr_id: 0
-					getAttr_type: 1
-					getCrtime: 0
-					getCrtimeAsDate: 0000-00-00 00:00:00
-					getCtime: 0
-					getCtimeAsDate: 0000-00-00 00:00:00
-					getDirFlagsAsString: Allocated
-					getDirTypeAsString: d
-					getDir_flags: 1
-					getDir_type: 3
-					getDirtype: 0
-					getGid: 0
-					getMetaFlagsAsString: Allocated
-					getMetaTypeAsString: d
-					getMeta_addr: 2
-					getMeta_flags: 5
-					getMeta_type: 2
-					getMode: 0
-					getModeAsString: d---------
-					getMtime: 0
-					getMtimeAsDate: 0000-00-00 00:00:00
-					getName: 
-					getParentPath: /
-					getSize: 16384
-					getUid: 0
-					read: md5=81c08f35401c144854c40fe5b9383b38
-
-					File >
-						getAtime: 0
-						getAtimeAsDate: 0000-00-00 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 0
-						getCrtimeAsDate: 0000-00-00 00:00:00
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: v
-						getDir_flags: 1
-						getDir_type: 10
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: v
-						getMeta_addr: 512660
-						getMeta_flags: 5
-						getMeta_type: 10
-						getMode: 0
-						getModeAsString: v---------
-						getMtime: 0
-						getMtimeAsDate: 0000-00-00 00:00:00
-						getName: $FAT1
-						getParentPath: /
-						getSize: 6144
-						getUid: 0
-						read: md5=ac5750e6eb5ab94ea394023d43ab4b50
-
-					File >
-						getAtime: 0
-						getAtimeAsDate: 0000-00-00 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 0
-						getCrtimeAsDate: 0000-00-00 00:00:00
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: v
-						getDir_flags: 1
-						getDir_type: 10
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: v
-						getMeta_addr: 512661
-						getMeta_flags: 5
-						getMeta_type: 10
-						getMode: 0
-						getModeAsString: v---------
-						getMtime: 0
-						getMtimeAsDate: 0000-00-00 00:00:00
-						getName: $FAT2
-						getParentPath: /
-						getSize: 6144
-						getUid: 0
-						read: md5=ac5750e6eb5ab94ea394023d43ab4b50
-
-					File >
-						getAtime: 0
-						getAtimeAsDate: 0000-00-00 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 0
-						getCrtimeAsDate: 0000-00-00 00:00:00
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: v
-						getDir_flags: 1
-						getDir_type: 10
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: v
-						getMeta_addr: 512659
-						getMeta_flags: 5
-						getMeta_type: 10
-						getMode: 0
-						getModeAsString: v---------
-						getMtime: 0
-						getMtimeAsDate: 0000-00-00 00:00:00
-						getName: $MBR
-						getParentPath: /
-						getSize: 512
-						getUid: 0
-						read: md5=f87a92f7f10eb15763230c71c3f84629
-
-					Directory >
-						getAtime: 0
-						getAtimeAsDate: 0000-00-00 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 0
-						getCrtimeAsDate: 0000-00-00 00:00:00
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: d
-						getDir_flags: 1
-						getDir_type: 3
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: d
-						getMeta_addr: 512662
-						getMeta_flags: 5
-						getMeta_type: 2
-						getMode: 0
-						getModeAsString: d---------
-						getMtime: 0
-						getMtimeAsDate: 0000-00-00 00:00:00
-						getName: $OrphanFiles
-						getParentPath: /
-						getSize: 0
-						getUid: 0
-						read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-					Directory >
-						getAtime: 1286856000
-						getAtimeAsDate: 2010-10-12 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 1286915024
-						getCrtimeAsDate: 2010-10-12 16:23:44
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: d
-						getDir_flags: 1
-						getDir_type: 3
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: d
-						getMeta_addr: 4
-						getMeta_flags: 5
-						getMeta_type: 2
-						getMode: 511
-						getModeAsString: drwxrwxrwx
-						getMtime: 1286915024
-						getMtimeAsDate: 2010-10-12 16:23:44
-						getName: dir 1
-						getParentPath: /
-						getSize: 4096
-						getUid: 0
-						read: md5=84f0eae9b626031286d45c1909ec0083
-
-						Directory >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286915024
-							getCrtimeAsDate: 2010-10-12 16:23:44
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: d
-							getDir_flags: 1
-							getDir_type: 3
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: d
-							getMeta_addr: 4
-							getMeta_flags: 5
-							getMeta_type: 2
-							getMode: 511
-							getModeAsString: drwxrwxrwx
-							getMtime: 1286915024
-							getMtimeAsDate: 2010-10-12 16:23:44
-							getName: .
-							getParentPath: /dir 1/
-							getSize: 4096
-							getUid: 0
-							read: md5=84f0eae9b626031286d45c1909ec0083
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286915016
-							getCrtimeAsDate: 2010-10-12 16:23:36
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 648
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286915016
-							getMtimeAsDate: 2010-10-12 16:23:36
-							getName: filler1
-							getParentPath: /dir 1/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286915016
-							getCrtimeAsDate: 2010-10-12 16:23:36
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 650
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286915016
-							getMtimeAsDate: 2010-10-12 16:23:36
-							getName: filler2
-							getParentPath: /dir 1/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286915016
-							getCrtimeAsDate: 2010-10-12 16:23:36
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 652
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286915016
-							getMtimeAsDate: 2010-10-12 16:23:36
-							getName: filler3
-							getParentPath: /dir 1/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286915018
-							getCrtimeAsDate: 2010-10-12 16:23:38
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 654
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286915018
-							getMtimeAsDate: 2010-10-12 16:23:38
-							getName: filler4
-							getParentPath: /dir 1/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286915018
-							getCrtimeAsDate: 2010-10-12 16:23:38
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 656
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286915018
-							getMtimeAsDate: 2010-10-12 16:23:38
-							getName: filler5
-							getParentPath: /dir 1/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286915018
-							getCrtimeAsDate: 2010-10-12 16:23:38
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 658
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286915018
-							getMtimeAsDate: 2010-10-12 16:23:38
-							getName: filler6
-							getParentPath: /dir 1/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286915020
-							getCrtimeAsDate: 2010-10-12 16:23:40
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 660
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286915020
-							getMtimeAsDate: 2010-10-12 16:23:40
-							getName: filler7
-							getParentPath: /dir 1/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286915024
-							getCrtimeAsDate: 2010-10-12 16:23:44
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 662
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286915024
-							getMtimeAsDate: 2010-10-12 16:23:44
-							getName: filler8
-							getParentPath: /dir 1/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286895424
-							getCrtimeAsDate: 2010-10-12 10:57:04
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 646
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286895424
-							getMtimeAsDate: 2010-10-12 10:57:04
-							getName: maytag0.jpg
-							getParentPath: /dir 1/
-							getSize: 9023
-							getUid: 0
-							read: md5=048857eca91ffed071cb8b8a1b3e3235
-
-				Directory >
-					getAtime: 0
-					getAtimeAsDate: 0000-00-00 00:00:00
-					getAttr_id: 0
-					getAttr_type: 1
-					getCrtime: 0
-					getCrtimeAsDate: 0000-00-00 00:00:00
-					getCtime: 0
-					getCtimeAsDate: 0000-00-00 00:00:00
-					getDirFlagsAsString: Allocated
-					getDirTypeAsString: d
-					getDir_flags: 1
-					getDir_type: 3
-					getDirtype: 0
-					getGid: 0
-					getMetaFlagsAsString: Allocated
-					getMetaTypeAsString: d
-					getMeta_addr: 2
-					getMeta_flags: 5
-					getMeta_type: 2
-					getMode: 0
-					getModeAsString: d---------
-					getMtime: 0
-					getMtimeAsDate: 0000-00-00 00:00:00
-					getName: ..
-					getParentPath: /dir 1/
-					getSize: 16384
-					getUid: 0
-					read: md5=81c08f35401c144854c40fe5b9383b38
-
-		Volume >
-			getAddr: 3
-			getDescription: Linux (0x83)
-			getFlags: 1
-			getFlagsAsString: Allocated
-			getLength: 16065
-			getSize: 16065
-			getStart: 32130
-			read: md5=8142e94785941496227c3928416c5e43
-
-		Volume >
-			getAddr: 4
-			getDescription: Win95 FAT32 (0x0B)
-			getFlags: 1
-			getFlagsAsString: Allocated
-			getLength: 16065
-			getSize: 16065
-			getStart: 48195
-			read: md5=94b22c428ae4a38d484f1d717f43570a
-
-			FileSystem >
-				getBlock_count: 16064
-				getBlock_size: 512
-				getFirst_inum: 2
-				getFs_type: 2
-				getImg_offset: 24675840
-				getLast_inum: 256630
-				getRoot_inum: 2
-				getSize: 8224768
-				read: md5=52e241659c3e1a5e4f6a124f30ce31bf
-
-				Directory >
-					getAtime: 0
-					getAtimeAsDate: 0000-00-00 00:00:00
-					getAttr_id: 0
-					getAttr_type: 1
-					getCrtime: 0
-					getCrtimeAsDate: 0000-00-00 00:00:00
-					getCtime: 0
-					getCtimeAsDate: 0000-00-00 00:00:00
-					getDirFlagsAsString: Allocated
-					getDirTypeAsString: d
-					getDir_flags: 1
-					getDir_type: 3
-					getDirtype: 0
-					getGid: 0
-					getMetaFlagsAsString: Allocated
-					getMetaTypeAsString: d
-					getMeta_addr: 2
-					getMeta_flags: 5
-					getMeta_type: 2
-					getMode: 0
-					getModeAsString: d---------
-					getMtime: 0
-					getMtimeAsDate: 0000-00-00 00:00:00
-					getName: 
-					getParentPath: /
-					getSize: 16384
-					getUid: 0
-					read: md5=75835fc58e872c3b0fc80ac516265912
-
-					File >
-						getAtime: 0
-						getAtimeAsDate: 0000-00-00 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 0
-						getCrtimeAsDate: 0000-00-00 00:00:00
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: v
-						getDir_flags: 1
-						getDir_type: 10
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: v
-						getMeta_addr: 256628
-						getMeta_flags: 5
-						getMeta_type: 10
-						getMode: 0
-						getModeAsString: v---------
-						getMtime: 0
-						getMtimeAsDate: 0000-00-00 00:00:00
-						getName: $FAT1
-						getParentPath: /
-						getSize: 6144
-						getUid: 0
-						read: md5=0dc62184de6df1c53c549c2408663654
-
-					File >
-						getAtime: 0
-						getAtimeAsDate: 0000-00-00 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 0
-						getCrtimeAsDate: 0000-00-00 00:00:00
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: v
-						getDir_flags: 1
-						getDir_type: 10
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: v
-						getMeta_addr: 256629
-						getMeta_flags: 5
-						getMeta_type: 10
-						getMode: 0
-						getModeAsString: v---------
-						getMtime: 0
-						getMtimeAsDate: 0000-00-00 00:00:00
-						getName: $FAT2
-						getParentPath: /
-						getSize: 6144
-						getUid: 0
-						read: md5=0dc62184de6df1c53c549c2408663654
-
-					File >
-						getAtime: 0
-						getAtimeAsDate: 0000-00-00 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 0
-						getCrtimeAsDate: 0000-00-00 00:00:00
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: v
-						getDir_flags: 1
-						getDir_type: 10
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: v
-						getMeta_addr: 256627
-						getMeta_flags: 5
-						getMeta_type: 10
-						getMode: 0
-						getModeAsString: v---------
-						getMtime: 0
-						getMtimeAsDate: 0000-00-00 00:00:00
-						getName: $MBR
-						getParentPath: /
-						getSize: 512
-						getUid: 0
-						read: md5=ae9b1438441ee0c1ef68fdcc85fd620a
-
-					Directory >
-						getAtime: 0
-						getAtimeAsDate: 0000-00-00 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 0
-						getCrtimeAsDate: 0000-00-00 00:00:00
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: d
-						getDir_flags: 1
-						getDir_type: 3
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: d
-						getMeta_addr: 256630
-						getMeta_flags: 5
-						getMeta_type: 2
-						getMode: 0
-						getModeAsString: d---------
-						getMtime: 0
-						getMtimeAsDate: 0000-00-00 00:00:00
-						getName: $OrphanFiles
-						getParentPath: /
-						getSize: 0
-						getUid: 0
-						read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-					Directory >
-						getAtime: 1286856000
-						getAtimeAsDate: 2010-10-12 00:00:00
-						getAttr_id: 0
-						getAttr_type: 1
-						getCrtime: 1286914962
-						getCrtimeAsDate: 2010-10-12 16:22:42
-						getCtime: 0
-						getCtimeAsDate: 0000-00-00 00:00:00
-						getDirFlagsAsString: Allocated
-						getDirTypeAsString: d
-						getDir_flags: 1
-						getDir_type: 3
-						getDirtype: 0
-						getGid: 0
-						getMetaFlagsAsString: Allocated
-						getMetaTypeAsString: d
-						getMeta_addr: 4
-						getMeta_flags: 5
-						getMeta_type: 2
-						getMode: 511
-						getModeAsString: drwxrwxrwx
-						getMtime: 1286914978
-						getMtimeAsDate: 2010-10-12 16:22:58
-						getName: dir 2
-						getParentPath: /
-						getSize: 2048
-						getUid: 0
-						read: md5=1dfbdb6600e081008cb448d0e69f7ac9
-
-						Directory >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914962
-							getCrtimeAsDate: 2010-10-12 16:22:42
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: d
-							getDir_flags: 1
-							getDir_type: 3
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: d
-							getMeta_addr: 4
-							getMeta_flags: 5
-							getMeta_type: 2
-							getMode: 511
-							getModeAsString: drwxrwxrwx
-							getMtime: 1286914978
-							getMtimeAsDate: 2010-10-12 16:22:58
-							getName: .
-							getParentPath: /dir 2/
-							getSize: 2048
-							getUid: 0
-							read: md5=1dfbdb6600e081008cb448d0e69f7ac9
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914242
-							getCrtimeAsDate: 2010-10-12 16:10:42
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Allocated
-							getDirTypeAsString: r
-							getDir_flags: 1
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Allocated
-							getMetaTypeAsString: r
-							getMeta_addr: 599
-							getMeta_flags: 5
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286914242
-							getMtimeAsDate: 2010-10-12 16:10:42
-							getName: about_maytag.txt
-							getParentPath: /dir 2/
-							getSize: 5158
-							getUid: 0
-							read: md5=940fafae14bfc68df90ad2e62696392e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914956
-							getCrtimeAsDate: 2010-10-12 16:22:36
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Unallocated
-							getDirTypeAsString: r
-							getDir_flags: 2
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Unallocated
-							getMetaTypeAsString: r
-							getMeta_addr: 582
-							getMeta_flags: 6
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286914956
-							getMtimeAsDate: 2010-10-12 16:22:36
-							getName: filler1
-							getParentPath: /dir 2/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914958
-							getCrtimeAsDate: 2010-10-12 16:22:38
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Unallocated
-							getDirTypeAsString: r
-							getDir_flags: 2
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Unallocated
-							getMetaTypeAsString: r
-							getMeta_addr: 584
-							getMeta_flags: 6
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286914958
-							getMtimeAsDate: 2010-10-12 16:22:38
-							getName: filler2
-							getParentPath: /dir 2/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914958
-							getCrtimeAsDate: 2010-10-12 16:22:38
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Unallocated
-							getDirTypeAsString: r
-							getDir_flags: 2
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Unallocated
-							getMetaTypeAsString: r
-							getMeta_addr: 586
-							getMeta_flags: 6
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286914958
-							getMtimeAsDate: 2010-10-12 16:22:38
-							getName: filler3
-							getParentPath: /dir 2/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914960
-							getCrtimeAsDate: 2010-10-12 16:22:40
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Unallocated
-							getDirTypeAsString: r
-							getDir_flags: 2
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Unallocated
-							getMetaTypeAsString: r
-							getMeta_addr: 588
-							getMeta_flags: 6
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286914960
-							getMtimeAsDate: 2010-10-12 16:22:40
-							getName: filler4
-							getParentPath: /dir 2/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914960
-							getCrtimeAsDate: 2010-10-12 16:22:40
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Unallocated
-							getDirTypeAsString: r
-							getDir_flags: 2
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Unallocated
-							getMetaTypeAsString: r
-							getMeta_addr: 590
-							getMeta_flags: 6
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286914960
-							getMtimeAsDate: 2010-10-12 16:22:40
-							getName: filler5
-							getParentPath: /dir 2/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914960
-							getCrtimeAsDate: 2010-10-12 16:22:40
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Unallocated
-							getDirTypeAsString: r
-							getDir_flags: 2
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Unallocated
-							getMetaTypeAsString: r
-							getMeta_addr: 592
-							getMeta_flags: 6
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286914960
-							getMtimeAsDate: 2010-10-12 16:22:40
-							getName: filler6
-							getParentPath: /dir 2/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914962
-							getCrtimeAsDate: 2010-10-12 16:22:42
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Unallocated
-							getDirTypeAsString: r
-							getDir_flags: 2
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Unallocated
-							getMetaTypeAsString: r
-							getMeta_addr: 594
-							getMeta_flags: 6
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286914962
-							getMtimeAsDate: 2010-10-12 16:22:42
-							getName: filler7
-							getParentPath: /dir 2/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-						File >
-							getAtime: 1286856000
-							getAtimeAsDate: 2010-10-12 00:00:00
-							getAttr_id: 0
-							getAttr_type: 1
-							getCrtime: 1286914962
-							getCrtimeAsDate: 2010-10-12 16:22:42
-							getCtime: 0
-							getCtimeAsDate: 0000-00-00 00:00:00
-							getDirFlagsAsString: Unallocated
-							getDirTypeAsString: r
-							getDir_flags: 2
-							getDir_type: 5
-							getDirtype: 0
-							getGid: 0
-							getMetaFlagsAsString: Unallocated
-							getMetaTypeAsString: r
-							getMeta_addr: 596
-							getMeta_flags: 6
-							getMeta_type: 1
-							getMode: 511
-							getModeAsString: rrwxrwxrwx
-							getMtime: 1286914962
-							getMtimeAsDate: 2010-10-12 16:22:42
-							getName: filler8
-							getParentPath: /dir 2/
-							getSize: 0
-							getUid: 0
-							read: md5=d41d8cd98f00b204e9800998ecf8427e
-
-				Directory >
-					getAtime: 0
-					getAtimeAsDate: 0000-00-00 00:00:00
-					getAttr_id: 0
-					getAttr_type: 1
-					getCrtime: 0
-					getCrtimeAsDate: 0000-00-00 00:00:00
-					getCtime: 0
-					getCtimeAsDate: 0000-00-00 00:00:00
-					getDirFlagsAsString: Allocated
-					getDirTypeAsString: d
-					getDir_flags: 1
-					getDir_type: 3
-					getDirtype: 0
-					getGid: 0
-					getMetaFlagsAsString: Allocated
-					getMetaTypeAsString: d
-					getMeta_addr: 2
-					getMeta_flags: 5
-					getMeta_type: 2
-					getMode: 0
-					getModeAsString: d---------
-					getMtime: 0
-					getMtimeAsDate: 0000-00-00 00:00:00
-					getName: ..
-					getParentPath: /dir 2/
-					getSize: 16384
-					getUid: 0
-					read: md5=75835fc58e872c3b0fc80ac516265912
-
diff --git a/framework/TskModules/c_FileTypeSigModule b/framework/TskModules/c_FileTypeSigModule
index 2e315f7460699b4892df69e709b4893d39953e65..21ee2fe7c16a3ee5e4675a14382e3248d776ef57 160000
--- a/framework/TskModules/c_FileTypeSigModule
+++ b/framework/TskModules/c_FileTypeSigModule
@@ -1 +1 @@
-Subproject commit 2e315f7460699b4892df69e709b4893d39953e65
+Subproject commit 21ee2fe7c16a3ee5e4675a14382e3248d776ef57
diff --git a/framework/TskModules/c_HashCalcModule b/framework/TskModules/c_HashCalcModule
index faa0197f7f7d6a7cb64c7366522b90dd2cea7599..662661eb5476c5b42387d7796d949c5391123330 160000
--- a/framework/TskModules/c_HashCalcModule
+++ b/framework/TskModules/c_HashCalcModule
@@ -1 +1 @@
-Subproject commit faa0197f7f7d6a7cb64c7366522b90dd2cea7599
+Subproject commit 662661eb5476c5b42387d7796d949c5391123330
diff --git a/framework/TskModules/c_RegRipperModule b/framework/TskModules/c_RegRipperModule
index 564b8aca3f3628dd1de5bae462c2c35aff6a8c6d..a5d916393ca0910bea99026804f7eec8d9b186b5 160000
--- a/framework/TskModules/c_RegRipperModule
+++ b/framework/TskModules/c_RegRipperModule
@@ -1 +1 @@
-Subproject commit 564b8aca3f3628dd1de5bae462c2c35aff6a8c6d
+Subproject commit a5d916393ca0910bea99026804f7eec8d9b186b5
diff --git a/framework/TskModules/c_SummaryReportModule b/framework/TskModules/c_SummaryReportModule
index 8eaf74d45d7bfd4c310087a6c1b482d0ddc8d8c5..cc9d19a0082371df88d3e637d6b439ba43e7b41a 160000
--- a/framework/TskModules/c_SummaryReportModule
+++ b/framework/TskModules/c_SummaryReportModule
@@ -1 +1 @@
-Subproject commit 8eaf74d45d7bfd4c310087a6c1b482d0ddc8d8c5
+Subproject commit cc9d19a0082371df88d3e637d6b439ba43e7b41a