diff --git a/js/three/BasePlane.js b/js/three/BasePlane.js
index d561e29e061961a08d5e4ad9f5e8aaa1f61416d9..96a22a05281ef4b1a7d85505b0537a0b42f92dbe 100644
--- a/js/three/BasePlane.js
+++ b/js/three/BasePlane.js
@@ -7,7 +7,7 @@ BasePlane = Backbone.Model.extend({
 
     defaults: {
         zIndex: 0,
-        mesh: [],
+        object3D: null,
         dimX: 100,
         dimY: 100,
         material: new THREE.MeshBasicMaterial({color:0x000000, transparent:true, opacity:0.2, wireframe:true})
@@ -20,12 +20,14 @@ BasePlane = Backbone.Model.extend({
         this.listenTo(globals.appState, "change:basePlaneIsVisible", this._setVisibility);
 
         //draw mesh
-        this.set("mesh", this._makeBasePlaneMesh());
-
-        var self = this;
-        _.each(this.get("mesh"), function(mesh){
-            globals.three.sceneAdd(mesh, self._checkIsHighlightable(mesh));
+        var meshes = this._makeBasePlaneMesh();
+        var object3D = new THREE.Object3D();
+        _.each(meshes, function(mesh){
+            object3D.add(mesh);
         });
+        object3D.myParent = this;
+        this.set("object3D", object3D);
+        globals.three.sceneAdd(object3D, "basePlane");
         globals.three.render();
         this._setVisibility();
     },
@@ -37,31 +39,17 @@ BasePlane = Backbone.Model.extend({
     },
 
     _setVisibility: function(){
-        _.each(this.get("mesh"), function(mesh){
-            mesh.visible = globals.appState.get("basePlaneIsVisible");
-        });
+        this.get("object3D").visible = globals.appState.get("basePlaneIsVisible");
         globals.three.render();
     },
 
-    ///////////////////////////////////////////////////////////////////////////////////
-    //////////////////////HIGHLIGHTER FUNCTIONALITY////////////////////////////////////
-    ///////////////////////////////////////////////////////////////////////////////////
-
-    _checkIsHighlightable: function(mesh){
-        if (mesh.type == "Mesh") return "basePlane";//don't try to highlight wireframe parts of baseplane
-        return null;
-    },
-
     ///////////////////////////////////////////////////////////////////////////////////
     ////////////////////////////////////////DEALLOC////////////////////////////////////
     ///////////////////////////////////////////////////////////////////////////////////
 
     _removeMesh: function(){
-        var self = this;
-        _.each(this.get("mesh"), function(mesh){
-            if (mesh.myParent) mesh.myParent = null;
-            globals.three.sceneRemove(mesh, self._checkIsHighlightable(mesh));
-        });
+        this.get("object3D").myParent = null;
+        globals.three.sceneRemove(this.get("object3D"), "basePlane");
         globals.three.render();
     },
 
@@ -69,7 +57,7 @@ BasePlane = Backbone.Model.extend({
         this.stopListening();
         this.set("zIndex", null, {silent:true});
         this._removeMesh();
-        this.set("mesh", null, {silent:true});
+        this.set("object3D", null, {silent:true});
         this.set("material", null, {silent:true});
         this.set("unitGeometry", null, {silent:true});
         this.set("dimX", null, {silent:true});
@@ -113,9 +101,7 @@ OctaBasePlane = BasePlane.extend({
         }
 
         geometry.computeFaceNormals();
-        var mesh = new THREE.Mesh(geometry, this.get("material"));
-        mesh.myParent = this;//reference used for intersection highlighting
-        return [mesh];
+        return [THREE.Mesh(geometry, this.get("material"))];
     },
 
     getType: function(){//todo hack from freeform octa, get rid of this eventually
diff --git a/js/three/Highlighter.js b/js/three/Highlighter.js
index 93a59b8dfde63309384ba4c7d5097d4d012468d9..2be2eb5061dcb25ff7fd55c13826a820c160dcee 100644
--- a/js/three/Highlighter.js
+++ b/js/three/Highlighter.js
@@ -21,7 +21,7 @@ Highlighter = Backbone.View.extend({
 //                vertexColors:THREE.FaceColors
             }));
 
-        globals.three.sceneAdd(this.mesh, null);
+        globals.three.sceneAdd(this.mesh, "highlighter");
         this.hide();
 
         //bind events
@@ -66,7 +66,10 @@ Highlighter = Backbone.View.extend({
         if (!intersection.object) return;
         var highlighted = intersection.object;
         if (!(highlighted.parent instanceof THREE.Scene)) highlighted = highlighted.parent;//cell mesh parent is object3d
-        if (!highlighted.myParent) console.warn("no parent for highlighted object");
+        if (!highlighted.myParent) {
+            console.warn("no parent for highlighted object");
+            return;
+        }
 
         this.highlightedObject = highlighted.myParent;
 
diff --git a/js/three/ThreeModel.js b/js/three/ThreeModel.js
index a3a13c6397febfc482358eb034f3fe2ea4efe483..ceb13b3868e3430a911157c3f8b0b1750998519c 100644
--- a/js/three/ThreeModel.js
+++ b/js/three/ThreeModel.js
@@ -53,6 +53,7 @@ function ThreeModel(){
     }
 
     function sceneAdd(object, type){
+
         scene.add(object);
 
         if (type == "cell"){
@@ -65,7 +66,12 @@ function ThreeModel(){
         } else if (type == "part"){//todo change this
 //            parts.push(object);
         } else if (type == "basePlane"){
-            basePlane.push(object);
+            basePlane.push(object.children[0]);
+        } else if (type == "highlighter"){
+
+        } else {
+            console.warn("no recognized type " + type + " for");
+//            console.log(object);
         }
     }
 
@@ -73,11 +79,20 @@ function ThreeModel(){
 
         if (type == "cell"){
             cells.splice(cells.indexOf(object.children[0]), 1);
+        } else if (type == "supercell"){
+            _.each(object.children, function(child){//add cells as hover
+                if (child.name != "object3D") return;
+                cells.splice(cells.indexOf(child.children[0]), 1);
+            });
         } else if (type == "part"){
 //            parts.splice(parts.indexOf(object), 1);
         } else if (type == "basePlane"){
             basePlane.splice(0, basePlane.length);//delete array without removing reference
+        } else {
+//            console.warn("no recognized type " + type + " for");
+//            console.log(object);
         }
+
         scene.remove(object);
     }