diff --git a/CHANGES b/CHANGES
index d23def55eb0798f236492896079afe66f1b9a225..80def09e0627a9146e1adf4218606652b6864e4c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,7 @@ OpenLDAP 2.4 Change Log
 OpenLDAP 2.4.17 Engineering
 	Fixed slapd normalization of updated schema attributes (ITS#5540)
 	Fixed slapd errno handling (ITS#6037)
+	Fixed slapd moduleload with static backends and modules (ITS#6016)
 	Build Environment
 		Added test056-monitor (ITS#5540)
 		Added test057-memberof-refint (ITS#5395)
diff --git a/servers/slapd/module.c b/servers/slapd/module.c
index a09da6a8b6dd530ad28515b9326384a5f1dfe991..3b95c7c4b4d079dfb0be5b66666723222c09ab26 100644
--- a/servers/slapd/module.c
+++ b/servers/slapd/module.c
@@ -136,6 +136,31 @@ int module_load(const char* file_name, int argc, char *argv[])
 		return -1;
 	}
 
+	/* If loading a backend, see if we already have it */
+	if ( !strncasecmp( file_name, "back_", 5 )) {
+		char *name = (char *)file_name + 5;
+		char *dot = strchr( name, '.');
+		if (dot) *dot = '\0';
+		rc = backend_info( name ) != NULL;
+		if (dot) *dot = '.';
+		if ( rc ) {
+			Debug( LDAP_DEBUG_CONFIG, "module_load: (%s) already present (static)\n",
+				file_name, 0, 0 );
+			return 0;
+		}
+	} else {
+		/* check for overlays too */
+		char *dot = strchr( file_name, '.' );
+		if ( dot ) *dot = '\0';
+		rc = overlay_find( file_name ) != NULL;
+		if ( dot ) *dot = '.';
+		if ( rc ) {
+			Debug( LDAP_DEBUG_CONFIG, "module_load: (%s) already present (static)\n",
+				file_name, 0, 0 );
+			return 0;
+		}
+	}
+
 	module = (module_loaded_t *)ch_calloc(1, sizeof(module_loaded_t) +
 		strlen(file_name));
 	if (module == NULL) {