diff --git a/js/lattice/CompositeEditorLattice.js b/js/lattice/CompositeEditorLattice.js
index b89c84c470aa242c7476089fb85ca0677451f76f..c23bd8b17481e8770d09ce4230aeb3bb2b9cb03d 100644
--- a/js/lattice/CompositeEditorLattice.js
+++ b/js/lattice/CompositeEditorLattice.js
@@ -74,10 +74,6 @@ define(['underscore', 'backbone', 'appState', 'globals', 'plist', 'three', 'thre
             materials.setMaterial(id, data);
         },
 
-        deleteComposite: function(){
-            return materials.setMaterial(this.get("id"), null);
-        },
-
 
 
 
diff --git a/js/materials/DMAMaterials.js b/js/materials/DMAMaterials.js
index 3353d61ea145ecc0142c0cc4f30b2b6f93133907..3ab962e51fbf69f735e64c53305569c038559eba 100644
--- a/js/materials/DMAMaterials.js
+++ b/js/materials/DMAMaterials.js
@@ -21,8 +21,14 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel'], fu
     };
 
     function deleteMaterial(id){
+        if (materials[id].noDelete) {
+            console.warn("no delete flag on this material type");
+            return false;
+        }
         delete materials[id];//todo check if being used first
-        return true;
+        var deleted = true;
+        if (deleted) loadMaterialClass();//set to defaults
+        return deleted;
     }
 
     var listener = {};
@@ -50,6 +56,7 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel'], fu
             newMaterials[key] = definitions[key];
             var color = getMaterialColorForState(state, definitions[key], key);
             newMaterials[key].threeMaterial = makeMaterialObject(color);
+            newMaterials[key].noDelete = true;//don't delete the predefined materials
         });
         return newMaterials;
     }
diff --git a/js/menus/CompositeMenuView.js b/js/menus/CompositeMenuView.js
index d2f25ca32324e1e4ddddd3386002c4967f77b4ed..55b5bed34f874839c1f195f482d10d7cf5973a19 100644
--- a/js/menus/CompositeMenuView.js
+++ b/js/menus/CompositeMenuView.js
@@ -44,9 +44,9 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma
             return null;
         },
 
