diff --git a/mem/dir.go b/mem/dir.go
index 02f632e..0767dc9 100644
--- a/mem/dir.go
+++ b/mem/dir.go
@@ -20,19 +20,3 @@
 	Add(File)
 	Remove(File)
 }
-
-func RemoveFromMemDir(dir *File, f *File) {
-	dir.memDir.Remove(*f)
-}
-
-func AddToMemDir(dir *File, f *File) {
-	dir.memDir.Add(*f)
-}
-
-func InitializeDir(d *File) {
-	if d.memDir == nil {
-		d.dir = true
-		d.memDir = &DirMap{}
-	}
-
-}
diff --git a/mem/file.go b/mem/file.go
index 4a652cb..692077a 100644
--- a/mem/file.go
+++ b/mem/file.go
@@ -26,45 +26,24 @@
 
 import "time"
 
-const FilePathSeparator = string(filepath.Separator)
-
 type File struct {
 	// atomic requires 64-bit alignment for struct field access
 	at           int64
 	readDirCount int64
 
+	FileName string
+	MemDir   Dir
+	Dir      bool
+	Mode     os.FileMode
+	Modtime  time.Time
+
 	sync.Mutex
-	name    string
-	data    []byte
-	memDir  Dir
-	dir     bool
-	closed  bool
-	mode    os.FileMode
-	modtime time.Time
+	closed bool
+	data   []byte
 }
 
-func CreateFile(name string) *File {
-	return &File{name: name, mode: os.ModeTemporary, modtime: time.Now()}
-}
-
-func CreateDir(name string) *File {
-	return &File{name: FilePathSeparator, memDir: &DirMap{}, dir: true}
-}
-
-func ChangeFileName(f *File, newname string) {
-	f.name = newname
-}
-
-func SetMode(f *File, mode os.FileMode) {
-	f.mode = mode
-}
-
-func SetModTime(f *File, mtime time.Time) {
-	f.modtime = mtime
-}
-
-func GetFileInfo(f *File) *FileInfo {
-	return &FileInfo{file: f}
+func Create(name string) *File {
+	return &File{FileName: name, Mode: os.ModeTemporary, Modtime: time.Now()}
 }
 
 func (f *File) Open() error {
@@ -84,7 +63,7 @@
 }
 
 func (f *File) Name() string {
-	return f.name
+	return f.FileName
 }
 
 func (f *File) Stat() (os.FileInfo, error) {
@@ -99,7 +78,7 @@
 	var outLength int64
 
 	f.Lock()
-	files := f.memDir.Files()[f.readDirCount:]
+	files := f.MemDir.Files()[f.readDirCount:]
 	if count > 0 {
 		if len(files) < count {
 			outLength = int64(len(files))
@@ -219,27 +198,27 @@
 }
 
 func (f *File) Info() *FileInfo {
-	return &FileInfo{file: f}
+	return &FileInfo{File: f}
 }
 
 type FileInfo struct {
-	file *File
+	File *File
 }
 
 // Implements os.FileInfo
 func (s *FileInfo) Name() string {
-	_, name := filepath.Split(s.file.Name())
+	_, name := filepath.Split(s.File.Name())
 	return name
 }
-func (s *FileInfo) Mode() os.FileMode  { return s.file.mode }
-func (s *FileInfo) ModTime() time.Time { return s.file.modtime }
-func (s *FileInfo) IsDir() bool        { return s.file.dir }
+func (s *FileInfo) Mode() os.FileMode  { return s.File.Mode }
+func (s *FileInfo) ModTime() time.Time { return s.File.Modtime }
+func (s *FileInfo) IsDir() bool        { return s.File.Dir }
 func (s *FileInfo) Sys() interface{}   { return nil }
 func (s *FileInfo) Size() int64 {
 	if s.IsDir() {
 		return int64(42)
 	}
-	return int64(len(s.file.data))
+	return int64(len(s.File.data))
 }
 
 var (
diff --git a/memmap.go b/memmap.go
index 0263953..88c390f 100644
--- a/memmap.go
+++ b/memmap.go
@@ -48,7 +48,7 @@
 
 		// Root should always exist, right?
 		// TODO: what about windows?
-		m.data[FilePathSeparator] = mem.CreateDir(FilePathSeparator)
+		m.data[FilePathSeparator] = &mem.File{FileName: FilePathSeparator, MemDir: &mem.DirMap{}, Dir: true}
 	}
 	return m.data
 }
@@ -66,7 +66,7 @@
 func (m *MemMapFs) Create(name string) (File, error) {
 	name = normalizePath(name)
 	m.lock()
-	file := mem.CreateFile(name)
+	file := mem.Create(name)
 	m.getData()[name] = file
 	m.registerWithParent(file)
 	m.unlock()
@@ -86,8 +86,7 @@
 		log.Fatal("parent of ", f.Name(), " is nil")
 	}
 	pmem := parent.(*mem.File)
-	fmem := f.(*mem.File)
-	mem.RemoveFromMemDir(pmem, fmem)
+	pmem.MemDir.Remove(*f.(*mem.File))
 }
 
 func (m *MemMapFs) findParent(f File) File {
@@ -119,14 +118,17 @@
 		}
 	}
 	pmem := parent.(*mem.File)
