diff --git a/js/elementMenu.js b/js/elementMenu.js
index f0ff7292060b45eb4d9a7f6d20c1206d0f459b91..035c212de2fcd04f6fa7b1d2bf5e93ed46251c0f 100644
--- a/js/elementMenu.js
+++ b/js/elementMenu.js
@@ -2,26 +2,54 @@
  * Created by aghassaei on 1/8/15.
  */
 
+var Parallel = Parallel || {};
+
 $(function(){
 
+    three = three || {};
+    modelMesh = modelMesh || {};
+
     $("#elementCube").click(function(e){
         e.preventDefault();
 
-        for ( var i = 0; i < 500; i ++ ) {
-            var mesh = createCubeGeometry(10);
-            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;
-            three.scene.add( mesh );
+        var cubeDim = 10;
+        var boundingBox = new THREE.Box3();
+        boundingBox.setFromObject(modelMesh);
+
+        var xRange = [];
+        for (var x=boundingBox.min.x;x<boundingBox.max.x;x+=cubeDim){
+           xRange.push(x);
+        }
+
+        var threads = new Parallel(xRange, {env:{boundingBox:boundingBox, three:three, cubeDim:cubeDim, modelMesh:modelMesh}}).require(
+            {fn:THREE.Vector3,name:'Vector3'}, {fn:THREE.Raycaster,name:'Raycaster'}, {fn:THREE.Ray,name:'Ray'},
+            createCubeGeometry, {fn:THREE.BoxGeometry,name:'BoxGeometry'}, {fn:THREE.MeshLambertMaterial,name:'MeshLambertMaterial'},
+            {fn:THREE.Geometry,name:'Geometry'}
+        );
+        threads.map(fillWithElements).then(three.render);
+
+        function fillWithElements(x){
+            var cubeDim = global.env.cubeDim;
+
+            for (var y=global.env.boundingBox.min.y;y<global.env.boundingBox.max.y;y+=cubeDim){
+                for (var z=global.env.boundingBox.min.z;z<global.env.boundingBox.max.z;z+=cubeDim){
+                    var raycaster = new Raycaster(new Vector3(x+cubeDim/2, y+cubeDim/2, z+cubeDim/2),
+                        new Vector3(0, 0, 1), 0, global.env.boundingBox.max.z-z+cubeDim/2);
+//                    if (raycaster.intersectObject(global.env.modelMesh).length % 2 == 1) {
+                        var mesh = createCubeGeometry(cubeDim);
+                        mesh.position.set(x+cubeDim/2, y+cubeDim/2, z+cubeDim/2);
+                        mesh.updateMatrix();
+                        mesh.matrixAutoUpdate = false;
+                        global.env.three.scene.add(mesh);
+//                    }
+                }
+            }
         }
-        three.render();
     });
 
     function createCubeGeometry(size){
-        var geometry = new THREE.BoxGeometry(size, size, size);
-        var material = new THREE.MeshLambertMaterial( { color:0xffffff, shading: THREE.FlatShading } );
+        var geometry = new BoxGeometry(size, size, size);
+        var material = new MeshLambertMaterial( { color:0xffffff} );
         return new THREE.Mesh( geometry, material );
     }
 
diff --git a/js/importMenu.js b/js/importMenu.js
index 9c447ef5999f367a02877936a309cd9286db0746..18a60cf636f683c776bc3fa53e918c9fde2c2ea3 100644
--- a/js/importMenu.js
+++ b/js/importMenu.js
@@ -8,7 +8,7 @@ $(function(){
 
     three = three || {};
 
-    var modelMesh = {};
+    modelMesh = {};
     var modelScaleSlider = $('#stlModelScale');
 
     function loadSTL(file){
@@ -16,7 +16,8 @@ $(function(){
   	    loader.addEventListener( 'load', function (e) {
   		    var geometry = e.content;
             resetUI();
-            modelMesh = new THREE.Mesh(geometry);
+            var material = new THREE.MeshLambertMaterial( { color:0xffa500, shading: THREE.FlatShading, transparent:true, opacity:0.5, side:THREE.DoubleSide} );
+            modelMesh = new THREE.Mesh(geometry, material);
   		    three.scene.add(modelMesh);
             three.render();
             showDimensions(1);
@@ -33,7 +34,9 @@ $(function(){
 
     $(".stlImport").click(function(e){
         e.preventDefault();
-        loadSTL('data/' + $(this).data("file"));
+        var fileName = $(this).data("file");
+        loadSTL('data/' + fileName);
+        setFileName(fileName);
     });
 
     $("#uploadSTL").change(function() {
diff --git a/main.html b/main.html
index f8c5f130962784ae6cb900af0a30e8d87c101715..ef4d14b71dff62d91d6e2a32d06dc317f5ecdb93 100644
--- a/main.html
+++ b/main.html
@@ -30,6 +30,9 @@
     <!--stl export-->
     <script src="dependencies/THREE2STL.js"></script>
 
+    <!--CSG-->
+    <script src="dependencies/ThreeCSG.js"></script>
+
     <!--multi-threading-->
     <script src="dependencies/parallel.js"></script>