diff --git a/cmd/guess_deps.go b/cmd/guess_deps.go
index 3bc26ac..4f9820d 100644
--- a/cmd/guess_deps.go
+++ b/cmd/guess_deps.go
@@ -2,6 +2,7 @@
 
 import (
 	"os"
+	"path/filepath"
 	"sort"
 	"strings"
 
@@ -14,15 +15,55 @@
 // GuessDeps tries to get the dependencies for the current directory.
 //
 // Params
-// 	- dirname (string): Directory to use as the base. Default: "."
+//  - dirname (string): Directory to use as the base. Default: "."
+//  - skipImport (book): Whether to skip importing from Godep, GPM, and gb
 func GuessDeps(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
 	buildContext, err := GetBuildContext()
 	if err != nil {
 		return nil, err
 	}
 	base := p.Get("dirname", ".").(string)
+	skipImport := p.Get("skipImport", false).(bool)
 	name := guessPackageName(buildContext, base)
 
+	Info("Generating a YAML configuration file and guessing the dependencies")
+
+	config := new(cfg.Config)
+
+	// Get the name of the top level package
+	config.Name = name
+
+	// Import by looking at other package managers and looking over the
+	// entire directory structure.
+
+	// Attempt to import from other package managers.
+	if !skipImport {
+		Info("Attempting to import from other package managers (use --skip-import to skip)")
+		deps := []*cfg.Dependency{}
+		absBase, err := filepath.Abs(base)
+		if err != nil {
+			return nil, err
+		}
+
+		if d, ok := guessImportGodep(absBase); ok {
+			Info("Importing Godep configuration")
+			Warn("Godep uses commit id versions. Consider using Semantic Versions with Glide")
+			deps = d
+		} else if d, ok := guessImportGPM(absBase); ok {
+			Info("Importing GPM configuration")
+			deps = d
+		} else if d, ok := guessImportGB(absBase); ok {
+			Info("Importing GB configuration")
+			deps = d
+		}
+
+		for _, i := range deps {
+			Info("Found imported reference to %s\n", i.Name)
+			config.Imports = append(config.Imports, i)
+		}
+	}
+
+	// Resolve dependencies by looking at the tree.
 	r, err := dependency.NewResolver(base)
 	if err != nil {
 		return nil, err
@@ -38,32 +79,40 @@
 
 	sort.Strings(sortable)
 
-	Info("Generating a YAML configuration file and guessing the dependencies")
-
-	config := new(cfg.Config)
 	vpath := r.VendorDir
 	if !strings.HasSuffix(vpath, "/") {
 		vpath = vpath + string(os.PathSeparator)
 	}
 
-	// Get the name of the top level package
-	config.Name = name
-	config.Imports = make([]*cfg.Dependency, len(sortable))
-	i := 0
 	for _, pa := range sortable {
 		n := strings.TrimPrefix(pa, vpath)
 		Info("Found reference to %s\n", n)
 		root := util.GetRootFromPackage(n)
 
-		d := &cfg.Dependency{
-			Name: root,
+		if !config.HasDependency(root) {
+			d := &cfg.Dependency{
+				Name: root,
+			}
+			subpkg := strings.TrimPrefix(n, root)
+			if len(subpkg) > 0 && subpkg != "/" {
+				d.Subpackages = []string{subpkg}
+			}
+			config.Imports = append(config.Imports, d)
+		} else {
+			subpkg := strings.TrimPrefix(n, root)
+			if len(subpkg) > 0 && subpkg != "/" {
+				d := config.Imports.Get(root)
+				f := false
+				for _, v := range d.Subpackages {
+					if v == subpkg {
+						f = true
+					}
+				}
+				if !f {
+					d.Subpackages = append(d.Subpackages, subpkg)
+				}
+			}
 		}
-		subpkg := strings.TrimPrefix(n, root)
-		if len(subpkg) > 0 && subpkg != "/" {
-			d.Subpackages = []string{subpkg}
-		}
-		config.Imports[i] = d
-		i++
 	}
 
 	return config, nil
@@ -89,3 +138,30 @@
 
 	return pkg.ImportPath
 }
+
+func guessImportGodep(dir string) ([]*cfg.Dependency, bool) {
+	d, err := parseGodepGodeps(dir)
+	if err != nil || len(d) == 0 {
+		return []*cfg.Dependency{}, false
+	}
+
+	return d, true
+}
+
+func guessImportGPM(dir string) ([]*cfg.Dependency, bool) {
+	d, err := parseGPMGodeps(dir)
+	if err != nil || len(d) == 0 {
+		return []*cfg.Dependency{}, false
+	}
+
+	return d, true
+}
+
+func guessImportGB(dir string) ([]*cfg.Dependency, bool) {
+	d, err := parseGbManifest(dir)
+	if err != nil || len(d) == 0 {
+		return []*cfg.Dependency{}, false
+	}
+
+	return d, true
+}
diff --git a/glide.go b/glide.go
index f8d1995..f6c00f7 100644
--- a/glide.go
+++ b/glide.go
@@ -132,7 +132,14 @@
 	or version range to include.
 
 	To fetch the dependencies you may run 'glide install'.`,
+			Flags: []cli.Flag{
+				cli.BoolFlag{
+					Name:  "skip-import",
+					Usage: "When initializing skip importing from other package managers.",
+				},
+			},
 			Action: func(c *cli.Context) {
+				cxt.Put("skipImport", c.Bool("skip-import"))
 				setupHandler(c, "create", cxt, router)
 			},
 		},
@@ -676,6 +683,7 @@
 		Does(cmd.GuardYaml, "_").
 		Using("filename").From("cxt:yaml").
 		Does(cmd.GuessDeps, "cfg").
+		Using("skipImport").From("cxt:skipImport").
 		Does(cmd.WriteYaml, "out").
 		Using("conf").From("cxt:cfg").
 		Using("filename").From("cxt:yaml")
