diff --git a/pkg/chartutil/load.go b/pkg/chartutil/load.go
index 2bdcb568a1ae1ab72c8d85ea2d570aabd738be59..b3dde3c314839d1189308ac1fc0bf173624f9b47 100644
--- a/pkg/chartutil/load.go
+++ b/pkg/chartutil/load.go
@@ -53,10 +53,10 @@ func Load(name string) (*chart.Chart, error) {
 	return LoadFile(name)
 }
 
-// afile represents an archive file buffered for later processing.
-type afile struct {
-	name string
-	data []byte
+// BufferedFile represents an archive file buffered for later processing.
+type BufferedFile struct {
+	Name string
+	Data []byte
 }
 
 // LoadArchive loads from a reader containing a compressed tar archive.
@@ -67,7 +67,7 @@ func LoadArchive(in io.Reader) (*chart.Chart, error) {
 	}
 	defer unzipped.Close()
 
-	files := []*afile{}
+	files := []*BufferedFile{}
 	tr := tar.NewReader(unzipped)
 	for {
 		b := bytes.NewBuffer(nil)
@@ -105,7 +105,7 @@ func LoadArchive(in io.Reader) (*chart.Chart, error) {
 			return &chart.Chart{}, err
 		}
 
-		files = append(files, &afile{name: n, data: b.Bytes()})
+		files = append(files, &BufferedFile{Name: n, Data: b.Bytes()})
 		b.Reset()
 	}
 
@@ -113,41 +113,42 @@ func LoadArchive(in io.Reader) (*chart.Chart, error) {
 		return nil, errors.New("no files in chart archive")
 	}
 
-	return loadFiles(files)
+	return LoadFiles(files)
 }
 
