diff --git a/includes/behaviors/js/openlayers_behavior_argparser.js b/includes/behaviors/js/openlayers_behavior_argparser.js
index 38383b2..07cb3e7 100644
--- a/includes/behaviors/js/openlayers_behavior_argparser.js
+++ b/includes/behaviors/js/openlayers_behavior_argparser.js
@@ -4,20 +4,9 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-
-(function($) {
 /**
  * ArgParser Behavior
  */
-Drupal.behaviors.openlayers_behavior_argparser = {
-  'attach': function(context, settings) {
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_argparser']) {
-      // Add control
-      var control = new OpenLayers.Control.ArgParser();
-      data.openlayers.addControl(control);
-      control.activate();
-    }
-  }
-};
-})(jQuery);
+Drupal.openlayers.addBehavior('argparser', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'ArgParser');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_attribution.js b/includes/behaviors/js/openlayers_behavior_attribution.js
index 65f2ee9..3ecb6d5 100644
--- a/includes/behaviors/js/openlayers_behavior_attribution.js
+++ b/includes/behaviors/js/openlayers_behavior_attribution.js
@@ -3,20 +3,10 @@
  * @file
  * JS Implementation of OpenLayers behavior.
  */
-
+ 
 /**
  * Attribution Behavior
  */
-(function($) {
-Drupal.behaviors.openlayers_behavior_attribution = {
-  'attach': function(context, settings) {
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_attribution']) {
-      // Add control
-      var control = new OpenLayers.Control.Attribution();
-      data.openlayers.addControl(control);
-      control.activate();
-    }
-  }
-};
-})(jQuery);
+Drupal.openlayers.addBehavior('attribution', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'Attribution');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_boxselect.js b/includes/behaviors/js/openlayers_behavior_boxselect.js
index 7dad984..d7e5dec 100644
--- a/includes/behaviors/js/openlayers_behavior_boxselect.js
+++ b/includes/behaviors/js/openlayers_behavior_boxselect.js
@@ -4,46 +4,40 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-(function($) {
-/**
- * Box Select Behavior
- */
-var selections_layer;
-Drupal.behaviors.openlayers_behavior_boxselect = {
-  'attach': function(context, settings) {
+(function ($) {
+  /**
+   * Box Select Behavior
+   */
+  Drupal.openlayers.addBehavior('boxselect', function (data) {
     function setRestrictedExtent(box) {
-      bounding_box = box.geometry.getBounds().toBBOX();
+      var bounding_box = box.geometry.getBounds().toBBOX();
       $('#edit-center-restrict-restrictedextent').val(bounding_box);
-      for (i = 0; i < selections_layer.features.length; i++) {
+      for (var i = 0; i < selections_layer.features.length; i++) {
         if (selections_layer.features[i] != box) {
           selections_layer.features[i].destroy();
         }
       }
     }
 
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_boxselect']) {
-      selections_layer = new OpenLayers.Layer.Vector('Temporary Box Layer');
-      control = new OpenLayers.Control.DrawFeature(selections_layer,
-          OpenLayers.Handler.RegularPolygon, {
-              featureAdded: setRestrictedExtent
-          }
-      );
-      control.handler.setOptions({
-          'keyMask': OpenLayers.Handler.MOD_SHIFT,
-          'sides': 4,
-          'irregular': true});
-      control.events.on({'featureAdded': this.setRestrictedExtent});
-      data.openlayers.addLayer(selections_layer);
-      data.openlayers.addControl(control);
-      if ($('#edit-center-restrict-restrictedextent').val()) {
-        bounds = $('#edit-center-restrict-restrictedextent').val();
-        geometry = new OpenLayers.Bounds.fromString(bounds).toGeometry();
-        feature = new OpenLayers.Feature.Vector(geometry);
-        selections_layer.addFeatures([feature]);
-      }
-      control.activate();
+    var selections_layer = new OpenLayers.Layer.Vector('Temporary Box Layer');
+    var control = new OpenLayers.Control.DrawFeature(selections_layer,
+        OpenLayers.Handler.RegularPolygon, {
+            featureAdded: setRestrictedExtent
+        }
+    );
+    control.handler.setOptions({
+        'keyMask': OpenLayers.Handler.MOD_SHIFT,
+        'sides': 4,
+        'irregular': true});
+    control.events.on({'featureAdded': this.setRestrictedExtent});
+    data.openlayers.addLayer(selections_layer);
+    data.openlayers.addControl(control);
+    if ($('#edit-center-restrict-restrictedextent').val()) {
+      bounds = $('#edit-center-restrict-restrictedextent').val();
+      geometry = new OpenLayers.Bounds.fromString(bounds).toGeometry();
+      feature = new OpenLayers.Feature.Vector(geometry);
+      selections_layer.addFeatures([feature]);
     }
-  }
-};
-})(jQuery);
+    control.activate();
+  });
+}(jQuery));
diff --git a/includes/behaviors/js/openlayers_behavior_cluster.js b/includes/behaviors/js/openlayers_behavior_cluster.js
index e966ce8..2887848 100644
--- a/includes/behaviors/js/openlayers_behavior_cluster.js
+++ b/includes/behaviors/js/openlayers_behavior_cluster.js
@@ -4,50 +4,41 @@
  * OpenLayers Behavior implementation for clustering.
  */
 
-(function ($) {
-  
 /**
  * OpenLayers Cluster Behavior
  */
-Drupal.behaviors.openlayers_cluster = {
-  attach: function(context) {
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors.openlayers_behavior_cluster) {
-      var options = data.map.behaviors.openlayers_behavior_cluster;
-      var map = data.openlayers;
-      var distance = parseInt(options.distance, 10);
-      var threshold = parseInt(options.threshold, 10);
-      var layers = [];
-      for (var i in options.clusterlayer) {
-        var selectedLayer = map.getLayersBy('drupalID', options.clusterlayer[i]);
-        if (typeof selectedLayer[0] != 'undefined') {
-          layers.push(selectedLayer[0]);
-        }
-      }
+Drupal.openlayers.addBehavior('cluster', function (data, options) {
+  var map = data.openlayers;
+  var distance = parseInt(options.distance, 10);
+  var threshold = parseInt(options.threshold, 10);
+  var layers = [];
+  for (var i in options.clusterlayer) {
+    var selectedLayer = map.getLayersBy('drupalID', options.clusterlayer[i]);
+    if (typeof selectedLayer[0] != 'undefined') {
+      layers.push(selectedLayer[0]);
+    }
+  }
 
-      // Go through chosen layers
-      for (var i in layers) {
-        var layer = layers[i];
-        // Ensure vector layer
-        if (layer.CLASS_NAME == 'OpenLayers.Layer.Vector') {
-          var cluster = new OpenLayers.Strategy.Cluster(options);
-          layer.addOptions({ 'strategies': [cluster] });
-          cluster.setLayer(layer);
-          cluster.features = layer.features.slice();
-          cluster.activate();
-          cluster.cluster();
-        }
-      }
+  // Go through chosen layers
+  for (var i in layers) {
+    var layer = layers[i];
+    // Ensure vector layer
+    if (layer.CLASS_NAME == 'OpenLayers.Layer.Vector') {
+      var cluster = new OpenLayers.Strategy.Cluster(options);
+      layer.addOptions({ 'strategies': [cluster] });
+      cluster.setLayer(layer);
+      cluster.features = layer.features.slice();
+      cluster.activate();
+      cluster.cluster();
     }
   }
-};
+});
 
-/*
+/**
  * Override of callback used by 'popup' behaviour to support clusters
  */
-Drupal.theme.openlayersPopup = function(feature) {
-  if (feature.cluster)
-  {
+Drupal.theme.openlayersPopup = function (feature) {
+  if (feature.cluster) {
     var output = '';
     var visited = []; // to keep track of already-visited items
     for (var i = 0; i < feature.cluster.length; i++) {
@@ -62,10 +53,7 @@ Drupal.theme.openlayersPopup = function(feature) {
     }
     return output;
   }
-  else
-  {
+  else {
     return Drupal.theme.prototype.openlayersPopup(feature);
   }
 };
-
-})(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_dragpan.js b/includes/behaviors/js/openlayers_behavior_dragpan.js
index bd982e0..a48f9fa 100644
--- a/includes/behaviors/js/openlayers_behavior_dragpan.js
+++ b/includes/behaviors/js/openlayers_behavior_dragpan.js
@@ -4,19 +4,9 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-(function($) {
-  /**
-   * DragPan Behavior
-   */
-  Drupal.behaviors.openlayers_behavior_dragpan = {
-    'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_dragpan']) {
-        // Add control
-        var control = new OpenLayers.Control.DragPan();
-        data.openlayers.addControl(control);
-        control.activate();
-      }
-    }
-  }
-})(jQuery);
+/**
+ * DragPan Behavior
+ */
+Drupal.openlayers.addBehavior('dragpan', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'DragPan');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_drawfeatures.js b/includes/behaviors/js/openlayers_behavior_drawfeatures.js
index e1e3432..93187df 100644
--- a/includes/behaviors/js/openlayers_behavior_drawfeatures.js
+++ b/includes/behaviors/js/openlayers_behavior_drawfeatures.js
@@ -4,11 +4,11 @@
  * DrawFeatures Behavior
  */
 
-/**
- * Behavior for Draw Features
- */
 (function($) {
-Drupal.behaviors.openlayers_behavior_drawfeatures = {
+  /**
+   * Behavior for Draw Features
+   */
+  Drupal.behaviors.openlayers_behavior_drawfeatures = {
     'attach': function(context, settings) {
       function openlayers_behavior_drawfeatures_update(features) {
         WktWriter = new OpenLayers.Format.WKT();
@@ -27,8 +27,9 @@ Drupal.behaviors.openlayers_behavior_drawfeatures = {
         this.element.val(WktWriter.write(features_copy.features));
       }
   
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_drawfeatures']) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_drawfeatures'];
+      if (!$(context).hasClass('openlayers-drawfeatures-processed') && behavior) {
         var feature_types = data.map.behaviors['openlayers_behavior_drawfeatures'].feature_types;
         this.element =
           $('#' + data.map.behaviors['openlayers_behavior_drawfeatures'].element_id);
@@ -134,7 +135,8 @@ Drupal.behaviors.openlayers_behavior_drawfeatures = {
           }
           )
         );
+        $(context).addClass('openlayers-drawfeatures-processed');
       }
-  }
-  }
+    }
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_fullscreen.js b/includes/behaviors/js/openlayers_behavior_fullscreen.js
index e0bdb8c..880fcc7 100644
--- a/includes/behaviors/js/openlayers_behavior_fullscreen.js
+++ b/includes/behaviors/js/openlayers_behavior_fullscreen.js
@@ -5,61 +5,45 @@
  */
 
 /**
- * Global variables to help with scope
- *
- * TODO: Move this to a better place, like the map data().
- */
-Drupal.openlayers = Drupal.openlayers || {};
-Drupal.openlayers.fullscreen = Drupal.openlayers.fullscreen || {};
-
-(function($) {
-/**
  * Attribution Behavior
  */
-Drupal.behaviors.openlayers_behavior_fullscreen = {
-  'attach': function(context, settings) {
-    var fullscreenPanel;
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_fullscreen']) {
-      var opts = data.map.behaviors['openlayers_behavior_fullscreen'];
-
-      // Create new panel control and add.
-      fullscreenPanel = new OpenLayers.Control.Panel(
-        {
-          displayClass: 'openlayers_behavior_fullscreen_button_panel'
-        }
-      );
-      data.openlayers.addControl(fullscreenPanel);
-
-      // Create toggleing control and cutton.
-      var toggler = OpenLayers.Function.bind(
-        Drupal.openlayers.fullscreen.fullscreenToggle, data);
-      var button = new OpenLayers.Control.Button({
-        displayClass: 'openlayers_behavior_fullscreen_button',
-        title: Drupal.t('Fullscreen'),
-        trigger: toggler
-      });
-      fullscreenPanel.addControls([button]);
-
-      // Make fullscreen by default if activited.
-      if (opts['activated'] == true) {
-        toggler();
-      }
+Drupal.openlayers.addBehavior('fullscreen', function (data, behavior) {
+  // Create new panel control and add.
+  var fullscreenPanel = new OpenLayers.Control.Panel(
+    {
+      displayClass: 'openlayers_behavior_fullscreen_button_panel'
     }
+  );
+  data.openlayers.addControl(fullscreenPanel);
+
+  // Create toggleing control and cutton.
+  var toggler = OpenLayers.Function.bind(
+    Drupal.openlayers.fullscreenToggle, data);
+  var button = new OpenLayers.Control.Button({
+    displayClass: 'openlayers_behavior_fullscreen_button',
+    title: Drupal.t('Fullscreen'),
+    trigger: toggler
+  });
+  fullscreenPanel.addControls([button]);
+
+  // Make fullscreen by default if activited.
+  if (behavior.activated == true) {
+    toggler();
   }
-};
-
-/**
- * Toggling function for FullScreen control.
- */
-Drupal.openlayers.fullscreen.fullscreenToggle = function() {
-  var map = this.openlayers;
-  var $map = $(this.openlayers.div);
-  var extent = map.getExtent();
-
-  $map.parent().toggleClass('openlayers_map_fullscreen');
-  $map.toggleClass('openlayers_map_fullscreen');
-  $map.data('openlayers').openlayers.updateSize();
-  $map.data('openlayers').openlayers.zoomToExtent(extent, true);
-}
-})(jQuery);
+});
+
+(function ($) {
+  /**
+   * Toggling function for FullScreen control.
+   */
+  Drupal.openlayers.fullscreenToggle = function () {
+    var map = this.openlayers;
+    var $map = $(this.openlayers.div);
+    var extent = map.getExtent();
+
+    $map.parent().toggleClass('openlayers_map_fullscreen');
+    $map.toggleClass('openlayers_map_fullscreen');
+    $map.data('openlayers').openlayers.updateSize();
+    $map.data('openlayers').openlayers.zoomToExtent(extent, true);
+  };
+}(jQuery));
diff --git a/includes/behaviors/js/openlayers_behavior_geolocate.js b/includes/behaviors/js/openlayers_behavior_geolocate.js
index 8dba20f..471b668 100644
--- a/includes/behaviors/js/openlayers_behavior_geolocate.js
+++ b/includes/behaviors/js/openlayers_behavior_geolocate.js
@@ -5,29 +5,21 @@
  */
 
 /**
- * Geolocate Control
- */
-(function($) {
-  Drupal.behaviors.openlayers_behavior_geolocate = {
-    'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_geolocate']) {
-        // Create Geolocate control
-        var geolocate = new OpenLayers.Control.Geolocate(data.map.behaviors['openlayers_behavior_geolocate']);
-        data.openlayers.addControl(geolocate);
-        
-        // Add some event handling
-        geolocate.events.register("locationupdated", this, function(e) {
-          data.openlayers.setCenter(new OpenLayers.Geometry.Point(e.point.x, e.point.y), data.map.behaviors['openlayers_behavior_geolocate'].zoom_level);
-        });
-        geolocate.events.register("locationfailed", this, function(e) {
-          OpenLayers.Console.log('Location detection failed');
-        });
-        
-        // Activiate!
-        geolocate.activate();
-        
-      }
-    }
-  }
-})(jQuery);
+* Geolocate Control
+*/
+Drupal.openlayers.addBehavior('geolocate', function (data, behavior) {
+  // Create Geolocate control
+  var geolocate = new OpenLayers.Control.Geolocate(behavior);
+  data.openlayers.addControl(geolocate);
+
+  // Add some event handling
+  geolocate.events.register("locationupdated", this, function(e) {
+    data.openlayers.setCenter(new OpenLayers.Geometry.Point(e.point.x, e.point.y), behavior.zoom_level);
+  });
+  geolocate.events.register("locationfailed", this, function(e) {
+    OpenLayers.Console.log('Location detection failed');
+  });
+
+  // Activiate!
+  geolocate.activate();
+});
diff --git a/includes/behaviors/js/openlayers_behavior_keyboarddefaults.js b/includes/behaviors/js/openlayers_behavior_keyboarddefaults.js
index 234480e..47e7e0f 100644
--- a/includes/behaviors/js/openlayers_behavior_keyboarddefaults.js
+++ b/includes/behaviors/js/openlayers_behavior_keyboarddefaults.js
@@ -5,16 +5,8 @@
  */
 
 /**
- * Keyboard Defaults Behavior
- */
-(function($) {
-Drupal.behaviors.openlayers_behavior_keyboarddefaults = function(context) {
-  var data = $(context).data('openlayers');
-  if (data && data.map.behaviors['openlayers_behavior_keyboarddefaults']) {
-    // Add control
-    var control = new OpenLayers.Control.KeyboardDefaults();
-    data.openlayers.addControl(control);
-    control.activate();
-  }
-}
-})(jQuery);
+* Keyboard Defaults Behavior
+*/
+Drupal.openlayers.addBehavior('keyboarddefaults', function (data, behavior) {
+  Drupal.openlayers.addControl(data.openlayers, 'KeyboardDefaults');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_layerswitcher.js b/includes/behaviors/js/openlayers_behavior_layerswitcher.js
index 053e162..56d7f38 100644
--- a/includes/behaviors/js/openlayers_behavior_layerswitcher.js
+++ b/includes/behaviors/js/openlayers_behavior_layerswitcher.js
@@ -7,18 +7,6 @@
 /**
  * Layer Switcher Behavior
  */
-(function($) {
-  Drupal.behaviors.openlayers_behavior_layerswitcher = {
-    'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_layerswitcher']) {
-        // Add control
-        var control = new OpenLayers.Control.LayerSwitcher({
-          'ascending': !!data.map.behaviors['openlayers_behavior_layerswitcher'].ascending
-        });
-        data.openlayers.addControl(control);
-        control.activate();
-      }
-    }
-  };
-})(jQuery);
+Drupal.openlayers.addBehavior('layerswitcher', function (data, behavior) {
+  Drupal.openlayers.addControl(data.openlayers, 'LayerSwitcher', {'ascending': !!behavior.ascending});
+});
diff --git a/includes/behaviors/js/openlayers_behavior_mapformvalues.js b/includes/behaviors/js/openlayers_behavior_mapformvalues.js
index 802e655..0494c25 100644
--- a/includes/behaviors/js/openlayers_behavior_mapformvalues.js
+++ b/includes/behaviors/js/openlayers_behavior_mapformvalues.js
@@ -4,13 +4,11 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * Map Form Values Behavior
- */
-(function($) {
-Drupal.behaviors.openlayers_behavior_mapformvalues = {
-  'attach': function(context, settings) {
-    var data = $(context).data('openlayers');
+(function ($) {
+  /**
+   * Map Form Values Behavior
+   */
+  Drupal.openlayers.addBehavior('mapformvalues', function (data, behavior) {
     function updateForm(evt) {
       if (evt.object.centerpoint_form) {
         center = evt.object.getCenter().transform(
@@ -23,28 +21,25 @@ Drupal.behaviors.openlayers_behavior_mapformvalues = {
         evt.object.zoom_form.val(zoom);
       }
     }
-    if (data && data.map.behaviors['openlayers_behavior_mapformvalues']) {
-      centerpoint_form = $(data.map.behaviors['openlayers_behavior_mapformvalues'].center_form);
-      zoom_form = $(data.map.behaviors['openlayers_behavior_mapformvalues'].zoom_form);
-
-      if (centerpoint_form.length) {
-        data.openlayers.centerpoint_form = centerpoint_form;
-        center_point = centerpoint_form.val();
-        data.openlayers.setCenter(
-          OpenLayers.LonLat.fromString(center_point).transform(
-            new OpenLayers.Projection('EPSG:4326'),
-            data.openlayers.projection)
-          );
-      }
+    centerpoint_form = $(behavior.center_form);
+    zoom_form = $(behavior.zoom_form);
 
-      if (zoom_form.length) {
-        data.openlayers.zoom_form = zoom_form;
-        zoom = zoom_form.val();
-        data.openlayers.zoomTo(parseInt(zoom));
-      }
+    if (centerpoint_form.length) {
+      data.openlayers.centerpoint_form = centerpoint_form;
+      center_point = centerpoint_form.val();
+      data.openlayers.setCenter(
+        OpenLayers.LonLat.fromString(center_point).transform(
+          new OpenLayers.Projection('EPSG:4326'),
+          data.openlayers.projection)
+        );
+    }
 
-      data.openlayers.events.on({'moveend': updateForm});
+    if (zoom_form.length) {
+      data.openlayers.zoom_form = zoom_form;
+      zoom = zoom_form.val();
+      data.openlayers.zoomTo(parseInt(zoom));
     }
-  }
-}
-})(jQuery);
+
+    data.openlayers.events.on({'moveend': updateForm});
+  });
+}(jQuery));
diff --git a/includes/behaviors/js/openlayers_behavior_mouseposition.js b/includes/behaviors/js/openlayers_behavior_mouseposition.js
index d6aaa1a..1e7ef5b 100644
--- a/includes/behaviors/js/openlayers_behavior_mouseposition.js
+++ b/includes/behaviors/js/openlayers_behavior_mouseposition.js
@@ -5,18 +5,8 @@
  */
 
 /**
- * Mouse Position Behavior
- */
-(function($) {
-  Drupal.behaviors.openlayers_behavior_mouseposition = {
-    'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_mouseposition']) {
-        // Add control
-        var control = new OpenLayers.Control.MousePosition();
-        data.openlayers.addControl(control);
-        control.activate();
-      }
-    }
-  }
-})(jQuery);
+* Mouse Position Behavior
+*/
+Drupal.openlayers.addBehavior('mouseposition', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'MousePosition');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_navigation.js b/includes/behaviors/js/openlayers_behavior_navigation.js
index 17fe17d..3318f5e 100644
--- a/includes/behaviors/js/openlayers_behavior_navigation.js
+++ b/includes/behaviors/js/openlayers_behavior_navigation.js
@@ -7,20 +7,10 @@
 /**
  * Navigation Behavior
  */
-(function($) {
-Drupal.behaviors.openlayers_behavior_navigation = {
-  'attach': function(context, settings) {
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_navigation']) {
-      // Add control
-      var options = {
-        'zoomWheelEnabled': data.map.behaviors['openlayers_behavior_navigation'].zoomWheelEnabled,
-        'documentDrag': Boolean(data.map.behaviors['openlayers_behavior_navigation'].documentDrag)
-      };
-      var control = new OpenLayers.Control.Navigation(options);
-      data.openlayers.addControl(control);
-      control.activate();
-    }
-  }
-};
-})(jQuery);
+Drupal.openlayers.addBehavior('navigation', function (data, behavior) {
+  var options = {
+    'zoomWheelEnabled': behavior.zoomWheelEnabled,
+    'documentDrag': !!behavior.documentDrag
+  };
+  Drupal.openlayers.addControl(data.openlayers, 'Navigation', options);
+});
diff --git a/includes/behaviors/js/openlayers_behavior_panzoom.js b/includes/behaviors/js/openlayers_behavior_panzoom.js
index af35495..91b3126 100644
--- a/includes/behaviors/js/openlayers_behavior_panzoom.js
+++ b/includes/behaviors/js/openlayers_behavior_panzoom.js
@@ -7,16 +7,6 @@
 /**
  * Pan Zoom Bar Behavior
  */
