diff --git a/src/drawer.js b/src/drawer.js
index 95da18ce..10165ffb 100644
--- a/src/drawer.js
+++ b/src/drawer.js
@@ -303,21 +303,22 @@ $.Drawer.prototype = /** @lends OpenSeadragon.Drawer.prototype */{
     canRotate: function() {
         return this.useCanvas;
     },
-	
-	/**
-	 * Destroy the drawer (unload current loaded tiles)
-	 */
-	destroy: function() {
-		
-		//unload current loaded tiles (=empty TILE_CACHE)
-		for (var i=0; i<this.tilesLoaded.length; ++i) {
-			this.tilesLoaded[i].unload();
-		}
-		
-		//force unloading of current canvas (1x1 will be gc later, trick not necessary needed)
-		this.canvas.width  = 1;
-		this.canvas.height = 1;
-	}
+
+    /**
+     * Destroy the drawer (unload current loaded tiles)
+     * @method
+     * @return null
+     */
+    destroy: function() {
+        //unload current loaded tiles (=empty TILE_CACHE)
+        for ( var i = 0; i < this.tilesLoaded.length; ++i ) {
+            this.tilesLoaded[i].unload();
+        }
+
+        //force unloading of current canvas (1x1 will be gc later, trick not necessarily needed)
+        this.canvas.width  = 1;
+        this.canvas.height = 1;
+    }
 };
 
 /**
diff --git a/src/mousetracker.js b/src/mousetracker.js
index 1017a4fa..fd4a1877 100644
--- a/src/mousetracker.js
+++ b/src/mousetracker.js
@@ -252,9 +252,9 @@
         destroy: function () {
             stopTracking( this );
             this.element = null;
-			
-			THIS[ this.hash ] = null;
-			delete THIS[ this.hash ];
+
+            THIS[ this.hash ] = null;
+            delete THIS[ this.hash ];
         },
 
         /**
diff --git a/src/viewer.js b/src/viewer.js
index 59b163b1..cb8e295f 100644
--- a/src/viewer.js
+++ b/src/viewer.js
@@ -529,6 +529,12 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
      * @fires OpenSeadragon.Viewer.event:close
      */
     close: function ( ) {
+        
+        if ( !THIS[ this.hash ] ) {
+            //this viewer has already been destroyed: returning immediately
+            return this;
+        }
+        
         if ( this._updateRequestId !== null ) {
             $.cancelAnimationFrame( this._updateRequestId );
             this._updateRequestId = null;
@@ -542,10 +548,10 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
         this.drawersContainer.innerHTML = "";
         this.overlaysContainer.innerHTML = "";
 
-		if (this.drawer) {
-			this.drawer.destroy();
-		}
-		
+        if ( this.drawer ) {
+            this.drawer.destroy();
+        }
+
         this.source     = null;
         this.drawer     = null;
         this.drawers    = [];
@@ -579,6 +585,10 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
     destroy: function( ) {
         this.close();
 
+        //TODO: implement this...
+        //this.unbindSequenceControls()
+        //this.unbindStandardControls()        
+        
         this.removeAllHandlers();
 
         // Go through top element (passed to us) and remove all children
@@ -600,10 +610,10 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
         if (this.outerTracker){
             this.outerTracker.destroy();
         }
-		
-		THIS[ this.hash ] = null;
-		delete THIS[ this.hash ];
-		
+
+        THIS[ this.hash ] = null;
+        delete THIS[ this.hash ];
+
         // clear all our references to dom objects
         this.canvas = null;
         this.keyboardCommandArea = null;
diff --git a/test/basic.js b/test/basic.js
index 969f492f..811efd3b 100644
--- a/test/basic.js
+++ b/test/basic.js
@@ -295,6 +295,7 @@
             equal(null, viewer.container);
             equal(null, viewer.element);
             equal(true, closeCalled);
+            viewer = null;
             start();
         });
         viewer.open('/test/data/testpattern.dzi');
diff --git a/test/demo/memory_check.html b/test/demo/memory_check.html
deleted file mode 100644
index b2295d10..00000000
--- a/test/demo/memory_check.html
+++ /dev/null
@@ -1,71 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-    <title>OpenSeadragon Memory Check Demo</title>
-    <script type="text/javascript" src='../../build/openseadragon/openseadragon.js'></script>
-    <style type="text/css">
-
-      .openseadragon1 {
-          width: 800px;
-          height: 600px;
-      }
-
-    </style>
-</head>
-<body>
-    <div>
-        Simple demo page to monitor OpenSeadragon Memory Usage.
-    </div>
-	<button onclick="createViewer()">Create</button>
-	<button onclick="destroyViewer()">Destroy</button>
-	
-    <div id="contentDiv" class="openseadragon1"></div>
-    <script type="text/javascript">
-
-		var _viewer;
-		
-		var generateUniqueHash = (function() {
-			var counter = 0;
-			return function() {		
-				return "seadragon_"+(counter++);
-			};
-		})();
-		
-		function createViewer() {
-			if (_viewer) {
-				destroyViewer();
-			}
-			
-			_viewer = OpenSeadragon({
-				element: document.getElementById("contentDiv"),
-				showNavigationControl: false,
-				springStiffness: 20,
-				animationTime : 1.5,
-				visibilityRatio: 1,
-				hash: "hello",
-				tileSources: {
-					Image: {
-						xmlns:    "http://schemas.microsoft.com/deepzoom/2008",
-						Url:      'http://cdn.photosynth.net/ps2/92fe5de9-dffa-4315-9095-082da8b90642/packet/undistorted/img0014/',
-						Format:   "jpg", 
-						Overlap:  1, 
-						TileSize: 510,
-						Size: {
-							Width:  4592,
-							Height: 3448
-						}
-					}
-				}
-			});
-		}
-		
-		function destroyViewer() {
-			if (_viewer) {
-				_viewer.destroy();
-			}
-			_viewer = null;
-		}
-
-    </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/test/demo/memorycheck.html b/test/demo/memorycheck.html
new file mode 100644
index 00000000..bebe80da
--- /dev/null
+++ b/test/demo/memorycheck.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>OpenSeadragon Memory Check Demo</title>
+    <script type="text/javascript" src='../../build/openseadragon/openseadragon.js'></script>
+    <style type="text/css">
+
+      .openseadragon1 {
+          width: 800px;
+          height: 600px;
+      }
+
+    </style>
+</head>
+<body>
+    <div>
+        Simple demo page to monitor OpenSeadragon Memory Usage.
+    </div>
+    <button onclick="createViewer()">Create</button>
+    <button onclick="destroyViewer()">Destroy</button>
+
+    <div id="contentDiv" class="openseadragon1"></div>
+    <script type="text/javascript">
+
+        var _viewer;
+        
+        var generateUniqueHash = (function() {
+            var counter = 0;
+            return function() {
+                return "openseadragon_" + (counter++);
+            };
+        })();
+        
+        function createViewer() {
+            if ( _viewer ) {
+                destroyViewer();
+            }
+            
+            _viewer = OpenSeadragon({
+                element: document.getElementById("contentDiv"),
+                showNavigationControl: false,
+                prefixUrl: "../../build/openseadragon/images/",
+                hash: generateUniqueHash(), //this is only needed if you want to instantiate more than one viewer at a time.
+                tileSources: "../data/testpattern.dzi"
+            });
+        }
+        
+        function destroyViewer() {
+            if ( _viewer ) {
+                _viewer.destroy();
+            }
+            _viewer = null;
+        }
+
+    </script>
+</body>
+</html>