diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp
index 6d3effe974302ea7d295f65f53201145b6d1172f..3b24fb03fc20d2caf3f032d2a4eaebe103b2e398 100755
--- a/tsk/auto/auto_db.cpp
+++ b/tsk/auto/auto_db.cpp
@@ -307,36 +307,60 @@ TSK_FILTER_ENUM TskAutoDb::filterVs(const TSK_VS_INFO * vs_info)
 TSK_FILTER_ENUM
 TskAutoDb::filterPool(const TSK_POOL_INFO * pool_info)
 {
+    int64_t poolObjId;
     m_poolFound = true;
 
     if (m_volFound && m_vsFound) {
         // there's a volume system and volume
-        if (m_db->addPoolInfoAndVS(pool_info, m_curVolId, m_curPoolVs)) {
+        if (m_db->addPoolInfoAndVS(pool_info, m_curVolId, poolObjId, m_curPoolVs)) {
             registerError();
             return TSK_FILTER_STOP;
         }
     }
     else {
         // pool doesn't live in a volume, use image as parent
-        if (m_db->addPoolInfoAndVS(pool_info, m_curImgId, m_curPoolVs)) {
+        if (m_db->addPoolInfoAndVS(pool_info, m_curImgId, poolObjId, m_curPoolVs)) {
             registerError();
             return TSK_FILTER_STOP;
         }
     }
 
-    
+    if (addUnallocatedPoolBlocksToDb(pool_info, poolObjId)) {
+        registerError();
+        return TSK_FILTER_STOP;
+    }
 
     return TSK_FILTER_CONT;
 }
 
 TSK_FILTER_ENUM
-TskAutoDb::addUnallocatedPoolBlocks(const TSK_POOL_INFO * pool_info) {
+TskAutoDb::addUnallocatedPoolBlocksToDb(const TSK_POOL_INFO * pool_info, int64_t poolObjId) {
     /* Only APFS pools are currently supported */
     if (pool_info->ctype != TSK_POOL_TYPE_APFS) {
         return TSK_FILTER_CONT;
     }
 
+    TSK_FS_ATTR_RUN * unalloc_runs = tsk_pool_unallocated_runs(pool_info);
+    TSK_FS_ATTR_RUN * current_run = unalloc_runs;
+    vector<TSK_DB_FILE_LAYOUT_RANGE> ranges;
+    while (current_run != NULL) {
+
+        TSK_DB_FILE_LAYOUT_RANGE tempRange(current_run->addr * pool_info->block_size, current_run->len * pool_info->block_size, 0);
+        
+        ranges.push_back(tempRange);
+        int64_t fileObjId = 0;
+        if (m_db->addUnallocBlockFile(poolObjId, NULL, current_run->len * pool_info->block_size, ranges, fileObjId, m_curImgId)) {
+            registerError();
+            tsk_fs_attr_run_free(unalloc_runs);
+            return TSK_FILTER_STOP;
+        }
+
+        current_run = current_run->next;
+        ranges.clear();
+    }
+    tsk_fs_attr_run_free(unalloc_runs);
 
+    return TSK_FILTER_CONT;
 }
 
 TSK_FILTER_ENUM
diff --git a/tsk/auto/db_postgresql.cpp b/tsk/auto/db_postgresql.cpp
index af07656dc8bb5a61ab730ab24a730907ef08e4a0..486c6f9c492aa2e53830a3054cfea6aeadb2cf54 100755
--- a/tsk/auto/db_postgresql.cpp
+++ b/tsk/auto/db_postgresql.cpp
@@ -1012,13 +1012,23 @@ int TskDbPostgreSQL::addImageName(int64_t objId, char const *imgName, int sequen
     return ret;
 }
 
+/**
+* Creates a new tsk_pool_info database entry and a new tsk_vs_info
+* entry with the tsk_pool_info as its parent.
+*
+* @ param pool_info The pool to save to the database
+* @ param parObjId The ID of the parent of the pool object
+* @ param poolObjId Will be set to the object ID of the new pool
+* @ param vsObjId Will be set to the object ID of the new volume system created as a child of
+*               the new pool.
+* @returns 1 on error, 0 on success
+*/
 int
-TskDbPostgreSQL::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& objId) {
+TskDbPostgreSQL::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& poolObjId, int64_t& vsObjId) {
 
     char stmt[1024];
 
     // Add pool
-    int64_t poolObjId;
     if (addObject(TSK_DB_OBJECT_TYPE_POOL, parObjId, poolObjId))
         return 1;
 
@@ -1032,11 +1042,11 @@ TskDbPostgreSQL::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObj
     }
 
     // Add volume system
-    if (addObject(TSK_DB_OBJECT_TYPE_VS, poolObjId, objId))
+    if (addObject(TSK_DB_OBJECT_TYPE_VS, poolObjId, vsObjId))
         return 1;
 
     snprintf(stmt, 1024,
-        "INSERT INTO tsk_vs_info (obj_id, vs_type, img_offset, block_size) VALUES (%" PRId64 ", %d,%" PRIuDADDR ",%d)", objId, TSK_VS_TYPE_APFS, pool_info->img_offset, pool_info->block_size);
+        "INSERT INTO tsk_vs_info (obj_id, vs_type, img_offset, block_size) VALUES (%" PRId64 ", %d,%" PRIuDADDR ",%d)", vsObjId, TSK_VS_TYPE_APFS, pool_info->img_offset, pool_info->block_size);
 
     return attempt_exec(stmt,
         "Error adding data to tsk_vs_info table: %s\n");
diff --git a/tsk/auto/db_sqlite.cpp b/tsk/auto/db_sqlite.cpp
index f2c61826d1d68c467a4ba8bf3585936d00a700fb..72c79655d09d8fbecb3f134edaf2f465428a4f96 100644
--- a/tsk/auto/db_sqlite.cpp
+++ b/tsk/auto/db_sqlite.cpp
@@ -754,23 +754,23 @@ TskDbSqlite::addVsInfo(const TSK_VS_INFO* vs_info, int64_t parObjId,
 }
 
 /**
-* Creats a new tsk_pool_info database entry and a new tsk_vs_info 
+* Creates a new tsk_pool_info database entry and a new tsk_vs_info 
 * entry with the tsk_pool_info as its parent.
 *
 * @ param pool_info The pool to save to the database
 * @ param parObjId The ID of the parent of the pool object
-* @ param objId Will be set to the object ID of the new volume system created as a child of 
+* @ param poolObjId Will be set to the object ID of the new pool
+* @ param vsObjId Will be set to the object ID of the new volume system created as a child of 
 *               the new pool.
 * @returns 1 on error, 0 on success
 */
 int
-TskDbSqlite::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& objId) {
+TskDbSqlite::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& poolObjId, int64_t& vsObjId) {
 
     char
         stmt[1024];
 
     // Add pool
-    int64_t poolObjId;
     if (addObject(TSK_DB_OBJECT_TYPE_POOL, parObjId, poolObjId))
         return 1;
 
@@ -784,11 +784,11 @@ TskDbSqlite::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId,
     }
 
     // Add volume system
