diff --git a/appmanager/unpacker.go b/appmanager/unpacker.go
new file mode 100644
index 0000000..e56d5f2
--- /dev/null
+++ b/appmanager/unpacker.go
@@ -0,0 +1,90 @@
+package appmanager
+
+import (
+	"errors"
+	"fmt"
+	"os/exec"
+	"strings"
+
+	"github.com/golang/glog"
+)
+
+type Unpacker interface {
+	Unpack(archive string,
+		namespace string,
+		releaseRame string,
+		values map[string]string) (map[string][]string, error)
+}
+
+type helmUnpacker struct {
+	helmBin string
+}
+
+func NewHelmUnpacker(helmBin string) Unpacker {
+	return &helmUnpacker{helmBin}
+}
+
+func (h *helmUnpacker) Unpack(
+	archive string,
+	namespace string,
+	releaseName string,
+	values map[string]string) (map[string][]string, error) {
+	cmd := h.generateHelmInstallCmd(archive, namespace, releaseName, values)
+	glog.Info(cmd.String())
+	var stdout strings.Builder
+	var stderr strings.Builder
+	cmd.Stdout = &stdout
+	cmd.Stderr = &stderr
+	err := cmd.Run()
+	if err != nil {
+		return nil, errors.New(stderr.String())
+	}
+	return extractTemplates(stdout.String())
+}
+
+func (h *helmUnpacker) generateHelmInstallCmd(
+	archive string,
+	namespace string,
+	releaseName string,
+	values map[string]string) *exec.Cmd {
+	cmd := exec.Command(h.helmBin)
+	cmd.Args = append(cmd.Args, "template")
+	cmd.Args = append(cmd.Args, fmt.Sprintf("--namespace=%s", namespace))
+	cmd.Args = append(cmd.Args, fmt.Sprintf("%s", releaseName))
+	cmd.Args = append(cmd.Args, fmt.Sprintf("%s", archive))
+	// TODO(giolekva): validate values
+	for key, value := range values {
+		cmd.Args = append(cmd.Args, fmt.Sprintf("--set=%s=%s", key, value))
+	}
+	return cmd
+}
+
+func extractTemplates(bundle string) (map[string][]string, error) {
+	items := strings.Split(bundle, "---")
+	temps := make(map[string][]string)
+	for _, item := range items {
+		if len(item) == 0 {
+			continue
+		}
+		tmp := strings.SplitN(item, "\n", 3)
+		if len(tmp) != 3 {
+			return nil, fmt.Errorf("Got invalid template: %s", item)
+		}
+		source := tmp[1]
+		glog.Info(source)
+		// if !strings.HasPrefix(source, "\n# Source: ") {
+		// 	return nil, fmt.Errorf("Got invalid source: %s", item)
+		// }
+		sourceItems := strings.Split(source, "/")
+		glog.Info(sourceItems)
+		if len(sourceItems) != 3 {
+			return nil, fmt.Errorf("Got invalid source: %s", item)
+		}
+		path := sourceItems[1] + "/" + sourceItems[2]
+		if _, ok := temps[path]; !ok {
+			temps[path] = make([]string, 1)
+		}
+		temps[path] = append(temps[path], tmp[2])
+	}
+	return temps, nil
+}
