diff --git a/tsk/fs/tsk_xfs.h b/tsk/fs/tsk_xfs.h
index 734029c611525f8adbd63ebeda853082d123ab9b..483a62a3b428f57b697ce121e3578618aec9f519 100644
--- a/tsk/fs/tsk_xfs.h
+++ b/tsk/fs/tsk_xfs.h
@@ -484,6 +484,18 @@ struct xfs_dir3_data_hdr {
     /* uint32_t pad; */
 };
 
+/* Values for ftype */
+#define XFS_DIR3_FT_UNKNOWN     0
+#define XFS_DIR3_FT_REG_FILE    1
+#define XFS_DIR3_FT_DIR         2
+#define XFS_DIR3_FT_CHRDEV      3
+#define XFS_DIR3_FT_BLKDEV      4
+#define XFS_DIR3_FT_FIFO        5
+#define XFS_DIR3_FT_SOCK        6
+#define XFS_DIR3_FT_SYMLINK     7
+#define XFS_DIR3_FT_WHT         8
+#define XFS_DIR3_FT_MAX         9
+
 /*
  * Active entry in a data block.
  *
diff --git a/tsk/fs/xfs.cpp b/tsk/fs/xfs.cpp
index c245eec0c2beb1c87304beb0a943d93d3051cccb..f6f9fcd2ed70053ca472bf786e2bef17549379c8 100644
--- a/tsk/fs/xfs.cpp
+++ b/tsk/fs/xfs.cpp
@@ -446,7 +446,7 @@ xfs_dinode_load(XFSFS_INFO * xfsfs, TSK_INUM_T dino_inum,
 }
 
 static TSK_FS_META_TYPE_ENUM
-get_file_type(uint16_t xfs_ftype)
+get_meta_file_type(uint16_t xfs_ftype)
 {
     switch (xfs_ftype) {
         case XFS_IN_REG:
@@ -468,6 +468,52 @@ get_file_type(uint16_t xfs_ftype)
     }
 }
 
+static TSK_FS_NAME_TYPE_ENUM
+get_fs_name_type(uint16_t xfs_ftype)
+{
+    switch (xfs_ftype) {
+        case XFS_DIR3_FT_REG_FILE:
+            return TSK_FS_NAME_TYPE_REG;
+        case XFS_DIR3_FT_DIR:
+            return TSK_FS_NAME_TYPE_DIR;
+        case XFS_DIR3_FT_SOCK:
+            return TSK_FS_NAME_TYPE_SOCK;
+        case XFS_DIR3_FT_SYMLINK:
+            return TSK_FS_NAME_TYPE_LNK;
+        case XFS_DIR3_FT_BLKDEV:
+            return TSK_FS_NAME_TYPE_BLK;
+        case XFS_DIR3_FT_CHRDEV:
+            return TSK_FS_NAME_TYPE_CHR;
+        case XFS_DIR3_FT_FIFO:
+            return TSK_FS_NAME_TYPE_FIFO;
+        default:
+            return TSK_FS_NAME_TYPE_UNDEF;
+    }
+}
+
+static TSK_FS_NAME_TYPE_ENUM
+get_fs_name_type_from_meta(uint16_t xfs_ftype)
+{
+    switch (xfs_ftype) {
+        case XFS_IN_REG:
+            return TSK_FS_NAME_TYPE_REG;
+        case XFS_IN_DIR:
+            return TSK_FS_NAME_TYPE_DIR;
+        case XFS_IN_SOCK:
+            return TSK_FS_NAME_TYPE_SOCK;
+        case XFS_IN_LNK:
+            return TSK_FS_NAME_TYPE_LNK;
+        case XFS_IN_BLK:
+            return TSK_FS_NAME_TYPE_BLK;
+        case XFS_IN_CHR:
+            return TSK_FS_NAME_TYPE_CHR;
+        case XFS_IN_FIFO:
+            return TSK_FS_NAME_TYPE_FIFO;
+        default:
+            return TSK_FS_NAME_TYPE_UNDEF;
+    }
+}
+
 static TSK_RETVAL_ENUM
 get_inode_file_type(XFSFS_INFO *xfs, TSK_INUM_T meta_addr, uint16_t *xfs_ftype)
 {
@@ -549,7 +595,7 @@ xfs_dinode_copy(XFSFS_INFO * xfsfs, TSK_FS_META * fs_meta,
     }
 
     // set the type
-    fs_meta->type = get_file_type(dino_buf->di_core.di_mode & XFS_IN_FMT);
+    fs_meta->type = get_meta_file_type(dino_buf->di_core.di_mode & XFS_IN_FMT);
 
     // set the mode
     fs_meta->mode = (TSK_FS_META_MODE_ENUM) 0;
@@ -2137,7 +2183,6 @@ parse_dir_block(
                 data_entry.inumber = tsk_getu64(TSK_BIG_ENDIAN, &data_entry.inumber);
                 fs_name->meta_addr = data_entry.inumber;
 
-
                 if (offset_in_block + data_entry.namelen + ftype_size >= limit)
                 {
                     tsk_error_set_errno(TSK_ERR_FS_FWALK);
@@ -2157,7 +2202,7 @@ parse_dir_block(
                 if (ftype_size > 0)
                 {
                     ftype = * (uint8_t *) (name + data_entry.namelen);
-                    ftype = ftype << 12;
+                    fs_name->type = get_fs_name_type(ftype);
                 }
                 else
                 {
@@ -2166,8 +2211,8 @@ parse_dir_block(
                         free(dirbuf);
                         return ret;
                     }
+                    fs_name->type = get_fs_name_type_from_meta(ftype);
                 }
-                fs_meta->type = get_file_type(ftype);
 
                 // we iterate over allocated directories
                 fs_name->flags = TSK_FS_NAME_FLAG_ALLOC;
@@ -2530,7 +2575,7 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
             if (ftype_size > 0)
             {
                 ftype = * (uint8_t *) (name + namelen);
-                ftype = ftype << 12;
+                fs_name->type = get_fs_name_type(ftype);
             }
             else
             {
@@ -2539,8 +2584,8 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                     free(dirbuf);
                     return ret;
                 }
+                fs_name->type = get_fs_name_type_from_meta(ftype);
             }
-            fs_meta->type = get_file_type(ftype);
 
             fs_name->flags = (TSK_FS_NAME_FLAG_ENUM) 0;
 
@@ -2707,7 +2752,7 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                     if (ftype_size > 0)
                     {
                         ftype = * (uint8_t *) (name + data_entry.namelen);
-                        ftype = ftype << 12;
+                        fs_name->type = get_fs_name_type(ftype);
                     }
                     else
                     {
@@ -2716,8 +2761,8 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                             free(dirbuf);
                             return ret;
                         }
+                        fs_name->type = get_fs_name_type_from_meta(ftype);
                     }
-                    fs_meta->type = get_file_type(ftype);
 
                     // we iterate over allocated directories
                     fs_name->flags = TSK_FS_NAME_FLAG_ALLOC;