diff --git a/Gopkg.lock b/Gopkg.lock
index cde22f63375e964de8d77c11be68c41cc291c196..db95e05a0184784f2402257f18150d5d5821fbf7 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -232,7 +232,7 @@
     "ksonnet-gen/nodemaker",
     "ksonnet-gen/printer"
   ]
-  revision = "b13dc1c505011ee838ae45324994dac432233000"
+  revision = "9f27c242ff65da0620f8324cc0cd50c8ef00bf5b"
 
 [[projects]]
   branch = "master"
@@ -610,6 +610,6 @@
 [solve-meta]
   analyzer-name = "dep"
   analyzer-version = 1
-  inputs-digest = "e99bb34d06691779ec855657a6aa077e80428aee4db1141c5849a84420033170"
+  inputs-digest = "0b7cc9568e8af03ad2c4e3b5febdef644b40057c6c01aced232c101df726ca4e"
   solver-name = "gps-cdcl"
   solver-version = 1
diff --git a/Gopkg.toml b/Gopkg.toml
index 5899b546977d044a16cb174df1a336d2eecf3422..70fa4ae74108776d1e8235ccda89bef840c811a9 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -54,7 +54,7 @@
 
 [[constraint]]
   name = "github.com/ksonnet/ksonnet-lib"
-  revision = "b13dc1c505011ee838ae45324994dac432233000"
+  revision = "9f27c242ff65da0620f8324cc0cd50c8ef00bf5b"
 
 [[constraint]]
   name = "github.com/mattn/go-isatty"
diff --git a/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/catalog.go b/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/catalog.go
index 29aa34d13c809deb587cc93a81333e0bfe5ccdc3..de81258ba188dce8b0f0d9ef997dcab78490b678 100644
--- a/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/catalog.go
+++ b/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/catalog.go
@@ -152,7 +152,7 @@ func (c *Catalog) Fields() ([]Field, error) {
 			return nil, errors.Wrapf(err, "parse description for %s", name)
 		}
 
-		// If there is a path, this should ot be a hidden object. This
+		// If there is a path, this should not be a hidden object. This
 		// makes this schema a field.
 		if _, ok := c.paths[name]; ok {
 			continue
diff --git a/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/extension.go b/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/extension.go
index 18fef747fdf18f2874fb5c4a46d39af4e46ee447..63f471a00f03069376bdd0f4934c1a7c28a8a53a 100644
--- a/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/extension.go
+++ b/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/extension.go
@@ -275,7 +275,7 @@ func setArray(varName string) *nm.Conditional {
 }
 
 func genIsIntersection(a, b nm.Noder) *nm.Binary {
-	intersection := nm.ApplyCall("std.Inter", a, b)
+	intersection := nm.ApplyCall("std.setInter", a, b)
 	checkLen := nm.ApplyCall("std.length", intersection)
 
 	return nm.NewBinary(
diff --git a/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/properties.go b/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/properties.go
index f69a929ff74f66fd294205f3b9c34239c5052b1c..37fed84b4a679705f553747ba66d8470751872e7 100644
--- a/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/properties.go
+++ b/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/ksonnet/properties.go
@@ -74,7 +74,7 @@ func isSkippedProperty(name string, schema spec.Schema) bool {
 		return true
 	}
 
-	if strings.Contains(strings.ToLower(schema.Description), "read-only") {
+	if strings.Contains(strings.ToLower(schema.Description), "read-only") && name != "readOnly" {
 		return true
 	}
 
diff --git a/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/nodemaker/nodemaker.go b/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/nodemaker/nodemaker.go
index 6c6f33fd6866c2bbb3fee053caf93cf4acbf2b99..3041c836a24b6d8ed81c4f769e8d9acf3d48f28c 100644
--- a/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/nodemaker/nodemaker.go
+++ b/vendor/github.com/ksonnet/ksonnet-lib/ksonnet-gen/nodemaker/nodemaker.go
@@ -87,6 +87,13 @@ func KVFromMap(m map[string]interface{}) (*Object, error) {
 				return nil, err
 			}
 
+			o.Set(InheritedKey(name), child)
+		case map[string]interface{}:
+			child, err := KVFromMap(t)
+			if err != nil {
+				return nil, err
+			}
+
 			o.Set(InheritedKey(name), child)
 		default:
 			return nil, errors.Errorf("unsupported type %T", t)
@@ -179,6 +186,10 @@ func (o *Object) Keys() []Key {
 	return keys
 }
 
+var (
+	reField = regexp.MustCompile(`^[A-Za-z]+[A-Za-z0-9]*$`)
+)
+
 // Node converts the object to a jsonnet node.
 func (o *Object) Node() ast.Node {
 	ao := &astext.Object{
@@ -193,12 +204,21 @@ func (o *Object) Node() ast.Node {
 			Comment: o.generateComment(k.comment),
 		}
 
-		if k.category == ast.ObjectFieldStr {
-			of.Expr1 = NewStringDouble(k.name).Node()
+		if k.category == ast.ObjectLocal {
+			of.Id = newIdentifier(name)
+			of.Kind = k.category
+		} else if stringInSlice(name, jsonnetReservedWords) {
+			of.Expr1 = NewStringDouble(name).Node()
+			of.Kind = ast.ObjectFieldStr
+		} else if reField.MatchString(name) {
+			id := ast.Identifier(name)
+			of.Kind = ast.ObjectFieldID
+			of.Id = &id
 		} else {
-			of.Id = newIdentifier(k.name)
+			of.Expr1 = NewStringDouble(name).Node()
+			of.Kind = ast.ObjectFieldStr
 		}
-		of.Kind = k.category
+
 		of.Hide = k.visibility
 		of.Expr2 = v.Node()
 		of.Method = k.Method()
@@ -939,3 +959,13 @@ func newIdentifier(value string) *ast.Identifier {
 	id := ast.Identifier(value)
 	return &id
 }
+
+func stringInSlice(s string, sl []string) bool {
+	for i := range sl {
+		if sl[i] == s {
+			return true
+		}
+	}
+
+	return false
+}