diff --git a/path/path.go b/path/path.go
index 0b19442..0c3cee1 100644
--- a/path/path.go
+++ b/path/path.go
@@ -80,6 +80,29 @@
 
 	gopath := filepath.Join(yamldir, VendorDir)
 
+	// Resolve symlinks
+	info, err := os.Lstat(gopath)
+	if err != nil {
+		return gopath, nil
+	}
+	for i := 0; IsLink(info) && i < 255; i++ {
+		p, err := os.Readlink(gopath)
+		if err != nil {
+			return gopath, nil
+		}
+
+		if filepath.IsAbs(p) {
+			gopath = p
+		} else {
+			gopath = filepath.Join(filepath.Dir(gopath), p)
+		}
+
+		info, err = os.Lstat(gopath)
+		if err != nil {
+			return gopath, nil
+		}
+	}
+
 	return gopath, nil
 }
 
diff --git a/path/path_test.go b/path/path_test.go
index 0c8a221..77a0276 100644
--- a/path/path_test.go
+++ b/path/path_test.go
@@ -34,6 +34,7 @@
 		t.Fatal(err)
 	}
 	wd, _ := os.Getwd()
+
 	os.Chdir(filepath.Join(td, "a/b/c"))
 	res, err := Vendor()
 	if err != nil {
@@ -43,6 +44,17 @@
 	if res != expect {
 		t.Errorf("Failed to find vendor: expected %s got %s", expect, res)
 	}
+
+	os.Chdir(filepath.Join(td, "x/y/z"))
+	res, err = Vendor()
+	if err != nil {
+		t.Errorf("Failed to resolve vendor directory: %s", err)
+	}
+	expect = filepath.Join(td, "x", "symlinked_vendor")
+	if res != expect {
+		t.Errorf("Failed to find vendor: expected %s got %s", expect, res)
+	}
+
 	os.Chdir(wd)
 }
 func TestGlide(t *testing.T) {
diff --git a/path/strip.go b/path/strip.go
index 1162f38..be00be9 100644
--- a/path/strip.go
+++ b/path/strip.go
@@ -11,36 +11,36 @@
 // StripVcs removes VCS metadata (.git, .hg, .bzr, .svn) from the vendor/
 // directory.
 func StripVcs() error {
-	if _, err := os.Stat(VendorDir); err != nil {
+	searchPath, _ := Vendor()
+	if _, err := os.Stat(searchPath); err != nil {
 		if os.IsNotExist(err) {
 			msg.Debug("Vendor directory does not exist.")
 		}
 
 		return err
 	}
-	return filepath.Walk(VendorDir, stripHandler)
-}
 
-func stripHandler(path string, info os.FileInfo, err error) error {
+	return filepath.Walk(searchPath, func(path string, info os.FileInfo, err error) error {
+		name := info.Name()
+		if name == ".git" || name == ".bzr" || name == ".svn" || name == ".hg" {
+			if _, err := os.Stat(path); err == nil {
+				if info.IsDir() {
+					msg.Info("Removing: %s", path)
+					return os.RemoveAll(path)
+				}
 
-	name := info.Name()
-	if name == ".git" || name == ".bzr" || name == ".svn" || name == ".hg" {
-		if _, err := os.Stat(path); err == nil {
-			if info.IsDir() {
-				msg.Info("Removing: %s", path)
-				return os.RemoveAll(path)
+				msg.Debug("%s is not a directory. Skipping removal", path)
+				return nil
 			}
-
-			msg.Debug("%s is not a directory. Skipping removal", path)
-			return nil
 		}
-	}
-	return nil
+		return nil
+	})
 }
 
 // StripVendor removes nested vendor and Godeps/_workspace/ directories.
 func StripVendor() error {
-	if _, err := os.Stat(VendorDir); err != nil {
+	searchPath, _ := Vendor()
+	if _, err := os.Stat(searchPath); err != nil {
 		if os.IsNotExist(err) {
 			msg.Debug("Vendor directory does not exist.")
 		}
@@ -48,33 +48,29 @@
 		return err
 	}
 
-	err := filepath.Walk(VendorDir, stripVendorHandler)
+	err := filepath.Walk(searchPath, func(path string, info os.FileInfo, err error) error {
+		// Skip the base vendor directory
+		if path == searchPath {
+			return nil
+		}
+
+		name := info.Name()
+		if name == "vendor" {
+			if _, err := os.Stat(path); err == nil {
+				if info.IsDir() {
+					msg.Info("Removing: %s", path)
+					return os.RemoveAll(path)
+				}
+
+				msg.Debug("%s is not a directory. Skipping removal", path)
+				return nil
+			}
+		}
+		return nil
+	})
 	if err != nil {
 		return err
 	}
 
-	err = strip.GodepWorkspace(VendorDir)
-
-	return err
-}
-
-func stripVendorHandler(path string, info os.FileInfo, err error) error {
-	// Skip the base vendor directory
-	if path == VendorDir {
-		return nil
-	}
-
-	name := info.Name()
-	if name == "vendor" {
-		if _, err := os.Stat(path); err == nil {
-			if info.IsDir() {
-				msg.Info("Removing: %s", path)
-				return os.RemoveAll(path)
-			}
-
-			msg.Debug("%s is not a directory. Skipping removal", path)
-			return nil
-		}
-	}
-	return nil
+	return strip.GodepWorkspace(searchPath)
 }
diff --git a/path/strip_test.go b/path/strip_test.go
index 6c11194..23e9d94 100644
--- a/path/strip_test.go
+++ b/path/strip_test.go
@@ -21,36 +21,44 @@
 	}()
 
 	// Make VCS directories.
-	gp := filepath.Join(tempDir, ".git")
+	v := filepath.Join(tempDir, VendorDir)
+	err = os.Mkdir(v, 0755)
+	if err != nil {
+		t.Error(err)
+	}
+
+	gp := filepath.Join(tempDir, VendorDir, ".git")
 	err = os.Mkdir(gp, 0755)
 	if err != nil {
 		t.Error(err)
 	}
 
-	bp := filepath.Join(tempDir, ".bzr")
+	bp := filepath.Join(tempDir, VendorDir, ".bzr")
 	err = os.Mkdir(bp, 0755)
 	if err != nil {
 		t.Error(err)
 	}
 
-	hp := filepath.Join(tempDir, ".hg")
+	hp := filepath.Join(tempDir, VendorDir, ".hg")
 	err = os.Mkdir(hp, 0755)
 	if err != nil {
 		t.Error(err)
 	}
 
-	sp := filepath.Join(tempDir, ".svn")
+	sp := filepath.Join(tempDir, VendorDir, ".svn")
 	err = os.Mkdir(sp, 0755)
 	if err != nil {
 		t.Error(err)
 	}
 
-	ov := VendorDir
-	VendorDir = tempDir
+	wd, _ := os.Getwd()
+	os.Chdir(tempDir)
 
-	StripVcs()
+	if err := StripVcs(); err != nil {
+		t.Errorf("Failed to strip vcs: %s", err)
+	}
 
-	VendorDir = ov
+	os.Chdir(wd)
 
 	if _, err := os.Stat(gp); !os.IsNotExist(err) {
 		t.Error(".git directory not deleted")
diff --git a/testdata/path/x/glide.yaml b/testdata/path/x/glide.yaml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/testdata/path/x/glide.yaml
diff --git a/testdata/path/x/vendor b/testdata/path/x/vendor
new file mode 120000
index 0000000..5b13353
--- /dev/null
+++ b/testdata/path/x/vendor
@@ -0,0 +1 @@
+symlinked_vendor
\ No newline at end of file
diff --git a/testdata/path/x/y/z/placeholder.empty b/testdata/path/x/y/z/placeholder.empty
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/testdata/path/x/y/z/placeholder.empty
