diff --git a/basepath.go b/basepath.go
index 87ce784..e3dcf97 100644
--- a/basepath.go
+++ b/basepath.go
@@ -7,11 +7,6 @@
 	"time"
 )
 
-type BasePathFs struct {
-	base Fs
-	path string
-}
-
 // The BasePathFs restricts all operations to a given path within an Fs.
 // The given file name to the operations on this Fs will be prepended with
 // the base path before calling the base Fs.
@@ -20,17 +15,14 @@
 //
 // Note that it does not clean the error messages on return, so you may
 // reveal the real path on errors.
-func NewBasePathFs(base Fs, path string) FilterFs {
-	return &BasePathFs{base: base, path: filepath.Clean(path) + string(os.PathSeparator)}
+type BasePathFs struct {
+	source Fs
+	path   string
 }
 
-func (b *BasePathFs) AddFilter(fs FilterFs) {
-	fs.SetSource(b.base)
-	b.base = fs
-}
-
-func (b *BasePathFs) SetSource(fs Fs) {
-	b.base = fs
+// NewBasePathFs applies filepath.Clean on creation
+func NewBasePathFs(source Fs, path string) *BasePathFs {
+	return &BasePathFs{source: source, path: filepath.Clean(path) + string(os.PathSeparator)}
 }
 
 // on a file outside the base path it returns the given file name and an error,
@@ -47,14 +39,14 @@
 	if name, err = b.RealPath(name); err != nil {
 		return &os.PathError{"chtimes", name, err}
 	}
-	return b.base.Chtimes(name, atime, mtime)
+	return b.source.Chtimes(name, atime, mtime)
 }
 
 func (b *BasePathFs) Chmod(name string, mode os.FileMode) (err error) {
 	if name, err = b.RealPath(name); err != nil {
 		return &os.PathError{"chmod", name, err}
 	}
-	return b.base.Chmod(name, mode)
+	return b.source.Chmod(name, mode)
 }
 
 func (b *BasePathFs) Name() string {
@@ -65,7 +57,7 @@
 	if name, err = b.RealPath(name); err != nil {
 		return nil, &os.PathError{"stat", name, err}
 	}
-	return b.base.Stat(name)
+	return b.source.Stat(name)
 }
 
 func (b *BasePathFs) Rename(oldname, newname string) (err error) {
@@ -75,56 +67,56 @@
 	if newname, err = b.RealPath(newname); err != nil {
 		return &os.PathError{"rename", newname, err}
 	}
-	return b.base.Rename(oldname, newname)
+	return b.source.Rename(oldname, newname)
 }
 
 func (b *BasePathFs) RemoveAll(name string) (err error) {
 	if name, err = b.RealPath(name); err != nil {
 		return &os.PathError{"remove_all", name, err}
 	}
-	return b.base.RemoveAll(name)
+	return b.source.RemoveAll(name)
 }
 
 func (b *BasePathFs) Remove(name string) (err error) {
 	if name, err = b.RealPath(name); err != nil {
 		return &os.PathError{"remove", name, err}
 	}
-	return b.base.Remove(name)
+	return b.source.Remove(name)
 }
 
 func (b *BasePathFs) OpenFile(name string, flag int, mode os.FileMode) (f File, err error) {
 	if name, err = b.RealPath(name); err != nil {
 		return nil, &os.PathError{"openfile", name, err}
 	}
-	return b.base.OpenFile(name, flag, mode)
+	return b.source.OpenFile(name, flag, mode)
 }
 
 func (b *BasePathFs) Open(name string) (f File, err error) {
 	if name, err = b.RealPath(name); err != nil {
 		return nil, &os.PathError{"open", name, err}
 	}
-	return b.base.Open(name)
+	return b.source.Open(name)
 }
 
 func (b *BasePathFs) Mkdir(name string, mode os.FileMode) (err error) {
 	if name, err = b.RealPath(name); err != nil {
 		return &os.PathError{"mkdir", name, err}
 	}
-	return b.base.Mkdir(name, mode)
+	return b.source.Mkdir(name, mode)
 }
 
 func (b *BasePathFs) MkdirAll(name string, mode os.FileMode) (err error) {
 	if name, err = b.RealPath(name); err != nil {
 		return &os.PathError{"mkdir", name, err}
 	}
-	return b.base.MkdirAll(name, mode)
+	return b.source.MkdirAll(name, mode)
 }
 
 func (b *BasePathFs) Create(name string) (f File, err error) {
 	if name, err = b.RealPath(name); err != nil {
 		return nil, &os.PathError{"create", name, err}
 	}
-	return b.base.Create(name)
+	return b.source.Create(name)
 }
 
 // vim: ts=4 sw=4 noexpandtab nolist syn=go
diff --git a/basepath_test.go b/basepath_test.go
index f45567e..ee9f2d3 100644
--- a/basepath_test.go
+++ b/basepath_test.go
@@ -1,19 +1,19 @@
 package afero
 
 import (
-    "testing"
+	"testing"
 )
 
 func TestBasePath(t *testing.T) {
-    baseFs := &MemMapFs{}
-    baseFs.MkdirAll("/base/path/tmp", 0777)
-    bp := NewBasePathFs(baseFs, "/base/path")
+	baseFs := &MemMapFs{}
+	baseFs.MkdirAll("/base/path/tmp", 0777)
+	bp := NewBasePathFs(baseFs, "/base/path")
 
-    if _, err := bp.Create("/tmp/foo"); err != nil {
-        t.Errorf("Failed to set real path")
-    }
+	if _, err := bp.Create("/tmp/foo"); err != nil {
+		t.Errorf("Failed to set real path")
+	}
 
-    if fh, err := bp.Create("../tmp/bar"); err == nil {
-        t.Errorf("succeeded in creating %s ...", fh.Name())
-    }
+	if fh, err := bp.Create("../tmp/bar"); err == nil {
+		t.Errorf("succeeded in creating %s ...", fh.Name())
+	}
 }
