diff --git a/mem/file.go b/mem/file.go
index 2ac9d3f..e92d943 100644
--- a/mem/file.go
+++ b/mem/file.go
@@ -66,20 +66,20 @@
 	return &FileData{name: name, memDir: &DirMap{}, dir: true}
 }
 
-func ChangeFileName(f *File, newname string) {
-	f.fileData.name = newname
+func ChangeFileName(f *FileData, newname string) {
+	f.name = newname
 }
 
-func SetMode(f *File, mode os.FileMode) {
-	f.fileData.mode = mode
+func SetMode(f *FileData, mode os.FileMode) {
+	f.mode = mode
 }
 
-func SetModTime(f *File, mtime time.Time) {
-	f.fileData.modtime = mtime
+func SetModTime(f *FileData, mtime time.Time) {
+	f.modtime = mtime
 }
 
-func GetFileInfo(f *File) *FileInfo {
-	return &FileInfo{f.fileData}
+func GetFileInfo(f *FileData) *FileInfo {
+	return &FileInfo{f}
 }
 
 func (f *File) Open() error {
diff --git a/memmap.go b/memmap.go
index 7e5536d..2c1ba39 100644
--- a/memmap.go
+++ b/memmap.go
@@ -64,11 +64,11 @@
 	if parent == nil {
 		log.Fatal("parent of ", f.Name(), " is nil")
 	}
-	mem.RemoveFromMemDir(parent.Data(), f.Data())
+	mem.RemoveFromMemDir(parent, f)
 	return nil
 }
 
-func (m *MemMapFs) findParent(f *mem.File) *mem.File {
+func (m *MemMapFs) findParent(f *mem.FileData) *mem.FileData {
 	pdir, _ := filepath.Split(f.Name())
 	pdir = filepath.Clean(pdir)
 	pfile, err := m.lockfreeOpen(pdir)
@@ -82,7 +82,7 @@
 	if f == nil {
 		return
 	}
-	parent := m.findParent(mem.NewFileHandle(f))
+	parent := m.findParent(f)
 	if parent == nil {
 		pdir := filepath.Dir(filepath.Clean(f.Name()))
 		err := m.lockfreeMkdir(pdir, 0777)
@@ -97,8 +97,8 @@
 		}
 	}
 
-	mem.InitializeDir(parent.Data())
-	mem.AddToMemDir(parent.Data(), f)
+	mem.InitializeDir(parent)
+	mem.AddToMemDir(parent, f)
 }
 
 func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
@@ -106,13 +106,10 @@
 	x, ok := m.getData()[name]
 	if ok {
 		// Only return ErrFileExists if it's a file, not a directory.
-		i, err := mem.NewFileHandle(x).Stat()
+		i := mem.FileInfo{x}
 		if !i.IsDir() {
 			return ErrFileExists
 		}
-		if err != nil {
-			return err
-		}
 	} else {
 		item := mem.CreateDir(name)
 		m.getData()[name] = item
@@ -174,19 +171,14 @@
 	if !ok {
 		return nil, &os.PathError{"open", name, ErrFileNotFound}
 	}
-	ff := mem.NewFileHandle(f)
-	ff.Open()
-	return ff, nil
+	return mem.NewFileHandle(f), nil
 }
 
-func (m *MemMapFs) lockfreeOpen(name string) (*mem.File, error) {
+func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) {
 	name = normalizePath(name)
 	f, ok := m.getData()[name]
 	if ok {
-		// TODO (mbertschler)
-		// not used anymore?
-		//ff.Open()
-		return mem.NewFileHandle(f), nil
+		return f, nil
 	} else {
 		return nil, ErrFileNotFound
 	}
@@ -273,7 +265,7 @@
 			m.unRegisterWithParent(oldname)
 			fileData := m.getData()[oldname]
 			delete(m.getData(), oldname)
-			mem.ChangeFileName(mem.NewFileHandle(fileData), newname)
+			mem.ChangeFileName(fileData, newname)
 			m.getData()[newname] = fileData
 			m.registerWithParent(fileData)
 			m.mu.Unlock()
@@ -292,7 +284,7 @@
 	if err != nil {
 		return nil, err
 	}
-	fi := mem.GetFileInfo(f.(*mem.File))
+	fi := mem.GetFileInfo(f.(*mem.File).Data())
 	return fi, nil
 }
 
@@ -303,9 +295,8 @@
 		return &os.PathError{"chmod", name, ErrFileNotFound}
 	}
 
-	ff := mem.NewFileHandle(f)
 	m.mu.Lock()
-	mem.SetMode(ff, mode)
+	mem.SetMode(f, mode)
 	m.mu.Unlock()
 
 	return nil
@@ -318,9 +309,8 @@
 		return &os.PathError{"chtimes", name, ErrFileNotFound}
 	}
 
-	ff := mem.NewFileHandle(f)
 	m.mu.Lock()
-	mem.SetModTime(ff, mtime)
+	mem.SetModTime(f, mtime)
 	m.mu.Unlock()
 
 	return nil
@@ -328,9 +318,8 @@
 
 func (m *MemMapFs) List() {
 	for _, x := range m.data {
-		f := mem.NewFileHandle(x)
-		y, _ := f.Stat()
-		fmt.Println(f.Name(), y.Size())
+		y := mem.FileInfo{x}
+		fmt.Println(x.Name(), y.Size())
 	}
 }
 