-(function($) {
-  Drupal.behaviors.openlayers_behavior_panzoom = {
-    'attach': function(context, settings) {
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_panzoom']) {
-      // Add control
-      var control = new OpenLayers.Control.PanZoom();
-      data.openlayers.addControl(control);
-      control.activate();
-    }
-  }
-}
-})(jQuery);
+Drupal.openlayers.addBehavior('panzoom', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'PanZoom');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_panzoombar.js b/includes/behaviors/js/openlayers_behavior_panzoombar.js
index 3e6dfba..6d7d9bf 100644
--- a/includes/behaviors/js/openlayers_behavior_panzoombar.js
+++ b/includes/behaviors/js/openlayers_behavior_panzoombar.js
@@ -7,16 +7,6 @@
 /**
  * Pan Zoom Bar Behavior
  */
-(function($) {
-    Drupal.behaviors.openlayers_behavior_panzoombar = {
-    'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_panzoombar']) {
-        // Add control
-        var control = new OpenLayers.Control.PanZoomBar();
-        data.openlayers.addControl(control);
-        control.activate();
-      }
-    }
-  };
-})(jQuery);
+Drupal.openlayers.addBehavior('panzoombar', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'PanZoomBar');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_permalink.js b/includes/behaviors/js/openlayers_behavior_permalink.js
index 95cb9fe..b1da4cf 100644
--- a/includes/behaviors/js/openlayers_behavior_permalink.js
+++ b/includes/behaviors/js/openlayers_behavior_permalink.js
@@ -7,16 +7,6 @@
 /**
  * Permalink Behavior
  */
