diff --git a/CHANGES.txt b/CHANGES.txt
index e5c1cb4d2f8ea1419db03ea3e75af4b7d700d2bd..4c4268ed8a53ba3c70734d65551be183eceaea6d 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -77,6 +77,9 @@ attributes.  Patch by Jamie Butler.
 4/21/09: Bug Fix. Fixed issue 2777633 re: missing second resolution on FAT
 creation times.  Reported by Eoghan Casey.
 
+4/21/09: Bug Fix: Fixed issue 2706862 re: default assignment of HFS
+permissions and type.  Patch by Rob Joyce.
+
 ---------------- VERSION 3.0.0 -------------- 
 0/00/00: Update: Many, many, many API changes.
 
diff --git a/tsk3/fs/hfs.c b/tsk3/fs/hfs.c
index a8fa3f4705d17760327910f7d89602aae76da93e..957123e294d668214ffeab28e314da87a42e49f8 100644
--- a/tsk3/fs/hfs.c
+++ b/tsk3/fs/hfs.c
@@ -1727,6 +1727,7 @@ hfs_dinode_copy(HFS_INFO * a_hfs, const hfs_file_folder * a_entry,
 {
     const hfs_file_fold_std *std;
     TSK_FS_INFO *fs = (TSK_FS_INFO *) & a_hfs->fs_info;
+    uint16_t hfsmode;
 
     if (a_fs_meta == NULL) {
         tsk_errno = TSK_ERR_FS_ARG;
@@ -1758,12 +1759,20 @@ hfs_dinode_copy(HFS_INFO * a_hfs, const hfs_file_folder * a_entry,
     /* 
      * Copy the file type specific stuff first 
      */
+    hfsmode = tsk_getu16(fs->endian, std->perm.mode);
+
     if (tsk_getu16(fs->endian, std->rec_type) == HFS_FOLDER_RECORD) {
+        // set the type of mode is not set
+        if ((hfsmode & HFS_IN_IFMT) == 0)
+            a_fs_meta->type = TSK_FS_META_TYPE_DIR;
         a_fs_meta->size = 0;
         memset(a_fs_meta->content_ptr, 0, HFS_FILE_CONTENT_LEN);
     }
     else if (tsk_getu16(fs->endian, std->rec_type) == HFS_FILE_RECORD) {
         hfs_fork *fork;
+        // set the type of mode is not set
+        if ((hfsmode & HFS_IN_IFMT) == 0)
+            a_fs_meta->type = TSK_FS_META_TYPE_REG;
         a_fs_meta->size =
             tsk_getu64(fs->endian, a_entry->file.data.logic_sz);
 
@@ -1779,15 +1788,21 @@ hfs_dinode_copy(HFS_INFO * a_hfs, const hfs_file_folder * a_entry,
     }
 
     /*
-     * Copy the standard stuff 
+     * Copy the standard stuff.  
+     * Use default values (as defined in spec) if mode is not defined.
      */
-    a_fs_meta->mode =
-        hfsmode2tskmode(tsk_getu16(fs->endian, std->perm.mode));
-    a_fs_meta->type =
-        hfsmode2tskmetatype(tsk_getu16(fs->endian, std->perm.mode));
+    if ((hfsmode & HFS_IN_IFMT) == 0) {
+        a_fs_meta->mode = 0;
+        a_fs_meta->uid = 99;
+        a_fs_meta->gid = 99;
+    }
+    else {
+        a_fs_meta->mode = hfsmode2tskmode(hfsmode);
+        a_fs_meta->type = hfsmode2tskmetatype(hfsmode);
+        a_fs_meta->uid = tsk_getu32(fs->endian, std->perm.owner);
+        a_fs_meta->gid = tsk_getu32(fs->endian, std->perm.group);
+    }
 
-    a_fs_meta->uid = tsk_getu32(fs->endian, std->perm.owner);
-    a_fs_meta->gid = tsk_getu32(fs->endian, std->perm.group);
     // this field is set only for "indirect" entries
     if (tsk_getu32(fs->endian, std->perm.special.nlink))
         a_fs_meta->nlink = tsk_getu32(fs->endian, std->perm.special.nlink);