diff --git a/Makefile b/Makefile
index da844291f246435fd89cc23cb0332bfc13dd5ba1..d1529767b2d77ceeaeb1ae2467d61a293db99f7d 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,9 @@ endif
 
 BIN_DIR := bin
 DIST_DIR := _dist
-GO_PACKAGES := cmd/helm dm deploy format kubectl
+#GO_PACKAGES := cmd/helm dm format kubectl
+GO_DIRS ?= $(shell glide nv -x )
+GO_PKGS ?= $(shell glide nv)
 MAIN_GO := github.com/deis/helm-dm/cmd/helm
 HELM_BIN := helm-dm
 PATH_WITH_HELM = PATH="$(shell pwd)/$(BIN_DIR)/helm:$(PATH)"
@@ -44,19 +46,19 @@ install: build
 	install -m 755 bin/${HELM_BIN} ${DESTDIR}/usr/local/bin/${HELM_BIN}
 
 quicktest:
-	$(PATH_WITH_HELM) go test -short $(addprefix ./,$(GO_PACKAGES))
+	$(PATH_WITH_HELM) go test -short ${GO_PKGS}
 
 test: test-style
-	$(PATH_WITH_HELM) go test -v -cover $(addprefix ./,$(GO_PACKAGES))
+	$(PATH_WITH_HELM) go test -v -cover ${GO_PKGS}
 
 test-style:
-	@if [ $(shell gofmt -e -l -s $(GO_PACKAGES)) ]; then \
-		echo "gofmt check failed:"; gofmt -e -d -s $(GO_PACKAGES); exit 1; \
+	@if [ $(shell gofmt -e -l -s $(GO_DIRS)) ]; then \
+		echo "gofmt check failed:"; gofmt -e -d -s $(GO_DIRS); exit 1; \
 	fi
-	@for i in . $(GO_PACKAGES); do \
+	@for i in . $(GO_DIRS); do \
 		golint $$i; \
 	done
-	@for i in . $(GO_PACKAGES); do \
+	@for i in . $(GO_DIRS); do \
 		go vet github.com/deis/helm-dm/$$i; \
 	done
 
diff --git a/cmd/helm/chart_upload.go b/cmd/helm/chart_upload.go
new file mode 100644
index 0000000000000000000000000000000000000000..5e5933af4e94fb5390e72475526b655c78d81a2e
--- /dev/null
+++ b/cmd/helm/chart_upload.go
@@ -0,0 +1,99 @@
+package main
+
+import (
+	"errors"
+	"fmt"
+	"os"
+	"regexp"
+	"strings"
+
+	"github.com/aokoli/goutils"
+	"github.com/codegangsta/cli"
+	"github.com/deis/helm-dm/format"
+	"github.com/kubernetes/deployment-manager/chart"
+)
+
+func uploadChart(c *cli.Context) error {
+	args := c.Args()
+	if len(args) < 1 {
+		format.Err("First argument, filename, is required. Try 'helm deploy --help'")
+		os.Exit(1)
+	}
+
+	cname := c.String("name")
+	fname := args[0]
+
+	if fname == "" {
+		return errors.New("A filename must be specified. For a tar archive, this is the name of the root template in the archive.")
+	}
+
+	_, err := doUpload(fname, cname, c)
+	return err
+}
+func doUpload(filename, cname string, cxt *cli.Context) (string, error) {
+
+	fi, err := os.Stat(filename)
+	if err != nil {
+		return "", err
+	}
+
+	if fi.IsDir() {
+		format.Info("Chart is directory")
+		c, err := chart.LoadDir(filename)
+		if err != nil {
+			return "", err
+		}
+		if cname == "" {
+			cname = genName(c.Chartfile().Name)
+		}
+
+		// TODO: Is it better to generate the file in temp dir like this, or
+		// just put it in the CWD?
+		//tdir, err := ioutil.TempDir("", "helm-")
+		//if err != nil {
+		//format.Warn("Could not create temporary directory. Using .")
+		//tdir = "."
+		//} else {
+		//defer os.RemoveAll(tdir)
+		//}
+		tdir := "."
+		tfile, err := chart.Save(c, tdir)
+		if err != nil {
+			return "", err
+		}
+		filename = tfile
+	} else if cname == "" {
+		n, _, e := parseTarName(filename)
+		if e != nil {
+			return "", e
+		}
+		cname = n
+	}
+
+	// TODO: Add a version build metadata on the chart.
+
+	if cxt.Bool("dry-run") {
+		format.Info("Prepared deploy %q using file %q", cname, filename)
+		return "", nil
+	}
+
+	c := client(cxt)
+	return c.PostChart(filename, cname)
+}
+
+func genName(pname string) string {
+	s, _ := goutils.RandomAlphaNumeric(8)
+	return fmt.Sprintf("%s-%s", pname, s)
+}
+
+func parseTarName(name string) (string, string, error) {
+	tnregexp := regexp.MustCompile(chart.TarNameRegex)
+	if strings.HasSuffix(name, ".tgz") {
+		name = strings.TrimSuffix(name, ".tgz")
+	}
+	v := tnregexp.FindStringSubmatch(name)
+	if v == nil {
+		return name, "", fmt.Errorf("invalid name %s", name)
+	}
+	return v[1], v[2], nil
+}
diff --git a/deploy/deploy.go b/deploy/deploy.go
deleted file mode 100644
index a29b2b275105141e1d3f97f9712cbad85e11a670..0000000000000000000000000000000000000000
--- a/deploy/deploy.go
+++ /dev/null
@@ -1,26 +0,0 @@
-package deploy
-
-import (
-	"os"
-
-	"github.com/kubernetes/deployment-manager/common"
-)
-
-// Deployment describes a deployment of a package.
-type Deployment struct {
-	// Name is the Deployment name. Autogenerated if empty.
-	Name string
-	// Filename is the filename for the base deployment.
-	Filename string
-	// Imports is a list of imported files.
-	Imports []string
-	// Properties to pass into the template.
-	Properties map[string]interface{}
-	// Input is a file containing templates. It may be os.Stdin.
-	Input *os.File
-	// Repository is the location of the templates.
-	Repository string
-
-	// The template, typically generated by the Deployment.
-	Template *common.Template
-}