-(function($) {
-  Drupal.behaviors.openlayers_behavior_permalink = {
-    'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_permalink']) {
-        // Add control
-        var control = new OpenLayers.Control.Permalink();
-        data.openlayers.addControl(control);
-        control.activate();
-      }
-    }
-  }
-})(jQuery);
+Drupal.openlayers.addBehavior('permalink', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'Permalink');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_popup.js b/includes/behaviors/js/openlayers_behavior_popup.js
index ac3ba68..aa4d867 100644
--- a/includes/behaviors/js/openlayers_behavior_popup.js
+++ b/includes/behaviors/js/openlayers_behavior_popup.js
@@ -1,16 +1,9 @@
 
 /**
- * Global variables to help with scope
- *
- * TODO: Move this to a better place, like the map data().
+ * @file
+ * JS Implementation of OpenLayers behavior.
  */
-Drupal.openlayers = Drupal.openlayers || {};
-Drupal.openlayers.popup = Drupal.openlayers.popup || {};
-Drupal.openlayers.popup.popupSelect = Drupal.openlayers.popup.popupSelect || {};
-Drupal.openlayers.popup.selectedFeature = Drupal.openlayers.popup.selectedFeature || {};
-
 
-(function($) {
 /**
  * Javascript Drupal Theming function for inside of Popups
  *
@@ -33,70 +26,63 @@ Drupal.theme.prototype.openlayersPopup = function(feature) {
   }
   
   return output;
-}
+};
 
 /**
  * OpenLayers Popup Behavior
  */
-Drupal.behaviors.openlayers_behavior_popup =  {
-  attach: function(context) {
-  var layers, data = $(context).data('openlayers');
-  if (data && data.map.behaviors['openlayers_behavior_popup']) {
-    var map = data.openlayers;
-    var options = data.map.behaviors['openlayers_behavior_popup'];
-    var layers = [];
+Drupal.openlayers.addBehavior('popup', function (data, options) {
+  var map = data.openlayers;
+  var layers = [];
 
-    // For backwards compatiability, if layers is not
-    // defined, then include all vector layers
-    if (typeof options.layers == 'undefined' || options.layers.length == 0) {
-      layers = map.getLayersByClass('OpenLayers.Layer.Vector');
-    }
-    else {
-      for (var i in options.layers) {
-        var selectedLayer = map.getLayersBy('drupalID', options.layers[i]);
-        if (typeof selectedLayer[0] != 'undefined') {
-          layers.push(selectedLayer[0]);
-        }
+  // For backwards compatiability, if layers is not
+  // defined, then include all vector layers
+  if (typeof options.layers == 'undefined' || options.layers.length == 0) {
+    layers = map.getLayersByClass('OpenLayers.Layer.Vector');
+  }
+  else {
+    for (var i in options.layers) {
+      var selectedLayer = map.getLayersBy('drupalID', options.layers[i]);
+      if (typeof selectedLayer[0] != 'undefined') {
+        layers.push(selectedLayer[0]);
       }
     }
+  }
 
-    popupSelect = new OpenLayers.Control.SelectFeature(layers,
-      {
-        onSelect: function(feature) {
-          // Create FramedCloud popup.
-          popup = new OpenLayers.Popup.FramedCloud(
-            'popup',
-            feature.geometry.getBounds().getCenterLonLat(),
-            null,
-            Drupal.theme('openlayersPopup', feature),
-            null,
-            true,
-            function(evt) {
-              Drupal.openlayers.popup.popupSelect.unselect(
-                Drupal.openlayers.popup.selectedFeature
-              );
-            }
-          );
+  var popupSelect = new OpenLayers.Control.SelectFeature(layers,
+    {
+      onSelect: function(feature) {
+        // Create FramedCloud popup.
+        popup = new OpenLayers.Popup.FramedCloud(
+          'popup',
+          feature.geometry.getBounds().getCenterLonLat(),
+          null,
+          Drupal.theme('openlayersPopup', feature),
+          null,
+          true,
+          function(evt) {
+            Drupal.openlayers.popup.popupSelect.unselect(
+              Drupal.openlayers.popup.selectedFeature
+            );
+          }
+        );
 
-          // Assign popup to feature and map.
-          feature.popup = popup;
-          feature.layer.map.addPopup(popup);
-          Drupal.attachBehaviors();
-          Drupal.openlayers.popup.selectedFeature = feature;
-        },
-        onUnselect: function(feature) {
-          // Remove popup if feature is unselected.
-          feature.layer.map.removePopup(feature.popup);
-          feature.popup.destroy();
-          feature.popup = null;
-        }
+        // Assign popup to feature and map.
+        feature.popup = popup;
+        feature.layer.map.addPopup(popup);
+        Drupal.attachBehaviors();
+        Drupal.openlayers.popup.selectedFeature = feature;
+      },
+      onUnselect: function(feature) {
+        // Remove popup if feature is unselected.
+        feature.layer.map.removePopup(feature.popup);
+        feature.popup.destroy();
+        feature.popup = null;
       }
-    );
+    }
+  );
 
-    map.addControl(popupSelect);
-    popupSelect.activate();
-    Drupal.openlayers.popup.popupSelect = popupSelect;
-  }
-  }
-}
-})(jQuery);
+  map.addControl(popupSelect);
+  popupSelect.activate();
+  Drupal.openlayers.popup.popupSelect = popupSelect;
+});
diff --git a/includes/behaviors/js/openlayers_behavior_scaleline.js b/includes/behaviors/js/openlayers_behavior_scaleline.js
index 1c41b2e..46f50b6 100644
--- a/includes/behaviors/js/openlayers_behavior_scaleline.js
+++ b/includes/behaviors/js/openlayers_behavior_scaleline.js
@@ -7,16 +7,6 @@
 /**
  * Scale Line Behavior
  */
-(function($) {
-  Drupal.behaviors.openlayers_behavior_scaleline = {
-    'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_scaleline']) {
-        // Add control
-        var control = new OpenLayers.Control.ScaleLine();
-        data.openlayers.addControl(control);
-        control.activate();
-      }
-    }
-  }
-})(jQuery);
+Drupal.openlayers.addBehavior('scaleline', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'ScaleLine');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_tooltip.js b/includes/behaviors/js/openlayers_behavior_tooltip.js
index 5dbf71e..4d3b912 100644
--- a/includes/behaviors/js/openlayers_behavior_tooltip.js
+++ b/includes/behaviors/js/openlayers_behavior_tooltip.js
@@ -1,5 +1,10 @@
 
 /**
+ * @file
+ * JS Implementation of OpenLayers behavior.
+ */
+
+/**
  * Javascript Drupal Theming function for inside of Tooltips
  *
  * To override
@@ -11,82 +16,74 @@
  */
 Drupal.theme.prototype.openlayersTooltip = function(feature) {
   var output = '';
-  
+
   if (feature.attributes.name) {
     output += '<div class="openlayers-popup openlayers-tooltip-name">' + feature.attributes.name + '</div>';
   }
-  
+
   if (feature.attributes.description) {
     output += '<div class="openlayers-popup openlayers-tooltip-description">' + feature.attributes.description + '</div>';
   }
-  
+
   return output;
 };
 
