diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.cpp b/bindings/java/jni/dataModel_SleuthkitJNI.cpp
index 75ff69cb024e4c1f015dc58c483ad36881d8ef77..0384cfdc3d35d0df35c621c11a1bac5340a2c9df 100644
--- a/bindings/java/jni/dataModel_SleuthkitJNI.cpp
+++ b/bindings/java/jni/dataModel_SleuthkitJNI.cpp
@@ -1422,13 +1422,31 @@ Java_org_sleuthkit_datamodel_SleuthkitJNI_openVolNat(JNIEnv * env,
  * @param fs_offset the offset in bytes to the file system 
  */
 JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openFsNat
-    (JNIEnv * env, jclass obj, jlong a_img_info, jlong fs_offset) {
+    (JNIEnv * env, jclass obj, jlong a_img_info, jlong fs_offset, jlong pool_block) {
     TSK_IMG_INFO *img_info = castImgInfo(env, a_img_info);
     if (img_info == 0) {
         //exception already set
         return 0;
     }
     TSK_FS_INFO *fs_info;
+    printf("Java_org_sleuthkit_datamodel_SleuthkitJNI_openFsNat - pool_block = %lld\n", pool_block);
+    fflush(stdout);
+
+    if (pool_block > 0) {
+        printf("  Ok have a pool\n");
+        const TSK_POOL_INFO *pool = tsk_pool_open_img_sing(img_info, fs_offset, TSK_POOL_TYPE_DETECT);
+
+        if (pool == NULL) {
+            tsk_error_print(stderr);
+            if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE)
+                tsk_pool_type_print(stderr);
+            setThrowTskCoreError(env, tsk_error_get());
+        }
+
+        printf("  Making new img_info\n");
+        fflush(stdout);
+        img_info = pool->get_img_info(pool, pool_block);
+    }
 
     fs_info =
         tsk_fs_open_img(img_info, (TSK_OFF_T) fs_offset,
diff --git a/bindings/java/jni/dataModel_SleuthkitJNI.h b/bindings/java/jni/dataModel_SleuthkitJNI.h
index 52a7a85a46872c3a04cf89ccd6fe3e1be526bff1..ad20cb8e6daca47f049ba7aec1dd32ac17b682ef 100644
--- a/bindings/java/jni/dataModel_SleuthkitJNI.h
+++ b/bindings/java/jni/dataModel_SleuthkitJNI.h
@@ -290,10 +290,10 @@ JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openVolNat
 /*
  * Class:     org_sleuthkit_datamodel_SleuthkitJNI
  * Method:    openFsNat
- * Signature: (JJ)J
+ * Signature: (JJJ)J
  */
 JNIEXPORT jlong JNICALL Java_org_sleuthkit_datamodel_SleuthkitJNI_openFsNat
-  (JNIEnv *, jclass, jlong, jlong);
+  (JNIEnv *, jclass, jlong, jlong, jlong);
 
 /*
  * Class:     org_sleuthkit_datamodel_SleuthkitJNI
@@ -479,3 +479,14 @@ extern "C" {
 }
 #endif
 #endif
+/* Header for class org_sleuthkit_datamodel_SleuthkitJNI_CaseHandles */
+
+#ifndef _Included_org_sleuthkit_datamodel_SleuthkitJNI_CaseHandles
+#define _Included_org_sleuthkit_datamodel_SleuthkitJNI_CaseHandles
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/bindings/java/src/org/sleuthkit/datamodel/Bundle.properties b/bindings/java/src/org/sleuthkit/datamodel/Bundle.properties
index 9e0e01c75bca51cadc0cc318e21c1f73bd703e06..1368c84046c9663ca338073e9fbb0a12e3a80c10 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/Bundle.properties
+++ b/bindings/java/src/org/sleuthkit/datamodel/Bundle.properties
@@ -230,6 +230,7 @@ TskData.tskFsTypeEnum.RAWautoDetect=RAW (Auto Detection)
 TskData.tskFsTypeEnum.ISO9660autoDetect=ISO9660 (Auto Detection)
 TskData.tskFsTypeEnum.HFSautoDetect=HFS (Auto Detection)
 TskData.tskFsTypeEnum.YAFFS2autoDetect=YAFFS2 (Auto Detection)
+TskData.tskFsTypeEnum.APFSautoDetect=APFS (Auto Detection)
 TskData.tskFsTypeEnum.unsupported=Unsupported File System
 TskData.tskImgTypeEnum.autoDetect=Auto Detect
 TskData.tskImgTypeEnum.rawSingle=Raw Single
diff --git a/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java b/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java
index 8d5b8fcc8271d808aec5a11e44068aa9a4e77d48..67d23024aa4ac6aabfd8fcae924afbcd5564dab2 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/FileSystem.java
@@ -61,6 +61,7 @@ protected FileSystem(SleuthkitCase db, long obj_id, String name, long img_offset
 		this.firstInum = first_inum;
 		this.lastInum = last_inum;
 		this.poolBlock = poolBlock;
+		System.out.println("%%% Created new FileSystem object with poolBlock = " + poolBlock);
 	}
 
 	@Override
@@ -94,7 +95,7 @@ long getFileSystemHandle() throws TskCoreException {
 					Content dataSource = getDataSource();
 					if ((dataSource != null) && (dataSource instanceof Image)) {
 						Image image = (Image) dataSource;
-						filesystemHandle = SleuthkitJNI.openFs(image.getImageHandle(), imgOffset, getSleuthkitCase());
+						filesystemHandle = SleuthkitJNI.openFs(image.getImageHandle(), imgOffset, poolBlock, getSleuthkitCase());
 					} else {
 						throw new TskCoreException("Data Source of File System is not an image");
 					}
diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
index 7497fc87ec1a42690de3cf54974bb76c805e0e0d..94128c6fc89e1ba676548bfe21ef9387d0efcd73 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java
@@ -843,7 +843,7 @@ public static long openFs(long imgHandle, long fsOffset, long poolBlock, Sleuthk
 					//return cached
 					fsHandle = imgOffSetToFsHandle.get(combinedOffset);
 				} else {
-					fsHandle = openFsNat(imgHandle, combinedOffset);
+					fsHandle = openFsNat(imgHandle, fsOffset, poolBlock);
 					//cache it
 					imgOffSetToFsHandle.put(combinedOffset, fsHandle);
 				}
@@ -1670,7 +1670,7 @@ public static long openFile(long fsHandle, long fileId, TSK_FS_ATTR_TYPE_ENUM at
 
 	private static native long openVolNat(long vsHandle, long volId) throws TskCoreException;
 
-	private static native long openFsNat(long imgHandle, long fsId) throws TskCoreException;
+	private static native long openFsNat(long imgHandle, long fsId, long poolOffset) throws TskCoreException;
 
 	private static native long openFileNat(long fsHandle, long fileId, int attrType, int attrId) throws TskCoreException;
 
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TskData.java b/bindings/java/src/org/sleuthkit/datamodel/TskData.java
index 6c8b844ff3ad283a40b595d063e110ba6200260d..8e13bba34e223c33e771f4905626d0e68a95a4f9 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/TskData.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/TskData.java
@@ -460,6 +460,8 @@ public enum TSK_FS_TYPE_ENUM {
 		TSK_FS_TYPE_EXT4(0x00002000, "Ext4"), ///< Ext4 file system
 		TSK_FS_TYPE_YAFFS2(0x00004000, "YAFFS2"), ///< YAFFS2 file system
 		TSK_FS_TYPE_YAFFS2_DETECT(0x00004000, bundle.getString("TskData.tskFsTypeEnum.YAFFS2autoDetect")), ///< YAFFS2 auto detection
+		TSK_FS_TYPE_APFS(0x00010000, "APFS"), ///< APFS file system
+		TSK_FS_TYPE_APFS_DETECT(0x00010000, bundle.getString("TskData.tskFsTypeEnum.APFSautoDetect")), ///< APFS auto detection
 		TSK_FS_TYPE_UNSUPP(0xffffffff, bundle.getString("TskData.tskFsTypeEnum.unsupported"));        ///< Unsupported file system
 
 		private int value;
@@ -524,6 +526,7 @@ public enum TSK_IMG_TYPE_ENUM {
 		TSK_IMG_TYPE_EWF_EWF(64, "E01"), // Expert Witness format (encase) NON-NLS
 		TSK_IMG_TYPE_VMDK_VMDK(128, "VMDK"), // VMware Virtual Disk (VMDK) NON-NLS
 		TSK_IMG_TYPE_VHD_VHD(256, "VHD"), // Virtual Hard Disk (VHD) image format NON-NLS
+		TSK_IMG_TYPE_POOL_POOL(16384, "POOL"), // Pool (internal use) NON-NLS
 		TSK_IMG_TYPE_UNSUPP(65535, bundle.getString("TskData.tskImgTypeEnum.unknown"));   // Unsupported Image Type
 
 		private long imgType;