diff --git a/servers/slapd/abandon.c b/servers/slapd/abandon.c
index b8c3438576d1ed163a4f1bbd2e044b046f84da0d..d0eb0244e89e186051e2d3a69b0891d5bd53ea47 100644
--- a/servers/slapd/abandon.c
+++ b/servers/slapd/abandon.c
@@ -43,12 +43,10 @@ do_abandon(
 		return LDAP_PROTOCOL_ERROR;
 	}
 
-#ifdef GET_CTRLS
 	if( (rc = get_ctrls( conn, op, 0 )) != LDAP_SUCCESS ) {
 		Debug( LDAP_DEBUG_ANY, "do_abandon: get_ctrls failed\n", 0, 0 ,0 );
 		return rc;
 	} 
-#endif
 
 	Debug( LDAP_DEBUG_ARGS, "do_abandon: id %d\n", id, 0 ,0 );
 
diff --git a/servers/slapd/add.c b/servers/slapd/add.c
index b1db141b594b7b5b19deb9d9842912712961b763..5e85be3aa7e06aa1adb5b3383819a8cef05a9048 100644
--- a/servers/slapd/add.c
+++ b/servers/slapd/add.c
@@ -110,13 +110,11 @@ do_add( Connection *conn, Operation *op )
 		return LDAP_PROTOCOL_ERROR;
 	}
 
-#ifdef GET_CTRLS
 	if( (rc = get_ctrls( conn, op, 1 )) != LDAP_SUCCESS ) {
 		entry_free( e );
 		Debug( LDAP_DEBUG_ANY, "do_add: get_ctrls failed\n", 0, 0, 0 );
 		return rc;
 	} 
-#endif
 
 	Statslog( LDAP_DEBUG_STATS, "conn=%d op=%d ADD dn=\"%s\"\n",
 	    conn->c_connid, op->o_opid, e->e_ndn, 0, 0 );
diff --git a/servers/slapd/bind.c b/servers/slapd/bind.c
index 28133792e3ff024fcab677c374ad823cc1633746..9586812e3e433a5cfc4473b27ff72f8ddd6f9b65 100644
--- a/servers/slapd/bind.c
+++ b/servers/slapd/bind.c
@@ -108,6 +108,8 @@ do_bind(
 		goto cleanup;
 	}
 
