diff --git a/js/materials/DMAMaterials.js b/js/materials/DMAMaterials.js
index 6b9ee78e2837369be54da71d53213a648275d9cd..5f40bb49291a153c62573bfd1881cf7aa3ba493f 100644
--- a/js/materials/DMAMaterials.js
+++ b/js/materials/DMAMaterials.js
@@ -12,6 +12,16 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel'], fu
         }
     };
 
+    var listener = {};
+    _.extend(listener, Backbone.Events);
+
+    listener.listenTo(appState, "change:realisticColorScheme", changeColorScheme);
+    listener.listenTo(appState, "change:materialClass", loadMaterialClass);
+    listener.listenTo(lattice, "change:connectionType cellType", loadMaterialClass);
+    listener.listenTo(appState, "change:materialType", setMaterialDefaults);
+
+    loadMaterialClass();
+
 
 
 
@@ -38,6 +48,25 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel'], fu
         return false;
     }
 
+    function deleteMaterial(id){
+        if (materialsList[id].noDelete) {
+            console.warn("no delete flag on this material type");
+            return false;
+        }
+        delete materialsList[id];//todo check if being used first
+        var deleted = true;
+        if (deleted) loadMaterialClass();//set to defaults
+        return deleted;
+    }
+
+
+
+
+
+
+
+
+
 
     function findAllChangedmaterialsList(runningList){
 //        _.each(getCompositeKeys(), function(key){
@@ -51,26 +80,26 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel'], fu
         });
     }
 
-    function deleteMaterial(id){
-        if (materialsList[id].noDelete) {
-            console.warn("no delete flag on this material type");
-            return false;
-        }
-        delete materialsList[id];//todo check if being used first
-        var deleted = true;
-        if (deleted) loadMaterialClass();//set to defaults
-        return deleted;
+    function getVaildCompositeKeys(id){//for "available materials" list in composite editor
+        var compositeKeys = getCompositeKeys();
+        var invalidKeys = getAllParentComposites(id);
+        invalidKeys.push(id);
+        return _.difference(compositeKeys, invalidKeys);
     }
 
-    var listener = {};
-    _.extend(listener, Backbone.Events);
+    function getAllParentComposites(id){
+        var parentComposites = [];
+        _.each(_.keys(materialsList), function(key){
+            if (materialsList[key].compositeChildren && materialsList[key].compositeChildren.indexOf(id)>-1){
+                parentComposites.push(key);
+            }
+        });
+        return parentComposites;
+    }
+
+    
 
-    listener.listenTo(appState, "change:realisticColorScheme", changeColorScheme);
-    listener.listenTo(appState, "change:materialClass", loadMaterialClass);
-    listener.listenTo(lattice, "change:connectionType cellType", loadMaterialClass);
-    listener.listenTo(appState, "change:materialType", setMaterialDefaults);
 
-    loadMaterialClass();
 
 
 
@@ -149,6 +178,8 @@ define(['underscore', 'three', 'appState', 'lattice', 'plist', 'threeModel'], fu
 
     return {
         list:materialsList,
-        setMaterial: setMaterial
+        setMaterial: setMaterial,
+        getCompositeKeys: getCompositeKeys,
+        getVaildCompositeKeys: getVaildCompositeKeys
     };
 });
\ No newline at end of file
diff --git a/js/menus/CompositeMenuView.js b/js/menus/CompositeMenuView.js
index afb1fbf7ee19f1783c6cded220e0b1490fdcf764..9d30fedea3967be70de469a8c7e856cf905cfa13 100644
--- a/js/menus/CompositeMenuView.js
+++ b/js/menus/CompositeMenuView.js
@@ -90,7 +90,8 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma
             return _.extend(this.model.toJSON(), plist, globals, lattice.compositeEditor.toJSON(),
                 {
                     dimensions: dimensions,
-                    materials: materials.list
+                    materials: materials.list,
+                    validCompositeMaterials: materials.getVaildCompositeKeys(lattice.compositeEditor.get("id"))
                 });
         },
 
diff --git a/js/menus/MaterialMenuView.js b/js/menus/MaterialMenuView.js
index c3ab007a61fddc3130a9f6e831049c98418b926f..fb3e6c333ec63f9361dbc6a819b1ed43696f95db 100644
--- a/js/menus/MaterialMenuView.js
+++ b/js/menus/MaterialMenuView.js
@@ -69,7 +69,7 @@ define(['jquery', 'underscore', 'menuParent', 'plist', 'lattice', 'globals', 'ma
         },
 
         _makeTemplateJSON: function(){
-            return _.extend(lattice.toJSON(), this.model.toJSON(), plist, globals, {materials:materials.list});
+            return _.extend(lattice.toJSON(), this.model.toJSON(), plist, globals, {materials:materials.list, compositeMaterialsKeys:materials.getCompositeKeys()});
         },
 
         template: _.template(template)
diff --git a/js/menus/templates/CompositeMenuView.html b/js/menus/templates/CompositeMenuView.html
index 200f89b65293c25cbb904179728039c50052a38d..90e019ebd38e121907ba3a51cd38b76b11fe9bd4 100644
--- a/js/menus/templates/CompositeMenuView.html
+++ b/js/menus/templates/CompositeMenuView.html
@@ -13,21 +13,7 @@ Available Materials:<br/>
             <span><%= allMaterials[materialClass][key].name %></span></div>
         </label>
     <% }); %>
-<% _.each(_.keys(materials), function(key){
-    if (key == id || key.substr(0,5) != "super") return;
-    <!--if (checkForLoops(key)) return;-->
-    <!--function checkForLoops(_key){-->
-        <!--console.log(materials[_key].compositeChildren);-->
-        <!--if (materials[_key].compositeChildren) {-->
-            <!--if (materials[_key].compositeChildren.indexOf(id)>0) return true;-->
-            <!--var childMatches = _.filter(materials[_key].compositeChildren, function(childKey){-->
-                <!--return checkForLoops(childKey);-->
-            <!--});-->
-            <!--if (childMatches.length>0) return true;-->
-        <!--}-->
-        <!--return false;-->
-    <!--}-->
-    %>
+<% _.each(validCompositeMaterials, function(key){%>
     <label class="radio colorSwatches">
         <input type="radio" <%if (key == materialType){ %>checked<%}%> name="materialType" value="<%= key %>" data-toggle="radio" class="custom-radio appState"><span class="icons"><span class="icon-unchecked"></span><span class="icon-checked"></span></span>
         <div class="materialColorSwatch">
diff --git a/js/menus/templates/MaterialMenuView.html b/js/menus/templates/MaterialMenuView.html
index 2efcb1e634d26f9c4f32bb7dbf8bdb638200e524..a024e35c0df3151612bdd13c2c9f6cfd89542200 100644
--- a/js/menus/templates/MaterialMenuView.html
+++ b/js/menus/templates/MaterialMenuView.html
@@ -27,8 +27,7 @@ Composite Materials:<br/>
 <% if ((cellType == "octa" && connectionType != "vertex") || cellType == "tetra"){ %>
     not available for this lattice type
 <%  } else { %>
-    <% _.each(_.keys(materials), function(key){
-        if (key.substr(0,5) != "super") return; %>
+    <% _.each(compositeMaterialsKeys, function(key){ %>
         <label class="radio colorSwatches">
             <input type="radio" <%if (key == materialType){ %>checked<%}%> name="materialType" value="<%= key %>" data-toggle="radio" class="custom-radio appState"><span class="icons"><span class="icon-unchecked"></span><span class="icon-checked"></span></span>
             <div class="materialColorSwatch">