diff --git a/index.html b/index.html
index a905ae10e8e5c38e9888e468c12ce6026b043479..d12d1680b321c54f7af27353fae0dbac3ee810fc 100644
--- a/index.html
+++ b/index.html
@@ -44,16 +44,16 @@
     <script src="js/fea/DmaNode.js"></script>
     <script src="js/fea/DmaBeam.js"></script>
 
-    <script src="js/cell/DmaCell.js"></script>
-    <script src="js/cell/OctaFaceCell.js"></script>
-    <script src="js/cell/OctaEdgeCell.js"></script>
-    <script src="js/cell/OctaRotEdgeCell.js"></script>
-    <script src="js/cell/OctaVertexCell.js"></script>
-
-    <script src="js/cell/DMASuperCell.js"></script>
-    <script src="js/cell/DMACellFreeform.js"></script>
-    <script src="js/cell/DmaCellTetra.js"></script>
-    <script src="js/cell/DmaCellOther.js"></script>
+    <script src="js/cells/DmaCell.js"></script>
+    <script src="js/cells/OctaFaceCell.js"></script>
+    <script src="js/cells/OctaEdgeCell.js"></script>
+    <script src="js/cells/OctaRotEdgeCell.js"></script>
+    <script src="js/cells/OctaVertexCell.js"></script>
+
+    <script src="js/cells/DMASuperCell.js"></script>
+    <script src="js/cells/DMACellFreeform.js"></script>
+    <script src="js/cells/DmaCellTetra.js"></script>
+    <script src="js/cells/DmaCellOther.js"></script>
 
     <script src="js/fea/DmaPart.js"></script>
 
diff --git a/js/cell/DMACell.js b/js/cells/DMACell.js
similarity index 86%
rename from js/cell/DMACell.js
rename to js/cells/DMACell.js
index 0e01d770131f84969c9e1b31b6e7f66e71fd78f0..49f71dd2e8c13332dcd05db8f8cd8a5a14729e0e 100644
--- a/js/cell/DMACell.js
+++ b/js/cells/DMACell.js
@@ -7,28 +7,26 @@ var cellMaterial = new THREE.MeshNormalMaterial();
 var wireframeMaterial = new THREE.MeshBasicMaterial({color:0x000000, wireframe:true});
 
 function DMACell(indices){
+
     this.indices = indices;
-    this.object3D = this._translateCell(this._rotateCell(new THREE.Object3D()));
-    this.object3D.myParent = this;//reference to get mouse raycasting back
-    this._buildMesh(this.object3D);
+
+    //object 3d is parent to all 3d elements related to cell, parts, beams, nodes, etc
+    this.object3D = this._buildObject3D();
+    this._addMeshes(this._buildMesh(), this.object3D);//build cell meshes
     globals.three.sceneAdd(this.object3D, this._getSceneType());
+
     this.setMode();
 }
 
+DMACell.prototype._getSceneType = function(){
+    if (this.indices) return "cell";
+    return null;
+};
 
