Index: tests/Control/ModifyFeature.html
===================================================================
--- tests/Control/ModifyFeature.html	(revision 8282)
+++ tests/Control/ModifyFeature.html	(working copy)
@@ -155,7 +155,7 @@
         layer.destroyFeatures = function(verts) {
             t.ok(verts == 'b', "Virtual verts destroyed correctly");
         }
-        control.unselectFeature({feature: fakeFeature});
+        control.unselectFeature(fakeFeature);
         t.eq(control.feature, null, "feature is set to null");
         
         layer.destroyFeatures = function() {};        
@@ -225,7 +225,7 @@
         var fakeFeature = new OpenLayers.Feature.Vector(new OpenLayers.Geometry.Point(0, 0));
         
         // Points don't call collectVertices
-        control.selectFeature({feature: fakeFeature});
+        control.selectFeature(fakeFeature);
         
         control.collectVertices = function() { 
           t.ok(true, "collectVertices called"); 
@@ -247,7 +247,7 @@
         ]);
         
         // OnSelect calls collectVertices and passes features to layer 
-        control.selectFeature({feature: fakeFeature});
+        control.selectFeature(fakeFeature);
         
         control.vertices = ['a'];
         control.virtualVertices = ['b'];
@@ -259,7 +259,7 @@
         }    
 
         // Features are removed whenever they exist
-        control.selectFeature({feature: fakeFeature});
+        control.selectFeature(fakeFeature);
         
         control.destroy();
 
@@ -424,7 +424,7 @@
             t.eq(feature.id, testFeature.id,
                  "onModificationStart called with the right feature");
         };
-        control.selectFeature({feature: testFeature});
+        control.selectFeature(testFeature);
         
         map.destroy();
     }
@@ -494,7 +494,7 @@
             t.eq(feature.id, testFeature.id,
                  "onModificationEnd called with the right feature");
         };
-        control.unselectFeature({feature: testFeature});
+        control.unselectFeature(testFeature);
         
         map.destroy();
     }
Index: lib/OpenLayers/Control/SelectFeature.js
===================================================================
--- lib/OpenLayers/Control/SelectFeature.js	(revision 8282)
+++ lib/OpenLayers/Control/SelectFeature.js	(working copy)
@@ -66,18 +66,32 @@
     box: false,
     
     /**
+     * Property: onBeforeSelect 
+     * {Function} Optional function to be called before a feature is selected.
+     *     The function should expect to be called with a feature.
+     */
+    onBeforeSelect: function() {},
+    
+    /**
      * APIProperty: onSelect 
      * {Function} Optional function to be called when a feature is selected.
-     * The function should expect to be called with a feature.
+     *     The function should expect to be called with a feature.
      */
     onSelect: function() {},
 
     /**
      * APIProperty: onUnselect
      * {Function} Optional function to be called when a feature is unselected.
-     *                  The function should expect to be called with a feature.
+     *     The function should expect to be called with a feature.
      */
     onUnselect: function() {},
+    
+    /**
+     * Property: scope
+     * {Object} The scope to use with the onBeforeSelect, onSelect, onUnselect
+     *     callbacks. If null the scope will be this control.
+     */
+    scope: this,
 
     /**
      * APIProperty: geometryTypes
@@ -312,17 +326,20 @@
      * feature - {<OpenLayers.Feature.Vector>} 
      */
     select: function(feature) {
-        var cont = this.layer.events.triggerEvent("beforefeatureselected", {
-            feature: feature
-        });
+        var cont = this.onBeforeSelect.call(this.scope, feature);
         if(cont !== false) {
-            this.layer.selectedFeatures.push(feature);
-    
-            var selectStyle = this.selectStyle || this.renderIntent;
-            
-            this.layer.drawFeature(feature, selectStyle);
-            this.layer.events.triggerEvent("featureselected", {feature: feature});
-            this.onSelect(feature);
+            cont = this.layer.events.triggerEvent("beforefeatureselected", {
+                feature: feature
+            });
+            if(cont !== false) {
+                this.layer.selectedFeatures.push(feature);
+        
+                var selectStyle = this.selectStyle || this.renderIntent;
+                
+                this.layer.drawFeature(feature, selectStyle);
+                this.layer.events.triggerEvent("featureselected", {feature: feature});
+                this.onSelect.call(this.scope, feature);
+            }
         }
     },
 
