diff --git a/js/main.js b/js/main.js
index ec7d27621ba958a1c305c55e68e5b28db579d820..d11e8da7b724c4f29f996fb7391cb6324fd49c37 100644
--- a/js/main.js
+++ b/js/main.js
@@ -7,7 +7,8 @@ $(function(){
 
     window.workers = persistentWorkers(8);
 
-    var three = new ThreeView();//singleton, my threejs view
+    var threeModel = new ThreeModel();
+    var three = new ThreeView({model:threeModel});//singleton, my threejs view
 
     //init models and views
     var fillGeometry = new FillGeometry();//singleton, mesh to fill with lattice
diff --git a/js/models/threeModel.js b/js/models/threeModel.js
new file mode 100644
index 0000000000000000000000000000000000000000..e7f2480b68dcc11f5f28744824b3a7c1da1d98cd
--- /dev/null
+++ b/js/models/threeModel.js
@@ -0,0 +1,91 @@
+/**
+ * Created by aghassaei on 1/17/15.
+ */
+
+
+function ThreeModel(){
+
+    var camera = new THREE.PerspectiveCamera(60, window.innerWidth/window.innerHeight, 1, 1000);
+    var scene = new THREE.Scene();
+    var renderer = new THREE.WebGLRenderer({antialias:false});
+
+    initialize();
+
+    function initialize(){
+
+        camera.position.z = 500;
+        scene.fog = new THREE.FogExp2(0xcccccc, 0.002);
+
+        drawRandomStuff();
+
+        // lights
+        var light = new THREE.DirectionalLight(0xffffff);
+        light.position.set(1, 1, 1);
+        scene.add(light);
+        light = new THREE.DirectionalLight(0x002288);
+        light.position.set(-1, -1, -1);
+        scene.add(light);
+        light = new THREE.AmbientLight(0x222222);
+        scene.add(light);
+
+        // renderer
+        renderer.setClearColor(scene.fog.color, 1);
+        renderer.setSize(window.innerWidth, window.innerHeight);
+
+        window.addEventListener('resize', onWindowResize, false);
+    }
+
+    function drawRandomStuff(){
+        var geometry = new THREE.CylinderGeometry(0, 10, 30, 4, 1);
+        var material = new THREE.MeshLambertMaterial({color:0xffffff, shading: THREE.FlatShading});
+
+        for ( var i = 0; i < 500; i ++ ) {
+            var mesh = new THREE.Mesh( geometry, material );
+            mesh.position.x = ( Math.random() - 0.5 ) * 1000;
+            mesh.position.y = ( Math.random() - 0.5 ) * 1000;
+            mesh.position.z = ( Math.random() - 0.5 ) * 1000;
+            mesh.updateMatrix();
+            mesh.matrixAutoUpdate = false;
+            scene.add(mesh);
+        }
+    }
+
+    function onWindowResize(){
+        camera.aspect = window.innerWidth/window.innerHeight;
+        camera.updateProjectionMatrix();
+        renderer.setSize(window.innerWidth, window.innerHeight);
+        render();
+    }
+
+    function sceneAdd(object){
+        scene.add(object)
+    }
+
+    function sceneRemove(object){
+        scene.remove(object);
+    }
+
+    function render(){
+        renderer.render(scene, camera);
+    }
+
+    function clearAll(){
+        var children = scene.children;
+        for (var i=children.length;i>=0;i--){
+            var object = children[i];
+            if (object instanceof THREE.Mesh){// && object != this.fillGeometry.get("mesh")
+                scene.remove(object);
+            }
+        }
+        render();
+    }
+
+    return {//return public properties
+        render:render,
+        clearAll: clearAll,
+        sceneRemove:sceneRemove,
+        sceneAdd:sceneAdd,
+        domElement:renderer.domElement,
+        camera:camera
+    }
+}
\ No newline at end of file
diff --git a/js/views/threeView.js b/js/views/threeView.js
index 8513e2913244e3cfcb1926a3802656b9fae1d533..e3a8f9bf09fcc7a3620877df6c44fd2c91db4144 100644
--- a/js/views/threeView.js
+++ b/js/views/threeView.js
@@ -6,95 +6,35 @@ ThreeView = Backbone.View.extend({
 
     el: "#threeContainer",
 
-    //this could break off into a model
-    camera: new THREE.PerspectiveCamera(60, window.innerWidth/window.innerHeight, 1, 1000),
-    scene: new THREE.Scene(),
-    renderer: new THREE.WebGLRenderer({antialias:false}),
+    controls: null,
 
     initialize: function(){
 
-        _.bindAll(this, "render", "animate", "onWindowResize", "clearAll");
+        _.bindAll(this, "animate");
 
-        this.camera.position.z = 500;
-        this.scene.fog = new THREE.FogExp2( 0xcccccc, 0.002);
-        this.controls = new THREE.OrbitControls(this.camera, this.$el.get(0));
-        this.controls.addEventListener('change', this.render);
+        this.controls = new THREE.OrbitControls(this.model.camera, this.$el.get(0));
+        this.controls.addEventListener('change', this.model.render);
 
-        this.drawRandomStuff();
-
-        // lights
-        var light = new THREE.DirectionalLight( 0xffffff );
-        light.position.set( 1, 1, 1 );
-        this.scene.add(light);
-        light = new THREE.DirectionalLight( 0x002288 );
-        light.position.set( -1, -1, -1 );
-        this.scene.add(light);
-        light = new THREE.AmbientLight( 0x222222 );
-        this.scene.add(light);
-
-
-        // renderer
-        this.renderer.setClearColor(this.scene.fog.color, 1);
-        this.renderer.setSize(window.innerWidth, window.innerHeight);
-        this.$el.append(this.renderer.domElement);
-
-        window.addEventListener('resize', this.onWindowResize, false);
+        this.$el.append(this.model.domElement);
 
         this.animate();
     },
 
-    drawRandomStuff: function(){
-        var geometry = new THREE.CylinderGeometry( 0, 10, 30, 4, 1 );
-        var material = new THREE.MeshLambertMaterial( { color:0xffffff, shading: THREE.FlatShading } );
-
-        for ( var i = 0; i < 500; i ++ ) {
-            var mesh = new THREE.Mesh( geometry, material );
-            mesh.position.x = ( Math.random() - 0.5 ) * 1000;
-            mesh.position.y = ( Math.random() - 0.5 ) * 1000;
-            mesh.position.z = ( Math.random() - 0.5 ) * 1000;
-            mesh.updateMatrix();
-            mesh.matrixAutoUpdate = false;
-            this.scene.add(mesh);
-        }
-    },
-
     setFillGeometry: function(fillGeometry){//call this once
         this.fillGeometry = fillGeometry;
         this.listenTo(fillGeometry, "change:geometry", this.replaceFillGeometry);
-        this.listenTo(fillGeometry, "change:orientation", this.render);
+        this.listenTo(fillGeometry, "change:orientation", this.model.render);
         this.replaceFillGeometry();
     },
 
     replaceFillGeometry: function(){
-        if (this.fillGeometry.previous("mesh")) this.scene.remove(this.fillGeometry.previous("mesh"));
-        this.scene.add(this.fillGeometry.get("mesh"));
-        this.render();
-    },
-
-    onWindowResize: function(){
-        this.camera.aspect = window.innerWidth/window.innerHeight;
-        this.camera.updateProjectionMatrix();
-        this.renderer.setSize(window.innerWidth, window.innerHeight);
-        this.render();
+        if (this.fillGeometry.previous("mesh")) this.model.sceneRemove(this.fillGeometry.previous("mesh"));
+        this.model.sceneAdd(this.fillGeometry.get("mesh"));
+        this.model.render();
     },
 
     animate: function(){
         requestAnimationFrame(this.animate);
         this.controls.update();
-    },
-
-    render: function(){
-        this.renderer.render(this.scene, this.camera);
-    },
-
-    clearAll: function(){
-        var children = this.scene.children;
-        for (var i=children.length;i>=0;i--){
-            var object = children[i];
-            if (object instanceof THREE.Mesh && object != this.fillGeometry.get("mesh")){
-                this.scene.remove(object);
-            }
-        }
-        this.render();
     }
 });
\ No newline at end of file
diff --git a/main.html b/main.html
index 58745767d5c58542d6c3b635be9dc949eba43a97..6e8122c4dcae61f56d949eaf6d6461ce6109ef71 100644
--- a/main.html
+++ b/main.html
@@ -40,6 +40,7 @@
     <script src="js/persistentWorkers.js"></script><!--global workers-->
 
     <!--models-->
+    <script src="js/models/threeModel.js"></script>
     <script src="js/models/fillGeometry.js"></script>
     <script src="js/models/lattice.js"></script>