diff --git a/metadata/environment.go b/metadata/environment.go
index 18b1b0193b3bfbbed1aab5ee9d87c673ecfe4898..b180e37ab09361af4adef188723e61aff9d2b518 100644
--- a/metadata/environment.go
+++ b/metadata/environment.go
@@ -36,11 +36,15 @@ const (
 	defaultEnvName  = "default"
 	metadataDirName = ".metadata"
 
+	// hidden metadata files
 	schemaFilename        = "swagger.json"
 	extensionsLibFilename = "k.libsonnet"
 	k8sLibFilename        = "k8s.libsonnet"
-	paramsFileName        = "params.libsonnet"
-	specFilename          = "spec.json"
+
+	// primary environment files
+	envFileName    = "main.jsonnet"
+	paramsFileName = "params.libsonnet"
+	specFilename   = "spec.json"
 )
 
 // Environment represents all fields of a ksonnet environment
@@ -129,7 +133,7 @@ func (m *manager) createEnvironment(name, server, namespace string, extensionsLi
 		},
 		{
 			// environment base override file
-			appendToAbsPath(envPath, path.Base(name)+".jsonnet"),
+			appendToAbsPath(envPath, envFileName),
 			m.generateOverrideData(),
 		},
 		{
@@ -281,10 +285,9 @@ func (m *manager) SetEnvironment(name string, desired *Environment) error {
 		//
 		// Move the directory
 		//
+
 		pathOld := appendToAbsPath(m.environmentsPath, name)
 		pathNew := appendToAbsPath(m.environmentsPath, desired.Name)
-		jsonnetPathOld := string(appendToAbsPath(pathOld, path.Base(name)+".jsonnet"))
-		jsonnetPathNew := string(appendToAbsPath(pathOld, path.Base(desired.Name)+".jsonnet"))
 		exists, err := afero.DirExists(m.appFS, string(pathNew))
 		if err != nil {
 			return err
@@ -299,13 +302,6 @@ func (m *manager) SetEnvironment(name string, desired *Environment) error {
 		if err != nil {
 			return err
 		}
-		// note: we have to move the jsonnet file first because of a bug with afero: spf13/afero:#141
-		log.Debugf("Renaming jsonnet file from '%s' to '%s'", path.Base(jsonnetPathOld), path.Base(jsonnetPathNew))
-		err = m.appFS.Rename(jsonnetPathOld, jsonnetPathNew)
-		if err != nil {
-			log.Debugf("Failed to move path '%s' to '%s", jsonnetPathOld, jsonnetPathNew)
-			return err
-		}
 		// finally, move the directory
 		err = m.appFS.Rename(string(pathOld), string(pathNew))
 		if err != nil {
diff --git a/metadata/environment_test.go b/metadata/environment_test.go
index 9cdb54259085aee17d4ffb9e8cdf019d175791e8..5d90a2992734d1a168a2afe7b321eb42be9bfcdf 100644
--- a/metadata/environment_test.go
+++ b/metadata/environment_test.go
@@ -18,7 +18,6 @@ package metadata
 import (
 	"encoding/json"
 	"fmt"
-	"path"
 	"reflect"
 	"strings"
 	"testing"
@@ -28,7 +27,6 @@ import (
 )
 
 const (
-	mockSpecJSON       = "spec.json"
 	mockSpecJSONServer = "localhost:8080"
 
 	mockEnvName  = "us-west/test"
@@ -58,15 +56,15 @@ func mockEnvironments(t *testing.T, appName string) *manager {
 		testFS.Mkdir(string(envPath), defaultFolderPermissions)
 		testDirExists(t, string(envPath))
 
-		jsonnetPath := appendToAbsPath(envPath, path.Base(env)+".jsonnet")
-		jsonnetData := m.generateOverrideData()
-		err = afero.WriteFile(testFS, string(jsonnetPath), jsonnetData, defaultFilePermissions)
+		envFilePath := appendToAbsPath(envPath, envFileName)
+		envFileData := m.generateOverrideData()
+		err = afero.WriteFile(testFS, string(envFilePath), envFileData, defaultFilePermissions)
 		if err != nil {
-			t.Fatalf("Could not write file at path: %s", jsonnetPath)
+			t.Fatalf("Could not write file at path: %s", envFilePath)
 		}
-		testFileExists(t, string(jsonnetPath))
+		testFileExists(t, string(envFilePath))
 
-		specPath := appendToAbsPath(envPath, mockSpecJSON)
+		specPath := appendToAbsPath(envPath, specFilename)
 		specData, err := generateSpecData(mockSpecJSONServer, mockNamespace)
 		if err != nil {
 			t.Fatalf("Expected to marshal:\nserver: %s\nnamespace: %s\n, but failed", mockSpecJSONServer, mockNamespace)
@@ -75,6 +73,15 @@ func mockEnvironments(t *testing.T, appName string) *manager {
 		if err != nil {
 			t.Fatalf("Could not write file at path: %s", specPath)
 		}
+		testFileExists(t, string(specPath))
+
+		paramsPath := appendToAbsPath(envPath, paramsFileName)
+		paramsData := m.generateParamsData()
+		err = afero.WriteFile(testFS, string(paramsPath), paramsData, defaultFilePermissions)
+		if err != nil {
+			t.Fatalf("Could not write file at path: %s", paramsPath)
+		}
+		testFileExists(t, string(paramsPath))
 	}
 
 	return m
@@ -172,26 +179,42 @@ func TestSetEnvironment(t *testing.T) {
 		t.Fatalf("Expected error when setting \"%s\" to \"%s\", because env already exists", mockEnvName, mockEnvName2)
 	}
 
+	//
 	// Test changing the name and server of a an existing environment.
-	// Ensure new env directory is created, and old directory no longer exists.
-	// Also ensure server is set in spec.json
+	//
+
 	err = m.SetEnvironment(mockEnvName, &set)
 	if err != nil {
 		t.Fatalf("Could not set \"%s\", got:\n  %s", mockEnvName, err)
 	}
 
+	// Ensure new env directory is created, and old directory no longer exists.
 	envPath := appendToAbsPath(AbsPath(appName), environmentsDir)
 	expectedPathExists := appendToAbsPath(envPath, set.Name)
 	expectedPathNotExists := appendToAbsPath(envPath, mockEnvName)
 	testDirExists(t, string(expectedPathExists))
 	testDirNotExists(t, string(expectedPathNotExists))
 
-	expectedSpecPath := appendToAbsPath(expectedPathExists, specFilename)
-	specData, err := afero.ReadFile(testFS, string(expectedSpecPath))
+	// BUG: https://github.com/spf13/afero/issues/141
+	// we aren't able to test this until the above is fixed.
+	//
+	// ensure all files are moved
+	//
+	// expectedFiles := []string{
+	// 	envFileName,
+	// 	specFilename,
+	// 	paramsFileName,
+	// }
+	// for _, f := range expectedFiles {
+	// 	expectedFilePath := appendToAbsPath(expectedPathExists, f)
+	// 	testFileExists(t, string(expectedFilePath))
+	// }
+
+	// ensure spec file contains the correct content
+	specData, err := afero.ReadFile(testFS, string(appendToAbsPath(expectedPathExists, specFilename)))
 	if err != nil {
 		t.Fatalf("Failed to read spec file:\n  %s", err)
 	}
-
 	var envSpec EnvironmentSpec
 	err = json.Unmarshal(specData, &envSpec)
 	if err != nil {
diff --git a/metadata/manager.go b/metadata/manager.go
index 19f6dd6e508c131c607018432fb3c9acb77769d9..cd02af1f8a16728c06ed869f5c9ed0e2724a9a56 100644
--- a/metadata/manager.go
+++ b/metadata/manager.go
@@ -255,7 +255,7 @@ func (m *manager) CreateComponent(name string, text string, params param.Params,
 func (m *manager) LibPaths(envName string) (libPath, vendorPath, envLibPath, envComponentPath, envParamsPath AbsPath) {
 	envPath := appendToAbsPath(m.environmentsPath, envName)
 	return m.libPath, m.vendorPath, appendToAbsPath(envPath, metadataDirName),
-		appendToAbsPath(envPath, path.Base(envName)+".jsonnet"), appendToAbsPath(envPath, componentParamsFile)
+		appendToAbsPath(envPath, envFileName), appendToAbsPath(envPath, componentParamsFile)
 }
 
 func (m *manager) GetComponentParams(component string) (param.Params, error) {
diff --git a/metadata/manager_test.go b/metadata/manager_test.go
index 950114474851d72ea901475a5cdd74c8fc406ae2..6ea8b7b24b90c29f7cedda9874c8b0c5289f4354 100644
--- a/metadata/manager_test.go
+++ b/metadata/manager_test.go
@@ -266,7 +266,7 @@ func TestLibPaths(t *testing.T) {
 	expectedVendorPath := path.Join(appName, vendorDir)
 	expectedLibPath := path.Join(appName, libDir)
 	expectedEnvLibPath := path.Join(appName, environmentsDir, mockEnvName, metadataDirName)
-	expectedEnvComponentPath := path.Join(appName, environmentsDir, mockEnvName, path.Base(mockEnvName)+".jsonnet")
+	expectedEnvComponentPath := path.Join(appName, environmentsDir, mockEnvName, envFileName)
 	expectedEnvParamsPath := path.Join(appName, environmentsDir, mockEnvName, paramsFileName)
 	m := mockEnvironments(t, appName)