-func loadFiles(files []*afile) (*chart.Chart, error) {
+// LoadFiles loads from in-memory files.
+func LoadFiles(files []*BufferedFile) (*chart.Chart, error) {
 	c := &chart.Chart{}
-	subcharts := map[string][]*afile{}
+	subcharts := map[string][]*BufferedFile{}
 
 	for _, f := range files {
-		if f.name == "Chart.yaml" {
-			m, err := UnmarshalChartfile(f.data)
+		if f.Name == "Chart.yaml" {
+			m, err := UnmarshalChartfile(f.Data)
 			if err != nil {
 				return c, err
 			}
 			c.Metadata = m
-		} else if f.name == "values.toml" {
+		} else if f.Name == "values.toml" {
 			return c, errors.New("values.toml is illegal as of 2.0.0-alpha.2")
-		} else if f.name == "values.yaml" {
-			c.Values = &chart.Config{Raw: string(f.data)}
-		} else if strings.HasPrefix(f.name, "templates/") {
-			c.Templates = append(c.Templates, &chart.Template{Name: f.name, Data: f.data})
-		} else if strings.HasPrefix(f.name, "charts/") {
-			if filepath.Ext(f.name) == ".prov" {
-				c.Files = append(c.Files, &any.Any{TypeUrl: f.name, Value: f.data})
+		} else if f.Name == "values.yaml" {
+			c.Values = &chart.Config{Raw: string(f.Data)}
+		} else if strings.HasPrefix(f.Name, "templates/") {
+			c.Templates = append(c.Templates, &chart.Template{Name: f.Name, Data: f.Data})
+		} else if strings.HasPrefix(f.Name, "charts/") {
+			if filepath.Ext(f.Name) == ".prov" {
+				c.Files = append(c.Files, &any.Any{TypeUrl: f.Name, Value: f.Data})
 				continue
 			}
-			cname := strings.TrimPrefix(f.name, "charts/")
+			cname := strings.TrimPrefix(f.Name, "charts/")
 			if strings.IndexAny(cname, "._") == 0 {
 				// Ignore charts/ that start with . or _.
 				continue
 			}
 			parts := strings.SplitN(cname, "/", 2)
 			scname := parts[0]
-			subcharts[scname] = append(subcharts[scname], &afile{name: cname, data: f.data})
+			subcharts[scname] = append(subcharts[scname], &BufferedFile{Name: cname, Data: f.Data})
 		} else {
-			c.Files = append(c.Files, &any.Any{TypeUrl: f.name, Value: f.data})
+			c.Files = append(c.Files, &any.Any{TypeUrl: f.Name, Value: f.Data})
 		}
 	}
 
@@ -166,25 +167,25 @@ func loadFiles(files []*afile) (*chart.Chart, error) {
 			continue
 		} else if filepath.Ext(n) == ".tgz" {
 			file := files[0]
-			if file.name != n {
-				return c, fmt.Errorf("error unpacking tar in %s: expected %s, got %s", c.Metadata.Name, n, file.name)
+			if file.Name != n {
+				return c, fmt.Errorf("error unpacking tar in %s: expected %s, got %s", c.Metadata.Name, n, file.Name)
 			}
 			// Untar the chart and add to c.Dependencies
-			b := bytes.NewBuffer(file.data)
+			b := bytes.NewBuffer(file.Data)
 			sc, err = LoadArchive(b)
 		} else {
 			// We have to trim the prefix off of every file, and ignore any file
 			// that is in charts/, but isn't actually a chart.
-			buff := make([]*afile, 0, len(files))
+			buff := make([]*BufferedFile, 0, len(files))
 			for _, f := range files {
-				parts := strings.SplitN(f.name, "/", 2)
+				parts := strings.SplitN(f.Name, "/", 2)
 				if len(parts) < 2 {
 					continue
 				}
-				f.name = parts[1]
+				f.Name = parts[1]
 				buff = append(buff, f)
 			}
-			sc, err = loadFiles(buff)
+			sc, err = LoadFiles(buff)
 		}
 
 		if err != nil {
@@ -237,7 +238,7 @@ func LoadDir(dir string) (*chart.Chart, error) {
 	}
 	rules.AddDefaults()
 
-	files := []*afile{}
+	files := []*BufferedFile{}
 	topdir += string(filepath.Separator)
 
 	err = symwalk.Walk(topdir, func(name string, fi os.FileInfo, err error) error {
@@ -268,12 +269,12 @@ func LoadDir(dir string) (*chart.Chart, error) {
 			return fmt.Errorf("error reading %s: %s", n, err)
 		}
 
-		files = append(files, &afile{name: n, data: data})
+		files = append(files, &BufferedFile{Name: n, Data: data})
 		return nil
 	})
 	if err != nil {
 		return c, err
 	}
 
-	return loadFiles(files)
+	return LoadFiles(files)
 }
diff --git a/pkg/chartutil/load_test.go b/pkg/chartutil/load_test.go
old mode 100755
new mode 100644
index 606996ba49b6fc15ce4abed18610f6eeda203d99..454500489999fa722be94e4f49387eac16e07a26
--- a/pkg/chartutil/load_test.go
+++ b/pkg/chartutil/load_test.go
@@ -17,6 +17,7 @@ limitations under the License.
 package chartutil
 
 import (
+	"path"
 	"testing"
 
 	"k8s.io/helm/pkg/proto/hapi/chart"
@@ -42,6 +43,83 @@ func TestLoadFile(t *testing.T) {
 	verifyRequirements(t, c)
 }
 
+func TestLoadFiles(t *testing.T) {
+	goodFiles := []*BufferedFile{
+		{
+			Name: ChartfileName,
+			Data: []byte(`apiVersion: v1
+name: frobnitz
+description: This is a frobnitz.
+version: "1.2.3"
+keywords:
+  - frobnitz
+  - sprocket
+  - dodad
+maintainers:
+  - name: The Helm Team
+    email: helm@example.com
+  - name: Someone Else
+    email: nobody@example.com
+sources:
+  - https://example.com/foo/bar
+home: http://example.com
+icon: https://example.com/64x64.png
+`),
+		},
+		{
+			Name: ValuesfileName,
+			Data: []byte(defaultValues),
+		},
+		{
+			Name: path.Join("templates", DeploymentName),
+			Data: []byte(defaultDeployment),
+		},
+		{
+			Name: path.Join("templates", ServiceName),
+			Data: []byte(defaultService),
+		},
+	}
+
+	c, err := LoadFiles(goodFiles)
+	if err != nil {
+		t.Errorf("Expected good files to be loaded, got %v", err)
+	}
+
+	if c.Metadata.Name != "frobnitz" {
+		t.Errorf("Expected chart name to be 'frobnitz', got %s", c.Metadata.Name)
+	}
+
+	if c.Values.Raw != defaultValues {
+		t.Error("Expected chart values to be populated with default values")
+	}
+
+	if len(c.Templates) != 2 {
+		t.Errorf("Expected number of templates == 2, got %d", len(c.Templates))
+	}
+
+	c, err = LoadFiles([]*BufferedFile{})
+	if err == nil {
+		t.Fatal("Expected err to be non-nil")
+	}
+	if err.Error() != "chart metadata (Chart.yaml) missing" {
+		t.Errorf("Expected chart metadata missing error, got '%s'", err.Error())
+	}
+
+	// legacy check
+	c, err = LoadFiles([]*BufferedFile{
+		{
+			Name: "values.toml",
+			Data: []byte{},
+		},
+	})
+	if err == nil {
+		t.Fatal("Expected err to be non-nil")
+	}
+	if err.Error() != "values.toml is illegal as of 2.0.0-alpha.2" {
+		t.Errorf("Expected values.toml to be illegal, got '%s'", err.Error())
+	}
+}
+
 // Packaging the chart on a Windows machine will produce an
 // archive that has \\ as delimiters. Test that we support these archives
 func TestLoadFileBackslash(t *testing.T) {