diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c
index eedc24abbe976a4fc246b0562d20aa42bbaaf9b5..203180c3a3f8273c9680c368182dbab28f2c047b 100644
--- a/servers/slapd/syncrepl.c
+++ b/servers/slapd/syncrepl.c
@@ -124,6 +124,7 @@ typedef struct syncinfo_s {
 	int			si_got;
 	int			si_strict_refresh;	/* stop listening during fallback refresh */
 	int			si_too_old;
+	int			si_is_configdb;
 	ber_int_t	si_msgid;
 	Avlnode			*si_presentlist;
 	LDAP			*si_ld;
@@ -974,12 +975,18 @@ get_pmutex(
 	syncinfo_t *si
 )
 {
-	while ( ldap_pvt_thread_mutex_trylock( &si->si_cookieState->cs_pmutex )) {
-		if ( slapd_shutdown )
-			return SYNC_SHUTDOWN;
-		if ( !ldap_pvt_thread_pool_pausecheck( &connection_pool ))
-			ldap_pvt_thread_yield();
+	if ( !si->si_is_configdb ) {
+		ldap_pvt_thread_mutex_lock( &si->si_cookieState->cs_pmutex );
+	} else {
+		/* avoid deadlock when replicating cn=config */
+		while ( ldap_pvt_thread_mutex_trylock( &si->si_cookieState->cs_pmutex )) {
+			if ( slapd_shutdown )
+				return SYNC_SHUTDOWN;
+			if ( !ldap_pvt_thread_pool_pausecheck( &connection_pool ))
+				ldap_pvt_thread_yield();
+		}
 	}
+
 	return 0;
 }
 
@@ -5641,6 +5648,8 @@ add_syncrepl(
 	LDAP_LIST_INIT( &si->si_nonpresentlist );
 	ldap_pvt_thread_mutex_init( &si->si_mutex );
 
+	si->si_is_configdb = strcmp( c->be->be_suffix[0].bv_val, "cn=config" ) == 0;
+
 	rc = parse_syncrepl_line( c, si );
 
 	if ( rc == 0 ) {