diff --git a/cmd/flatten.go b/cmd/flatten.go
index e9bdcaa..652b522 100644
--- a/cmd/flatten.go
+++ b/cmd/flatten.go
@@ -56,6 +56,13 @@
 	f := &flattening{conf, vend, vend, deps, packages}
 
 	err := recFlatten(f, force, home, cache, cacheGopath, skipGopath)
+	if err != nil {
+		return conf, err
+	}
+	err = conf.DeDupe()
+	if err != nil {
+		return conf, err
+	}
 	flattenSetRefs(f)
 	Info("Project relies on %d dependencies.", len(deps))
 
@@ -134,6 +141,11 @@
 func flattenGlideUp(f *flattening, base, home string, force, cache, cacheGopath, skipGopath bool) error {
 	//vdir := path.Join(base, "vendor")
 	for _, imp := range f.deps {
+		// If the top package name in the glide.yaml file is present in the deps
+		// skip it because we already have it.
+		if imp.Name == f.conf.Name {
+			continue
+		}
 		wd := path.Join(f.top, imp.Name)
 		if VcsExists(imp, wd) {
 			if updateCache[imp.Name] {
diff --git a/cmd/update_references.go b/cmd/update_references.go
index 33c8eeb..c81a95c 100644
--- a/cmd/update_references.go
+++ b/cmd/update_references.go
@@ -1,6 +1,8 @@
 package cmd
 
 import (
+	"path"
+
 	"github.com/Masterminds/cookoo"
 	"github.com/Masterminds/glide/yaml"
 )
@@ -16,7 +18,7 @@
 func UpdateReferences(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
 	cfg := p.Get("conf", &yaml.Config{}).(*yaml.Config)
 	plist := p.Get("packages", []string{}).([]string)
-
+	vend, _ := VendorPath(c)
 	pkgs := list2map(plist)
 	restrict := len(pkgs) > 0
 
@@ -29,6 +31,28 @@
 		return cfg, nil
 	}
 
+	// Walk the dependency tree to discover all the packages to pin.
+	packages := make([]string, len(cfg.Imports))
+	for i, v := range cfg.Imports {
+		packages[i] = v.Name
+	}
+	deps := make(map[string]*yaml.Dependency, len(cfg.Imports))
+	for _, imp := range cfg.Imports {
+		deps[imp.Name] = imp
+	}
+	f := &flattening{cfg, vend, vend, deps, packages}
+	err = discoverDependencyTree(f)
+	if err != nil {
+		return cfg, err
+	}
+
+	exportFlattenedDeps(cfg, deps)
+
+	err = cfg.DeDupe()
+	if err != nil {
+		return cfg, err
+	}
+
 	for _, imp := range cfg.Imports {
 		if restrict && !pkgs[imp.Name] {
 			Debug("===> Skipping %q", imp.Name)
@@ -44,6 +68,39 @@
 	return cfg, nil
 }
 
+func discoverDependencyTree(f *flattening) error {
+	Debug("---> Inspecting %s for dependencies (%d packages).\n", f.curr, len(f.scan))
+	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); 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))
diff --git a/yaml/yaml.go b/yaml/yaml.go
index d88ac65..5648e22 100644
--- a/yaml/yaml.go
+++ b/yaml/yaml.go
@@ -56,11 +56,7 @@
 		}
 	}
 
-	c.Imports, err = c.Imports.DeDupe()
-	if err != nil {
-		return c, err
-	}
-	c.DevImports, err = c.DevImports.DeDupe()
+	c.DeDupe()
 	if err != nil {
 		return c, err
 	}
@@ -110,6 +106,43 @@
 	return false
 }
 
+func (c *Config) DeDupe() error {
+
+	// Remove duplicates in the imports
+	var err error
+	c.Imports, err = c.Imports.DeDupe()
+	if err != nil {
+		return err
+	}
+	c.DevImports, err = c.DevImports.DeDupe()
+	if err != nil {
+		return err
+	}
+
+	// If the name on the config object is part of the imports remove it.
+	found := -1
+	for i, dep := range c.Imports {
+		if dep.Name == c.Name {
+			found = i
+		}
+	}
+	if found >= 0 {
+		c.Imports = append(c.Imports[:found], c.Imports[found+1:]...)
+	}
+
+	found = -1
+	for i, dep := range c.DevImports {
+		if dep.Name == c.Name {
+			found = i
+		}
+	}
+	if found >= 0 {
+		c.Imports = append(c.DevImports[:found], c.DevImports[found+1:]...)
+	}
+
+	return nil
+}
+
 // GetRoot follows the Parent down to the top node
 func (c *Config) GetRoot() *Config {
 	if c.Parent != nil {