@@ -339,7 +356,7 @@
         this.layer.drawFeature(feature, "default");
         OpenLayers.Util.removeItem(this.layer.selectedFeatures, feature);
         this.layer.events.triggerEvent("featureunselected", {feature: feature});
-        this.onUnselect(feature);
+        this.onUnselect.call(this.scope, feature);
     },
     
     /**
Index: lib/OpenLayers/Control/ModifyFeature.js
===================================================================
--- lib/OpenLayers/Control/ModifyFeature.js	(revision 8282)
+++ lib/OpenLayers/Control/ModifyFeature.js	(working copy)
@@ -195,17 +195,15 @@
         var selectOptions = {
             geometryTypes: this.geometryTypes,
             clickout: this.clickout,
-            toggle: this.toggle
+            toggle: this.toggle,
+            onBeforeSelect: this.beforeSelectFeature,
+            onSelect: this.selectFeature,
+            onUnselect: this.unselectFeature,
+            scope: this
         };
         this.selectControl = new OpenLayers.Control.SelectFeature(
             layer, selectOptions
         );
-        this.layer.events.on({
-            "beforefeatureselected": this.beforeSelectFeature,
-            "featureselected": this.selectFeature,
-            "featureunselected": this.unselectFeature,
-            scope: this
-        });
 
         // configure the drag control
         var dragOptions = {
@@ -239,12 +237,6 @@
      * Take care of things that are not handled in superclass.
      */
     destroy: function() {
-        this.layer.events.un({
-            "beforefeatureselected": this.beforeSelectFeature,
-            "featureselected": this.selectFeature,
-            "featureunselected": this.unselectFeature,
-            scope: this
-        });
         this.layer = null;
         this.selectControl.destroy();
         this.dragControl.destroy();
@@ -295,12 +287,11 @@
      * Called before a feature is selected.
      *
      * Parameters:
-     * object - {Object} Object with a feature property referencing the
-     *     selected feature.
+     * feature - {<OpenLayers.Feature.Vector>} The feature about to be selected.
      */
-    beforeSelectFeature: function(object) {
+    beforeSelectFeature: function(feature) {
         return this.layer.events.triggerEvent(
-            "beforefeaturemodified", {feature: object.feature}
+            "beforefeaturemodified", {feature: feature}
         );
     },
 
@@ -309,11 +300,10 @@
      * Called when the select feature control selects a feature.
      *
      * Parameters:
-     * object - {Object} Object with a feature property referencing the
-     *     selected feature.
+     * feature - {<OpenLayers.Feature.Vector>} the selected feature.
      */
-    selectFeature: function(object) {
-        this.feature = object.feature;
+    selectFeature: function(feature) {
+        this.feature = feature;
         this.resetVertices();
         this.dragControl.activate();
         this.onModificationStart(this.feature);
@@ -324,10 +314,9 @@
      * Called when the select feature control unselects a feature.
      *
      * Parameters:
-     * object - {Object} Object with a feature property referencing the
-     *     unselected feature.
+     * feature - {<OpenLayers.Feature.Vector>} The unselected feature.
      */
-    unselectFeature: function(object) {
+    unselectFeature: function(feature) {
         this.layer.removeFeatures(this.vertices, {silent: true});
         this.vertices = [];
         this.layer.destroyFeatures(this.virtualVertices, {silent: true});
@@ -342,9 +331,9 @@
         }
         this.feature = null;
         this.dragControl.deactivate();
-        this.onModificationEnd(object.feature);
+        this.onModificationEnd(feature);
         this.layer.events.triggerEvent("afterfeaturemodified", 
-                                       {feature: object.feature});
+                                       {feature: feature});
     },
 
     /**
