diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
index 6f597e215282b5ba9b5cd3d8008c40855a764002..9763edf1978faa460ed824dc4f52eeb08f9f498f 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
@@ -884,7 +884,12 @@ public static void closeImg(long imgHandle) {
 	 * @param vsHandle pointer to volume system structure in sleuthkit
 	 */
 	public static void closeVs(long vsHandle) {
-		closeVsNat(vsHandle);
+        // NOTE: We are not caching Volume System handles, so we
+        // can free it.  One is allocated per VolumeSystem object. 
+        // There is a chance that a vsPart handle exists in a Volume object,
+        // and that memory will be freed.  But, the "TAG" checks in the native
+        // code should detect that it has been freed. 
+        closeVsNat(vsHandle);
 	}
 
 	/**
diff --git a/bindings/java/src/org/sleuthkit/datamodel/Volume.java b/bindings/java/src/org/sleuthkit/datamodel/Volume.java
index a339e923ec9454760e7098a044c85c07c9dfe92e..c3a7b7cda8e791faa03117944389c8958b6a7767 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/Volume.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/Volume.java
@@ -79,14 +79,9 @@ public int read(byte[] buf, long offset, long len) throws TskCoreException {
 
 	@Override
 	public void close() {
-		if (volumeHandle != 0) {
-			synchronized (this) {
-				if (volumeHandle != 0) {
-					SleuthkitJNI.closeVs(volumeHandle);
-					volumeHandle = 0;
-				}
-			}
-		}
+        // there is nothing to free. The VolumeSystem structure
+        // in C++ contains this structure and will free it. 
+        volumeHandle = 0;
 	}
 
 	@Override