diff --git a/alldocs.go b/alldocs.go
index 85e106b..bb5e889 100644
--- a/alldocs.go
+++ b/alldocs.go
@@ -62,6 +62,8 @@
 Flags:
 	-precaire
 		allow the use of insecure protocols.
+	-connections
+		count of parallel download connections.
 
 Update a local dependency
 
diff --git a/rebuild.go b/rebuild.go
index 9d4b0fa..87f13cd 100644
--- a/rebuild.go
+++ b/rebuild.go
@@ -6,16 +6,20 @@
 	"log"
 	"os"
 	"path/filepath"
+	"sync"
+	"sync/atomic"
 
 	"github.com/FiloSottile/gvt/gbvendor"
 )
 
 var (
-	rbInsecure bool // Allow the use of insecure protocols
+	rbInsecure    bool // Allow the use of insecure protocols
+	rbConnections uint // Count of concurrent download connections
 )
 
 func addRebuildFlags(fs *flag.FlagSet) {
 	fs.BoolVar(&rbInsecure, "precaire", false, "allow the use of insecure protocols")
+	fs.UintVar(&rbConnections, "connections", 8, "count of parallel download connections")
 }
 
 var cmdRebuild = &Command{
@@ -36,6 +40,8 @@
 Flags:
 	-precaire
 		allow the use of insecure protocols.
+	-connections
+		count of parallel download connections.
 `,
 	Run: func(args []string) error {
 		switch len(args) {
@@ -54,35 +60,63 @@
 		return fmt.Errorf("could not load manifest: %v", err)
 	}
 
-	for _, dep := range m.Dependencies {
-		dst := filepath.Join(vendorDir(), dep.Importpath)
-		if _, err := os.Stat(dst); err == nil {
-			if err := vendor.RemoveAll(dst); err != nil {
-				// TODO need to apply vendor.cleanpath here too
-				return fmt.Errorf("dependency could not be deleted: %v", err)
+	var errors uint32
+	var wg sync.WaitGroup
+	depC := make(chan vendor.Dependency)
+	for i := 0; i < int(rbConnections); i++ {
+		wg.Add(1)
+		go func() {
+			defer wg.Done()
+			for d := range depC {
+				if err := downloadDependency(d); err != nil {
+					log.Printf("%s: %v", d.Importpath, err)
+					atomic.AddUint32(&errors, 1)
+				}
 			}
-		}
+		}()
+	}
 
-		log.Printf("fetching %s", dep.Importpath)
+	for _, dep := range m.Dependencies {
+		depC <- dep
+	}
+	close(depC)
+	wg.Wait()
 
-		repo, _, err := vendor.DeduceRemoteRepo(dep.Importpath, rbInsecure)
-		if err != nil {
-			return err
-		}
+	if errors > 0 {
+		return fmt.Errorf("failed to fetch %d dependencies", errors)
+	}
 
-		wc, err := repo.Checkout("", "", dep.Revision)
-		if err != nil {
-			return err
-		}
+	return nil
+}
 
-		src := filepath.Join(wc.Dir(), dep.Path)
-		if err := vendor.Copypath(dst, src); err != nil {
-			return err
+func downloadDependency(dep vendor.Dependency) error {
+	dst := filepath.Join(vendorDir(), dep.Importpath)
+	if _, err := os.Stat(dst); err == nil {
+		if err := vendor.RemoveAll(dst); err != nil {
+			// TODO need to apply vendor.cleanpath here too
+			return fmt.Errorf("dependency could not be deleted: %v", err)
 		}
+	}
 
-		if err := wc.Destroy(); err != nil {
-			return err
-		}
+	log.Printf("fetching %s", dep.Importpath)
+
+	repo, _, err := vendor.DeduceRemoteRepo(dep.Importpath, rbInsecure)
+	if err != nil {
+		return err
+	}
+
+	wc, err := repo.Checkout("", "", dep.Revision)
+	if err != nil {
+		return err
+	}
+
+	src := filepath.Join(wc.Dir(), dep.Path)
+	if err := vendor.Copypath(dst, src); err != nil {
+		return err
+	}
+
+	if err := wc.Destroy(); err != nil {
+		return err
 	}
 
 	return nil
