diff --git a/pkg/chartutil/requirements.go b/pkg/chartutil/requirements.go
index 2325176ed1848af6e18b1772fffbe3465203e5b5..3a003e1a394a115f08c4e8f0f6ff9ac450e6dc98 100644
--- a/pkg/chartutil/requirements.go
+++ b/pkg/chartutil/requirements.go
@@ -205,29 +205,18 @@ func pathToMap(path string, data map[string]interface{}) map[string]interface{}
 	if path == "." {
 		return data
 	}
-	ap := strings.Split(path, ".")
-	if len(ap) == 0 {
+	return set(parsePath(path), data)
+}
+
+func set(path []string, data map[string]interface{}) map[string]interface{} {
+	if len(path) == 0 {
 		return nil
 	}
-	n := []map[string]interface{}{}
-	// created nested map for each key, adding to slice
-	for _, v := range ap {
-		nm := make(map[string]interface{})
-		nm[v] = make(map[string]interface{})
-		n = append(n, nm)
-	}
-	// find the last key (map) and set our data
-	for i, d := range n {
-		for k := range d {
-			z := i + 1
-			if z == len(n) {
-				n[i][k] = data
-				break
-			}
-			n[i][k] = n[z]
-		}
+	cur := data
+	for i := len(path) - 1; i >= 0; i-- {
+		cur = map[string]interface{}{path[i]: cur}
 	}
-	return n[0]
+	return cur
 }
 
 // processImportValues merges values from child to parent based on the chart's dependencies' ImportValues field.
@@ -247,27 +236,29 @@ func processImportValues(c *chart.Chart) error {
 		for _, riv := range r.ImportValues {
 			switch iv := riv.(type) {
 			case map[string]interface{}:
-				nm := map[string]string{
-					"child":  iv["child"].(string),
-					"parent": iv["parent"].(string),
-				}
-				outiv = append(outiv, nm)
+				child := iv["child"].(string)
+				parent := iv["parent"].(string)
+
+				outiv = append(outiv, map[string]string{
+					"child":  child,
+					"parent": parent,
+				})
+
 				// get child table
-				vv, err := cvals.Table(r.Name + "." + nm["child"])
+				vv, err := cvals.Table(r.Name + "." + child)
 				if err != nil {
 					log.Printf("Warning: ImportValues missing table: %v", err)
 					continue
 				}
 				// create value map from child to be merged into parent
-				vm := pathToMap(nm["parent"], vv.AsMap())
-				b = coalesceTables(cvals, vm)
+				b = coalesceTables(cvals, pathToMap(parent, vv.AsMap()))
 			case string:
-				nm := map[string]string{
-					"child":  "exports." + iv,
+				child := "exports." + iv
+				outiv = append(outiv, map[string]string{
+					"child":  child,
 					"parent": ".",
-				}
-				outiv = append(outiv, nm)
-				vm, err := cvals.Table(r.Name + "." + nm["child"])
+				})
+				vm, err := cvals.Table(r.Name + "." + child)
 				if err != nil {
 					log.Printf("Warning: ImportValues missing table: %v", err)
 					continue
diff --git a/pkg/chartutil/values.go b/pkg/chartutil/values.go
index d52a7a4d3b36b5244f3fc57d552c679dcf836674..a2872dae9c332bc05e9118fe84295c53ffd97252 100644
--- a/pkg/chartutil/values.go
+++ b/pkg/chartutil/values.go
@@ -62,7 +62,7 @@ func (v Values) Table(name string) (Values, error) {
 	table := v
 	var err error
 
-	for _, n := range strings.Split(name, ".") {
+	for _, n := range parsePath(name) {
 		table, err = tableLookup(table, n)
 		if err != nil {
 			return table, err
@@ -118,7 +118,7 @@ func ReadValues(data []byte) (vals Values, err error) {
 	if len(vals) == 0 {
 		vals = Values{}
 	}
-	return
+	return vals, err
 }
 
 // ReadValuesFile will parse a YAML file into a map of values.
@@ -240,11 +240,11 @@ func coalesceGlobals(dest, src map[string]interface{}) {
 }
 
 func copyMap(src map[string]interface{}) map[string]interface{} {
-	dest := make(map[string]interface{}, len(src))
+	m := make(map[string]interface{}, len(src))
 	for k, v := range src {
-		dest[k] = v
+		m[k] = v
 	}
-	return dest
+	return m
 }
 
 // coalesceValues builds up a values map for a particular chart.
@@ -350,40 +350,35 @@ func istable(v interface{}) bool {
 //	chapter:
 //	  one:
 //	    title: "Loomings"
-func (v Values) PathValue(ypath string) (interface{}, error) {
-	if len(ypath) == 0 {
-		return nil, errors.New("YAML path string cannot be zero length")
+func (v Values) PathValue(path string) (interface{}, error) {
+	if path == "" {
+		return nil, errors.New("YAML path cannot be empty")
 	}
-	yps := strings.Split(ypath, ".")
-	if len(yps) == 1 {
+	return v.pathValue(parsePath(path))
+}
+
+func (v Values) pathValue(path []string) (interface{}, error) {
+	if len(path) == 1 {
 		// if exists must be root key not table
-		vals := v.AsMap()
-		k := yps[0]
-		if _, ok := vals[k]; ok && !istable(vals[k]) {
-			// key found
-			return vals[yps[0]], nil
+		if _, ok := v[path[0]]; ok && !istable(v[path[0]]) {
+			return v[path[0]], nil
 		}
-		// key not found
-		return nil, ErrNoValue(errors.Errorf("%v is not a value", k))
+		return nil, ErrNoValue(errors.Errorf("%v is not a value", path[0]))
 	}
-	// join all elements of YAML path except last to get string table path
-	ypsLen := len(yps)
-	table := yps[:ypsLen-1]
-	st := strings.Join(table, ".")
-	// get the last element as a string key
-	sk := yps[ypsLen-1:][0]
+
+	key, path := path[len(path)-1], path[:len(path)-1]
 	// get our table for table path
-	t, err := v.Table(st)
+	t, err := v.Table(joinPath(path...))
 	if err != nil {
-		//no table
-		return nil, ErrNoValue(errors.Errorf("%v is not a value", sk))
+		return nil, ErrNoValue(errors.Errorf("%v is not a value", key))
 	}
 	// check table for key and ensure value is not a table
-	if k, ok := t[sk]; ok && !istable(k) {
-		// key found
+	if k, ok := t[key]; ok && !istable(k) {
 		return k, nil
 	}
-
-	// key not found
-	return nil, ErrNoValue(errors.Errorf("key not found: %s", sk))
+	return nil, ErrNoValue(errors.Errorf("key not found: %s", key))
 }
+
+func parsePath(key string) []string { return strings.Split(key, ".") }
+
+func joinPath(path ...string) string { return strings.Join(path, ".") }