+	op->o_protocol = version;
+
 	if( method != LDAP_AUTH_SASL ) {
 		tag = ber_scanf( ber, /*{*/ "o}", &cred );
 
@@ -134,12 +136,10 @@ do_bind(
 		goto cleanup;
 	}
 
-#ifdef GET_CTRLS
 	if( (rc = get_ctrls( conn, op, 1 )) != LDAP_SUCCESS ) {
 		Debug( LDAP_DEBUG_ANY, "do_bind: get_ctrls failed\n", 0, 0, 0 );
 		goto cleanup;
 	} 
-#endif
 
 	if( method == LDAP_AUTH_SASL ) {
 		Debug( LDAP_DEBUG_TRACE, "do_sasl_bind: dn (%s) mech %s\n",
diff --git a/servers/slapd/compare.c b/servers/slapd/compare.c
index 544b7ca1cd8c5b8350a7de4e112d806963ac04d0..c07c8dabcb630ef84be35a28f262ea715d4951c7 100644
--- a/servers/slapd/compare.c
+++ b/servers/slapd/compare.c
@@ -58,14 +58,12 @@ do_compare(
 		return rc;
 	}
 
-#ifdef GET_CTRLS
 	if( ( rc = get_ctrls( conn, op, 1 )) != LDAP_SUCCESS ) {
 		free( ndn );
 		ava_free( &ava, 0 );
 		Debug( LDAP_DEBUG_ANY, "do_compare: get_ctrls failed\n", 0, 0, 0 );
 		return rc;
 	} 
-#endif
 
 	value_normalize( ava.ava_value.bv_val, attr_syntax( ava.ava_type ) );
 
diff --git a/servers/slapd/delete.c b/servers/slapd/delete.c
index 06253200a5c7f9839347018f64127fddcffa891b..87b320760121c137781f5569350614e2914c0702 100644
--- a/servers/slapd/delete.c
+++ b/servers/slapd/delete.c
@@ -51,13 +51,11 @@ do_delete(
 		return rc;
 	}
 
-#ifdef GET_CTRLS
 	if( ( rc = get_ctrls( conn, op, 1 ) ) != LDAP_SUCCESS ) {
 		free( ndn );
 		Debug( LDAP_DEBUG_ANY, "do_add: get_ctrls failed\n", 0, 0, 0 );
 		return rc;
 	} 
-#endif
 
 	Debug( LDAP_DEBUG_ARGS, "do_delete: dn (%s)\n", ndn, 0, 0 );
 
diff --git a/servers/slapd/libslapd.dsp b/servers/slapd/libslapd.dsp
index 3c58616d44632fe44a7169f17b6a3f3be64cedca..6800343d723979cfe529954ad603fbca91df1ca6 100644
--- a/servers/slapd/libslapd.dsp
+++ b/servers/slapd/libslapd.dsp
@@ -180,6 +180,10 @@ SOURCE=.\connection.c
 # End Source File
 # Begin Source File
 
+SOURCE=.\controls.c
+# End Source File
+# Begin Source File
+
 SOURCE=.\daemon.c
 # End Source File
 # Begin Source File
diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c
index c245a54c62b3c67f537bd970be3a61fdfce4b828..6be8038bdfd7257c6b749bb0ea539fc246a96e0a 100644
--- a/servers/slapd/modify.c
+++ b/servers/slapd/modify.c
@@ -142,14 +142,12 @@ do_modify(
 	}
 #endif
 
-#ifdef  GET_CTRLS
 	if( (rc = get_ctrls( conn, op, 1 )) != LDAP_SUCCESS ) {
 		free( ndn );
 		modlist_free( modlist );
 		Debug( LDAP_DEBUG_ANY, "do_modify: get_ctrls failed\n", 0, 0, 0 );
 		return rc;
 	} 
-#endif
 
 	Statslog( LDAP_DEBUG_STATS, "conn=%d op=%d MOD dn=\"%s\"\n",
 	    conn->c_connid, op->o_opid, ndn, 0, 0 );
diff --git a/servers/slapd/monitor.c b/servers/slapd/monitor.c
index a37ab8b2a502b16ba992b8512e9aa49fbdf56918..9dcf13d9e9714d385d3e1551df628a5a5b227202 100644
--- a/servers/slapd/monitor.c
+++ b/servers/slapd/monitor.c
@@ -21,10 +21,6 @@
 #include "ldap_defaults.h"
 #include "slap.h"
 
-char *supportedControls[] = {
-	NULL
-};
-
 char *supportedExtensions[] = {
 	NULL
 };
diff --git a/servers/slapd/operation.c b/servers/slapd/operation.c
index ddad7b90646c6ee08fa23cb3ed020aa1886480e0..4ca92d801b7ac8a5b48242b4fcf97f1c23d167cb 100644
--- a/servers/slapd/operation.c
+++ b/servers/slapd/operation.c
@@ -27,6 +27,9 @@ slap_op_free( Operation *op )
 	if ( op->o_authmech != NULL ) {
 		free( op->o_authmech );
 	}
+	if ( op->o_ctrls != NULL ) {
+		ldap_controls_free( op->o_ctrls );
+	}
 
 	ldap_pvt_thread_mutex_destroy( &op->o_abandonmutex );
 
@@ -55,6 +58,7 @@ slap_op_alloc(
 	op->o_dn = NULL;
 	op->o_ndn = NULL;
 	op->o_authmech = NULL;
+	op->o_ctrls = NULL;
 
 	op->o_time = slap_get_time();
 	op->o_opid = id;
diff --git a/servers/slapd/search.c b/servers/slapd/search.c
index 25f73163791911241c414609bfc501b8764c6ba0..fece855dc78622529108cc9d244c4971fe77fbe2 100644
--- a/servers/slapd/search.c
+++ b/servers/slapd/search.c
@@ -104,12 +104,10 @@ do_search(
 		goto return_results;
 	}
 
-#ifdef GET_CTRLS
 	if( (rc = get_ctrls( conn, op, 1 )) != LDAP_SUCCESS ) {
 		Debug( LDAP_DEBUG_ANY, "do_search: get_ctrls failed\n", 0, 0, 0 );
 		goto return_results;
 	} 
-#endif
 
 	rc = 0;