diff --git a/CHANGES b/CHANGES
index da1a9b8f7d1d66894bcd1ad7f39e691928cedfb8..e224f5b1a43743cf4744719c3749171a5c506eff 100644
--- a/CHANGES
+++ b/CHANGES
@@ -49,6 +49,7 @@ OpenLDAP 2.4.24 Engineering
 	Fixed slapo-pcache callback freeing (ITS#6640)
 	Fixed slapo-pcache to ignore undefined attrs (ITS#6600)
 	Fixed slapo-ppolicy don't update opattrs on consumers (ITS#6608)
+	Fixed slapo-ppolicy to allow userPassword deletion (ITS#6620)
 	Fixed slapo-refint when last group member is deleted (ITS#6663)
 	Fixed slapo-refint with subtree rename (ITS#6730)
 	Fixed slapo-sssvlv initialization (ITS#6649)
diff --git a/servers/slapd/overlays/ppolicy.c b/servers/slapd/overlays/ppolicy.c
index 4064d003a2c7cbef877790a122e0207aca58381f..930b1532ca056a3a3e8e4517c504e01929549da4 100644
--- a/servers/slapd/overlays/ppolicy.c
+++ b/servers/slapd/overlays/ppolicy.c
@@ -1969,23 +1969,26 @@ do_modify:
 		timestamp.bv_len = sizeof(timebuf);
 		slap_timestamp( &now, &timestamp );
 
-		mods = (Modifications *) ch_calloc( sizeof( Modifications ), 1 );
-		mods->sml_desc = ad_pwdChangedTime;
+		mods = NULL;
 		if (pwmop != LDAP_MOD_DELETE) {
+			mods = (Modifications *) ch_calloc( sizeof( Modifications ), 1 );
 			mods->sml_op = LDAP_MOD_REPLACE;
 			mods->sml_numvals = 1;
 			mods->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) );
 			ber_dupbv( &mods->sml_values[0], &timestamp );
 			BER_BVZERO( &mods->sml_values[1] );
 			assert( !BER_BVISNULL( &mods->sml_values[0] ) );
-
-		} else {
+		} else if (attr_find(e->e_attrs, ad_pwdChangedTime )) {
+			mods = (Modifications *) ch_calloc( sizeof( Modifications ), 1 );
 			mods->sml_op = LDAP_MOD_DELETE;
 		}
-		mods->sml_flags = SLAP_MOD_INTERNAL;
-		mods->sml_next = NULL;
-		modtail->sml_next = mods;
-		modtail = mods;
+		if (mods) {
+			mods->sml_desc = ad_pwdChangedTime;
+			mods->sml_flags = SLAP_MOD_INTERNAL;
+			mods->sml_next = NULL;
+			modtail->sml_next = mods;
+			modtail = mods;
+		}
 
 		if (attr_find(e->e_attrs, ad_pwdGraceUseTime )) {
 			mods = (Modifications *) ch_calloc( sizeof( Modifications ), 1 );