diff --git a/servers/slapd/overlays/ppolicy.c b/servers/slapd/overlays/ppolicy.c
index 98221b86d41322a296f779875db544331393f9e5..1ebb02333a6d70b5dd6f2bd1429657a6d59e6c10 100644
--- a/servers/slapd/overlays/ppolicy.c
+++ b/servers/slapd/overlays/ppolicy.c
@@ -2327,7 +2327,18 @@ ppolicy_close(
 	overlay_unregister_control( be, LDAP_CONTROL_PASSWORDPOLICYREQUEST );
 #endif /* SLAP_CONFIG_DELETE */
 
-	/* Perhaps backover should provide bi_destroy hooks... */
+	free( pi->def_policy.bv_val );
+	free( pi );
+
+	return 0;
+}
+
+static int
+ppolicy_db_destroy(
+	BackendDB *be,
+	ConfigReply *cr
+)
+{
 	ov_count--;
 	if ( ov_count <=0 && pwcons ) {
 		pw_conn *pwc = pwcons;
@@ -2335,10 +2346,6 @@ ppolicy_close(
 		pwc--;
 		ch_free( pwc );
 	}
-	free( pi->def_policy.bv_val );
-	free( pi );
-
-	return 0;
 }
 
 static char *extops[] = {
@@ -2380,6 +2387,7 @@ int ppolicy_initialize()
 	ppolicy.on_bi.bi_db_init = ppolicy_db_init;
 	ppolicy.on_bi.bi_db_open = ppolicy_db_open;
 	ppolicy.on_bi.bi_db_close = ppolicy_close;
+	ppolicy.on_bi.bi_db_destroy = ppolicy_db_destroy;
 
 	ppolicy.on_bi.bi_op_add = ppolicy_add;
 	ppolicy.on_bi.bi_op_bind = ppolicy_bind;