diff --git a/memmap.go b/memmap.go
index efd0db7..7376c24 100644
--- a/memmap.go
+++ b/memmap.go
@@ -91,6 +91,7 @@
 func (MemMapFs) Name() string { return "MemMapFS" }
 
 func (m *MemMapFs) Create(name string) (File, error) {
+	name = normalizePath(name)
 	m.lock()
 	file := MemFileCreate(name)
 	m.getData()[name] = file
@@ -158,6 +159,7 @@
 }
 
 func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
+	name = normalizePath(name)
 	x, ok := m.getData()[name]
 	if ok {
 		// Only return ErrFileExists if it's a file, not a directory.
@@ -177,6 +179,8 @@
 }
 
 func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error {
+	name = normalizePath(name)
+
 	m.rlock()
 	x, ok := m.getData()[name]
 	m.runlock()
@@ -203,7 +207,23 @@
 	return m.Mkdir(path, 0777)
 }
 
+// Handle some relative paths
+func normalizePath(path string) string {
+	path = filepath.Clean(path)
+
+	switch path {
+	case ".":
+		return "/"
+	case "..":
+		return "/"
+	default:
+		return path
+	}
+}
+
 func (m *MemMapFs) Open(name string) (File, error) {
+	name = normalizePath(name)
+
 	m.rlock()
 	f, ok := m.getData()[name]
 	ff, ok := f.(*InMemoryFile)
@@ -220,6 +240,7 @@
 }
 
 func (m *MemMapFs) lockfreeOpen(name string) (File, error) {
+	name = normalizePath(name)
 	f, ok := m.getData()[name]
 	ff, ok := f.(*InMemoryFile)
 	if ok {
@@ -258,6 +279,8 @@
 }
 
 func (m *MemMapFs) Remove(name string) error {
+	name = normalizePath(name)
+
 	m.lock()
 	defer m.unlock()
 
@@ -271,6 +294,7 @@
 }
 
 func (m *MemMapFs) RemoveAll(path string) error {
+	path = normalizePath(path)
 	m.lock()
 	m.unRegisterWithParent(path)
 	m.unlock()
@@ -291,6 +315,13 @@
 }
 
 func (m *MemMapFs) Rename(oldname, newname string) error {
+	oldname = normalizePath(oldname)
+	newname = normalizePath(newname)
+
+	if oldname == newname {
+		return nil
+	}
+
 	m.rlock()
 	defer m.runlock()
 	if _, ok := m.getData()[oldname]; ok {
@@ -315,6 +346,7 @@
 }
 
 func (m *MemMapFs) Stat(name string) (os.FileInfo, error) {
+	name = normalizePath(name)
 	f, err := m.Open(name)
 	if err != nil {
 		return nil, err
@@ -323,6 +355,7 @@
 }
 
 func (m *MemMapFs) Chmod(name string, mode os.FileMode) error {
+	name = normalizePath(name)
 	f, ok := m.getData()[name]
 	if !ok {
 		return &os.PathError{"chmod", name, ErrFileNotFound}
@@ -340,6 +373,7 @@
 }
 
 func (m *MemMapFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
+	name = normalizePath(name)
 	f, ok := m.getData()[name]
 	if !ok {
 		return &os.PathError{"chtimes", name, ErrFileNotFound}
diff --git a/memmap_test.go b/memmap_test.go
new file mode 100644
index 0000000..2355122
--- /dev/null
+++ b/memmap_test.go
@@ -0,0 +1,27 @@
+package afero
+
+import "testing"
+
+func TestNormalizePath(t *testing.T) {
+	type test struct {
+		input    string
+		expected string
+	}
+
+	data := []test{
+		{".", "/"},
+		{".", "/"},
+		{"./", "/"},
+		{"..", "/"},
+		{"../", "/"},
+		{"./..", "/"},
+		{"./../", "/"},
+	}
+
+	for i, d := range data {
+		cpath := normalizePath(d.input)
+		if d.expected != cpath {
+			t.Errorf("Test %d failed. Expected %t got %t", i, d.expected, cpath)
+		}
+	}
+}
