diff --git a/servers/slapd/back-bdb/tools.c b/servers/slapd/back-bdb/tools.c
index 39ff2d728a2140a677ba49977ebb6f44efb0348b..09d25571ae0812c668d661fa39a83299656c7d1f 100644
--- a/servers/slapd/back-bdb/tools.c
+++ b/servers/slapd/back-bdb/tools.c
@@ -64,7 +64,7 @@ static bdb_tool_idl_cache_entry *bdb_tool_idl_free_list;
 
 static ID bdb_tool_ix_id;
 static Operation *bdb_tool_ix_op;
-static volatile int *bdb_tool_index_threads;
+static int *bdb_tool_index_threads, bdb_tool_index_tcount;
 static void *bdb_tool_index_rec;
 static struct bdb_info *bdb_tool_info;
 static ldap_pvt_thread_mutex_t bdb_tool_index_mutex;
@@ -100,12 +100,12 @@ int bdb_tool_entry_open(
 			ldap_pvt_thread_cond_init( &bdb_tool_index_cond );
 			bdb_tool_index_threads = ch_malloc( slap_tool_thread_max * sizeof( int ));
 			bdb_tool_index_rec = ch_malloc( bdb->bi_nattrs * sizeof( IndexRec ));
+			bdb_tool_index_tcount = slap_tool_thread_max - 1;
 			for (i=1; i<slap_tool_thread_max; i++) {
 				int *ptr = ch_malloc( sizeof( int ));
 				*ptr = i;
 				ldap_pvt_thread_pool_submit( &connection_pool,
 					bdb_tool_index_task, ptr );
-				ldap_pvt_thread_yield();
 			}
 		}
 		bdb_tool_info = bdb;
@@ -120,6 +120,7 @@ int bdb_tool_entry_close(
 	if ( bdb_tool_info ) {
 		slapd_shutdown = 1;
 		ldap_pvt_thread_mutex_lock( &bdb_tool_index_mutex );
+		bdb_tool_index_tcount = slap_tool_thread_max - 1;
 		ldap_pvt_thread_cond_broadcast( &bdb_tool_index_cond );
 		ldap_pvt_thread_mutex_unlock( &bdb_tool_index_mutex );
 	}
@@ -406,8 +407,15 @@ bdb_tool_index_add(
 		bdb_tool_ix_id = e->e_id;
 		bdb_tool_ix_op = op;
 		ldap_pvt_thread_mutex_lock( &bdb_tool_index_mutex );
+		/* Wait for all threads to be ready */
+		while ( bdb_tool_index_tcount ) {
+			ldap_pvt_thread_mutex_unlock( &bdb_tool_index_mutex );
+			ldap_pvt_thread_yield();
+			ldap_pvt_thread_mutex_lock( &bdb_tool_index_mutex );
+		}
 		for ( i=1; i<slap_tool_thread_max; i++ )
 			bdb_tool_index_threads[i] = LDAP_BUSY;
+		bdb_tool_index_tcount = slap_tool_thread_max - 1;
 		ldap_pvt_thread_cond_broadcast( &bdb_tool_index_cond );
 		ldap_pvt_thread_mutex_unlock( &bdb_tool_index_mutex );
 		rc = bdb_index_recrun( op, bdb, ir, e->e_id, 0 );
@@ -1032,6 +1040,7 @@ bdb_tool_index_task( void *ctx, void *ptr )
 	free( ptr );
 	while ( 1 ) {
 		ldap_pvt_thread_mutex_lock( &bdb_tool_index_mutex );
+		bdb_tool_index_tcount--;
 		ldap_pvt_thread_cond_wait( &bdb_tool_index_cond,
 			&bdb_tool_index_mutex );
 		ldap_pvt_thread_mutex_unlock( &bdb_tool_index_mutex );