diff --git a/cfg/config.go b/cfg/config.go
index 0daa26f..63c3676 100644
--- a/cfg/config.go
+++ b/cfg/config.go
@@ -14,6 +14,7 @@
 // Config is the top-level configuration object.
 type Config struct {
 	Name       string       `yaml:"package"`
+	Ignore     []string     `yaml:"ignore,omitempty"`
 	Imports    Dependencies `yaml:"import"`
 	DevImports Dependencies `yaml:"devimport,omitempty"`
 }
@@ -21,6 +22,7 @@
 // A transitive representation of a dependency for importing and exploting to yaml.
 type cf struct {
 	Name       string       `yaml:"package"`
+	Ignore     []string     `yaml:"ignore,omitempty"`
 	Imports    Dependencies `yaml:"import"`
 	DevImports Dependencies `yaml:"devimport,omitempty"`
 }
@@ -48,6 +50,7 @@
 		return err
 	}
 	c.Name = newConfig.Name
+	c.Ignore = newConfig.Ignore
 	c.Imports = newConfig.Imports
 	c.DevImports = newConfig.DevImports
 
@@ -60,7 +63,8 @@
 // MarshalYAML is a hook for gopkg.in/yaml.v2 in the marshaling process
 func (c *Config) MarshalYAML() (interface{}, error) {
 	newConfig := &cf{
-		Name: c.Name,
+		Name:   c.Name,
+		Ignore: c.Ignore,
 	}
 	i, err := c.Imports.Clone().DeDupe()
 	if err != nil {
@@ -93,10 +97,22 @@
 	return false
 }
 
+// HasIgnore returns true if the given name is listed on the ignore list.
+func (c *Config) HasIgnore(name string) bool {
+	for _, v := range c.Ignore {
+		if v == name {
+			return true
+		}
+	}
+
+	return false
+}
+
 // Clone performs a deep clone of the Config instance
 func (c *Config) Clone() *Config {
 	n := &Config{}
 	n.Name = c.Name
+	n.Ignore = c.Ignore
 	n.Imports = c.Imports.Clone()
 	n.DevImports = c.DevImports.Clone()
 	return n
@@ -134,7 +150,30 @@
 		}
 	}
 	if found >= 0 {
-		c.Imports = append(c.DevImports[:found], c.DevImports[found+1:]...)
+		c.DevImports = append(c.DevImports[:found], c.DevImports[found+1:]...)
+	}
+
+	// If something is on the ignore list remove it from the imports.
+	for _, v := range c.Ignore {
+		found = -1
+		for k, d := range c.Imports {
+			if v == d.Name {
+				found = k
+			}
+		}
+		if found >= 0 {
+			c.Imports = append(c.Imports[:found], c.Imports[found+1:]...)
+		}
+
+		found = -1
+		for k, d := range c.DevImports {
+			if v == d.Name {
+				found = k
+			}
+		}
+		if found >= 0 {
+			c.DevImports = append(c.DevImports[:found], c.DevImports[found+1:]...)
+		}
 	}
 
 	return nil
diff --git a/cmd/flatten.go b/cmd/flatten.go
index bb0f055..1bf9adc 100644
--- a/cmd/flatten.go
+++ b/cmd/flatten.go
@@ -115,15 +115,15 @@
 		Debug("----> Scanning %s", imp)
 		base := path.Join(f.top, imp)
 		mod := []string{}
-		if m, ok := mergeGlide(base, imp, f.deps, f.top); ok {
+		if m, ok := mergeGlide(base, imp, f); ok {
 			mod = m
-		} else if m, ok = mergeGodep(base, imp, f.deps, f.top); ok {
+		} else if m, ok = mergeGodep(base, imp, f); ok {
 			mod = m
-		} else if m, ok = mergeGPM(base, imp, f.deps, f.top); ok {
+		} else if m, ok = mergeGPM(base, imp, f); ok {
 			mod = m
-		} else if m, ok = mergeGb(base, imp, f.deps, f.top); ok {
+		} else if m, ok = mergeGb(base, imp, f); ok {
 			mod = m
-		} else if m, ok = mergeGuess(base, imp, f.deps, f.top, scanned); ok {
+		} else if m, ok = mergeGuess(base, imp, f, scanned); ok {
 			mod = m
 		}
 
@@ -197,7 +197,9 @@
 	}
 }
 
