diff --git a/mem/dir.go b/mem/dir.go
index d7b7bdf..e104013 100644
--- a/mem/dir.go
+++ b/mem/dir.go
@@ -16,22 +16,22 @@
 type Dir interface {
 	Len() int
 	Names() []string
-	Files() []*File
-	Add(*File)
-	Remove(*File)
+	Files() []*FileData
+	Add(*FileData)
+	Remove(*FileData)
 }
 
-func RemoveFromMemDir(dir *File, f *File) {
-	dir.fileData.memDir.Remove(f)
+func RemoveFromMemDir(dir *FileData, f *FileData) {
+	dir.memDir.Remove(f)
 }
 
-func AddToMemDir(dir *File, f *File) {
-	dir.fileData.memDir.Add(f)
+func AddToMemDir(dir *FileData, f *FileData) {
+	dir.memDir.Add(f)
 }
 
-func InitializeDir(d *File) {
-	if d.fileData.memDir == nil {
-		d.fileData.dir = true
-		d.fileData.memDir = &DirMap{}
+func InitializeDir(d *FileData) {
+	if d.memDir == nil {
+		d.dir = true
+		d.memDir = &DirMap{}
 	}
 }
diff --git a/mem/dirmap.go b/mem/dirmap.go
index f18718c..03a57ee 100644
--- a/mem/dirmap.go
+++ b/mem/dirmap.go
@@ -17,23 +17,23 @@
 
 type DirMap map[string]*FileData
 
-func (m DirMap) Len() int       { return len(m) }
-func (m DirMap) Add(f *File)    { m[f.fileData.name] = f.fileData }
-func (m DirMap) Remove(f *File) { delete(m, f.fileData.name) }
-func (m DirMap) Files() (files []*File) {
+func (m DirMap) Len() int           { return len(m) }
+func (m DirMap) Add(f *FileData)    { m[f.name] = f }
+func (m DirMap) Remove(f *FileData) { delete(m, f.name) }
+func (m DirMap) Files() (files []*FileData) {
 	for _, f := range m {
-		files = append(files, NewFileHandle(f))
+		files = append(files, f)
 	}
 	sort.Sort(filesSorter(files))
 	return files
 }
 
-type filesSorter []*File
+// implement sort.Interface for []*FileData
+type filesSorter []*FileData
 
-// implement sort.Interface for []File
 func (s filesSorter) Len() int           { return len(s) }
 func (s filesSorter) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
-func (s filesSorter) Less(i, j int) bool { return s[i].fileData.name < s[j].fileData.name }
+func (s filesSorter) Less(i, j int) bool { return s[i].name < s[j].name }
 
 func (m DirMap) Names() (names []string) {
 	for x := range m {
diff --git a/mem/file.go b/mem/file.go
index 16f13a0..2ac9d3f 100644
--- a/mem/file.go
+++ b/mem/file.go
@@ -54,6 +54,10 @@
 	modtime time.Time
 }
 
+func (d FileData) Name() string {
+	return d.name
+}
+
 func CreateFile(name string) *FileData {
 	return &FileData{name: name, mode: os.ModeTemporary, modtime: time.Now()}
 }
@@ -128,7 +132,7 @@
 
 	res = make([]os.FileInfo, outLength)
 	for i := range res {
-		res[i] = &FileInfo{files[i].fileData}
+		res[i] = &FileInfo{files[i]}
 	}
 
 	return res, err
diff --git a/memmap.go b/memmap.go
index c8ab75a..7e5536d 100644
--- a/memmap.go
+++ b/memmap.go
@@ -50,11 +50,9 @@
 	m.mu.Lock()
 	file := mem.CreateFile(name)
 	m.getData()[name] = file
-
-	handle := mem.NewFileHandle(file)
-	m.registerWithParent(handle)
+	m.registerWithParent(file)
 	m.mu.Unlock()
-	return handle, nil
+	return mem.NewFileHandle(file), nil
 }
 
 func (m *MemMapFs) unRegisterWithParent(fileName string) error {
@@ -66,7 +64,7 @@
 	if parent == nil {
 		log.Fatal("parent of ", f.Name(), " is nil")
 	}
-	mem.RemoveFromMemDir(parent, f)
+	mem.RemoveFromMemDir(parent.Data(), f.Data())
 	return nil
 }
 
@@ -80,11 +78,11 @@
 	return pfile
 }
 
-func (m *MemMapFs) registerWithParent(f *mem.File) {
+func (m *MemMapFs) registerWithParent(f *mem.FileData) {
 	if f == nil {
 		return
 	}
-	parent := m.findParent(f)
+	parent := m.findParent(mem.NewFileHandle(f))
 	if parent == nil {
 		pdir := filepath.Dir(filepath.Clean(f.Name()))
 		err := m.lockfreeMkdir(pdir, 0777)
@@ -99,8 +97,8 @@
 		}
 	}
 
-	mem.InitializeDir(parent)
-	mem.AddToMemDir(parent, f)
+	mem.InitializeDir(parent.Data())
+	mem.AddToMemDir(parent.Data(), f)
 }
 
 func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
@@ -118,7 +116,7 @@
 	} else {
 		item := mem.CreateDir(name)
 		m.getData()[name] = item
-		m.registerWithParent(mem.NewFileHandle(item))
+		m.registerWithParent(item)
 	}
 	return nil
 }
@@ -135,7 +133,7 @@
 		m.mu.Lock()
 		item := mem.CreateDir(name)
 		m.getData()[name] = item
-		m.registerWithParent(mem.NewFileHandle(item))
+		m.registerWithParent(item)
 		m.mu.Unlock()
 	}
 	return nil
@@ -274,11 +272,10 @@
 			m.mu.Lock()
 			m.unRegisterWithParent(oldname)
 			fileData := m.getData()[oldname]
-			file := mem.NewFileHandle(fileData)
 			delete(m.getData(), oldname)
-			mem.ChangeFileName(file, newname)
+			mem.ChangeFileName(mem.NewFileHandle(fileData), newname)
 			m.getData()[newname] = fileData
-			m.registerWithParent(file)
+			m.registerWithParent(fileData)
 			m.mu.Unlock()
 			m.mu.RLock()
 		} else {
