diff --git a/CHANGES b/CHANGES
index 27379cb27c35b604128da5eb3a92c8babfd553c0..24d0afb4cfc0a16f0b4fda791bba1ba4e5a08691 100644
--- a/CHANGES
+++ b/CHANGES
@@ -8,12 +8,14 @@ OpenLDAP 2.4.12 Engineering
 	Fixed slapd socket closing on Windows (ITS#5606)
 	Fixed slapd-ldap,slapd-meta invalid filter behavior (ITS#5614)
 	Fixed slapd-meta quarantine behavior (ITS#5592)
+	Fixed slapd-meta objectClass filtering (ITS#5647)
 	Fixed slapd-relay initialization (ITS#5643)
 	Fixed slapd-sql freeing of connection (ITS#5607)
 	Fixed slapo-constraint string termination (ITS#5609)
 	Fixed slapo-memberof internal operations DN (ITS#5622)
 	Fixed slapo-rwm callback cleanup (ITS#5601)
 	Fixed slapo-rwm attr mapping and merging (ITS#5624)
+	Fixed slapo-rwm objectClass filtering (ITS#5647)
 	Fixed slapo-unique filter validation (ITS#5581)
 	Fixed slapo-unique suffix testing (ITS#5641)
 	Build Environment
diff --git a/servers/slapd/back-meta/config.c b/servers/slapd/back-meta/config.c
index c3424438e6fd5715ae7042f059cc418ab532ae6a..610f607545a6c7a6c2d3288a4fc3ac9ee6f45a1e 100644
--- a/servers/slapd/back-meta/config.c
+++ b/servers/slapd/back-meta/config.c
@@ -1556,6 +1556,11 @@ ldap_back_map_config(
 		return 1;
 	}
 
+	if ( !is_oc && map->map == NULL ) {
+		/* only init if required */
+		ldap_back_map_init( map, &mapping );
+	}
+
 	if ( strcmp( argv[ 2 ], "*" ) == 0 ) {
 		if ( argc < 4 || strcmp( argv[ 3 ], "*" ) == 0 ) {
 			map->drop_missing = ( argc < 4 );
@@ -1702,11 +1707,6 @@ ldap_back_map_config(
 				mapping_cmp, mapping_dup );
 
 success_return:;
-	if ( !is_oc && map->map == NULL ) {
-		/* only init if required */
-		ldap_back_map_init( map, &mapping );
-	}
-
 	return 0;
 
 error_return:;
diff --git a/servers/slapd/overlays/rwmconf.c b/servers/slapd/overlays/rwmconf.c
index d612712f0e7f0f87ee0e9151db30f90307fb4758..a96bf8b4507cfad4dc35096390be363d604bfbfb 100644
--- a/servers/slapd/overlays/rwmconf.c
+++ b/servers/slapd/overlays/rwmconf.c
@@ -71,6 +71,13 @@ rwm_map_config(
 		return 1;
 	}
 
+	if ( !is_oc && map->map == NULL ) {
+		/* only init if required */
+		if ( rwm_map_init( map, &mapping ) != LDAP_SUCCESS ) {
+			return 1;
+		}
+	}
+
 	if ( strcmp( argv[2], "*" ) == 0 ) {
 		if ( argc < 4 || strcmp( argv[3], "*" ) == 0 ) {
 			map->drop_missing = ( argc < 4 );
@@ -225,11 +232,6 @@ rwm_map_config(
 				rwm_mapping_cmp, rwm_mapping_dup );
 
 success_return:;
-	if ( !is_oc && map->map == NULL ) {
-		/* only init if required */
-		rc = rwm_map_init( map, &mapping ) != LDAP_SUCCESS;
-	}
-
 	return rc;
 
 error_return:;
diff --git a/servers/slapd/overlays/rwmmap.c b/servers/slapd/overlays/rwmmap.c
index c9a8126db5514282427aa67c7fa250d0f9dc99e1..bc79ae17b64fdb1379577f8039d6948610ec4ba5 100644
--- a/servers/slapd/overlays/rwmmap.c
+++ b/servers/slapd/overlays/rwmmap.c
@@ -81,7 +81,9 @@ rwm_map_init( struct ldapmap *lm, struct ldapmapping **m )
 		return LDAP_NO_MEMORY;
 	}
 
-	/* FIXME: I don't think this is needed any more... */
+	/* NOTE: this is needed to make sure that
+	 *	rwm-map attribute *
+	 * does not  filter out all attributes including objectClass */
 	rc = slap_str2ad( "objectClass", &mapping[0].m_src_ad, &text );
 	if ( rc != LDAP_SUCCESS ) {
 		ch_free( mapping );