diff --git a/dependencies/loaders/binary_stl_writer.js b/dependencies/loaders/binary_stl_writer.js
new file mode 100755
index 0000000000000000000000000000000000000000..047cf7aef07437af8ddc26761c637a1dd5201f3d
--- /dev/null
+++ b/dependencies/loaders/binary_stl_writer.js
@@ -0,0 +1,60 @@
+// Written by Paul Kaplan
+
+
+var geometryToSTLBin = function(geometryArray) {
+
+    var writeVector = function(dataview, bufferIndex, vector, offset, orientation, isLittleEndian) {
+        vector = vector.clone();
+        console.log(orientation);
+        if (orientation) vector.applyQuaternion(orientation);
+        if (offset) vector.add(offset);
+        bufferIndex = writeFloat(dataview, bufferIndex, vector.x, isLittleEndian);
+        bufferIndex = writeFloat(dataview, bufferIndex, vector.y, isLittleEndian);
+        return writeFloat(dataview, bufferIndex, vector.z, isLittleEndian);
+    };
+
+    var writeFloat = function(dataview, bufferIndex, float, isLittleEndian) {
+        dataview.setFloat32(bufferIndex, float, isLittleEndian);
+        return bufferIndex + 4;
+    };
+
+
+    var isLittleEndian = true; // STL files assume little endian, see wikipedia page
+    var floatData = [];
+
+    for (var index = 0;index<geometryArray.length;index++){
+
+        var geometry = geometryArray[index].geo;
+        var orientation = geometryArray[index].orientation;
+        var offset = geometryArray[index].offset;
+        var tris = geometry.faces;
+        var verts = geometry.vertices;
+
+        for(var n = 0; n < tris.length; n++) {
+            floatData.push([tris[n].normal, verts[tris[n].a], verts[tris[n].b], verts[tris[n].c], offset, orientation]);
+        }
+    }
+
+    //write to DataView
+    var bufferSize = 84 + (50 * floatData.length);
+    var buffer = new ArrayBuffer(bufferSize);
+    var dv = new DataView(buffer);
+    var bufferIndex = 0;
+
+    bufferIndex += 80; // Header is empty
+
+    dv.setUint32(bufferIndex, floatData.length, isLittleEndian);
+    bufferIndex += 4;
+
+    for (var i=0;i<floatData.length;i++){
+        bufferIndex = writeVector(dv, bufferIndex, floatData[i][0], null, floatData[i][5], isLittleEndian);
+        for (var j=1;j<4;j++){
+            bufferIndex = writeVector(dv, bufferIndex, floatData[i][j], floatData[i][4], floatData[i][5], isLittleEndian);
+        }
+        bufferIndex += 2; // unused 'attribute byte count' is a Uint16
+    }
+
+
+    return dv;
+};
+
diff --git a/js/cells/DMACell.js b/js/cells/DMACell.js
index 4fd8903ef5db0bac224ccf454c50da6cdf13c847..3d1619ce0b61ca8f6b0466c46236a6cf89f94f59 100644
--- a/js/cells/DMACell.js
+++ b/js/cells/DMACell.js
@@ -352,8 +352,9 @@ define(['underscore', 'three', 'threeModel', 'lattice', 'appState', 'globals', '
     DMACell.prototype.getVisibleGeometry = function(){//for save stl
         var meshes = this.getVisibleMeshes();
         var geometry = [];
+        var self = this;
         _.each(meshes, function(mesh){
-            geometry.push(mesh.geometry);
+            geometry.push({geo: mesh.geometry, offset:self.getAbsolutePosition(), orientation:self.getAbsoluteOrientation()});
         });
         return geometry;
     };
diff --git a/js/main.js b/js/main.js
index 8708ab9cc6e55cd7e8844ddc8d2af30d8d2d324c..a7ea11aef4a6377a720358e1822108dea8c16e5f 100644
--- a/js/main.js
+++ b/js/main.js
@@ -23,7 +23,7 @@ require.config({
         three: '../dependencies/three',
         orbitControls: '../dependencies/OrbitControls',
         stlLoader: '../dependencies/loaders/STLLoader',
-        stlExport: '../dependencies/THREE2STL',
+        stlExport: '../dependencies/loaders/binary_stl_writer',
         threeModel: 'three/ThreeModel',
         threeView: 'three/ThreeView',
         fillGeometry: 'three/FillGeometry',
@@ -241,7 +241,7 @@ require.config({
             exports: 'THREE'
         },
         stlExport: {
-            exports: 'stlFromGeometry'
+            exports: 'geometryToSTLBin'
         },
         threeProjector: {
             deps: ['three'],
diff --git a/js/models/FileSaver.js b/js/models/FileSaver.js
index 7ba3899cf0ff9409245e2771369c49d0a709198e..7fcdb152177dcc9f45e6615a068c050b53f3d948 100644
--- a/js/models/FileSaver.js
+++ b/js/models/FileSaver.js
@@ -130,14 +130,15 @@ define(['underscore', 'fileSaverLib', 'lattice', 'materials', 'ribbon', 'menuWra
     }
 
     function saveSTL(){
-        require(['stlExport'], function(stlFromGeometry){
+        require(['stlExport'], function(geometryToSTLBin){
             //merge geometry first
             var geoArray = [];
             lattice.loopCells(function(cell){
                 if (cell) geoArray = geoArray.concat(cell.getVisibleGeometry());
             });
-            var stlString = stlFromGeometry(geoArray);
-            saveData(stlString, "DMAssembly", "stl");
+            var stlBin = geometryToSTLBin(geoArray);
+            var blob = new Blob([stlBin], {type: 'application/octet-binary'});
+            saveAs(blob, "STL.stl");
         });
     }