-    if (addObject(TSK_DB_OBJECT_TYPE_VS, poolObjId, objId))
+    if (addObject(TSK_DB_OBJECT_TYPE_VS, poolObjId, vsObjId))
         return 1;
 
     snprintf(stmt, 1024,
-        "INSERT INTO tsk_vs_info (obj_id, vs_type, img_offset, block_size) VALUES (%" PRId64 ", %d,%" PRIuDADDR ",%d)", objId, TSK_VS_TYPE_APFS, pool_info->img_offset, pool_info->block_size); // TODO - offset
+        "INSERT INTO tsk_vs_info (obj_id, vs_type, img_offset, block_size) VALUES (%" PRId64 ", %d,%" PRIuDADDR ",%d)", vsObjId, TSK_VS_TYPE_APFS, pool_info->img_offset, pool_info->block_size); // TODO - offset
 
     return attempt_exec(stmt,
         "Error adding data to tsk_vs_info table: %s\n");
diff --git a/tsk/auto/tsk_case_db.h b/tsk/auto/tsk_case_db.h
index d8750f6153897c35eb6ba9eceab8e0ec659d58df..25df18e0956e3f91bb67d58d1c2d4bfebf042405 100644
--- a/tsk/auto/tsk_case_db.h
+++ b/tsk/auto/tsk_case_db.h
@@ -186,7 +186,7 @@ class TskAutoDb:public TskAuto {
         TSK_OFF_T offset, TSK_DADDR_T addr, char *buf, size_t size,
         TSK_FS_BLOCK_FLAG_ENUM a_flags, void *ptr);
     int md5HashAttr(unsigned char md5Hash[16], const TSK_FS_ATTR * fs_attr);
-    TSK_FILTER_ENUM addUnallocatedPoolBlocks(const TSK_POOL_INFO * pool_info);
+    TSK_FILTER_ENUM addUnallocatedPoolBlocksToDb(const TSK_POOL_INFO * pool_info, int64_t poolObjId);
 
     static TSK_WALK_RET_ENUM fsWalkUnallocBlocksCb(const TSK_FS_BLOCK *a_block, void *a_ptr);
     TSK_RETVAL_ENUM addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo);
