diff --git a/CHANGES b/CHANGES
index a99be1c477968db7b92bc97f3b06ae827bf329dd..514634703780a59a8e49990c8c4ae347ae8ef7ee 100644
--- a/CHANGES
+++ b/CHANGES
@@ -21,6 +21,7 @@ OpenLDAP 2.4.22 Engineering
 	Fixed slapo-accesslog to not replicate internal purges (ITS#6519)
 	Fixed slapd-bdb contextCSN updates from updatedn (ITS#6469)
 	Fixed slapd-bdb lockobj zeroing (ITS#6501)
+	Fixed slapd-ldap/meta with ordered values (ITS#6516)
 	Fixed slapo-collect REP_ENTRY flag handling (ITS#5340,ITS#6423)
 	Fixed slapo-dds with NULL backend (ITS#6490)
 	Fixed slapo-dynlist REP_ENTRY flag handling (ITS#5340,ITS#6423)
diff --git a/servers/slapd/back-ldap/search.c b/servers/slapd/back-ldap/search.c
index a8b05326aab101ec56716a8aced87aae6403948c..e2125e82b0ac64d6a6070bb8a8867af7cea4faf5 100644
--- a/servers/slapd/back-ldap/search.c
+++ b/servers/slapd/back-ldap/search.c
@@ -744,12 +744,12 @@ ldap_build_entry(
 			int		rc;
 
 			if ( pretty ) {
-				rc = pretty( attr->a_desc->ad_type->sat_syntax,
+				rc = ordered_value_pretty( attr->a_desc,
 					&attr->a_vals[i], &pval, NULL );
 
 			} else {
-				rc = validate( attr->a_desc->ad_type->sat_syntax,
-					&attr->a_vals[i] );
+				rc = ordered_value_validate( attr->a_desc,
+					&attr->a_vals[i], 0 );
 			}
 
 			if ( rc != LDAP_SUCCESS ) {
@@ -793,9 +793,9 @@ ldap_build_entry(
 			for ( i = 0; i < last; i++ ) {
 				int		rc;
 
-				rc = attr->a_desc->ad_type->sat_equality->smr_normalize(
+				rc = ordered_value_normalize(
 					SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
-					attr->a_desc->ad_type->sat_syntax,
+					attr->a_desc,
 					attr->a_desc->ad_type->sat_equality,
 					&attr->a_vals[i], &attr->a_nvals[i],
 					NULL );
diff --git a/servers/slapd/back-meta/search.c b/servers/slapd/back-meta/search.c
index 96c6b92250cd5275df9e57b1c76b7e8f7e583034..3e2930dd076a678be4c21ba4a6d2c3e652bdc670 100644
--- a/servers/slapd/back-meta/search.c
+++ b/servers/slapd/back-meta/search.c
@@ -2045,12 +2045,12 @@ remove_oc:;
 				int		rc;
 
 				if ( pretty ) {
-					rc = pretty( attr->a_desc->ad_type->sat_syntax,
+					rc = ordered_value_pretty( attr->a_desc,
 						&attr->a_vals[i], &pval, NULL );
 
 				} else {
-					rc = validate( attr->a_desc->ad_type->sat_syntax,
-						&attr->a_vals[i] );
+					rc = ordered_value_validate( attr->a_desc,
+						&attr->a_vals[i], 0 );
 				}
 
 				if ( rc ) {
@@ -2085,9 +2085,9 @@ remove_oc:;
 			attr->a_nvals = ch_malloc( ( last + 1 ) * sizeof( struct berval ) );
 			for ( i = 0; i<last; i++ ) {
 				/* if normalizer fails, drop this value */
-				if ( attr->a_desc->ad_type->sat_equality->smr_normalize(
+				if ( ordered_value_normalize(
 					SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
-					attr->a_desc->ad_type->sat_syntax,
+					attr->a_desc,
 					attr->a_desc->ad_type->sat_equality,
 					&attr->a_vals[i], &attr->a_nvals[i],
 					NULL )) {