diff --git a/action/install.go b/action/install.go
index 3e28788..b3f5052 100644
--- a/action/install.go
+++ b/action/install.go
@@ -1,18 +1,18 @@
 package action
 
 import (
+	"fmt"
 	"path/filepath"
 
 	"github.com/Masterminds/glide/cache"
 	"github.com/Masterminds/glide/cfg"
-	"github.com/Masterminds/glide/dependency"
 	"github.com/Masterminds/glide/msg"
 	gpath "github.com/Masterminds/glide/path"
 	"github.com/Masterminds/glide/repo"
 )
 
 // Install installs a vendor directory based on an existing Glide configuration.
-func Install(installer *repo.Installer, strip, stripVendor bool) {
+func Install(installer *repo.Installer, stripVendor bool) {
 	if installer.UseCache {
 		cache.SystemLock()
 	}
@@ -39,6 +39,9 @@
 	if err != nil {
 		msg.Die("Could not load lockfile.")
 	} else if hash != lock.Hash {
+		fmt.Println(hash, lock.Hash)
+		foo, _ := conf.Marshal()
+		fmt.Println(string(foo))
 		msg.Warn("Lock file may be out of date. Hash check of YAML failed. You may need to run 'update'")
 	}
 
@@ -55,26 +58,9 @@
 		msg.Err("Failed to set references: %s (Skip to cleanup)", err)
 	}
 
-	// Delete unused packages
-	if installer.DeleteUnused {
-		// newConf is calculated based on the lock file so it should be
-		// accurate to the project list.
-		dependency.DeleteUnused(newConf)
-	}
-
-	// VendoredCleanup. This should ONLY be run if UpdateVendored was specified.
-	// When stripping VCS happens this will happen as well. No need for double
-	// effort.
-	if installer.UpdateVendored && !strip {
-		repo.VendoredCleanup(newConf)
-	}
-
-	if strip {
-		msg.Info("Removing version control data from vendor directory...")
-		err := gpath.StripVcs()
-		if err != nil {
-			msg.Err("Unable to strip version control data: %s", err)
-		}
+	err = installer.Export(newConf)
+	if err != nil {
+		msg.Die("Unable to export dependencies to vendor directory: %s", err)
 	}
 
 	if stripVendor {
diff --git a/glide.go b/glide.go
index f86b491..2e7cb1d 100644
--- a/glide.go
+++ b/glide.go
@@ -441,36 +441,43 @@
    from the lock file.`,
 			Flags: []cli.Flag{
 				cli.BoolFlag{
-					Name:  "delete",
-					Usage: "Delete vendor packages not specified in config.",
+					Name:   "delete",
+					Usage:  "Delete vendor packages not specified in config.",
+					Hidden: true,
 				},
 				cli.BoolFlag{
 					Name:  "force",
 					Usage: "If there was a change in the repo or VCS switch to new one. Warning: changes will be lost.",
 				},
 				cli.BoolFlag{
-					Name:  "update-vendored, u",
-					Usage: "Update vendored packages (without local VCS repo). Warning: this may destroy local modifications to vendor/.",
+					Name:   "update-vendored, u",
+					Usage:  "Update vendored packages (without local VCS repo). Warning: this may destroy local modifications to vendor/.",
+					Hidden: true,
 				},
 				cli.StringFlag{
-					Name:  "file, f",
-					Usage: "Save all of the discovered dependencies to a Glide YAML file. (DEPRECATED: This has no impact.)",
+					Name:   "file, f",
+					Usage:  "Save all of the discovered dependencies to a Glide YAML file. (DEPRECATED: This has no impact.)",
+					Hidden: true,
 				},
 				cli.BoolFlag{
-					Name:  "cache",
-					Usage: "When downloading dependencies attempt to cache them.",
+					Name:   "cache",
+					Usage:  "When downloading dependencies attempt to cache them.",
+					Hidden: true,
 				},
 				cli.BoolFlag{
-					Name:  "cache-gopath",
-					Usage: "When downloading dependencies attempt to put them in the GOPATH, too.",
+					Name:   "cache-gopath",
+					Usage:  "When downloading dependencies attempt to put them in the GOPATH, too.",
+					Hidden: true,
 				},
 				cli.BoolFlag{
-					Name:  "use-gopath",
-					Usage: "Copy dependencies from the GOPATH if they exist there.",
+					Name:   "use-gopath",
+					Usage:  "Copy dependencies from the GOPATH if they exist there.",
+					Hidden: true,
 				},
 				cli.BoolFlag{
-					Name:  "strip-vcs, s",
-					Usage: "Removes version control metadata (e.g, .git directory) from the vendor folder.",
+					Name:   "strip-vcs, s",
+					Usage:  "Removes version control metadata (e.g, .git directory) from the vendor folder.",
+					Hidden: true,
 				},
 				cli.BoolFlag{
 					Name:  "strip-vendor, v",
@@ -482,21 +489,34 @@
 				},
 			},
 			Action: func(c *cli.Context) error {
-				if c.Bool("strip-vendor") && !c.Bool("strip-vcs") {
-					msg.Die("--strip-vendor cannot be used without --strip-vcs")
+				if c.Bool("delete") {
+					msg.Warn("The --delete flag is deprecated. This now works by default.")
+				}
+				if c.Bool("update-vendored") {
+					msg.Warn("The --update-vendored flag is deprecated. This now works by default.")
+				}
+				if c.String("file") != "" {
+					msg.Warn("The --flag flag is deprecated.")
+				}
+				if c.Bool("cache") {
+					msg.Warn("The --cache flag is deprecated. This now works by default.")
+				}
+				if c.Bool("cache-gopath") {
+					msg.Warn("The --cache-gopath flag is deprecated.")
+				}
+				if c.Bool("use-gopath") {
+					msg.Warn("The --use-gopath flag is deprecated. Please see overrides.")
+				}
+				if c.Bool("strip-vcs") {
+					msg.Warn("The --strip-vcs flag is deprecated. This now works by default.")
 				}
 
 				installer := repo.NewInstaller()
 				installer.Force = c.Bool("force")
-				installer.UseCache = c.Bool("cache")
-				installer.UseGopath = c.Bool("use-gopath")
-				installer.UseCacheGopath = c.Bool("cache-gopath")
-				installer.UpdateVendored = c.Bool("update-vendored")
 				installer.Home = c.GlobalString("home")
-				installer.DeleteUnused = c.Bool("delete")
 				installer.ResolveTest = !c.Bool("skip-test")
 
-				action.Install(installer, c.Bool("strip-vcs"), c.Bool("strip-vendor"))
+				action.Install(installer, c.Bool("strip-vendor"))
 				return nil
 			},
 		},
@@ -609,10 +629,6 @@
 					msg.Warn("The --strip-vcs flag is deprecated. This now works by default.")
 				}
 
-				if c.Bool("strip-vendor") && !c.Bool("strip-vcs") {
-					msg.Die("--strip-vendor cannot be used without --strip-vcs")
-				}
-
 				if c.Bool("resolve-current") {
 					util.ResolveCurrent = true
 					msg.Warn("Only resolving dependencies for the current OS/Arch")
diff --git a/glide.lock b/glide.lock
index 5f4169c..04390b5 100644
--- a/glide.lock
+++ b/glide.lock
@@ -1,5 +1,5 @@
 hash: 84b989218da3e6a1480e6fa95864e838b1e676a970a14d65fffd33cf052a84fd
-updated: 2016-08-11T13:15:29.781819924-04:00
+updated: 2016-08-11T13:38:46.721068785-04:00
 imports:
 - name: github.com/codegangsta/cli
   version: 1efa31f08b9333f1bd4882d61f9d668a70cd902e
diff --git a/repo/installer.go b/repo/installer.go
index 206fb6e..99a6452 100644
--- a/repo/installer.go
+++ b/repo/installer.go
@@ -82,11 +82,6 @@
 // Install installs the dependencies from a Lockfile.
 func (i *Installer) Install(lock *cfg.Lockfile, conf *cfg.Config) (*cfg.Config, error) {
 
-	cwd, err := gpath.Vendor()
-	if err != nil {
-		return conf, err
-	}
-
 	// Create a config setup based on the Lockfile data to process with
 	// existing commands.
 	newConf := &cfg.Config{}
@@ -111,8 +106,8 @@
 
 	msg.Info("Downloading dependencies. Please wait...")
 
-	LazyConcurrentUpdate(newConf.Imports, cwd, i, newConf)
-	LazyConcurrentUpdate(newConf.DevImports, cwd, i, newConf)
+	LazyConcurrentUpdate(newConf.Imports, i, newConf)
+	LazyConcurrentUpdate(newConf.DevImports, i, newConf)
 	return newConf, nil
 }
 
@@ -122,16 +117,14 @@
 // vendor directory based on changed config.
 func (i *Installer) Checkout(conf *cfg.Config) error {
 
-	dest := i.VendorPath()
-
 	msg.Info("Downloading dependencies. Please wait...")
 
-	if err := ConcurrentUpdate(conf.Imports, dest, i, conf); err != nil {
+	if err := ConcurrentUpdate(conf.Imports, i, conf); err != nil {
 		return err
 	}
 
 	if i.ResolveTest {
-		return ConcurrentUpdate(conf.DevImports, dest, i, conf)
+		return ConcurrentUpdate(conf.DevImports, i, conf)
 	}
 
 	return nil
@@ -251,13 +244,13 @@
 
 	msg.Info("Downloading dependencies. Please wait...")
 
-	err = ConcurrentUpdate(conf.Imports, vpath, i, conf)
+	err = ConcurrentUpdate(conf.Imports, i, conf)
 	if err != nil {
 		return err
 	}
 
 	if i.ResolveTest {
-		err = ConcurrentUpdate(conf.DevImports, vpath, i, conf)
+		err = ConcurrentUpdate(conf.DevImports, i, conf)
 		if err != nil {
 			return err
 		}
@@ -390,7 +383,7 @@
 // LazyConcurrentUpdate updates only deps that are not already checkout out at the right version.
 //
 // This is only safe when updating from a lock file.
-func LazyConcurrentUpdate(deps []*cfg.Dependency, cwd string, i *Installer, c *cfg.Config) error {
+func LazyConcurrentUpdate(deps []*cfg.Dependency, i *Installer, c *cfg.Config) error {
 
 	newDeps := []*cfg.Dependency{}
 	for _, dep := range deps {
@@ -418,14 +411,14 @@
 		newDeps = append(newDeps, dep)
 	}
 	if len(newDeps) > 0 {
-		return ConcurrentUpdate(newDeps, cwd, i, c)
+		return ConcurrentUpdate(newDeps, i, c)
 	}
 
 	return nil
 }
 
 // ConcurrentUpdate takes a list of dependencies and updates in parallel.
-func ConcurrentUpdate(deps []*cfg.Dependency, cwd string, i *Installer, c *cfg.Config) error {
+func ConcurrentUpdate(deps []*cfg.Dependency, i *Installer, c *cfg.Config) error {
 	done := make(chan struct{}, concurrentWorkers)
 	in := make(chan *cfg.Dependency, concurrentWorkers)
 	var wg sync.WaitGroup
