diff --git a/includes/behaviors/js/openlayers_behavior_argparser.js b/includes/behaviors/js/openlayers_behavior_argparser.js
index 38383b2..638c255 100644
--- a/includes/behaviors/js/openlayers_behavior_argparser.js
+++ b/includes/behaviors/js/openlayers_behavior_argparser.js
@@ -11,12 +11,15 @@
  */
 Drupal.behaviors.openlayers_behavior_argparser = {
   'attach': function(context, settings) {
-    var data = $(context).data('openlayers');
-    if (data && data.map.behaviors['openlayers_behavior_argparser']) {
+    var data = $(context).data('openlayers'),
+        behavior = data && data.map.behaviors['openlayers_behavior_argparser'];
+    if (!$(context).hasClass('openlayers-processed') && behavior) {
       // Add control
       var control = new OpenLayers.Control.ArgParser();
       data.openlayers.addControl(control);
       control.activate();
+      
+      $(context).addClass('openlayers-processed');
     }
   }
 };
diff --git a/includes/behaviors/js/openlayers_behavior_attribution.js b/includes/behaviors/js/openlayers_behavior_attribution.js
index 65f2ee9..95f8b1f 100644
--- a/includes/behaviors/js/openlayers_behavior_attribution.js
+++ b/includes/behaviors/js/openlayers_behavior_attribution.js
@@ -4,19 +4,22 @@
  * 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();
+  /**
+   * Attribution Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_attribution = {
+    'attach': function(context, settings) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_attribution'];
+      if (!$(context).hasClass('openlayers-attribution-processed') && behavior) {
+        // Add control
+        var control = new OpenLayers.Control.Attribution();
+        data.openlayers.addControl(control);
+        control.activate();
+
+        $(context).addClass('openlayers-attribution-processed');
+      }
     }
-  }
-};
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_boxselect.js b/includes/behaviors/js/openlayers_behavior_boxselect.js
index 7dad984..c728d25 100644
--- a/includes/behaviors/js/openlayers_behavior_boxselect.js
+++ b/includes/behaviors/js/openlayers_behavior_boxselect.js
@@ -5,45 +5,48 @@
  */
 
 (function($) {
-/**
- * Box Select Behavior
- */
-var selections_layer;
-Drupal.behaviors.openlayers_behavior_boxselect = {
-  'attach': function(context, settings) {
-    function setRestrictedExtent(box) {
-      bounding_box = box.geometry.getBounds().toBBOX();
-      $('#edit-center-restrict-restrictedextent').val(bounding_box);
-      for (i = 0; i < selections_layer.features.length; i++) {
-        if (selections_layer.features[i] != box) {
-          selections_layer.features[i].destroy();
+  var selections_layer;
+  /**
+   * Box Select Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_boxselect = {
+    'attach': function(context, settings) {
+      function setRestrictedExtent(box) {
+        bounding_box = box.geometry.getBounds().toBBOX();
+        $('#edit-center-restrict-restrictedextent').val(bounding_box);
+        for (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]);
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_boxselect'];
+      if (!$(context).hasClass('openlayers-boxselect-processed') && behavior) {
+        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();
+
+        $(context).addClass('openlayers-boxselect-processed');
       }
-      control.activate();
     }
-  }
-};
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_cluster.js b/includes/behaviors/js/openlayers_behavior_cluster.js
index e966ce8..9b9f829 100644
--- a/includes/behaviors/js/openlayers_behavior_cluster.js
+++ b/includes/behaviors/js/openlayers_behavior_cluster.js
@@ -5,67 +5,67 @@
  */
 
 (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]);
+  /**
+   * OpenLayers Cluster Behavior
+   */
+  Drupal.behaviors.openlayers_cluster = {
+    attach: function(context) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_cluster'];
+      if (!$(context).hasClass('openlayers-cluster-processed') && behavior) {
+        var options = behavior;
+        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();
+          }
         }
+        $(context).addClass('openlayers-cluster-processed');
       }
     }
-  }
-};
+  };
 
-/*
- * Override of callback used by 'popup' behaviour to support clusters
- */
-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++) {
-      var pf = feature.cluster[i]; // pseudo-feature
-      if (typeof pf.drupalFID != 'undefined') {
-        var mapwide_id = feature.layer.drupalID + pf.drupalFID;
-        if (mapwide_id in visited) continue;
-        visited[mapwide_id] = true;
+  /**
+   * Override of callback used by 'popup' behaviour to support clusters
+   */
+  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++) {
+        var pf = feature.cluster[i]; // pseudo-feature
+        if (typeof pf.drupalFID != 'undefined') {
+          var mapwide_id = feature.layer.drupalID + pf.drupalFID;
+          if (mapwide_id in visited) continue;
+          visited[mapwide_id] = true;
+        }
+        output += '<div class="openlayers-popup openlayers-popup-feature">' +
+          Drupal.theme.prototype.openlayersPopup(pf) + '</div>';
       }
-      output += '<div class="openlayers-popup openlayers-popup-feature">' +
-        Drupal.theme.prototype.openlayersPopup(pf) + '</div>';
+      return output;
     }
-    return output;
-  }
-  else
-  {
-    return Drupal.theme.prototype.openlayersPopup(feature);
-  }
-};
-
+    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..75dabb4 100644
--- a/includes/behaviors/js/openlayers_behavior_dragpan.js
+++ b/includes/behaviors/js/openlayers_behavior_dragpan.js
@@ -10,13 +10,16 @@
    */
   Drupal.behaviors.openlayers_behavior_dragpan = {
     'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_dragpan']) {
+      var data = $(context).data('openlayers'),
+        behavior = data && data.map.behaviors['openlayers_behavior_dragpan'];
+      if (!$(context).hasClass('openlayers-dragpan-processed') && behavior) {
         // Add control
         var control = new OpenLayers.Control.DragPan();
         data.openlayers.addControl(control);
         control.activate();
+
+        $(context).addClass('openlayers-dragpan-processed');
       }
     }
