diff --git a/js/cells/DMACell.js b/js/cells/DMACell.js
index 43037ae701840b52f2579c10bc206b8e5d146631..bd26ec84a7468b66b674bd3705c593c5f27c6d72 100644
--- a/js/cells/DMACell.js
+++ b/js/cells/DMACell.js
@@ -16,7 +16,8 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState'],
 
         //object 3d is parent to all 3d elements owned by cell: cell mesh and wireframe, parts, beams, nodes, etc
         this.object3D = this._buildObject3D();
-        this._addChildren(this._buildMesh(), this.object3D);//build cell meshes
+        this.addChildren(this._buildMesh(), this.object3D);//build cell meshes
+        this.superCell.addChildren(this.object3D);//add as child of supercell
 
         if (superCell === undefined) {
             if (this.index) three.sceneAdd(this.object3D);
@@ -34,12 +35,12 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState'],
 
     DMACell.prototype._buildObject3D = function(){
         var object3D = this._translateCell(this._rotateCell(new THREE.Object3D()));
-        if (!this.cells) object3D.myParent = this;//reference to get mouse raycasting back
+        if (!this.cells) object3D.myParent = this;//reference to get mouse raycasting back, only for lowest level of hierarchy
         object3D.name = "object3D";
         return object3D;
     };
 
-    DMACell.prototype.getObject3D = function(){//careful, used for stock sim and supercell only for now  todo need this?
+    DMACell.prototype.getObject3D = function(){//careful, used for stock sim only for now  todo need this?
         return this.object3D;
     };
 
@@ -73,7 +74,7 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState'],
         return "cell";
     };
 
-    DMACell.prototype._buildWireframe = function(mesh, geometry){//abstract mesh representation of cell
+    DMACell.prototype._buildWireframe = function(mesh, geometry){//for "cell" view
         return new THREE.Mesh(geometry, wireframeMaterial);
     };
 
@@ -128,13 +129,13 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState'],
 
 
 
+    //children
 
-
-    DMACell.prototype._addChildren = function(children, object3D){//accepts an array or a single mesh
+    DMACell.prototype.addChildren = function(children, object3D){//accepts an array or a single mesh
         this._addRemoveChildren(true, children, object3D);
     };
 
-    DMACell.prototype._removeChildren = function(children, object3D){//accepts an array or a single mesh
+    DMACell.prototype.removeChildren = function(children, object3D){//accepts an array or a single mesh
         this._addRemoveChildren(false, children, object3D);
     };
 
@@ -149,6 +150,12 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState'],
         else object3D.remove(children);
     };
 
+
+
+
+
+    //visibility
+
     DMACell.prototype.hide = function(){
         this.object3D.visible = false;
     };
@@ -165,15 +172,6 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState'],
     DMACell.prototype.setOpacity = function(opacity){
     };
 
-
-
-
-
-
-    DMACell.prototype._initParts = function(){
-        return [];//override in subclasses
-    };
-
     DMACell.prototype.setMode = function(mode){
 
         if (mode === undefined) mode = appState.get("cellMode");
@@ -189,7 +187,7 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState'],
                     this.parts = this._initParts();
                     var self = this;
                     _.each(this.parts, function(part){
-                        self._addChildren(part.getMesh());
+                        self.addChildren(part.getMesh());
                     });
                 }
                 break;
@@ -201,12 +199,32 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState'],
                 break;
         }
 
+        var visible = !(this.superCell && this.cells);//middle layers are always hidden
+
         _.each(this.object3D.children, function(child){
             if (child.name == "object3D") return;
-            child.visible = child.name == mode;
+            child.visible = child.name == visible && mode;
         });
     };
 
+
+
+
+
+
+
+    //subcomponents
+
+    DMACell.prototype._initParts = function(){
+        return [];//override in subclasses
+    };
+
+
+
+
+
+    //scale
+
     DMACell.prototype.axisScale = function(axis){
         switch (axis){
             case "x":
@@ -234,9 +252,16 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState'],
         return lattice.zScale(0);
     };
 
+
+
+
+
+
+    //destroy
+
     DMACell.prototype.destroy = function(){
         if (this.object3D) {
-            if (this.superCell) this.object3D.parent.remove(this.object3D);
+            if (this.superCell) this.superCell.removeChildren(this.object3D);
             else if (this.index) three.sceneRemove(this.object3D);
             this.object3D.myParent = null;
     //            this.object3D.dispose();
diff --git a/js/cells/supercells/DMASuperCell.js b/js/cells/supercells/DMASuperCell.js
index 62e34f99bdba1f7689295065ce325e00dfdeaf0b..c1ff7b5a4aacda019794b0e7ec70ee19bc5481ee 100644
--- a/js/cells/supercells/DMASuperCell.js
+++ b/js/cells/supercells/DMASuperCell.js
@@ -7,16 +7,11 @@
 define(['underscore', 'three', 'threeModel', 'lattice', 'appState', 'cell'],
     function(_, THREE, three, lattice, appState, DMACell){
 
-    function DMASuperCell(index, superCell){//supercells might have supercells
+    function DMASuperCell(index, material, superCell){//supercells might have supercells
 
         var range = lattice.get("superCellRange");
         this.cells = this._makeChildCells(index, range);//todo three dimensional array?
         DMACell.call(this, index, superCell);
-
-        var self = this;
-        _.each(this.cells, function(cell){
-            self._addChildren(cell.getObject3D());
-        });
     
         this.setMode();
     }
@@ -27,7 +22,7 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState', 'cell'],
         for (var x=0;x<range.x;x++){
             for (var y=0;y<range.y;y++){
                 for (var z=0;z<range.z;z++){
-                    cells.push(this._makeSubCellForIndex({x:x, y:y, z:z}));
+                    cells.push(this._makeSubCellForIndex({x:x, y:y, z:z}));//child cells add themselves to object3D
                 }
             }
         }
@@ -43,36 +38,51 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState', 'cell'],
     };
 
     DMASuperCell.prototype.setMode = function(mode){
-
-        if (mode === undefined) mode = appState.get("cellMode");
-
+        DMACell.prototype.setMode.call(mode);
         _.each(this.cells, function(cell){
             cell.setMode(mode);
         });
+    };
+
+
 
-        if (mode == "cell" || mode == "supercell") mode = "supercell";
-        else mode = "object3D";
 
-        _.each(this.object3D.children, function(child){
-            child.visible = child.name == mode;
-        });
-    };
 
     DMASuperCell.prototype.getLength = function(){
         if (this.cells) return this.cells.length-1;
         return lattice.get("superCellRange").x-1;
     };
 
+    DMASuperCell.prototype._loopCells = function(callback){
+        var cells = this.cells;
+        for (var x=0;x<cells.length;x++){
+            for (var y=0;y<cells[0].length;y++){
+                for (var z=0;z<cells[0][0].length;z++){
+                    callback(cells[x][y][z], x, y, z, this);
+                }
+            }
+        }
+    };
+
+    DMASuperCell.prototype._iterCells = function(callback){
+        var self = this;
+        var cells = this.cells;
+        _.each(cells, function(cellLayer){
+            _.each(cellLayer, function(cellColumn){
+                _.each(cellColumn, function(cell){
+                    callback(self, cell, cellColumn, cellLayer);
+                });
+            });
+
+        });
+    };
+
     DMASuperCell.prototype.destroy = function(){
-        this.object3D.myParent = null;
-        three.sceneRemove(this.object3D);
-        this.object3D = null;
-        _.each(this.cells, function(cell){
+        this._iterCells(function(cell){
             if (cell) cell.destroy();
         });
         this.cells = null;
-        this.index = null;
-        this.material = null;
+        DMACell.prototype.destroy.call();
     };
 
     return DMASuperCell;