diff --git a/js/lattice/CompositeEditorLattice.js b/js/lattice/CompositeEditorLattice.js
index c23bd8b17481e8770d09ce4230aeb3bb2b9cb03d..f63612ea62c60c59bb875191e5e4f8dcf3bf0bd1 100644
--- a/js/lattice/CompositeEditorLattice.js
+++ b/js/lattice/CompositeEditorLattice.js
@@ -54,24 +54,34 @@ define(['underscore', 'backbone', 'appState', 'globals', 'plist', 'three', 'thre
             this.set("color", makeRandomColor());
         },
 
-        makeNewCompositeMaterial: function(name, dimensions){
+        makeNewCompositeMaterial: function(dimensions){
             if (this.get("numCells") == 0) {
                 console.warn("no cells in this composite");
                 return;
             }
-            if (name == "") name = "Composite Material " + compositeNum++;
             var id = this.get("id");
+            materials.setMaterial(id, this.toJSONForSave(dimensions));
+        },
+
+        toJSONForSave: function(dimensions){
+            var name = this.get("name");
+            if (name == "") name = "Composite Material " + compositeNum++;
+            if (dimensions) var _dimensions = dimensions.clone();
+            var cellsMin = this.get("cellsMin");
+            if (cellsMin) cellsMin = cellsMin.clone();
+            var cellsMax = this.get("cellsMax");
+            if (cellsMax) cellsMax = cellsMax.clone();
             var data = {
                 name: name,
                 color: this.get("color"),
                 altColor: this.get("color"),
                 numCells: this.get("numCells"),
                 sparseCells: JSON.parse(JSON.stringify(this.sparseCells)),
-                cellsMin: this.get("cellsMin").clone(),
-                cellsMax: this.get("cellsMax").clone(),
-                dimensions: dimensions
+                cellsMin: cellsMin,
+                cellsMax: cellsMax,
+                dimensions: _dimensions
             };
-            materials.setMaterial(id, data);
+            return data;
         },
 
 
diff --git a/js/menus/CompositeMenuView.js b/js/menus/CompositeMenuView.js
index 55b5bed34f874839c1f195f482d10d7cf5973a19..03555636ad32c7d2d60adf3cea617d407e6d7d9b 100644
--- a/js/menus/CompositeMenuView.js
+++ b/js/menus/CompositeMenuView.js
@@ -2,8 +2,8 @@
  * Created by aghassaei on 6/10/15.
  */
 
-define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'materials', 'text!compositeMenuTemplate'],
-    function($, _, MenuParentView, plist, lattice, globals, materials, template){
+define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'materials', 'text!compositeMenuTemplate', 'fileSaver'],
+    function($, _, MenuParentView, plist, lattice, globals, materials, template, fileSaver){
 
     var dimensions;
 
@@ -57,13 +57,13 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma
                 this._exit();
                 return;
             }
-            lattice.compositeEditor.makeNewCompositeMaterial($("#compositeName").val(), dimensions.clone());
+            lattice.compositeEditor.makeNewCompositeMaterial(dimensions.clone());
             this._exit();
         },
 
         _saveComposite: function(e){
             e.preventDefault();
-            //save as file
+            fileSaver.saveMaterial(lattice.compositeEditor.get("id"), lattice.compositeEditor.toJSONForSave(dimensions));
         },
 
         _cancelComposite: function(e){
diff --git a/js/menus/MaterialEditorMenuView.js b/js/menus/MaterialEditorMenuView.js
index 835092afb5f3acf4706821400a29b79a10a8c879..ce9bbd7912018d107e7a62efa1d0c1d012712f71 100644
--- a/js/menus/MaterialEditorMenuView.js
+++ b/js/menus/MaterialEditorMenuView.js
@@ -3,8 +3,8 @@
  */
 
 
-define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materialEditorMenuTemplate'],
-    function($, _, MenuParentView, plist, materials, template){
+define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materialEditorMenuTemplate', 'fileSaver'],
+    function($, _, MenuParentView, plist, materials, template, fileSaver){
 
     var materialNameIndex = 1;
 
@@ -14,7 +14,8 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi
             "click #cancelMaterial":                             "_cancelMaterial",
             "click #deleteMaterial":                             "_deleteMaterial",
             "click #finishMaterial":                             "_save",
-            "click #newRandomColor":                             "_changeRandomColor"
+            "click #newRandomColor":                             "_changeRandomColor",
+            "click #saveMaterial":                               "_saveMaterialToFile"
         },
 
         _initialize: function(){
@@ -51,6 +52,11 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'materials', 'text!materi
             this._exit();
         },
 
+        _saveMaterialToFile: function(e){
+            e.preventDefault();
+            fileSaver.saveMaterial(this.model.get("materialType"));
+        },
+
         _deleteMaterial: function(e){
             e.preventDefault();
             var deleted = materials.setMaterial(this.model.get("materialType"), null);
diff --git a/js/menus/templates/CompositeMenuView.html b/js/menus/templates/CompositeMenuView.html
index 65e8888bb35148872f41d6b48c8f17ecb8a49bcc..bf882d68779825ea503b3a461e53a5f1ae1704c3 100644
--- a/js/menus/templates/CompositeMenuView.html
+++ b/js/menus/templates/CompositeMenuView.html
@@ -1,5 +1,3 @@
-<a href="#" class="btn btn-halfWidth btn-lg btn-default importJSON">Load Composite</a>
-<a id="saveComposite" href="#" class="btn btn-halfWidth btn-lg pull-right btn-default">Save Composite</a><br/><br/>
 Name: &nbsp;&nbsp;<input id="compositeName" data-property="name" value="<%= name %>" placeholder="Enter Name" class="seventyFiveWidth form-control textInput compositeEditor" type="text"><br/><br/>
 Num Cells: &nbsp;&nbsp;<%= numCells %><br/><br/>
 Bounding Box: &nbsp;&nbsp;<%= dimensions.x %> x <%= dimensions.y %> x <%= dimensions.z %><br/><br/>
@@ -26,4 +24,5 @@ Available Materials:<br/>
 <% }); %><br/>
 <a id="finishComposite" href="#" class="btn btn-block btn-lg btn-success">Save Composite</a><br/>
 <a id="cancelComposite" href="#" class="btn btn-halfWidth btn-lg btn-default">Cancel / Exit</a>
-<a id="deleteComposite" 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
+<a id="deleteComposite" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/><br/>
+<a id="saveComposite" href="#" class="btn btn-block btn-lg btn-default">Save Composite To File</a><br/><br/>
diff --git a/js/menus/templates/MaterialEditorMenuView.html b/js/menus/templates/MaterialEditorMenuView.html
index e2578716b8cbbd8fa979e0f44b2911eea2186641..7443bf4a4f31c3fe401fc3747c936406bea13925 100644
--- a/js/menus/templates/MaterialEditorMenuView.html
+++ b/js/menus/templates/MaterialEditorMenuView.html
@@ -1,5 +1,3 @@
-<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 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="<%= altColor %>" placeholder="Enter HEX" class="halfWidth materialEditor form-control hexInput" type="text"><br/><br/>
@@ -9,8 +7,10 @@ Realistic Color: &nbsp;&nbsp;
 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/>
 <% if (noDelete){ %>
-    <a id="cancelMaterial" href="#" class="btn btn-block btn-lg btn-default">Cancel / Exit</a>
+    <a id="cancelMaterial" href="#" class="btn btn-halfWidth btn-lg btn-default">Cancel / Exit</a>
+    <a id="saveMaterial" href="#" class="btn btn-halfWidth btn-lg pull-right btn-default">Save To File</a><br/><br/>
 <% } 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
+    <a id="deleteMaterial" href="#" class="btn btn-halfWidth pull-right btn-lg btn-default"><span class="fui-trash"></span> Delete</a><br/><br/>
+    <a id="saveMaterial" href="#" class="btn btn-block btn-lg pull-right btn-default">Save Material To File</a><br/><br/>
+<% } %>
diff --git a/js/models/FileSaver.js b/js/models/FileSaver.js
index ccc28fb8d59acfc6d06c1e0d746a775dbb2960c1..a7f9f0872df256aceda0e01e4cf746d1c0cf4cba 100644
--- a/js/models/FileSaver.js
+++ b/js/models/FileSaver.js
@@ -43,6 +43,12 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra
         _saveFile(data, name, ".user");
     }
 