-  }
+  };
 })(jQuery);
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_geolocate.js b/includes/behaviors/js/openlayers_behavior_geolocate.js
index 8dba20f..140854e 100644
--- a/includes/behaviors/js/openlayers_behavior_geolocate.js
+++ b/includes/behaviors/js/openlayers_behavior_geolocate.js
@@ -4,30 +4,32 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * Geolocate Control
- */
 (function($) {
+  /**
+   * Geolocate Control
+   */
   Drupal.behaviors.openlayers_behavior_geolocate = {
     'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_geolocate']) {
+      var data = $(context).data('openlayers'),
+        behavior = data && data.map.behaviors['openlayers_behavior_geolocate'];
+      if (!$(context).hasClass('openlayers-geolocate-processed') && behavior) {
         // Create Geolocate control
-        var geolocate = new OpenLayers.Control.Geolocate(data.map.behaviors['openlayers_behavior_geolocate']);
+        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), data.map.behaviors['openlayers_behavior_geolocate'].zoom_level);
+          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();
-        
+
+        $(context).hasClass('openlayers-geolocate-processed');
       }
     }
-  }
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_keyboarddefaults.js b/includes/behaviors/js/openlayers_behavior_keyboarddefaults.js
index 234480e..4672324 100644
--- a/includes/behaviors/js/openlayers_behavior_keyboarddefaults.js
+++ b/includes/behaviors/js/openlayers_behavior_keyboarddefaults.js
@@ -4,17 +4,20 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * 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();
-  }
-}
+  /**
+   * Keyboard Defaults Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_keyboarddefaults = function(context) {
+    var data = $(context).data('openlayers'),
+        behavior = data && data.map.behaviors['openlayers_behavior_keyboarddefaults'];
+    if (!$(context).hasClass('openlayers-keyboarddefaults-processed') && behavior) {
+      // Add control
+      var control = new OpenLayers.Control.KeyboardDefaults();
+      data.openlayers.addControl(control);
+      control.activate();
+
+      $(context).addClass('openlayers-keyboarddefaults-processed');
+    }
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_layerswitcher.js b/includes/behaviors/js/openlayers_behavior_layerswitcher.js
index 053e162..7f57d07 100644
--- a/includes/behaviors/js/openlayers_behavior_layerswitcher.js
+++ b/includes/behaviors/js/openlayers_behavior_layerswitcher.js
@@ -4,20 +4,23 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * Layer Switcher Behavior
- */
 (function($) {
+  /**
+   * Layer Switcher Behavior
+   */
   Drupal.behaviors.openlayers_behavior_layerswitcher = {
     'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_layerswitcher']) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_layerswitcher'];
+      if (!$(context).hasClass('openlayers-layerswitcher-processed') && behavior) {
         // Add control
         var control = new OpenLayers.Control.LayerSwitcher({
-          'ascending': !!data.map.behaviors['openlayers_behavior_layerswitcher'].ascending
+          'ascending': !!behavior.ascending
         });
         data.openlayers.addControl(control);
         control.activate();
+
+        $(context).addClass('openlayers-layerswitcher-processed');
       }
     }
   };
