diff --git a/tsk/auto/auto.cpp b/tsk/auto/auto.cpp
index ce95297129d4eaf6e98b933303b290c745b62788..af43d445a4c3f7c1bb07278f2a4fe9e133afd22a 100644
--- a/tsk/auto/auto.cpp
+++ b/tsk/auto/auto.cpp
@@ -255,9 +255,8 @@ TSK_WALK_RET_ENUM
         return TSK_WALK_STOP;    
 
     // process it
-    TSK_RETVAL_ENUM retval2 =
-        tsk->findFilesInFsRet(a_vs_part->start *
-        a_vs_part->vs->block_size, TSK_FS_TYPE_DETECT);
+    TSK_RETVAL_ENUM retval2 = tsk->findFilesInFsRet(
+        a_vs_part->start * a_vs_part->vs->block_size, TSK_FS_TYPE_DETECT);
     if ((retval2 == TSK_STOP) || (tsk->getStopProcessing())) {
         return TSK_WALK_STOP;
     }
@@ -360,8 +359,10 @@ TSK_RETVAL_ENUM
             return TSK_ERR;
         }
         else if (getCurVsPartFlag() & TSK_VS_PART_FLAG_ALLOC) {
-            tsk_error_set_errstr2 ("Sector offset: %" PRIuOFF ", Partition Type: %s",
-                a_start/512, getCurVsPartDescr().c_str() );
+            tsk_error_set_errstr2 (
+                "Sector offset: %" PRIuOFF ", Partition Type: %s",
+                a_start/512, getCurVsPartDescr().c_str()
+            );
             registerError();
             return TSK_ERR;
         }
diff --git a/tsk/fs/ffs.c b/tsk/fs/ffs.c
index 5b7116c512bf11611f550370b07c2b3546b8d1fc..df48ccb2ac3e7ba03b668d36762dfbd53f348cc8 100644
--- a/tsk/fs/ffs.c
+++ b/tsk/fs/ffs.c
@@ -1980,7 +1980,7 @@ ffs_close(TSK_FS_INFO * fs)
  * @returns NULL on error or if data is not a FFS file system
  */
 TSK_FS_INFO *