-
-
-
-DMACell.prototype._buildMesh = function(object3D){//called from every subclass
-    var geometry = this._getGeometry();
-    if (!object3D || object3D === undefined) object3D = this.object3D;
-
-    var mesh = new THREE.Mesh(geometry, cellMaterial);
-    mesh.name = "cell";
-    object3D.add(mesh);
-    var wireframe = new THREE.Mesh(geometry, wireframeMaterial);
-    wireframe.name = "cell";
-    object3D.add(wireframe);
+DMACell.prototype._buildObject3D = function(){
+    var object3D = this._translateCell(this._rotateCell(new THREE.Object3D()));
+    object3D.myParent = this;//reference to get mouse raycasting back
+    return object3D;
 };
 
 DMACell.prototype._rotateCell = function(object3D){
@@ -41,10 +39,26 @@ DMACell.prototype._translateCell = function(object3D){
     return object3D;
 };
 
+DMACell.prototype._addMeshes = function(meshes, object3D){//accepts an array or a single mesh
+    if (object3D === undefined) object3D = this.object3D;
+    if (meshes.constructor === Array){
+        _.each(meshes, function(mesh){
+            object3D.add(mesh);
+        });
+    } else object3D.add(meshes);
+};
 
-
-
-
+DMACell.prototype._buildMesh = function(){//called from every subclass
+    var geometry = this._getGeometry();
+    var meshes = [];
+    var mesh = new THREE.Mesh(geometry, cellMaterial);
+    mesh.name = "cell";
+    var wireframe = new THREE.Mesh(geometry, wireframeMaterial);
+    wireframe.name = "cell";
+    meshes.push(mesh);
+    meshes.push(wireframe);
+    return meshes;
+};
 
 DMACell.prototype._initParts = function(){
     return [];//override in subclasses
@@ -53,11 +67,6 @@ DMACell.prototype._initParts = function(){
 DMACell.prototype.changePartType = function(){//override in subclasses
 };
 
-
-
-
-
-
 DMACell.prototype.setMode = function(mode){
 
     if (mode === undefined) mode = globals.appState.get("cellMode");
@@ -74,8 +83,6 @@ DMACell.prototype.setMode = function(mode){
         case "node":
             if (!this.nodes) this.nodes = this._initNodes();
             break;
-        case "hide":
-            break;
     }
 
     _.each(this.object3D.children, function(child){
@@ -94,18 +101,6 @@ DMACell.prototype.show = function(){
 DMACell.prototype.setOpacity = function(opacity){
 };
 
-DMACell.prototype._getSceneType = function(){
-    if (this.indices) return "cell";
-    return null;
-};
-
-
-
-
-
-
-
-
 DMACell.prototype.getPosition = function(){
     return this.object3D.position.clone();
 };
@@ -130,11 +125,6 @@ DMACell.prototype.zScale = function(){
     return globals.lattice.zScale(0);
 };
 
-
-
-
-
-
 DMACell.prototype.destroy = function(){
     if (this.destroyStarted) return;
     this.destroyStarted = true;
diff --git a/js/cell/DMACellFreeform.js b/js/cells/DMACellFreeform.js
similarity index 100%
rename from js/cell/DMACellFreeform.js
rename to js/cells/DMACellFreeform.js
diff --git a/js/cell/DMASuperCell.js b/js/cells/DMASuperCell.js
similarity index 100%
rename from js/cell/DMASuperCell.js
rename to js/cells/DMASuperCell.js
diff --git a/js/cell/DmaCellOld.js b/js/cells/DmaCellOld.js
similarity index 100%
rename from js/cell/DmaCellOld.js
rename to js/cells/DmaCellOld.js
diff --git a/js/cell/DmaCellOther.js b/js/cells/DmaCellOther.js
similarity index 100%
rename from js/cell/DmaCellOther.js
rename to js/cells/DmaCellOther.js
diff --git a/js/cell/DmaCellTetra.js b/js/cells/DmaCellTetra.js
similarity index 100%
rename from js/cell/DmaCellTetra.js
rename to js/cells/DmaCellTetra.js
diff --git a/js/cell/OctaEdgeCell.js b/js/cells/OctaEdgeCell.js
similarity index 100%
rename from js/cell/OctaEdgeCell.js
rename to js/cells/OctaEdgeCell.js
diff --git a/js/cell/OctaFaceCell.js b/js/cells/OctaFaceCell.js
similarity index 100%
rename from js/cell/OctaFaceCell.js
rename to js/cells/OctaFaceCell.js
diff --git a/js/cell/OctaRotEdgeCell.js b/js/cells/OctaRotEdgeCell.js
similarity index 100%
rename from js/cell/OctaRotEdgeCell.js
rename to js/cells/OctaRotEdgeCell.js
diff --git a/js/cell/OctaVertexCell.js b/js/cells/OctaVertexCell.js
similarity index 100%
rename from js/cell/OctaVertexCell.js
rename to js/cells/OctaVertexCell.js
diff --git a/js/parts/DMAPart.js b/js/parts/DMAPart.js
new file mode 100644
index 0000000000000000000000000000000000000000..9311de8510e74109622bab3b3c47260c3c6a673a
--- /dev/null
+++ b/js/parts/DMAPart.js
@@ -0,0 +1,61 @@
+/**
+ * Created by aghassaei on 5/26/15.
+ */
+
+
+var partMaterial = new THREE.MeshLambertMaterial({ color:0xffffff, shading: THREE.FlatShading });
+    partMaterial.color.setRGB( 0.9619657144369509, 0.6625466032079207, 0.20799727886007258 );
+
+function DMAPart(index) {
+    this.index = index;
+    this.mesh = this._buildMesh();
+}
+
+DMAPart.prototype._buildMesh = function(){
+    var geometry = this._getGeometry();
+    var mesh = new THREE.Mesh(geometry, partMaterial);
+    mesh.name = "part";
+    return mesh;
+};
+
+DMAPart.prototype._draw = function(){
+    if (this.mesh) console.warn("part mesh already in scene");
+    this.mesh = this._makeMeshForType(this.type);
+    var rotation = this.parentCell.getEulerRotation();
+    this.mesh.rotation.set(rotation.x, rotation.y, rotation.z);
+    this._setMeshPosition(this.parentCell.getPosition());
+    globals.three.sceneAdd(this.mesh, "part");
+};
+
+DMAPart.prototype.highlight = function(){
+//        this.mesh.material.color.setRGB(1,0,0);
+};
+
+DMAPart.prototype.unhighlight = function(){
+//        if (this.mesh) this.mesh.material.color.setRGB(0.9619657144369509, 0.6625466032079207, 0.20799727886007258);
+};
+
+DMAPart.prototype.removeFromCell = function(){//send message back to parent cell to destroy this
+    if (this.parentCell) {
+        this.parentCell.removePart(this.type);
+        globals.three.render();
+    } else console.warn("part has no parent cell");
+};
+
+DMAPart.prototype.destroy = function(){
+    if (this.mesh) {
+        globals.three.sceneRemove(this.mesh, "part");
+        this.mesh.myPart = null;
+//            this.mesh.dispose();
+//            geometry.dispose();
+//            material.dispose();
+        this.mesh = null;
+    }
+    this.parentCell = null;
+    this.type = null;
+};
+
+DMAPart.prototype.toJSON = function(){
+    return {
+    }
+};
diff --git a/js/parts/OctaSquarePart.js b/js/parts/OctaSquarePart.js
new file mode 100644
index 0000000000000000000000000000000000000000..3a69655c88c371a20fe62e547001ccf24a03ab85
--- /dev/null
+++ b/js/parts/OctaSquarePart.js
@@ -0,0 +1,3 @@
+/**
+ * Created by aghassaei on 5/26/15.
+ */
diff --git a/js/parts/OctaTrianglePart.js b/js/parts/OctaTrianglePart.js
new file mode 100644
index 0000000000000000000000000000000000000000..3a69655c88c371a20fe62e547001ccf24a03ab85
--- /dev/null
+++ b/js/parts/OctaTrianglePart.js
@@ -0,0 +1,3 @@
+/**
+ * Created by aghassaei on 5/26/15.
+ */
diff --git a/js/parts/OctaXPart.js b/js/parts/OctaXPart.js
new file mode 100644
index 0000000000000000000000000000000000000000..3a69655c88c371a20fe62e547001ccf24a03ab85
--- /dev/null
+++ b/js/parts/OctaXPart.js
@@ -0,0 +1,3 @@
+/**
+ * Created by aghassaei on 5/26/15.
+ */