diff --git a/includes/behaviors/js/openlayers_behavior_mapformvalues.js b/includes/behaviors/js/openlayers_behavior_mapformvalues.js
index 802e655..0975b6a 100644
--- a/includes/behaviors/js/openlayers_behavior_mapformvalues.js
+++ b/includes/behaviors/js/openlayers_behavior_mapformvalues.js
@@ -4,47 +4,50 @@
  * 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 updateForm(evt) {
-      if (evt.object.centerpoint_form) {
-        center = evt.object.getCenter().transform(
-          evt.object.projection,
-          new OpenLayers.Projection('EPSG:4326')).toShortString();
-          evt.object.centerpoint_form.val(center);
-      }
-      if (evt.object.zoom_form) {
-        zoom = evt.object.getZoom();
-        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);
+  /**
+   * Map Form Values Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_mapformvalues = {
+    'attach': function(context, settings) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_mapformvalues'];
+      function updateForm(evt) {
+        if (evt.object.centerpoint_form) {
+          center = evt.object.getCenter().transform(
+            evt.object.projection,
+            new OpenLayers.Projection('EPSG:4326')).toShortString();
+            evt.object.centerpoint_form.val(center);
+        }
+        if (evt.object.zoom_form) {
+          zoom = evt.object.getZoom();
+          evt.object.zoom_form.val(zoom);
+        }
+      },
+      if (!$(context).hasClass('openlayers-mapformvalues-processed') && behavior) {
+        centerpoint_form = $(behavior.center_form);
+        zoom_form = $(behavior.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)
-          );
-      }
+        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)
+            );
+        }
 
-      if (zoom_form.length) {
-        data.openlayers.zoom_form = zoom_form;
-        zoom = zoom_form.val();
-        data.openlayers.zoomTo(parseInt(zoom));
-      }
+        if (zoom_form.length) {
+          data.openlayers.zoom_form = zoom_form;
+          zoom = zoom_form.val();
+          data.openlayers.zoomTo(parseInt(zoom));
+        }
 
-      data.openlayers.events.on({'moveend': updateForm});
+        data.openlayers.events.on({'moveend': updateForm});
+
+        $(context).addClass('openlayers-mapformvalues-processed');
+      }
     }
-  }
-}
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_mouseposition.js b/includes/behaviors/js/openlayers_behavior_mouseposition.js
index d6aaa1a..30f5bf5 100644
--- a/includes/behaviors/js/openlayers_behavior_mouseposition.js
+++ b/includes/behaviors/js/openlayers_behavior_mouseposition.js
@@ -4,19 +4,22 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * Mouse Position Behavior
- */
 (function($) {
+  /**
+   * Mouse Position Behavior
+   */
   Drupal.behaviors.openlayers_behavior_mouseposition = {
     'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_mouseposition']) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_mouseposition'];
+      if (!$(context).hasClass('openlayers-mouseposition-processed') && behavior) {
         // Add control
         var control = new OpenLayers.Control.MousePosition();
         data.openlayers.addControl(control);
         control.activate();
+
+        $(context).addClass('openlayers-mouseposition-processed');
       }
     }
-  }
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_navigation.js b/includes/behaviors/js/openlayers_behavior_navigation.js
index 17fe17d..d9a1880 100644
--- a/includes/behaviors/js/openlayers_behavior_navigation.js
+++ b/includes/behaviors/js/openlayers_behavior_navigation.js
@@ -4,23 +4,26 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * 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();
+  /**
+   * Navigation Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_navigation = {
+    'attach': function(context, settings) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_navigation'];
+      if (!$(context).hasClass('openlayers-navigation-processed') && behavior) {
+        // Add control
+        var options = {
+          'zoomWheelEnabled': behavior.zoomWheelEnabled,
+          'documentDrag': !!behavior.documentDrag
+        };
+        var control = new OpenLayers.Control.Navigation(options);
+        data.openlayers.addControl(control);
+        control.activate();
+
+        $(context).addClass('openlayers-navigation-processed');
+      }
     }
-  }
-};
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_panzoom.js b/includes/behaviors/js/openlayers_behavior_panzoom.js
index af35495..7d04f57 100644
--- a/includes/behaviors/js/openlayers_behavior_panzoom.js
+++ b/includes/behaviors/js/openlayers_behavior_panzoom.js
@@ -4,19 +4,22 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * Pan Zoom Bar Behavior
- */
 (function($) {
+  /**
+   * Pan Zoom Bar Behavior
+   */
   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();
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_panzoom'];
+      if (!$(context).hasClass('openlayers-panzoom-processed') && behavior) {
+        // Add control
+        var control = new OpenLayers.Control.PanZoom();
+        data.openlayers.addControl(control);
+        control.activate();
+
+        $(context).addClass('openlayers-panzoom-processed');
+      }
     }
-  }
-}
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_panzoombar.js b/includes/behaviors/js/openlayers_behavior_panzoombar.js
index 3e6dfba..5eeb91e 100644
--- a/includes/behaviors/js/openlayers_behavior_panzoombar.js
+++ b/includes/behaviors/js/openlayers_behavior_panzoombar.js
@@ -4,18 +4,21 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * Pan Zoom Bar Behavior
- */
 (function($) {
-    Drupal.behaviors.openlayers_behavior_panzoombar = {
+  /**
+   * Pan Zoom Bar Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_panzoombar = {
     'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_panzoombar']) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_panzoombar'];
+      if (!$(context).hasClass('openlayers-panzoombar-processed') && behavior) {
         // Add control
         var control = new OpenLayers.Control.PanZoomBar();
         data.openlayers.addControl(control);
         control.activate();
+
+        $(context).addClass('openlayers-panzoombar-processed');
       }
     }
   };
diff --git a/includes/behaviors/js/openlayers_behavior_permalink.js b/includes/behaviors/js/openlayers_behavior_permalink.js
index 95cb9fe..7e51a21 100644
--- a/includes/behaviors/js/openlayers_behavior_permalink.js
+++ b/includes/behaviors/js/openlayers_behavior_permalink.js
@@ -4,18 +4,21 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * Permalink Behavior
- */
 (function($) {
+  /**
+   * Permalink Behavior
+   */
   Drupal.behaviors.openlayers_behavior_permalink = {
     'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_permalink']) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_permalink'];
+      if (!$(context).hasClass('openlayers-permalink-processed') && behavior) {
         // Add control
         var control = new OpenLayers.Control.Permalink();
         data.openlayers.addControl(control);
         control.activate();
+
+        $(context).addClass('openlayers-permalink-processed');
       }
     }
   }
diff --git a/includes/behaviors/js/openlayers_behavior_popup.js b/includes/behaviors/js/openlayers_behavior_popup.js
index c723aa3..e59b287 100644
--- a/includes/behaviors/js/openlayers_behavior_popup.js
+++ b/includes/behaviors/js/openlayers_behavior_popup.js
@@ -11,91 +11,94 @@ Drupal.openlayers.popup.selectedFeature = Drupal.openlayers.popup.selectedFeatur
 
 
 (function($) {
-/**
- * Javascript Drupal Theming function for inside of Popups
- *
- * To override
- *
- * @param feature
- *  OpenLayers feature object.
- * @return
- *  Formatted HTML.
- */
-Drupal.theme.prototype.openlayersPopup = 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;
-}
+  /**
+   * Javascript Drupal Theming function for inside of Popups
+   *
+   * To override
+   *
+   * @param feature
+   *  OpenLayers feature object.
+   * @return
+   *  Formatted HTML.
+   */
+  Drupal.theme.prototype.openlayersPopup = 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;
+  };
 
-/**
- * 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 = [];
+  /**
+   * OpenLayers Popup Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_popup = {
+    attach: function(context) {
+      var layers, data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_popup'];
+      if (!$(context).hasClass('openlayers-popup-processed') && behavior) {
+        var map = data.openlayers;
+        var options = behavior;
+        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
+        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.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.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;
 
-    map.addControl(popupSelect);
-    popupSelect.activate();
-    Drupal.openlayers.popup.popupSelect = popupSelect;
-  }
-  }
-}
+        $(context).addClass('openlayers-popup-processed');
+      }
+    }
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_scaleline.js b/includes/behaviors/js/openlayers_behavior_scaleline.js
index 1c41b2e..2201762 100644
--- a/includes/behaviors/js/openlayers_behavior_scaleline.js
+++ b/includes/behaviors/js/openlayers_behavior_scaleline.js
@@ -4,19 +4,22 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * Scale Line Behavior
- */
 (function($) {
+  /**
+   * Scale Line Behavior
+   */
   Drupal.behaviors.openlayers_behavior_scaleline = {
     'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_scaleline']) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_scaleline'];
+      if (!$(context).hasClass('openlayers-scaleline-processed') && behavior) {
         // Add control
         var control = new OpenLayers.Control.ScaleLine();
         data.openlayers.addControl(control);
         control.activate();
+
+        $(context).addClass('openlayers-scaleline-processed');
       }
     }
-  }
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_tooltip.js b/includes/behaviors/js/openlayers_behavior_tooltip.js
index 0af6b42..98d0f79 100644
--- a/includes/behaviors/js/openlayers_behavior_tooltip.js
+++ b/includes/behaviors/js/openlayers_behavior_tooltip.js
@@ -24,68 +24,71 @@ Drupal.theme.prototype.openlayersTooltip = function(feature) {
 };
 
 (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 = [];
+  /**
+   * OpenLayers Tooltip Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_tooltip = {
+    'attach': function(context, settings) {
+      var layers, data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_tooltip'];
+      if (!$(context).hasClass('openlayers-tooltip-processed') && behavior) {
+        var map = data.openlayers;
+        var options = behavior;
+        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);
-            }
-          },
-          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.
+        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);
+              }
+            },
+            onUnselect: function(feature) {
+              // Remove popup.
+              if (typeof feature.popup != 'undefined') {
+                feature.layer.map.removePopup(feature.popup);
+                feature.popup.destroy();
+                feature.popup = null;
+              }
             }
           }
-        }
-      );
+        );
+
+        // Actiate the popups
+        map.addControl(popupSelect);
+        popupSelect.activate();
 
-      // Actiate the popups
-      map.addControl(popupSelect);
-      popupSelect.activate();
+        $(context).addClass('openlayers-tooltip-processed');
+      }
     }
-  }
-};
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_zoombox.js b/includes/behaviors/js/openlayers_behavior_zoombox.js
index 6f43b60..73b9c26 100644
--- a/includes/behaviors/js/openlayers_behavior_zoombox.js
+++ b/includes/behaviors/js/openlayers_behavior_zoombox.js
@@ -4,19 +4,22 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * 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();
+  /**
+   * Zoom Box Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_zoombox = {
+    'attach': function(context, settings) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_zoombox'];
+      if (!$(context).hasClass('openlayers-zoombox-processed') && behavior) {
+        // Add control
+        var control = new OpenLayers.Control.ZoomBox();
+        data.openlayers.addControl(control);
+        control.activate();
+
+        $(context).addClass('openlayers-zoombox-processed');
+      }
     }
-  }
-};
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_zoompanel.js b/includes/behaviors/js/openlayers_behavior_zoompanel.js
index 2149a62..5c766bf 100644
--- a/includes/behaviors/js/openlayers_behavior_zoompanel.js
+++ b/includes/behaviors/js/openlayers_behavior_zoompanel.js
@@ -4,19 +4,22 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * 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();
+  /**
+   * ZoomPanel Behavior
+   */
+  Drupal.behaviors.openlayers_behavior_zoompanel = {
+    'attach': function(context, settings) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_zoompanel'];
+      if (!$(context).hasClass('openlayers-zoompanel-processed') && behavior) {
+        // Add control
+        var control = new OpenLayers.Control.ZoomPanel();
+        data.openlayers.addControl(control);
+        control.activate();
+
+        $(context).addClass('openlayers-zoompanel-processed');
+      }
     }
-  }
-};
+  };
 })(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_zoomtolayer.js b/includes/behaviors/js/openlayers_behavior_zoomtolayer.js
index 97deafe..1d54326 100644
--- a/includes/behaviors/js/openlayers_behavior_zoomtolayer.js
+++ b/includes/behaviors/js/openlayers_behavior_zoomtolayer.js
@@ -1,15 +1,20 @@
 
 /**
- * OpenLayers Zoom to Layer Behavior
+ * @file
+ * JS Implementation of OpenLayers behavior.
  */
+ 
 (function($) {
+  /**
+   * OpenLayers Zoom to Layer Behavior
+   */
   Drupal.behaviors.openlayers_zoomtolayer = {
     'attach': function(context, settings) {
-      var layerextent, layers, data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_zoomtolayer']) {
+      var layerextent, layers, data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_zoomtolayer'];
+      if (!$(context).hasClass('openlayers-zoomtolayer-processed') && behavior) {
         map = data.openlayers;
-        layers = map.getLayersBy('drupalID',
-          data.map.behaviors['openlayers_behavior_zoomtolayer'].zoomtolayer);
+        layers = map.getLayersBy('drupalID', behavior.zoomtolayer);
 
         // Go through selected layers to get full extent.
         for (var i in layers) {
@@ -32,13 +37,14 @@
                 // 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);
+                  map.zoomTo(behavior.point_zoom_level);
                 }
               }
             }
           }
         }
+        $(context).addClass('openlayers-zoomtolayer-processed');
       }
-  }
-};
-})(jQuery);
\ No newline at end of file
+    }
+  };
+})(jQuery);
diff --git a/includes/behaviors/js/openlayers_behavior_zoomtomaxextent.js b/includes/behaviors/js/openlayers_behavior_zoomtomaxextent.js
index 89ff9bb..4c3e33f 100644
--- a/includes/behaviors/js/openlayers_behavior_zoomtomaxextent.js
+++ b/includes/behaviors/js/openlayers_behavior_zoomtomaxextent.js
@@ -4,14 +4,15 @@
  * JS Implementation of OpenLayers behavior.
  */
 
-/**
- * Zoom Max Extent Behavior
- */
 (function($) {
+  /**
+   * Zoom Max Extent Behavior
+   */
   Drupal.behaviors.openlayers_behavior_zoomtomaxextent = {
     'attach': function(context, settings) {
-      var data = $(context).data('openlayers');
-      if (data && data.map.behaviors['openlayers_behavior_zoomtomaxextent']) {
+      var data = $(context).data('openlayers'),
+          behavior = data && data.map.behaviors['openlayers_behavior_zoomtomaxextent'];
+      if (!$(context).hasClass('openlayers-zoomtomaxextent-processed') && behavior) {
         var panel = new OpenLayers.Control.Panel({
           allowSelection: true
         });
@@ -21,6 +22,8 @@
 
         var button = new OpenLayers.Control.ZoomToMaxExtent();
         panel.addControls(button);
+
+        $(context).addClass('openlayers-zoomtomaxextent-processed');
       }
     }
   };
