diff --git a/CHANGES b/CHANGES
index 73b2eedf16134e4e9f25aaeb1f9748faf7ad8ea2..83ddf32133c6826de56e57089ad92fa989fbe9c8 100644
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,7 @@ OpenLDAP 2.4.13 Engineering
 	Fixed slapd contextCSN pending list (ITS#5709)
 	Fixed slapd control criticality (ITS#5785)
 	Added slapd dn.this search limits (ITS#5734)
+	Fixed slapd error status on shutdown (ITS#5745)
 	Fixed slapd nameUIDPretty bitstring parsing (ITS#5750)
 	Fixed slapd overlay/database open with real structure (ITS#5724)
 	Fixed slapd parsing of read entry control (ITS#5741)
diff --git a/servers/slapd/back-bdb/init.c b/servers/slapd/back-bdb/init.c
index 5de029303bc6cb0984a1c4bac16f876535db9271..a0bfcc16fa8d22d81f0865394b64f3467e9284e3 100644
--- a/servers/slapd/back-bdb/init.c
+++ b/servers/slapd/back-bdb/init.c
@@ -584,6 +584,17 @@ bdb_db_close( BackendDB *be, ConfigReply *cr )
 	ber_bvarray_free( bdb->bi_db_config );
 	bdb->bi_db_config = NULL;
 
+	if( bdb->bi_dbenv ) {
+		/* Free cache locker if we enabled locking.
+		 * TXNs must all be closed before DBs...
+		 */
+		if ( !( slapMode & SLAP_TOOL_QUICK ) && bdb->bi_cache.c_txn ) {
+			TXN_ABORT( bdb->bi_cache.c_txn );
+			bdb->bi_cache.c_txn = NULL;
+		}
+		bdb_reader_flush( bdb->bi_dbenv );
+	}
+
 	while( bdb->bi_databases && bdb->bi_ndatabases-- ) {
 		db = bdb->bi_databases[bdb->bi_ndatabases];
 		rc = db->bdi_db->close( db->bdi_db, 0 );
@@ -614,13 +625,6 @@ bdb_db_close( BackendDB *be, ConfigReply *cr )
 
 	/* close db environment */
 	if( bdb->bi_dbenv ) {
-		/* Free cache locker if we enabled locking */
-		if ( !( slapMode & SLAP_TOOL_QUICK ) && bdb->bi_cache.c_txn ) {
-			TXN_ABORT( bdb->bi_cache.c_txn );
-			bdb->bi_cache.c_txn = NULL;
-		}
-		bdb_reader_flush( bdb->bi_dbenv );
-
 		/* force a checkpoint, but not if we were ReadOnly,
 		 * and not in Quick mode since there are no transactions there.
 		 */
diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c
index 459490b4ee8eea9be6561c47dde6b548d4d3629e..3754a258f20af6203dbce3bc5d295c85632fd207 100644
--- a/servers/slapd/backend.c
+++ b/servers/slapd/backend.c
@@ -349,11 +349,13 @@ int backend_shutdown( Backend *be )
 		}
 
 		if ( be->bd_info->bi_db_close ) {
-			be->bd_info->bi_db_close( be, NULL );
+			rc = be->bd_info->bi_db_close( be, NULL );
+			if ( rc ) return rc;
 		}
 
 		if( be->bd_info->bi_close ) {
-			be->bd_info->bi_close( be->bd_info );
+			rc = be->bd_info->bi_close( be->bd_info );
+			if ( rc ) return rc;
 		}
 
 		return 0;
diff --git a/servers/slapd/slapacl.c b/servers/slapd/slapacl.c
index 67cf7b3b56b62ee8e14659fd7f67c7e06a8ea9cb..c0a06e279c2a980c833ccca40b767952a1171b70 100644
--- a/servers/slapd/slapacl.c
+++ b/servers/slapd/slapacl.c
@@ -1,3 +1,4 @@
+/* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
  * Copyright 2004-2008 The OpenLDAP Foundation.
@@ -399,7 +400,8 @@ destroy:;
 		}
 	}
 
-	slap_tool_destroy();
+	if ( slap_tool_destroy())
+		rc = EXIT_FAILURE;
 
 	return rc;
 }
diff --git a/servers/slapd/slapadd.c b/servers/slapd/slapadd.c
index 468dcea6716c6f1d14b8660bc6c4e2cbebc88abf..442446c1d26ffa416d71a3f4b22e0467566b50b0 100644
--- a/servers/slapd/slapadd.c
+++ b/servers/slapd/slapadd.c
@@ -447,7 +447,8 @@ slapadd( int argc, char **argv )
 		}
 	}
 
-	slap_tool_destroy();
+	if ( slap_tool_destroy())
+		rc = EXIT_FAILURE;
 
 	return rc;
 }
diff --git a/servers/slapd/slapauth.c b/servers/slapd/slapauth.c
index 8934df3b29faad7016f84f37db954fd4aec7bd8b..0b273263842a5f62f4c2f2174bfc51f022fe6176 100644
--- a/servers/slapd/slapauth.c
+++ b/servers/slapd/slapauth.c
@@ -1,3 +1,4 @@
+/* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
  * Copyright 2004-2008 The OpenLDAP Foundation.
@@ -166,7 +167,8 @@ destroy:;
 	if ( !BER_BVISNULL( &authzID ) ) {
 		op->o_tmpfree( authzID.bv_val, op->o_tmpmemctx );
 	}
-	slap_tool_destroy();
+	if ( slap_tool_destroy())
+		rc = EXIT_FAILURE;
 
 	return rc;
 }
diff --git a/servers/slapd/slapcat.c b/servers/slapd/slapcat.c
index 6ea1952006502541080756408981bf00ea2f8039..80586ef65111b75b0fc19e7ed306a9ef8a92e8bd 100644
--- a/servers/slapd/slapcat.c
+++ b/servers/slapd/slapcat.c
@@ -134,6 +134,7 @@ slapcat( int argc, char **argv )
 
 	be->be_entry_close( be );
 
-	slap_tool_destroy();
+	if ( slap_tool_destroy())
+		rc = EXIT_FAILURE;
 	return rc;
 }
diff --git a/servers/slapd/slapcommon.c b/servers/slapd/slapcommon.c
index 6050629cd3b25de64dfb5e36c3a4d9ba47bec27c..fad2bb9a960e7be359a1de93af9108e0c6e93bc5 100644
--- a/servers/slapd/slapcommon.c
+++ b/servers/slapd/slapcommon.c
@@ -740,13 +740,16 @@ startup:;
 	}
 }
 
-void slap_tool_destroy( void )
+int slap_tool_destroy( void )
 {
+	int rc = 0;
 	if ( !dryrun ) {
 		if ( need_shutdown ) {
-			slap_shutdown( be );
+			if ( slap_shutdown( be ))
+				rc = EXIT_FAILURE;
 		}
-		slap_destroy();
+		if ( slap_destroy())
+			rc = EXIT_FAILURE;
 	}
 #ifdef SLAPD_MODULES
 	if ( slapMode == SLAP_SERVER_MODE ) {
@@ -772,4 +775,5 @@ void slap_tool_destroy( void )
 	if ( ldiffp && ldiffp != &dummy ) {
 		ldif_close( ldiffp );
 	}
+	return rc;
 }
diff --git a/servers/slapd/slapcommon.h b/servers/slapd/slapcommon.h
index 9cc22fed48d0f8867879e1b60b81cf7ab6ef8bbf..32138d1c22d474d1c4170b5eff4c1770e365cfb6 100644
--- a/servers/slapd/slapcommon.h
+++ b/servers/slapd/slapcommon.h
@@ -101,6 +101,6 @@ void slap_tool_init LDAP_P((
 	int tool,
 	int argc, char **argv ));
 
-void slap_tool_destroy LDAP_P((void));
+int slap_tool_destroy LDAP_P((void));
 
 #endif /* SLAPCOMMON_H_ */
diff --git a/servers/slapd/slapdn.c b/servers/slapd/slapdn.c
index 2aa12232b23e50ac1c4c57836ac3852ce6771415..95af1a37d8c4d21dbdb4df78d6c7f71bb23354df 100644
--- a/servers/slapd/slapdn.c
+++ b/servers/slapd/slapdn.c
@@ -1,3 +1,4 @@
+/* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
  * Copyright 2004-2008 The OpenLDAP Foundation.
@@ -99,7 +100,8 @@ slapdn( int argc, char **argv )
 		}
 	}
 	
-	slap_tool_destroy();
+	if ( slap_tool_destroy())
+		rc = EXIT_FAILURE;
 
 	return rc;
 }
diff --git a/servers/slapd/slapindex.c b/servers/slapd/slapindex.c
index 6b1f9bb92a879b8b31545ce4d11478717118a393..81ddf6ee93feaaac04e6c6bde7b8da03e4ade845 100644
--- a/servers/slapd/slapindex.c
+++ b/servers/slapd/slapindex.c
@@ -99,6 +99,7 @@ slapindex( int argc, char **argv )
 
 	(void) be->be_entry_close( be );
 
-	slap_tool_destroy();
+	if ( slap_tool_destroy())
+		rc = EXIT_FAILURE;
 	return( rc );
 }
diff --git a/servers/slapd/slaptest.c b/servers/slapd/slaptest.c
index c47abf85d78098755cd962b63162a42678fa6a04..bf48c7e6414ce66b249d08108c35096e8148e33a 100644
--- a/servers/slapd/slaptest.c
+++ b/servers/slapd/slaptest.c
@@ -1,3 +1,4 @@
+/* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
  * Copyright 2004-2008 The OpenLDAP Foundation.
@@ -108,7 +109,8 @@ slaptest( int argc, char **argv )
 		fprintf( stderr, "config file testing succeeded\n");
 	}
 
-	slap_tool_destroy();
+	if ( slap_tool_destroy())
+		rc = EXIT_FAILURE;
 
 	return rc;
 }