-(function($) {
 /**
  * OpenLayers Tooltip Behavior
  */
-Drupal.behaviors.openlayers_behavior_tooltip = {
-  'attach': function(context, settings) {
-    var layers, data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_tooltip']) {
-      var map = data.openlayers;
-      var options = data.map.behaviors['openlayers_behavior_tooltip'];
-      var layers = [];
+Drupal.openlayers.addBehavior('tooltip', function (data, options) {
+  var map = data.openlayers;
+  var layers = [];
 
-      // For backwards compatiability, if layers is not
-      // defined, then include all vector layers
-      if (typeof options.layers == 'undefined' || options.layers.length == 0) {
-        layers = map.getLayersByClass('OpenLayers.Layer.Vector');
-      }
-      else {
-        for (var i in options.layers) {
-          var selectedLayer = map.getLayersBy('drupalID', options.layers[i]);
-          if (typeof selectedLayer[0] != 'undefined') {
-            layers.push(selectedLayer[0]);
-          }
-        }
+  // For backwards compatiability, if layers is not
+  // defined, then include all vector layers
+  if (typeof options.layers == 'undefined' || options.layers.length == 0) {
+    layers = map.getLayersByClass('OpenLayers.Layer.Vector');
+  }
+  else {
+    for (var i in options.layers) {
+      var selectedLayer = map.getLayersBy('drupalID', options.layers[i]);
+      if (typeof selectedLayer[0] != 'undefined') {
+        layers.push(selectedLayer[0]);
       }
+    }
+  }
 
-      // Define feature select events for selected layers.
-      popupSelect = new OpenLayers.Control.SelectFeature(layers,
-        {
-          hover: true,
-          clickout: false,
-          multiple: false,
-          onSelect: function(feature) {
-            // Create FramedCloud popup for tooltip.
-            var output = Drupal.theme('openlayersTooltip', feature);
-            if (typeof output != 'undefined') {
-              popup = new OpenLayers.Popup.FramedCloud(
-                'tooltip',
-                feature.geometry.getBounds().getCenterLonLat(),
-                null,
-                output,
-                null,
-                true
-              );
-              feature.popup = popup;
-              feature.layer.map.addPopup(popup);
-              Drupal.attachBehaviors();
-            }
-          },
-          onUnselect: function(feature) {
-            // Remove popup.
-            if (typeof feature.popup != 'undefined') {
-              feature.layer.map.removePopup(feature.popup);
-              feature.popup.destroy();
-              feature.popup = null;
-            }
-          }
+  // Define feature select events for selected layers.
+  var popupSelect = new OpenLayers.Control.SelectFeature(layers,
+    {
+      hover: true,
+      clickout: false,
+      multiple: false,
+      onSelect: function(feature) {
+        // Create FramedCloud popup for tooltip.
+        var output = Drupal.theme('openlayersTooltip', feature);
+        if (typeof output != 'undefined') {
+          popup = new OpenLayers.Popup.FramedCloud(
+            'tooltip',
+            feature.geometry.getBounds().getCenterLonLat(),
+            null,
+            output,
+            null,
+            true
+          );
+          feature.popup = popup;
+          feature.layer.map.addPopup(popup);
+          Drupal.attachBehaviors();
         }
-      );
-
-      // Actiate the popups
-      map.addControl(popupSelect);
-      popupSelect.activate();
+      },
+      onUnselect: function(feature) {
+        // Remove popup.
+        if (typeof feature.popup != 'undefined') {
+          feature.layer.map.removePopup(feature.popup);
+          feature.popup.destroy();
+          feature.popup = null;
+        }
+      }
     }
-  }
-};
-})(jQuery);
+  );
+
+  // Actiate the popups
+  map.addControl(popupSelect);
+  popupSelect.activate();
+});
diff --git a/includes/behaviors/js/openlayers_behavior_zoombox.js b/includes/behaviors/js/openlayers_behavior_zoombox.js
index 6f43b60..39ed196 100644
--- a/includes/behaviors/js/openlayers_behavior_zoombox.js
+++ b/includes/behaviors/js/openlayers_behavior_zoombox.js
@@ -7,16 +7,6 @@
 /**
  * Zoom Box Behavior
  */
-(function($) {
-Drupal.behaviors.openlayers_behavior_zoombox = {
-  'attach': function(context, settings) {
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_zoombox']) {
-      // Add control
-      var control = new OpenLayers.Control.ZoomBox();
-      data.openlayers.addControl(control);
-      control.activate();
-    }
-  }
-};
-})(jQuery);
+Drupal.openlayers.addBehavior('zoombox', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'ZoomBox');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_zoompanel.js b/includes/behaviors/js/openlayers_behavior_zoompanel.js
index 2149a62..26ef8e7 100644
--- a/includes/behaviors/js/openlayers_behavior_zoompanel.js
+++ b/includes/behaviors/js/openlayers_behavior_zoompanel.js
@@ -7,16 +7,6 @@
 /**
  * ZoomPanel Behavior
  */
-(function($) {
-Drupal.behaviors.openlayers_behavior_zoompanel = {
-  'attach': function(context, settings) {
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_zoompanel']) {
-      // Add control
-      var control = new OpenLayers.Control.ZoomPanel();
-      data.openlayers.addControl(control);
-      control.activate();
-    }
-  }
-};
-})(jQuery);
+Drupal.openlayers.addBehavior('zoompanel', function (data) {
+  Drupal.openlayers.addControl(data.openlayers, 'ZoomPanel');
+});
diff --git a/includes/behaviors/js/openlayers_behavior_zoomtolayer.js b/includes/behaviors/js/openlayers_behavior_zoomtolayer.js
index 97deafe..b6f8f65 100644
--- a/includes/behaviors/js/openlayers_behavior_zoomtolayer.js
+++ b/includes/behaviors/js/openlayers_behavior_zoomtolayer.js
@@ -1,44 +1,41 @@
 
 /**
+ * @file
+ * JS Implementation of OpenLayers behavior.
+ */
+
+/**
  * OpenLayers Zoom to Layer Behavior
  */