+    function saveMaterial(id, material){
+        var data = {materials:{}};
+        data.materials[id] = material || _getMaterialDataToSave(id);
+        _saveFile(JSON.stringify(data), data.materials[id].name, ".json");
+    }
+
     function _getAssemblerDataToSave(){
         var assemblerData = _.omit(globals.cam.toJSON(), ["origin", "stock", "exporter", "appState", "lattice", "machine", "simLineNumber"]);
         if (!globals.cam.get("editsMadeToProgram")) assemblerData.dataOut = "";
@@ -56,11 +62,15 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra
     function _getMaterialsDataToSave(){
         var data = {};
         _.each(_.keys(materials), function(key){
-            data[key] = _.omit(materials[key], "threeMaterial");
+            data[key] = _getMaterialDataToSave(key);
         });
         return data;
     }
 
+    function _getMaterialDataToSave(id){
+        return _.omit(materials[id], "threeMaterial");
+    }
+
     function loadFile(data){//parsed json todo make this better - load composite
         if (!data.materials){
             console.warn("no material definitions in this file");
@@ -99,6 +109,7 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra
     return {//return public methods
 //        save: save,
         save: save,
+        saveMaterial: saveMaterial,
 //        saveAssembler: saveAssembler,
 //        saveUser: saveUser,
         loadFile: loadFile