-	fmem := f.(*mem.File)
 
 	// TODO(mbertschler): memDir is only nil when it was not made with Mkdir
 	// or lockfreeMkdir. In this case the parent is also not a real directory.
 	// This currently only happens for the file ".".
 	// This is a quick hack to make the library usable with relative paths.
-	mem.InitializeDir(pmem)
-	mem.AddToMemDir(pmem, fmem)
+	if pmem.MemDir == nil {
+		pmem.Dir = true
+		pmem.MemDir = &mem.DirMap{}
+	}
+
+	pmem.MemDir.Add(*f.(*mem.File))
 }
 
 func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
@@ -142,7 +144,7 @@
 			return err
 		}
 	} else {
-		item := mem.CreateDir(name)
+		item := &mem.File{FileName: name, MemDir: &mem.DirMap{}, Dir: true}
 		m.getData()[name] = item
 		m.registerWithParent(item)
 	}
@@ -166,7 +168,7 @@
 		}
 	} else {
 		m.lock()
-		item := mem.CreateDir(name)
+		item := &mem.File{FileName: name, MemDir: &mem.DirMap{}, Dir: true}
 		m.getData()[name] = item
 		m.registerWithParent(item)
 		m.unlock()
@@ -303,7 +305,7 @@
 			m.unRegisterWithParent(oldname)
 			file := m.getData()[oldname].(*mem.File)
 			delete(m.getData(), oldname)
-			mem.ChangeFileName(file, newname)
+			file.FileName = newname
 			m.getData()[newname] = file
 			m.registerWithParent(file)
 			m.unlock()
@@ -322,8 +324,7 @@
 	if err != nil {
 		return nil, err
 	}
-	fi := mem.GetFileInfo(f.(*mem.File))
-	return fi, nil
+	return &mem.FileInfo{File: f.(*mem.File)}, nil
 }
 
 func (m *MemMapFs) Chmod(name string, mode os.FileMode) error {
@@ -336,7 +337,7 @@
 	ff, ok := f.(*mem.File)
 	if ok {
 		m.lock()
-		mem.SetMode(ff, mode)
+		ff.Mode = mode
 		m.unlock()
 	} else {
 		return errors.New("Unable to Chmod Memory File")
@@ -354,7 +355,7 @@
 	ff, ok := f.(*mem.File)
 	if ok {
 		m.lock()
-		mem.SetModTime(ff, mtime)
+		ff.Modtime = mtime
 		m.unlock()
 	} else {
 		return errors.New("Unable to Chtime Memory File")
