diff --git a/servers/slapd/overlays/deref.c b/servers/slapd/overlays/deref.c
index ddc45748bc4ecea8df62b89a91aa61654c76d242..af4d368f56080ca1a03bbb146efe2df7e5b6a143 100644
--- a/servers/slapd/overlays/deref.c
+++ b/servers/slapd/overlays/deref.c
@@ -139,6 +139,7 @@ typedef struct deref_cb_t {
 
 static int			deref_cid;
 static slap_overinst 		deref;
+static int ov_count;
 
 static int
 deref_parseCtrl (
@@ -516,6 +517,29 @@ deref_op_search( Operation *op, SlapReply *rs )
 	return SLAP_CB_CONTINUE;
 }
 
+static int
+deref_db_init( BackendDB *be, ConfigReply *cr)
+{
+	if ( ov_count == 0 ) {
+		int rc;
+
+		rc = register_supported_control2( LDAP_CONTROL_X_DEREF,
+			SLAP_CTRL_SEARCH,
+			NULL,
+			deref_parseCtrl,
+			1, /* replace */
+			&deref_cid );
+		if ( rc != LDAP_SUCCESS ) {
+			Debug( LDAP_DEBUG_ANY,
+				"deref_init: Failed to register control (%d)\n",
+				rc, 0, 0 );
+			return rc;
+		}
+	}
+	ov_count++;
+	return LDAP_SUCCESS;
+}
+
 static int
 deref_db_open( BackendDB *be, ConfigReply *cr)
 {
@@ -524,9 +548,13 @@ deref_db_open( BackendDB *be, ConfigReply *cr)
 
 #ifdef SLAP_CONFIG_DELETE
 static int
-deref_db_close( BackendDB *be, ConfigReply *cr)
+deref_db_destroy( BackendDB *be, ConfigReply *cr)
 {
+	ov_count--;
 	overlay_unregister_control( be, LDAP_CONTROL_X_DEREF );
+	if ( ov_count == 0 ) {
+		unregister_supported_control( LDAP_CONTROL_X_DEREF );
+	}
 	return 0;
 }
 #endif /* SLAP_CONFIG_DELETE */
@@ -534,22 +562,11 @@ deref_db_close( BackendDB *be, ConfigReply *cr)
 int
 deref_initialize(void)
 {
-	int rc;
-
-	rc = register_supported_control( LDAP_CONTROL_X_DEREF,
-		SLAP_CTRL_SEARCH, NULL,
-		deref_parseCtrl, &deref_cid );
-	if ( rc != LDAP_SUCCESS ) {
-		Debug( LDAP_DEBUG_ANY,
-			"deref_init: Failed to register control (%d)\n",
-			rc, 0, 0 );
-		return -1;
-	}
-
 	deref.on_bi.bi_type = "deref";
+	deref.on_bi.bi_db_init = deref_db_init;
 	deref.on_bi.bi_db_open = deref_db_open;
 #ifdef SLAP_CONFIG_DELETE
-	deref.on_bi.bi_db_close = deref_db_close;
+	deref.on_bi.bi_db_destroy = deref_db_destroy;
 #endif /* SLAP_CONFIG_DELETE */
 	deref.on_bi.bi_op_search = deref_op_search;