diff --git a/CHANGES b/CHANGES
index a30b0bd8b4578a4bd45185505abafa9256c0a5b7..d48f50dcfa605a86a3be3c731959862ae73e0d5f 100644
--- a/CHANGES
+++ b/CHANGES
@@ -9,6 +9,7 @@ OpenLDAP 2.4.11 Engineering
 	Fixed slapd crash with no listeners (ITS#5563)
 	Fixed slapd equality rules for olcRootDN/olcSchemaDN (ITS#5540)
 	Fixed slapd sets memory leak (ITS#5557)
+	Fixed slapd-meta link to slapd-ldap (ITS#5355)
 	Fixed slapd-sock, back-shell buffer count (ITS#5558)
 	Added slapo-nssov contrib module
 	Fixed slapo-pcache handling of negative search caches (ITS#5546)
diff --git a/servers/slapd/back-ldap/back-ldap.h b/servers/slapd/back-ldap/back-ldap.h
index 9098d40841bd356e206692776a33fac9a173a7bf..81a42501f057fc7ebed4ab7aabe2a200657cfd09 100644
--- a/servers/slapd/back-ldap/back-ldap.h
+++ b/servers/slapd/back-ldap/back-ldap.h
@@ -428,6 +428,11 @@ typedef struct ldap_extra_t {
 	int (*proxy_authz_ctrl)( Operation *op, SlapReply *rs, struct berval *bound_ndn,
 		int version, slap_idassert_t *si, LDAPControl	*ctrl );
 	int (*controls_free)( Operation *op, SlapReply *rs, LDAPControl ***pctrls );
+	int (*idassert_authzfrom_parse_cf)( const char *fname, int lineno, const char *arg, slap_idassert_t *si );
+	int (*idassert_parse_cf)( const char *fname, int lineno, int argc, char *argv[], slap_idassert_t *si );
+	void (*retry_info_destroy)( slap_retry_info_t *ri );
+	int (*retry_info_parse)( char *in, slap_retry_info_t *ri, char *buf, ber_len_t buflen );
+	int (*retry_info_unparse)( slap_retry_info_t *ri, struct berval *bvout );
 } ldap_extra_t;
 
 LDAP_END_DECL
diff --git a/servers/slapd/back-ldap/init.c b/servers/slapd/back-ldap/init.c
index 44012c81b762541974091a6a5b73b537b3f609fc..fa32fd47f4832c2930157ffb86638c7241a57a8d 100644
--- a/servers/slapd/back-ldap/init.c
+++ b/servers/slapd/back-ldap/init.c
@@ -34,7 +34,12 @@
 
 static const ldap_extra_t ldap_extra = {
 	ldap_back_proxy_authz_ctrl,
-	ldap_back_controls_free
+	ldap_back_controls_free,
+	slap_idassert_authzfrom_parse_cf,
+	slap_idassert_parse_cf,
+	slap_retry_info_destroy,
+	slap_retry_info_parse,
+	slap_retry_info_unparse
 };
 
 int
diff --git a/servers/slapd/back-ldap/proto-ldap.h b/servers/slapd/back-ldap/proto-ldap.h
index 933c9484cc19f1db24ac2610757bfef846eb003a..e2f98e5b154e1d62877ff537e6a98d76a11e1eeb 100644
--- a/servers/slapd/back-ldap/proto-ldap.h
+++ b/servers/slapd/back-ldap/proto-ldap.h
@@ -63,22 +63,6 @@ extern void ldap_back_conn_free( void *c );
 
 extern ldapconn_t * ldap_back_conn_delete( ldapinfo_t *li, ldapconn_t *lc );
 
-#if 0
-extern int
-ldap_back_proxy_authz_ctrl(
-		struct berval	*bound_ndn,
-		int		version,
-		slap_idassert_t	*si,
-		Operation	*op,
-		SlapReply	*rs,
-		LDAPControl	***pctrls );
-
-extern int
-ldap_back_proxy_authz_ctrl_free(
-		Operation	*op,
-		LDAPControl	***pctrls );
-#endif
-
 extern int
 ldap_back_proxy_authz_ctrl(
 		Operation	*op,
diff --git a/servers/slapd/back-meta/config.c b/servers/slapd/back-meta/config.c
index 2d87c78c32f63bdb219f3eef271271fc9320afd3..1c02ccc248abe3f527db8b13e279c9ce903efe44 100644
--- a/servers/slapd/back-meta/config.c
+++ b/servers/slapd/back-meta/config.c
@@ -1089,7 +1089,7 @@ idassert-authzFrom	"dn:<rootdn>"
 			}
 			cargv[ 2 ] = binddn;
 
-			rc = slap_idassert_parse_cf( fname, lineno, cargc, cargv, &mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_idassert );
+			rc = mi->mi_ldap_extra->idassert_parse_cf( fname, lineno, cargc, cargv, &mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_idassert );
 			if ( rc == 0 ) {
 				struct berval	bv;
 
@@ -1159,7 +1159,7 @@ idassert-authzFrom	"dn:<rootdn>"
 			return 1;
 		}
 
-		return slap_idassert_parse_cf( fname, lineno, argc, argv, &mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_idassert );
+		return mi->mi_ldap_extra->idassert_parse_cf( fname, lineno, argc, argv, &mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_idassert );
 
 	/* idassert-authzFrom */
 	} else if ( strcasecmp( argv[ 0 ], "idassert-authzFrom" ) == 0 ) {
@@ -1188,7 +1188,7 @@ idassert-authzFrom	"dn:<rootdn>"
 			return 1;
 		}
 
-		return slap_idassert_authzfrom_parse_cf( fname, lineno, argv[ 1 ], &mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_idassert );
+		return mi->mi_ldap_extra->idassert_authzfrom_parse_cf( fname, lineno, argv[ 1 ], &mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_idassert );
 
 	/* quarantine */
 	} else if ( strcasecmp( argv[ 0 ], "quarantine" ) == 0 ) {
@@ -1232,7 +1232,7 @@ idassert-authzFrom	"dn:<rootdn>"
 			ldap_pvt_thread_mutex_init( &mi->mi_targets[ mi->mi_ntargets - 1 ]->mt_quarantine_mutex );
 		}
 
-		if ( slap_retry_info_parse( argv[ 1 ], ri, buf, sizeof( buf ) ) ) {
+		if ( mi->mi_ldap_extra->retry_info_parse( argv[ 1 ], ri, buf, sizeof( buf ) ) ) {
 			Debug( LDAP_DEBUG_ANY,
 				"%s line %d: %s.\n",
 				fname, lineno, buf );
diff --git a/servers/slapd/back-meta/init.c b/servers/slapd/back-meta/init.c
index cd98c4738db122e55e33d20f851f021ed8378020..0fe162ca35bb1b6490577f1999f8353d39342137 100644
--- a/servers/slapd/back-meta/init.c
+++ b/servers/slapd/back-meta/init.c
@@ -383,7 +383,7 @@ meta_back_db_destroy(
 				if ( META_BACK_TGT_QUARANTINE( mt ) ) {
 					if ( mt->mt_quarantine.ri_num != mi->mi_quarantine.ri_num )
 					{
-						slap_retry_info_destroy( &mt->mt_quarantine );
+						mi->mi_ldap_extra->retry_info_destroy( &mt->mt_quarantine );
 					}
 
 					ldap_pvt_thread_mutex_destroy( &mt->mt_quarantine_mutex );
@@ -411,7 +411,7 @@ meta_back_db_destroy(
 		}
 
 		if ( META_BACK_QUARANTINE( mi ) ) {
-			slap_retry_info_destroy( &mi->mi_quarantine );
+			mi->mi_ldap_extra->retry_info_destroy( &mi->mi_quarantine );
 		}
 	}