diff --git a/asterix-examples/src/main/resources/black-cherry/cherry.tpl b/asterix-examples/src/main/resources/black-cherry/cherry.tpl
index 2a63e89..015daf2 100755
--- a/asterix-examples/src/main/resources/black-cherry/cherry.tpl
+++ b/asterix-examples/src/main/resources/black-cherry/cherry.tpl
@@ -135,10 +135,10 @@
                     <h4 class="list-group-item-heading">Location</h4>
                     <input class="textbox" type="text" id="location-text-box">
                     <div class="btn-group" data-toggle="buttons">
-                      <label class="btn btn-default">
+                      <label id="location-label" class="btn btn-default">
                         <input type="radio" id="location-button"> Location
                       </label>
-                      <label class="btn btn-default">
+                      <label id="selection-label" class="btn btn-default">
                         <input type="radio" id="selection-button"> Selection
                       </label>
                     </div>
diff --git a/asterix-examples/src/main/resources/black-cherry/static/js/cherry.js b/asterix-examples/src/main/resources/black-cherry/static/js/cherry.js
index 8beda60..898afb2 100755
--- a/asterix-examples/src/main/resources/black-cherry/static/js/cherry.js
+++ b/asterix-examples/src/main/resources/black-cherry/static/js/cherry.js
@@ -69,7 +69,7 @@
     var input = document.getElementById('location-text-box');
     var autocomplete = new google.maps.places.Autocomplete(input);
     autocomplete.bindTo('bounds', map);
-
+    
     google.maps.event.addListener(autocomplete, 'place_changed', function() {
         var place = autocomplete.getPlace();
         if (place.geometry.viewport) {
@@ -86,46 +86,28 @@
         }
     });
     
-    // UI Elements - Selection Rectangle Drawing
-    shouldDraw = false;
-    selectionRect = null;
-    var startLatLng;
-    var selectionRadio = $("#selection-button");
-    var firstClick = true;
-    
-    google.maps.event.addListener(map, 'mousedown', function (event) {
-        // only allow drawing if selection is selected
-        if (selectionRadio.hasClass("active")) {
-            startLatLng = event.latLng;
-            shouldDraw = true;
+    // Drawing Manager for selecting map regions. See documentation here:
+    // https://developers.google.com/maps/documentation/javascript/reference#DrawingManager
+    rectangleManager = new google.maps.drawing.DrawingManager({
+        drawingMode : google.maps.drawing.OverlayType.RECTANGLE,
+        drawingControl : false,
+        rectangleOptions : {
+            strokeWeight: 1,
+            clickable: false,
+            editable: true,
+            strokeColor: "2b3f8c",
+            fillColor: "2b3f8c",
+            zIndex: 1
         }
     });
-
-    google.maps.event.addListener(map, 'mousemove', drawRect);
-    function drawRect (event) {
-        if (shouldDraw) {
-            if (!selectionRect) {
-                var selectionRectOpts = {
-                    bounds: new google.maps.LatLngBounds(startLatLng, event.latLng),
-                    map: map,
-                    strokeWeight: 1,
-                    strokeColor: "2b3f8c",
-                    fillColor: "2b3f8c"
-                };
-                selectionRect = new google.maps.Rectangle(selectionRectOpts);
-                google.maps.event.addListener(selectionRect, 'mouseup', function () {
-                    shouldDraw = false;
-                });
-            } else {
-            
-                if (startLatLng.lng() < event.latLng.lng()) {
-                    selectionRect.setBounds(new google.maps.LatLngBounds(startLatLng, event.latLng));
-                } else {
-                    selectionRect.setBounds(new google.maps.LatLngBounds(event.latLng, startLatLng));
-                }
-            }
-        }
-    };
+    rectangleManager.setMap(map);
+    selectionRectangle = null;
+    
+    // Drawing Manager: Just one editable rectangle!
+    google.maps.event.addListener(rectangleManager, 'rectanglecomplete', function(rectangle) {
+        selectionRectangle = rectangle;
+        rectangleManager.setDrawingMode(null);
+    });
 
     // Open about tab to start user on a tutorial
     //$('#mode-tabs a:first').tab('show') // Select first tab
@@ -182,15 +164,17 @@
     // Explore Mode: Toggle Selection/Location Search
     $('#selection-button').on('change', function (e) {
         $("#location-text-box").attr("disabled", "disabled");
-        if (selectionRect) {
-            selectionRect.setMap(map);
+        rectangleManager.setMap(map);
+        if (selectionRectangle) {
+            selectionRectangle.setMap(null);
+            selectionRectangle = null;
+        } else {
+            rectangleManager.setDrawingMode(google.maps.drawing.OverlayType.RECTANGLE);
         }
     });
     $('#location-button').on('change', function (e) {
         $("#location-text-box").removeAttr("disabled");
-        if (selectionRect) {
-            selectionRect.setMap(null);
-        }
+        rectangleManager.setMap(null);
     });
     $("#selection-button").trigger("click");
 
@@ -210,6 +194,7 @@
 
         $("#report-message").html('');
         $("#submit-button").attr("disabled", true);
+        rectangleManager.setDrawingMode(null);
         $("body").css("cursor", "progress");
         
         var kwterm = $("#keyword-textbox").val();
@@ -228,11 +213,9 @@
 
         // Get Map Bounds
         var bounds;
-        if ($('#selection-button').hasClass("active") && selectionRect) {
-            bounds = selectionRect.getBounds();
-            alert("using rectangle");
+        if ($('#selection-label').hasClass("active") && selectionRectangle) {
+            bounds = selectionRectangle.getBounds();
         } else {
-            alert("Using map");
             bounds = map.getBounds();
         }
         
@@ -271,8 +254,9 @@
         }
     
         // Clears selection rectangle on query execution, rather than waiting for another clear call.
-        if (selectionRect) {
-            selectionRect.setMap(null);
+        if (selectionRectangle) {
+            selectionRectangle.setMap(null);
+            selectionRectangle = null;
         }
     });
 }
@@ -1028,6 +1012,8 @@
     $('#explore-mode').click(function(e) {
         $('#review-well').hide();
         $('#explore-well').show();
+        rectangleManager.setMap(map);
+        rectangleManager.setDrawingMode(google.maps.drawing.OverlayType.RECTANGLE);
         mapWidgetResetMap();
     });
         
@@ -1036,6 +1022,7 @@
         $('#explore-well').hide();
         $('#review-well').show();
         mapWidgetResetMap();
+        rectangleManager.setMap(null);
     });
 
     // Does some alignment necessary for the map canvas
@@ -1088,16 +1075,17 @@
 * Clears ALL map elements - plotted items, overlays, then resets position
 */
 function mapWidgetResetMap() {
-
-    if (selectionRect) {
-        selectionRect.setMap(null);
-    }
     
     mapWidgetClearMap();
     
     // Reset map center and zoom
     map.setCenter(new google.maps.LatLng(38.89, -77.03));
     map.setZoom(4);
+    
+    // Selection button
+    $("#selection-button").trigger("click");
+    rectangleManager.setMap(map);
+    rectangleManager.setDrawingMode(google.maps.drawing.OverlayType.RECTANGLE);
 }
 
 /**
@@ -1122,9 +1110,17 @@
     }
     map_tweet_markers = [];
     
+    // Hide legend
     $("#rainbow-legend-container").hide();
   
+    // Reenable submit button
     $("#submit-button").attr("disabled", false);
+    
+    // Hide selection rectangle
+    if (selectionRectangle) {
+        selectionRectangle.setMap(null);
+        selectionRectangle = null;
+    }
 }
 
 /**