diff --git a/tsk/auto/tsk_db.h b/tsk/auto/tsk_db.h
index 291f0c30c821b66fc53deff128af666987e9d4d7..770aa9e4800c25977c7a4c13c1d66caf679ab029 100755
--- a/tsk/auto/tsk_db.h
+++ b/tsk/auto/tsk_db.h
@@ -180,7 +180,7 @@ class TskDb {
     virtual int addImageName(int64_t objId, char const *imgName, int sequence) = 0;
     virtual int addVsInfo(const TSK_VS_INFO * vs_info, int64_t parObjId, int64_t & objId) = 0;
     virtual int addVolumeInfo(const TSK_VS_PART_INFO * vs_part, int64_t parObjId, int64_t & objId) = 0;
-    virtual int addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& objId) = 0;
+    virtual int addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& poolObjId, int64_t& vsObjId) = 0;
     virtual int addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol,
         int64_t parObjId, int64_t& objId) = 0;
     virtual int addFsInfo(const TSK_FS_INFO * fs_info, int64_t parObjId, int64_t & objId) = 0;
diff --git a/tsk/auto/tsk_db_postgresql.h b/tsk/auto/tsk_db_postgresql.h
index 873b142babca2158d569deeb9c580a089da15d79..fcc3c620def43d1e62b6fbb38ea4444dee879d6f 100755
--- a/tsk/auto/tsk_db_postgresql.h
+++ b/tsk/auto/tsk_db_postgresql.h
@@ -58,7 +58,7 @@ class TskDbPostgreSQL : public TskDb {
         int64_t & objId);
     int addFsInfo(const TSK_FS_INFO * fs_info, int64_t parObjId,
         int64_t & objId);
-    int addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& objId);
+    int addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& poolObjId, int64_t& vsObjId);
     int addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol,
         int64_t parObjId, int64_t& objId);
     int addFsFile(TSK_FS_FILE * fs_file, const TSK_FS_ATTR * fs_attr,
diff --git a/tsk/auto/tsk_db_sqlite.h b/tsk/auto/tsk_db_sqlite.h
index 7fa3abae9a08da0c338145d9b6ce865a174720e6..f0aec6536e16e6acae434ce709c9d4d57159b631 100755
--- a/tsk/auto/tsk_db_sqlite.h
+++ b/tsk/auto/tsk_db_sqlite.h
@@ -50,7 +50,7 @@ class TskDbSqlite : public TskDb {
     int addImageName(int64_t objId, char const *imgName, int sequence);
     int addVsInfo(const TSK_VS_INFO * vs_info, int64_t parObjId,
         int64_t & objId);
-    int addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& objId);
+    int addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, int64_t& poolObjId, int64_t& vsObjId);
     int addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol,
         int64_t parObjId, int64_t& objId);
     int addVolumeInfo(const TSK_VS_PART_INFO * vs_part, int64_t parObjId,
diff --git a/tsk/pool/pool_read.cpp b/tsk/pool/pool_read.cpp
index 1c565ffaedc90352dea59c3cfaa359c591c82c5f..abe531885f9af739601d915895ffd63de7eafb64 100755
--- a/tsk/pool/pool_read.cpp
+++ b/tsk/pool/pool_read.cpp
@@ -21,8 +21,14 @@ TSK_FS_ATTR_RUN *tsk_pool_unallocated_runs(const TSK_POOL_INFO *a_pool) {
 
   TSK_DADDR_T offset = 0;
 
+  int count = 0;
+  printf("Pool block size: %lld\n", pool->block_size());
   // Create the runs
   for (const auto &range : ranges) {
+      count++;
+      if (count < 10) {
+          printf("Range start block: %lld, num blocks; %lld\n", range.start_block, range.num_blocks);
+      }
     auto data_run = tsk_fs_attr_run_alloc();
     if (data_run == nullptr) {
       tsk_fs_attr_run_free(data_run_head);
@@ -34,6 +40,9 @@ TSK_FS_ATTR_RUN *tsk_pool_unallocated_runs(const TSK_POOL_INFO *a_pool) {
     data_run->len = range.num_blocks;
     data_run->flags = TSK_FS_ATTR_RUN_FLAG_NONE;
     data_run->next = nullptr;
+    if (count < 10) {
+        printf("Run addr: %lld, offset: %lld, len: %lld\n\n", data_run->addr, data_run->offset, data_run->len);
+    }
 
     offset += range.num_blocks;