diff --git a/core/installer/app.go b/core/installer/app.go
index 611318d..35c6d11 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -328,7 +328,7 @@
 	Description() string
 	Icon() template.HTML
 	Schema() Schema
-	Namespaces() []string
+	Namespace() string
 	Render(derived Derived) (Rendered, error)
 }
 
@@ -386,8 +386,8 @@
 	return a.schema
 }
 
-func (a cueApp) Namespaces() []string {
-	return []string{a.namespace}
+func (a cueApp) Namespace() string {
+	return a.namespace
 }
 
 type PortForward struct {
diff --git a/core/installer/app_manager.go b/core/installer/app_manager.go
index 4684e02..295c8ff 100644
--- a/core/installer/app_manager.go
+++ b/core/installer/app_manager.go
@@ -59,18 +59,13 @@
 	if err != nil {
 		return err
 	}
-	namespaces := make([]string, len(app.Namespaces()))
-	for i, n := range app.Namespaces() {
-		ns, err := ns.Generate(n)
-		if err != nil {
-			return err
-		}
-		namespaces[i] = ns + suffix
+	nms, err := ns.Generate(app.Namespace())
+	if err != nil {
+		return err
 	}
-	for _, n := range namespaces {
-		if err := m.nsCreator.Create(n); err != nil {
-			return err
-		}
+	nms = nms + suffix
+	if err := m.nsCreator.Create(nms); err != nil {
+		return err
 	}
 	globalConfig, err := m.repoIO.ReadConfig()
 	if err != nil {
@@ -85,9 +80,7 @@
 		Global: globalConfig.Values,
 		Values: derivedValues,
 	}
-	if len(namespaces) > 0 {
-		derived.Release.Namespace = namespaces[0]
-	}
+	derived.Release.Namespace = nms
 	fmt.Printf("%+v\n", derived)
 	err = m.repoIO.InstallApp(
 		app,
diff --git a/core/installer/bootstrapper.go b/core/installer/bootstrapper.go
index fa1a997..b981573 100644
--- a/core/installer/bootstrapper.go
+++ b/core/installer/bootstrapper.go
@@ -388,17 +388,12 @@
 		if err != nil {
 			return err
 		}
-		namespaces := make([]string, len(app.Namespaces()))
-		for i, n := range app.Namespaces() {
-			namespaces[i], err = nsGen.Generate(n)
-			if err != nil {
-				return err
-			}
+		nms, err := nsGen.Generate(app.Namespace())
+		if err != nil {
+			return err
 		}
-		for _, n := range namespaces {
-			if err := nsCreator.Create(n); err != nil {
-				return err
-			}
+		if err := nsCreator.Create(nms); err != nil {
+			return err
 		}
 		derived := Derived{
 			Global: Values{
@@ -407,9 +402,7 @@
 			Release: Release{},
 			Values:  make(map[string]any),
 		}
-		if len(namespaces) > 0 {
-			derived.Release.Namespace = namespaces[0]
-		}
+		derived.Release.Namespace = nms
 		values := map[string]any{}
 		return repo.InstallApp(app, filepath.Join("/infrastructure", app.Name()), values, derived)
 	}
@@ -497,17 +490,12 @@
 	if err != nil {
 		return err
 	}
-	namespaces := make([]string, len(app.Namespaces()))
-	for i, n := range app.Namespaces() {
-		namespaces[i], err = nsGen.Generate(n)
-		if err != nil {
-			return err
-		}
+	nms, err := nsGen.Generate(app.Namespace())
+	if err != nil {
+		return err
 	}
-	for _, n := range namespaces {
-		if err := nsCreator.Create(n); err != nil {
-			return err
-		}
+	if err := nsCreator.Create(nms); err != nil {
+		return err
 	}
 	derived := Derived{
 		Global: Values{
@@ -520,9 +508,7 @@
 			"sshPrivateKey": string(keys.RawPrivateKey()),
 		},
 	}
-	if len(namespaces) > 0 {
-		derived.Release.Namespace = namespaces[0]
-	}
+	derived.Release.Namespace = nms
 	return repo.InstallApp(app, filepath.Join("/infrastructure", app.Name()), derived.Values, derived)
 }
 
@@ -532,17 +518,12 @@
 	if err != nil {
 		return err
 	}
-	namespaces := make([]string, len(app.Namespaces()))
-	for i, n := range app.Namespaces() {
-		namespaces[i], err = nsGen.Generate(n)
-		if err != nil {
-			return err
-		}
+	nms, err := nsGen.Generate(app.Namespace())
+	if err != nil {
+		return err
 	}
-	for _, n := range namespaces {
-		if err := nsCreator.Create(n); err != nil {
-			return err
-		}
+	if err := nsCreator.Create(nms); err != nil {
+		return err
 	}
 	derived := Derived{
 		Global: Values{
@@ -550,9 +531,7 @@
 		},
 		Values: map[string]any{},
 	}
-	if len(namespaces) > 0 {
-		derived.Release.Namespace = namespaces[0]
-	}
+	derived.Release.Namespace = nms
 	return repo.InstallApp(app, filepath.Join("/infrastructure", app.Name()), derived.Values, derived)
 }
 
@@ -603,7 +582,7 @@
 	if err != nil {
 		return err
 	}
-	ns, err := nsGen.Generate(app.Namespaces()[0])
+	ns, err := nsGen.Generate(app.Namespace())
 	if err != nil {
 		return err
 	}
diff --git a/core/installer/schema.go b/core/installer/schema.go
index 7e5e08d..de26173 100644
--- a/core/installer/schema.go
+++ b/core/installer/schema.go
@@ -1,9 +1,7 @@
 package installer
 
 import (
-	"encoding/json"
 	"fmt"
-	"strings"
 
 	"cuelang.org/go/cue"
 	"cuelang.org/go/cue/cuecontext"
@@ -175,36 +173,3 @@
 		return nil, fmt.Errorf("SHOULD NOT REACH!")
 	}
 }
-
-func newSchema(schema map[string]any) (Schema, error) {
-	switch schema["type"] {
-	case "string":
-		if r, ok := schema["role"]; ok && r == "network" {
-			return basicSchema{KindNetwork}, nil
-		} else {
-			return basicSchema{KindString}, nil
-		}
-	case "object":
-		s := structSchema{make(map[string]Schema)}
-		props := schema["properties"].(map[string]any)
-		for name, schema := range props {
-			sm, _ := schema.(map[string]any)
-			scm, err := newSchema(sm)
-			if err != nil {
-				return nil, err
-			}
-			s.fields[name] = scm
-		}
-		return s, nil
-	default:
-		return nil, fmt.Errorf("SHOULD NOT REACH!")
-	}
-}
-
-func NewJSONSchema(schema string) (Schema, error) {
-	ret := make(map[string]any)
-	if err := json.NewDecoder(strings.NewReader(schema)).Decode(&ret); err != nil {
-		return nil, err
-	}
-	return newSchema(ret)
-}
