diff --git a/js/materials/DMAMaterial.js b/js/materials/DMAMaterial.js
index ae23b7f9d4fd2ef03ca8c74510517288b18e7152..218bb17acb8772dc4c673c56c212ce162abbf57a 100644
--- a/js/materials/DMAMaterial.js
+++ b/js/materials/DMAMaterial.js
@@ -5,8 +5,24 @@
 
 define(['underscore', 'appState'], function(_, appState){
 
-    function DMAMaterial(json, id){
+    var materialNum = 0;
+
+    function getNextMaterialNum(){
+        return materialNum++;
+    }
+
+
+    function DMAMaterial(json, id){//todo defaults
         this.id = id;
+
+        var defaults = {
+            name: "",
+            color: "#000000",
+            altColor: "#000000",
+            noDelete: false,
+            properties:{}
+        };
+        json = _.extend(defaults, json);
         this.set(json);
     }
 
@@ -16,6 +32,8 @@ define(['underscore', 'appState'], function(_, appState){
 
     DMAMaterial.prototype.set = function(data){
 
+        if (data.id) delete data.id;//cannot change id once set
+
         //check if colors have changed
         var oldColor = this.color;
         var oldAltColor = this.altColor;
@@ -25,13 +43,12 @@ define(['underscore', 'appState'], function(_, appState){
             if (data[key] && data[key].x) self[key] = new THREE.Vector3(data[key].x, data[key].y, data[key].z);
             else self[key] = data[key];
         });
+        if (this.name === "") this.name = "Material " + getNextMaterialNum();
 
         if (!this.threeMaterial ||
             (data.color && oldColor != data.color) ||
             (data.altColor && oldAltColor != data.altColor)) this.changeColorScheme();//don't need to set edited flag for this, render will handle it
 
-        if (data.noDelete === undefined) this.noDelete = false;
-
         return false;//composite materials have edited flag to trigger upstream changes
     };
 
@@ -58,7 +75,7 @@ define(['underscore', 'appState'], function(_, appState){
 
     DMAMaterial.prototype.getThreeMaterial = function(){
         if (!this.threeMaterial) {
-            console.warn("no transparentMaterial found for material " + this.id);
+            console.warn("no transparentMaterial found for material " + this.getID());
             return null;
         }
         return this.threeMaterial;
@@ -66,7 +83,7 @@ define(['underscore', 'appState'], function(_, appState){
 
     DMAMaterial.prototype.getTransparentMaterial = function(){
         if (!this.transparentMaterial) {
-            console.warn("no transparentMaterial found for material " + this.id);
+            console.warn("no transparentMaterial found for material " + this.getID());
             return null;
         }
         return this.transparentMaterial;
@@ -80,6 +97,10 @@ define(['underscore', 'appState'], function(_, appState){
         return false;
     };
 
+    DMAMaterial.prototype.getName = function(){
+        return this.name;
+    };
+
     DMAMaterial.prototype.getProperties = function(){
         return this.properties;
     };
@@ -88,17 +109,18 @@ define(['underscore', 'appState'], function(_, appState){
         return !this.noDelete;
     };
 
-    DMAMaterial.prototype.clone = function(){
-        return JSON.parse(JSON.stringify(this.toJSON()));
-    };
+//    DMAMaterial.prototype.clone = function(){
+//        return JSON.parse(JSON.stringify(this.toJSON()));
+//    };
 
     DMAMaterial.prototype.toJSON = function(){
         return {
                 name: this.name,
                 color: this.color,
+                id: this.getID(),
                 altColor: this.altColor,
                 noDelete: this.noDelete,
-                properties: this.properties
+                properties: this.getProperties()
             }
     };
 
diff --git a/js/materials/DMAMaterials.js b/js/materials/DMAMaterials.js
index 76a0d5bbef0a9d6c7c3939e8f807a73eb4ca20d9..d8a6b3ed656a1943851ffac8ed478c986d406699 100644
--- a/js/materials/DMAMaterials.js
+++ b/js/materials/DMAMaterials.js
@@ -8,6 +8,7 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma
 
     var materialsList = {
         deleteMaterial: new DMAMaterial({
+            name: "Delete",
             color: "#ff0000",
             altColor: "#ff0000",
             noDelete: true
@@ -28,13 +29,19 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma
 
 
 
-    function newMaterial(data){
-
-    }
-
-    //material objects edited through set()
+    function newMaterial(data, noAdd){
+        if (data.sparseCells) {
+            console.warn("you are trying to init a composite material as a regular material");
+            return null;
+        }
 
+        var id = data.id || getNextMaterialID();
+        var material = new DMAMaterial(data, id);
+        if (noAdd) return material;//in the new material menu, you may init a material before saving changes
 
+        materialsList[id] = material;
+        return material;
+    }
 
     function deleteMaterial(id){
         if (materialsList[id] === undefined){
@@ -53,26 +60,17 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma
         return deleted;
     }
 
-    function getMaterialForId(id, returnTHREEObject, transparent){
-        var material = materialsList[id];
-        if (!returnTHREEObject) return material;
-        if (!material){
-            console.warn("no material object found for type "+ id);
-            return null;
-        }
-        if (transparent) return material.getTransparentMaterial(id);
-        return material.getThreeMaterial(id);
+    function getMaterialForId(id){
+        return materialsList[id];
     }
 
-
-
-
     function setMaterial(id, data){
+
         var material = getMaterialForId(id);
 
         var edited = false;
         if (!material) {
-            materialsList[id] = new DMAMaterial(data, id);
+            newMaterial(data);
             return;
         } else {
             if (data.elementaryChildren) data.properties = getPropertiesFromChildren(data.elementaryChildren);
@@ -94,19 +92,11 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma
 
 
 
-    var materialNameIndex = 1;
 
-    function getMaterialCopy(id){
-        var material = getMaterialForId(id);
-        if (material) return material.clone();
-        return {
-                name: "Material " + materialNameIndex++,
-                color: '#000000',
-                altColor: '#000000',
-                noDelete: false,
-                properties: {}
-            };
-    }
+
+
+
+
 
     function getDeleteMaterial(){
         return materialsList.deleteMaterial.threeMaterial;
@@ -252,18 +242,18 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel', 'ma
     }
 
 
+
     return {
         list: materialsList,
+        newMaterial: newMaterial,
         setMaterial: setMaterial,
         deleteMaterial: deleteMaterial,
         getMaterialForId: getMaterialForId,
-        getMaterialCopy: getMaterialCopy,
         getCompositeKeys: getCompositeKeys,
         getVaildAvailableCompositeKeys: getVaildAvailableCompositeKeys,
         getChildCellTypes:getChildCellTypes,
         setToDefaultMaterial: setToDefaultMaterial,
         getDeleteMaterial: getDeleteMaterial,
-        getNextCompositeID: getNextCompositeID,
-        getNextMaterialID: getNextMaterialID
+        getNextCompositeID: getNextCompositeID
     };
 });
\ No newline at end of file
diff --git a/js/menus/MaterialEditorMenuView.js b/js/menus/MaterialEditorMenuView.js
index 2b0608944a1c20e89220686655d27105597e43ac..7b08914c9ce31bf2dce20b5ba5cbdb2f97c4789a 100644
--- a/js/menus/MaterialEditorMenuView.js
+++ b/js/menus/MaterialEditorMenuView.js
@@ -15,15 +15,18 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi
 
         _initialize: function(options){
 
-            var id = options.myObject;
-            if (!options.myObject) {
+            var materialID = options.myObject;
+
+            if (!materialID) {
                 console.warn("no editing material id passed in");
                 this.model.set("currentNav", plist.allMenus.navMaterial.parent);
             }
-            if (id == "new") id = materials.getNextMaterialID();
-            this.materialID = id;
 
-            this.material = materials.getMaterialCopy(id);
+            var material = materials.getMaterialForId(materialID);
+            var json = {};
+            if (material) json = material.toJSON();
+
+            this.material = materials.newMaterial(json, true);
         },
 
         getPropertyOwner: function($target){
@@ -46,31 +49,26 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi
 
         _saveMaterialToFile: function(e){
             e.preventDefault();
-            fileSaver.saveMaterial(this.materialID, this.material);
+            fileSaver.saveMaterial(this.material);
         },
 
         saveExitMenu: function(){
-            if (this.material.name == "") this.material.name = "Material " + materials.getNextMaterialID();
-            materials.setMaterial(this.materialID, _.clone(this.material));
+            materials.setMaterial(this.material.getID(), this.material.toJSON());
             return true;
         },
 
         deleteExitMenu: function(){
-            var deleted = materials.deleteMaterial(this.materialID);
+            var deleted = materials.deleteMaterial(this.material.getID());
             return deleted;
         },
 
         _makeTemplateJSON: function(){
-            return _.extend(this.material);
+            return _.extend(this.material.toJSON());
         },
 
         _destroy: function(){
-            var self = this;
-            _.each(_.keys(this.material), function(key){
-                delete self.material[key];
-            });
+            if(this.material) this.material.destroy();
             this.material = null;
-            this.materialID = null;
         },
 
         template: _.template(template)
diff --git a/js/models/FileSaver.js b/js/models/FileSaver.js
index 9c62e776cb519ebc60e140dcbf180d3110986c38..8529d4ca78bfc301e275b7c235e152cab36c30f8 100644
--- a/js/models/FileSaver.js
+++ b/js/models/FileSaver.js
@@ -55,10 +55,10 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra
         _saveFile(seqArray, name || "seqs", "txt", true);
     }
 
-    function saveMaterial(id, material){
+    function saveMaterial(material){
         var data = {materials:{}};
-        data.materials[id] = material || _getMaterialDataToSave(material);
-        _saveFile(data, data.materials[id].name, "json");
+        data.materials[materials.getID()] = material.toJSON();
+        _saveFile(data, material.getName(), "json");
     }
 
     function saveMachineConfig(data){
@@ -78,14 +78,11 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra
     function _getMaterialsDataToSave(){
         var data = {};
         _.each(materials.list, function(material, key){
-            data[key] = _getMaterialDataToSave(material);
+            data[key] = material.toJSON();
         });
         return data;
     }
 
-    function _getMaterialDataToSave(material){
-        return material.toJSON();
-    }
 
     function loadFile(data){//parsed json todo make this better - load composite
         if (data.assembler) {