-func mergeGlide(dir, name string, deps map[string]*cfg.Dependency, vend string) ([]string, bool) {
+func mergeGlide(dir, name string, f *flattening) ([]string, bool) {
+	deps := f.deps
+	vend := f.top
 	gp := path.Join(dir, "glide.yaml")
 	if _, err := os.Stat(gp); err != nil {
 		return []string{}, false
@@ -217,14 +219,16 @@
 
 	Info("Found glide.yaml in %s", gp)
 
-	return mergeDeps(deps, conf.Imports, vend), true
+	return mergeDeps(deps, conf.Imports, vend, f), true
 }
 
 // listGodep appends Godeps entries to the deps.
 //
 // It returns true if any dependencies were found (even if not added because
 // they are duplicates).
-func mergeGodep(dir, name string, deps map[string]*cfg.Dependency, vend string) ([]string, bool) {
+func mergeGodep(dir, name string, f *flattening) ([]string, bool) {
+	deps := f.deps
+	vend := f.top
 	Debug("Looking in %s/Godeps/ for a Godeps.json file.\n", dir)
 	d, err := parseGodepGodeps(dir)
 	if err != nil {
@@ -235,28 +239,32 @@
 	}
 
 	Info("Found Godeps.json file for %q", name)
-	return mergeDeps(deps, d, vend), true
+	return mergeDeps(deps, d, vend, f), true
 }
 
 // listGb merges GB dependencies into the deps.
-func mergeGb(dir, pkg string, deps map[string]*cfg.Dependency, vend string) ([]string, bool) {
+func mergeGb(dir, pkg string, f *flattening) ([]string, bool) {
+	deps := f.deps
+	vend := f.top
 	Debug("Looking in %s/vendor/ for a manifest file.\n", dir)
 	d, err := parseGbManifest(dir)
 	if err != nil || len(d) == 0 {
 		return []string{}, false
 	}
 	Info("Found gb manifest file for %q", pkg)
-	return mergeDeps(deps, d, vend), true
+	return mergeDeps(deps, d, vend, f), true
 }
 
 // mergeGPM merges GPM Godeps files into deps.
-func mergeGPM(dir, pkg string, deps map[string]*cfg.Dependency, vend string) ([]string, bool) {
+func mergeGPM(dir, pkg string, f *flattening) ([]string, bool) {
+	deps := f.deps
+	vend := f.top
 	d, err := parseGPMGodeps(dir)
 	if err != nil || len(d) == 0 {
 		return []string{}, false
 	}
 	Info("Found GPM file for %q", pkg)
-	return mergeDeps(deps, d, vend), true
+	return mergeDeps(deps, d, vend, f), true
 }
 
 // mergeGuess guesses dependencies and merges.
@@ -264,7 +272,8 @@
 // This always returns true because it always handles the job of searching
 // for dependencies. So generally it should be the last merge strategy
 // that you try.
-func mergeGuess(dir, pkg string, deps map[string]*cfg.Dependency, vend string, scanned map[string]bool) ([]string, bool) {
+func mergeGuess(dir, pkg string, f *flattening, scanned map[string]bool) ([]string, bool) {
+	deps := f.deps
 	Info("Scanning %s for dependencies.", pkg)
 	buildContext, err := GetBuildContext()
 	if err != nil {
@@ -292,6 +301,10 @@
 		//Debug("====> Seen %s already. Skipping", name)
 		//continue
 		//}
+		if f.conf.HasIgnore(name) {
+			Debug("==> Skipping %s because it is on the ignore list", name)
+			continue
+		}
 
 		found := findPkg(buildContext, name, dir)
 		switch found.PType {
@@ -326,11 +339,13 @@
 }
 
 // mergeDeps merges any dependency array into deps.
-func mergeDeps(orig map[string]*cfg.Dependency, add []*cfg.Dependency, vend string) []string {
+func mergeDeps(orig map[string]*cfg.Dependency, add []*cfg.Dependency, vend string, f *flattening) []string {
 	mod := []string{}
 	for _, dd := range add {
-		// Add it unless it's already there.
-		if existing, ok := orig[dd.Name]; !ok {
+		if f.conf.HasIgnore(dd.Name) {
+			Debug("Skipping %s because it is on the ignore list", dd.Name)
+		} else if existing, ok := orig[dd.Name]; !ok {
+			// Add it unless it's already there.
 			orig[dd.Name] = dd
 			Debug("Adding %s to the scan list", dd.Name)
 			mod = append(mod, dd.Name)
diff --git a/cmd/get_imports.go b/cmd/get_imports.go
index ff0d810..ab103eb 100644
--- a/cmd/get_imports.go
+++ b/cmd/get_imports.go
@@ -72,6 +72,11 @@
 			continue
 		}
 
+		if conf.HasIgnore(root) {
+			Warn("Package %q is set to be ignored in glide.yaml. Skipping", root)
+			continue
+		}
+
 		dest := path.Join(cwd, root)
 
 		if err != nil {
@@ -803,6 +808,16 @@
 	return ""
 }
 
+// list2map takes a list of packages names and creates a map of normalized names.
+func list2map(in []string) map[string]bool {
+	out := make(map[string]bool, len(in))
+	for _, v := range in {
+		v, _ := NormalizeName(v)
+		out[v] = true
+	}
+	return out
+}
+
 func envForDir(dir string) []string {
 	env := os.Environ()
 	return mergeEnvLists([]string{"PWD=" + dir}, env)
diff --git a/cmd/update_references.go b/cmd/update_references.go
deleted file mode 100644
index 92fe235..0000000
--- a/cmd/update_references.go
+++ /dev/null
@@ -1,113 +0,0 @@
-package cmd
-
-import (
-	"path"
-
-	"github.com/Masterminds/cookoo"
-	"github.com/Masterminds/glide/cfg"
-)
-
-// UpdateReferences updates the revision numbers on all of the imports.
-//
-// If a `packages` list is supplied, only the given base packages will
-// be updated.
-//
-// Params:
-// 	- conf (*cfg.Config): Configuration
-// 	- packages ([]string): A list of packages to update. Default is all packages.
-func UpdateReferences(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
-	conf := p.Get("conf", &cfg.Config{}).(*cfg.Config)
-	plist := p.Get("packages", []string{}).([]string)
-	vend, _ := VendorPath(c)
-	pkgs := list2map(plist)
-	restrict := len(pkgs) > 0
-
-	cwd, err := VendorPath(c)
-	if err != nil {
-		return false, err
-	}
-
-	if len(conf.Imports) == 0 {
-		return conf, nil
-	}
-
-	// Walk the dependency tree to discover all the packages to pin.
-	packages := make([]string, len(conf.Imports))
-	for i, v := range conf.Imports {
-		packages[i] = v.Name
-	}
-	deps := make(map[string]*cfg.Dependency, len(conf.Imports))
-	for _, imp := range conf.Imports {
-		deps[imp.Name] = imp
-	}
-	f := &flattening{conf, vend, vend, deps, packages}
-	err = discoverDependencyTree(f)
-	if err != nil {
-		return conf, err
-	}
-
-	exportFlattenedDeps(conf, deps)
-
-	err = conf.DeDupe()
-	if err != nil {
-		return conf, err
-	}
-
-	for _, imp := range conf.Imports {
-		if restrict && !pkgs[imp.Name] {
-			Debug("===> Skipping %q", imp.Name)
-			continue
-		}
-		commit, err := VcsLastCommit(imp, cwd)
-		if err != nil {
-			Warn("Could not get commit on %s: %s", imp.Name, err)
-		}
-		imp.Reference = commit
-	}
-
-	return conf, nil
-}
-
-func discoverDependencyTree(f *flattening) error {
-	Debug("---> Inspecting %s for dependencies (%d packages).\n", f.curr, len(f.scan))
-	scanned := map[string]bool{}
-	for _, imp := range f.scan {
-		Debug("----> Scanning %s", imp)
-		base := path.Join(f.top, imp)
-		mod := []string{}
-		if m, ok := mergeGlide(base, imp, f.deps, f.top); ok {
-			mod = m
-		} else if m, ok = mergeGodep(base, imp, f.deps, f.top); ok {
-			mod = m
-		} else if m, ok = mergeGPM(base, imp, f.deps, f.top); ok {
-			mod = m
-		} else if m, ok = mergeGb(base, imp, f.deps, f.top); ok {
-			mod = m
-		} else if m, ok = mergeGuess(base, imp, f.deps, f.top, scanned); ok {
-			mod = m
-		}
-
-		if len(mod) > 0 {
-			Debug("----> Looking for dependencies in %q (%d)", imp, len(mod))
-			f2 := &flattening{
-				conf: f.conf,
-				top:  f.top,
-				curr: base,
-				deps: f.deps,
-				scan: mod}
-			discoverDependencyTree(f2)
-		}
-	}
-
-	return nil
-}
-
-// list2map takes a list of packages names and creates a map of normalized names.
-func list2map(in []string) map[string]bool {
-	out := make(map[string]bool, len(in))
-	for _, v := range in {
-		v, _ := NormalizeName(v)
-		out[v] = true
-	}
-	return out
-}