-(function($) {
-  Drupal.behaviors.openlayers_zoomtolayer = {
-    'attach': function(context, settings) {
-      var layerextent, layers, data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_zoomtolayer']) {
-        map = data.openlayers;
-        layers = map.getLayersBy('drupalID',
-          data.map.behaviors['openlayers_behavior_zoomtolayer'].zoomtolayer);
+Drupal.openlayers.addBehavior('zoomtolayer', function (data, behavior) {
+  var map = data.openlayers;
+  var layers = map.getLayersBy('drupalID', behavior.zoomtolayer);
+
+  // Go through selected layers to get full extent.
+  for (var i in layers) {
+    if (layers[i].features !== undefined) {
+      // For KML layers, we need to wait until layer is loaded.  Ideally
+      // we could check for any layer that is loading from an external
+      // source, but for now, just check KML
+      if (layers[i].layer_handler == 'kml') {
+        layers[i].events.register("loadend", layers[i], function() {
+          layerextent = layers[i].getDataExtent();
+          map.zoomToExtent(layerextent);
+        });
+      }
+      else {
+        layerextent = layers[i].getDataExtent();
+        // Check for valid layer extent
+        if (layerextent != null) {
+          map.zoomToExtent(layerextent);
 
-        // Go through selected layers to get full extent.
-        for (var i in layers) {
-          if (layers[i].features !== undefined) {
-            // For KML layers, we need to wait until layer is loaded.  Ideally
-            // we could check for any layer that is loading from an external
-            // source, but for now, just check KML
-            if (layers[i].layer_handler == 'kml') {
-              layers[i].events.register("loadend", layers[i], function() {
-                layerextent = layers[i].getDataExtent();
-                map.zoomToExtent(layerextent);
-              });
-            }
-            else {
-              layerextent = layers[i].getDataExtent();
-              // Check for valid layer extent
-              if (layerextent != null) {
-                map.zoomToExtent(layerextent);
-  
-                // If unable to find width due to single point,
-                // zoom in with point_zoom_level option.
-                if (layerextent.getWidth() == 0.0) {
-                  map.zoomTo(data.map.behaviors['openlayers_behavior_zoomtolayer'].point_zoom_level);
-                }
-              }
-            }
+          // If unable to find width due to single point,
+          // zoom in with point_zoom_level option.
+          if (layerextent.getWidth() == 0.0) {
+            map.zoomTo(behavior.point_zoom_level);
           }
         }
       }
+    }
   }
-};
-})(jQuery);
\ No newline at end of file
+});
diff --git a/includes/behaviors/js/openlayers_behavior_zoomtomaxextent.js b/includes/behaviors/js/openlayers_behavior_zoomtomaxextent.js
index 89ff9bb..5e8cdb9 100644
--- a/includes/behaviors/js/openlayers_behavior_zoomtomaxextent.js
+++ b/includes/behaviors/js/openlayers_behavior_zoomtomaxextent.js
@@ -7,21 +7,9 @@
 /**
  * Zoom Max Extent Behavior
  */
-(function($) {
-  Drupal.behaviors.openlayers_behavior_zoomtomaxextent = {
-    'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_zoomtomaxextent']) {
-        var panel = new OpenLayers.Control.Panel({
-          allowSelection: true
-        });
+Drupal.openlayers.addBehavior('zoomtomaxextent', function (data) {
+  var panel = Drupal.openlayers.addControl(data.openlayers, 'Panel', {allowSelection: true});
 
-        data.openlayers.addControl(panel);
-        panel.activate();
-
-        var button = new OpenLayers.Control.ZoomToMaxExtent();
-        panel.addControls(button);
-      }
-    }
-  };
-})(jQuery);
+  var button = new OpenLayers.Control.ZoomToMaxExtent();
+  panel.addControls([button]);
+});