-        updateHex: function(hex){
+        updateHex: function(hex, $target){
             //update hex without rendering
-            $("#compositeColor").css("border-color", hex);
+            $target.css("border-color", hex);
         },
 
         _finishComposite: function(e){
@@ -63,6 +63,7 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma
 
         _saveComposite: function(e){
             e.preventDefault();
+            //save as file
         },
 
         _cancelComposite: function(e){
@@ -77,8 +78,8 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma
                 this._exit();
                 return;
             }
-            lattice.compositeEditor.deleteComposite();
-            this._exit();
+            var deleted = materials.setMaterial(this.get("id"), null);
+            if (deleted) this._exit();
         },
 
         _exit: function(){
diff --git a/js/menus/MaterialEditorMenuView.js b/js/menus/MaterialEditorMenuView.js
index deafc0c6b4be3f71eb4c1fb6708eaad6ec2ee5a5..b131653fb4cedfbbafab878299f119daef78452c 100644
--- a/js/menus/MaterialEditorMenuView.js
+++ b/js/menus/MaterialEditorMenuView.js
@@ -6,14 +6,52 @@
 define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materialEditorMenuTemplate'],
     function($, _, MenuParentView, plist, materials, template){
 
+    var materialNameIndex = 1;
+
     return MenuParentView.extend({
 
         events: {
-            "click #cancelMaterial":                             "_exit"
+            "click #cancelMaterial":                             "_cancelMaterial",
+            "click #deleteMaterial":                             "_deleteMaterial",
+            "click #finishMaterial":                             "_save"
         },
 
         _initialize: function(){
             //bind events
+            this.material = _.clone(materials[this.model.get("materialType")]);
+        },
+
+        getPropertyOwner: function($target){
+            if ($target.hasClass("materialEditor")) return this.material;
+            return null;
+        },
+
+        updateHex: function(hex, $target){
+            //update hex without rendering
+            $target.css("border-color", hex);
+        },
+
+        _save: function(e){
+            e.preventDefault();
+            var name = this.material.name;
+            if (name == "") name = "Material " + materialNameIndex++;
+            materials.setMaterial(this.model.get("materialType"), {
+                name: name,
+                color: this.material.color,
+                altColor: this.material.altColor
+            });
+            this._exit();
+        },
+
+        _deleteMaterial: function(e){
+            e.preventDefault();
+            var deleted = materials.setMaterial(this.model.get("materialType"), null);
+            if (deleted) this._exit();
+        },
+
+        _cancelMaterial: function(e){
+            e.preventDefault();
+            this._exit();
         },
 
         _exit: function(){
@@ -21,7 +59,15 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi
         },
 
         _makeTemplateJSON: function(){
-            return _.extend({name:"name", color:"#ffff00", altColor:"#00ffff"}, plist);
+            return _.extend(this.material);
+        },
+
+        _destroy: function(){
+            var self = this;
+            _.each(_.keys(this.material), function(key){
+                delete self.material[key];
+            });
+            this.material = null;
         },
 
         template: _.template(template)
diff --git a/js/menus/MaterialMenuView.js b/js/menus/MaterialMenuView.js
index ffc17fb5ebff1e648b720686fb0df28f3a372e9f..89e3ff70a902fbd6c6253ad95e6779ce033e4464 100644
--- a/js/menus/MaterialMenuView.js
+++ b/js/menus/MaterialMenuView.js
@@ -36,6 +36,7 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma
             e.stopPropagation();
             e.preventDefault();
             var id = $(e.target).data("id");
+            this.model.set("materialType", id);
             this.model.set("currentTab", "materialEditor", {silent:true});
             this.model.set("currentNav", "navMaterial");
         },
diff --git a/js/menus/MenuParentView.js b/js/menus/MenuParentView.js
index defecd9e6d62911b4725287f9c03474a25ca1fbf..45ebe547f614b12481c24a0581a56bfc59440e5a 100644
--- a/js/menus/MenuParentView.js
+++ b/js/menus/MenuParentView.js
@@ -29,6 +29,7 @@ define(['jquery', 'underscore', 'backbone'], function($, _, Backbone){
         },
 
         destroy: function(){
+            if (this._destroy) this._destroy();
             this.stopListening();
             this.undelegateEvents();
             this.$el.removeData().unbind();
diff --git a/js/menus/MenuWrapperView.js b/js/menus/MenuWrapperView.js
index 2ec39ea5b3095755aa8a599e6a62aed7d04087a5..cd574709571c8591c2e905a4076c94ccbb27a777 100644
--- a/js/menus/MenuWrapperView.js
+++ b/js/menus/MenuWrapperView.js
@@ -59,7 +59,7 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex
                 console.warn("no property associated with string input");
                 return;
             }
-            this._setProperty($target, $target.val());
+            this._setProperty($target, property, $target.val());
         },
 
         _updateHex: function(e){
@@ -73,7 +73,7 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex
                 return;
             }
             this._setProperty($target, property, hex);
-            if (this.menu.updateHex) this.menu.updateHex(hex);//no render when input in focus, this forces update of the inputs color
+            if (this.menu.updateHex) this.menu.updateHex(hex, $target);//no render when input in focus, this forces update of the inputs color
         },
 
         _isValidHex: function(hex){
@@ -175,7 +175,7 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex
 
         _toggleProperty: function($target, property){ //val = !val
             var owner = this._getPropertyOwner($target);
-            if (owner) owner.set(property, !owner.get(property));
+            if (owner) this._setOwnerProperty(owner, property, !this._getOwnerProperty(owner, property));
         },
 
         _setProperty: function($target, property, newVal, key){
@@ -186,14 +186,24 @@ define(['jquery', 'underscore', 'plist', 'backbone', 'lattice', 'appState', 'tex
                 return;
             }
             if (key){
-                var propObject = owner.get(property).clone();
+                var propObject = this._getOwnerProperty(owner, property).clone();
                 propObject[key] = newVal;
-                owner.set(property, propObject);
+                this._setOwnerProperty(owner, property, newVal);
             } else {
-                owner.set(property, newVal);
+                this._setOwnerProperty(owner, property, newVal);
             }
         },
 
+        _getOwnerProperty: function(owner, property){
+            if (owner instanceof Backbone.Model) return owner.get(property);
+            return owner[property];
+        },
+
+        _setOwnerProperty: function(owner, property, value){
+            if (owner instanceof Backbone.Model) owner.set(property, value);
+            else owner[property] = value;
+        },
+
 
 
 
diff --git a/js/menus/templates/MaterialEditorMenuView.html b/js/menus/templates/MaterialEditorMenuView.html
index a2ca68fb57adb23a9ec81c8516162baafe84979b..e2578716b8cbbd8fa979e0f44b2911eea2186641 100644
--- a/js/menus/templates/MaterialEditorMenuView.html
+++ b/js/menus/templates/MaterialEditorMenuView.html
@@ -1,12 +1,16 @@
 <a href="#" class="btn btn-halfWidth btn-lg btn-default importJSON">Load Material</a>
 <a id="saveMaterial" href="#" class="btn btn-halfWidth btn-lg pull-right btn-default">Save Material</a><br/><br/>
-Name: &nbsp;&nbsp;<input id="materialName" data-property="name" value="<%= name %>" placeholder="Enter Name" class="seventyFiveWidth form-control textInput materialEditor" type="text"><br/><br/>
+Name: &nbsp;&nbsp;<input data-property="name" value="<%= name %>" placeholder="Enter Name" class="seventyFiveWidth form-control textInput materialEditor" type="text"><br/><br/>
 Display Color: &nbsp;&nbsp;
-    <input id="materialColor" style="border-color: <%= altColor %> ;" data-property="altColor" value="<%= color %>" placeholder="Enter HEX" class="halfWidth materialEditor form-control hexInput" type="text"><br/><br/>
+    <input id="materialColor" style="border-color: <%= altColor %> ;" data-property="altColor" value="<%= altColor %>" placeholder="Enter HEX" class="halfWidth materialEditor form-control hexInput" type="text"><br/><br/>
 <a id="newRandomColor" href="#" class="btn btn-block btn-lg btn-default">New Random Display Color</a><br/>
 Realistic Color: &nbsp;&nbsp;
     <input id="materialAltColor" style="border-color: <%= color %> ;" data-property="color" value="<%= color %>" placeholder="Enter HEX" class="halfWidth materialEditor form-control hexInput" type="text"><br/><br/>
-Material Properties:<br/><br/>add properties here<br/><br/>
+Material Properties:<br/><br/>- add properties here<br/><br/>
 <a id="finishMaterial" href="#" class="btn btn-block btn-lg btn-success">Save Material</a><br/>
-<a id="cancelMaterial" href="#" class="btn btn-halfWidth btn-lg btn-default">Cancel / Exit</a>
-<a id="deleteMaterial" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/>
\ No newline at end of file
+<% if (noDelete){ %>
+    <a id="cancelMaterial" href="#" class="btn btn-block btn-lg btn-default">Cancel / Exit</a>
+<% } else { %>
+    <a id="cancelMaterial" href="#" class="btn btn-halfWidth btn-lg btn-default">Cancel / Exit</a>
+    <a id="deleteMaterial" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/>
+<% } %>
\ No newline at end of file