-ffs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, TSK_FS_TYPE_ENUM ftype)
+ffs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, TSK_FS_TYPE_ENUM ftype, uint8_t test)
 {
     char *myname = "ffs_open";
     FFS_INFO *ffs;
diff --git a/tsk/fs/fs_open.c b/tsk/fs/fs_open.c
index f59344332e6994c8bab7bcceadc73b84dacb240e..056683a51d8e80db9751164dc79a3d5c11a931a6 100644
--- a/tsk/fs/fs_open.c
+++ b/tsk/fs/fs_open.c
@@ -94,151 +94,64 @@ tsk_fs_open_img(TSK_IMG_INFO * a_img_info, TSK_OFF_T a_offset,
      * We need to try all of them in case more than one matches
      */
     if (a_ftype == TSK_FS_TYPE_DETECT) {
-        TSK_FS_INFO *fs_info, *fs_set = NULL;
-        char *set = NULL;
+        TSK_FS_INFO *fs_info, *fs_first = NULL;
+        const char *name_first;
 
         if (tsk_verbose)
             tsk_fprintf(stderr,
                 "fsopen: Auto detection mode at offset %" PRIuOFF "\n",
                 a_offset);
 
-        if ((fs_info =
-                ntfs_open(a_img_info, a_offset, TSK_FS_TYPE_NTFS_DETECT,
-                    1)) != NULL) {
-            set = "NTFS";
-            fs_set = fs_info;
-        }
-        else {
-            tsk_error_reset();
-        }
-
-        if ((fs_info =
-                fatfs_open(a_img_info, a_offset, TSK_FS_TYPE_FAT_DETECT,
-                    1)) != NULL) {
-            if (set == NULL) {
-                set = "FAT";
-                fs_set = fs_info;
-            }
-            else {
-                fs_set->close(fs_set);
-                fs_info->close(fs_info);
-                tsk_error_reset();
-                tsk_error_set_errno(TSK_ERR_FS_UNKTYPE);
-                tsk_error_set_errstr("FAT or %s", set);
-                return NULL;
-            }
-        }
-        else {
-            tsk_error_reset();
-        }
-
-        if ((fs_info =
-                ext2fs_open(a_img_info, a_offset, TSK_FS_TYPE_EXT_DETECT,
-                    1)) != NULL) {
-            if (set == NULL) {
-                set = "EXT2/3";
-                fs_set = fs_info;
-            }
-            else {
-                fs_set->close(fs_set);
-                fs_info->close(fs_info);
-                tsk_error_reset();
-                tsk_error_set_errno(TSK_ERR_FS_UNKTYPE);
-                tsk_error_set_errstr("EXT2/3 or %s", set);
-                return NULL;
-            }
-        }
-        else {
-            tsk_error_reset();
-        }
-
-        if ((fs_info =
-                ffs_open(a_img_info, a_offset,
-                    TSK_FS_TYPE_FFS_DETECT)) != NULL) {
-            if (set == NULL) {
-                set = "UFS";
-                fs_set = fs_info;
-            }
-            else {
-                fs_set->close(fs_set);
-                fs_info->close(fs_info);
-                tsk_error_reset();
-                tsk_error_set_errno(TSK_ERR_FS_UNKTYPE);
-                tsk_error_set_errstr("UFS or %s", set);
-                return NULL;
-            }
-        }
-        else {
-            tsk_error_reset();
-        }
-
-        if ((fs_info =
-                yaffs2_open(a_img_info, a_offset,
-                    TSK_FS_TYPE_YAFFS2_DETECT, 1)) != NULL) {
-            if (set == NULL) {
-                set = "YAFFS2";
-                fs_set = fs_info;
-            }
-            else {
-                fs_set->close(fs_set);
-                fs_info->close(fs_info);
-                tsk_error_reset();
-                tsk_error_set_errno(TSK_ERR_FS_UNKTYPE);
-                tsk_error_set_errstr("YAFFS2 or %s", set);
-                return NULL;
-            }
-        }
-        else {
-            tsk_error_reset();
-        }
-
-
+        const struct {
+            char* name;
+            TSK_FS_INFO* (*open)(TSK_IMG_INFO*, TSK_OFF_T,
+                                 TSK_FS_TYPE_ENUM, uint8_t);
+            TSK_FS_TYPE_ENUM type;
+        } FS_OPENERS[] = {
+            { "NTFS",     ntfs_open,    TSK_FS_TYPE_NTFS_DETECT    },
+            { "FAT",      fatfs_open,   TSK_FS_TYPE_FAT_DETECT     },
+            { "EXT2/3/4", ext2fs_open,  TSK_FS_TYPE_EXT_DETECT     },
+            { "UFS",      ffs_open,     TSK_FS_TYPE_FFS_DETECT     },
+            { "YAFFS2",   yaffs2_open,  TSK_FS_TYPE_YAFFS2_DETECT  },
 #if TSK_USE_HFS
-        if ((fs_info =
-                hfs_open(a_img_info, a_offset, TSK_FS_TYPE_HFS_DETECT,
-                    1)) != NULL) {
-            if (set == NULL) {
-                set = "HFS";
-                fs_set = fs_info;
+            { "HFS",      hfs_open,     TSK_FS_TYPE_HFS_DETECT     },
+#endif
+            { "ISO9660",  iso9660_open, TSK_FS_TYPE_ISO9660_DETECT }
+        };
+
+        for (int i = 0; i < sizeof(FS_OPENERS)/sizeof(FS_OPENERS[0]); ++i) {
+            if ((fs_info = FS_OPENERS[i].open(
+                    a_img_info, a_offset, FS_OPENERS[i].type, 1)) != NULL) {
+                // fs opens as type i
+                if (fs_first == NULL) {
+                    // first success opening fs
+                    name_first = FS_OPENERS[i].name;
+                    fs_first = fs_info;
+                }
+                else {
+                    // second success opening fs, which means we
+                    // cannot autodetect the fs type and must give up
+                    fs_first->close(fs_first);
+                    fs_info->close(fs_info);
+                    tsk_error_reset();
+                    tsk_error_set_errno(TSK_ERR_FS_UNKTYPE);
+                    tsk_error_set_errstr(
+                        "%s or %s", FS_OPENERS[i].name, name_first);
+                    return NULL;
+                }
             }
             else {
-                fs_set->close(fs_set);
-                fs_info->close(fs_info);
+                // fs does not open as type i
                 tsk_error_reset();
-                tsk_error_set_errno(TSK_ERR_FS_UNKTYPE);
-                tsk_error_set_errstr("HFS or %s", set);
-                return NULL;
             }
         }
-        else {
-            tsk_error_reset();
-        }
-#endif
-
-        if ((fs_info =
-                iso9660_open(a_img_info, a_offset,
-                    TSK_FS_TYPE_ISO9660_DETECT, 1)) != NULL) {
-            if (set != NULL) {
-                fs_set->close(fs_set);
-                fs_info->close(fs_info);
-                tsk_error_reset();
-                tsk_error_set_errno(TSK_ERR_FS_UNKTYPE);
-                tsk_error_set_errstr("ISO9660 or %s", set);
-                return NULL;
-            }
-            fs_set = fs_info;
-        }
-        else {
-            tsk_error_reset();
-        }
 
-
-        if (fs_set == NULL) {
+        if (fs_first == NULL) {
             tsk_error_reset();
             tsk_error_set_errno(TSK_ERR_FS_UNKTYPE);
-            return NULL;
         }
-        return fs_set;
+
+        return fs_first;
     }
     else {
         if (TSK_FS_TYPE_ISNTFS(a_ftype))
@@ -246,7 +159,7 @@ tsk_fs_open_img(TSK_IMG_INFO * a_img_info, TSK_OFF_T a_offset,
         else if (TSK_FS_TYPE_ISFAT(a_ftype))
             return fatfs_open(a_img_info, a_offset, a_ftype, 0);
         else if (TSK_FS_TYPE_ISFFS(a_ftype))
-            return ffs_open(a_img_info, a_offset, a_ftype);
+            return ffs_open(a_img_info, a_offset, a_ftype, 0);
         else if (TSK_FS_TYPE_ISEXT(a_ftype))
             return ext2fs_open(a_img_info, a_offset, a_ftype, 0);
         else if (TSK_FS_TYPE_ISHFS(a_ftype))
diff --git a/tsk/fs/tsk_fs_i.h b/tsk/fs/tsk_fs_i.h
index c0c4faa2822af03b82186e03fe733629014ffcd7..43609ab068203951dc4c97bd0e796847e388decf 100644
--- a/tsk/fs/tsk_fs_i.h
+++ b/tsk/fs/tsk_fs_i.h
@@ -187,7 +187,7 @@ extern "C" {
     extern TSK_FS_INFO *fatfs_open(TSK_IMG_INFO *, TSK_OFF_T,
         TSK_FS_TYPE_ENUM, uint8_t);
     extern TSK_FS_INFO *ffs_open(TSK_IMG_INFO *, TSK_OFF_T,
-        TSK_FS_TYPE_ENUM);
+        TSK_FS_TYPE_ENUM, uint8_t);
     extern TSK_FS_INFO *ntfs_open(TSK_IMG_INFO *, TSK_OFF_T,
         TSK_FS_TYPE_ENUM, uint8_t);
     extern TSK_FS_INFO *rawfs_open(TSK_IMG_INFO *, TSK_OFF_T);
diff --git a/tsk/vs/mm_part.c b/tsk/vs/mm_part.c
index cb65ea6a294e080b7128f24582c5e6a61acf17c4..6ee01dc4c3d42cff1e2528c2c6cc32b3b690cb2b 100644
--- a/tsk/vs/mm_part.c
+++ b/tsk/vs/mm_part.c
@@ -272,13 +272,9 @@ tsk_vs_part_walk(TSK_VS_INFO * a_vs, TSK_PNUM_T a_start, TSK_PNUM_T a_last,
 
     for (part = a_vs->part_list; part != NULL; part = part->next) {
         if ((part->addr >= a_start) && ((part->flags & a_flags) != 0)) {
-            int retval;
-            retval = a_action(a_vs, part, a_ptr);
-            if (retval == TSK_WALK_STOP) {
-                return 0;
-            }
-            else if (retval == TSK_WALK_ERROR) {
-                return 1;
+            switch (a_action(a_vs, part, a_ptr)) {
+            case TSK_WALK_STOP:   return 0;
+            case TSK_WALK_ERROR:  return 1;
             }
         }