diff --git a/asterisk.c b/asterisk.c
index e3daa1febb66b763784dde360301b6d706599ffa..249931ed3a38378b1bc8aef2f1c5f9936b273071 100755
--- a/asterisk.c
+++ b/asterisk.c
@@ -2081,6 +2081,11 @@ int main(int argc, char *argv[])
 		printf(term_quit());
 		exit(1);
 	}
+	/* load 'preload' modules, required for access to Realtime-mapped configuration files */
+	if (load_modules(1)) {
+		printf(term_quit());
+		exit(1);
+	}
 	ast_channels_init();
 	if (init_manager()) {
 		printf(term_quit());
@@ -2103,7 +2108,7 @@ int main(int argc, char *argv[])
 		printf(term_quit());
 		exit(1);
 	}
-	if (load_modules()) {
+	if (load_modules(0)) {
 		printf(term_quit());
 		exit(1);
 	}
diff --git a/config.c b/config.c
index dcb5c44e24488f6cb778fca619a13cfae8227ffb..cef3d61cf121ad46f13a94bc2e8f6067a8ec9c79 100755
--- a/config.c
+++ b/config.c
@@ -787,8 +787,18 @@ void read_config_maps(void)
 		database = strsep(&stringp, ",");
 		table = strsep(&stringp, ",");
 			
-		if (!strcmp(v->name, extconfig_conf) || !strcmp(v->name, "asterisk.conf")) {
-			ast_log(LOG_WARNING, "Cannot bind asterisk.conf or extconfig.conf!\n");
+		if (!strcmp(v->name, extconfig_conf)) {
+			ast_log(LOG_WARNING, "Cannot bind '%s'!\n", extconfig_conf);
+			continue;
+		}
+
+		if (!strcmp(v->name, "asterisk.conf")) {
+			ast_log(LOG_WARNING, "Cannot bind 'asterisk.conf'!\n");
+			continue;
+		}
+
+		if (!strcmp(v->name, "logger.conf")) {
+			ast_log(LOG_WARNING, "Cannot bind 'logger.conf'!\n");
 			continue;
 		}
 
diff --git a/configs/extconfig.conf.sample b/configs/extconfig.conf.sample
index 56ca2d11771fb59fc15f7e462203aa42396a412d..1cf923fb38e608d92363e3cb03e602e77aa2556e 100755
--- a/configs/extconfig.conf.sample
+++ b/configs/extconfig.conf.sample
@@ -18,7 +18,19 @@
 ;uncomment to load queues.conf via the odbc engine.
 ;
 ;queues.conf => odbc,asterisk,ast_config
-
+;
+; The following files CANNOT be loaded from Realtime storage:
+;	asterisk.conf
+;	extconfig.conf (this file)
+;	logger.conf
+;
+; Additionally, the following files cannot be loaded from
+; Realtime storage unless the storage driver is loaded
+; early using 'preload' statements in modules.conf:
+;	manager.conf
+;	cdr.conf
+;	rtp.conf
+;
 ;
 ; Realtime configuration engine
 ;
diff --git a/configs/modules.conf.sample b/configs/modules.conf.sample
index 8dcee358cfb84740b22e1c630d6ddabb27599968..7162b72da32b1296c866365d247e6d7650975487 100755
--- a/configs/modules.conf.sample
+++ b/configs/modules.conf.sample
@@ -7,6 +7,16 @@
 [modules]
 autoload=yes
 ;
+; Any modules that need to be loaded before the Asterisk core has been initialized
+; (just after the logger has been initialized) can be loaded using 'preload'. This
+; will frequently be needed if you wish to map all module configuration files into
+; Realtime storage, since the Realtime driver will need to be loaded before the
+; modules using those configuration files are initialized.
+;
+; An example of loading ODBC support would be:
+;preload => res_odbc.so
+;preload => res_config_odbc.so
+;
 ; If you want, load the GTK console right away.  
 ; Don't load the KDE console since
 ; it's not as sophisticated right now.
diff --git a/include/asterisk.h b/include/asterisk.h
index 3b6f565900a56468a0f31831ae284a59480b154e..afba16071321c9940f3ad657334631b81b5c21cb 100755
--- a/include/asterisk.h
+++ b/include/asterisk.h
@@ -34,7 +34,7 @@ extern char ast_config_AST_SOCKET[AST_CONFIG_MAX_PATH];
 extern char ast_config_AST_RUN_DIR[AST_CONFIG_MAX_PATH];
 
 /* Provided by module.c */
-extern int load_modules(void);
+extern int load_modules(const int preload_only);
 /* Provided by pbx.c */
 extern int load_pbx(void);
 /* Provided by logger.c */
diff --git a/loader.c b/loader.c
index 012491cc111ce21a6abf66f9f7d8ac91e9ab1242..ec85851909ad8237b41856848edc8bf1d4661e0e 100755
--- a/loader.c
+++ b/loader.c
@@ -450,35 +450,53 @@ static const char *loadorder[] =
 	NULL,
 };
 
-int load_modules()
+int load_modules(const int preload_only)
 {
 	struct ast_config *cfg;
 	struct ast_variable *v;
 	char tmp[80];
-	if (option_verbose) 
-		ast_verbose( "Asterisk Dynamic Loader Starting:\n");
+
+	if (option_verbose) {
+		if (preload_only)
+			ast_verbose("Asterisk Dynamic Loader loading preload modules:\n");
+		else
+			ast_verbose("Asterisk Dynamic Loader Starting:\n");
+	}
+
 	cfg = ast_config_load(AST_MODULE_CONFIG);
 	if (cfg) {
+		int doload;
+
 		/* Load explicitly defined modules */
-		v = ast_variable_browse(cfg, "modules");
-		while(v) {
-			if (!strcasecmp(v->name, "load")) {
+		for (v = ast_variable_browse(cfg, "modules"); v; v = v->next) {
+			doload = 0;
+
+			if (preload_only)
+				doload = !strcasecmp(v->name, "preload");
+			else
+				doload = !strcasecmp(v->name, "load");
+
+		       if (doload) {
 				if (option_debug && !option_verbose)
 					ast_log(LOG_DEBUG, "Loading module %s\n", v->value);
 				if (option_verbose) {
-					ast_verbose( VERBOSE_PREFIX_1 "[%s]", term_color(tmp, v->value, COLOR_BRWHITE, 0, sizeof(tmp)));
+					ast_verbose(VERBOSE_PREFIX_1 "[%s]", term_color(tmp, v->value, COLOR_BRWHITE, 0, sizeof(tmp)));
 					fflush(stdout);
 				}
 				if (__load_resource(v->value, cfg)) {
 					ast_log(LOG_WARNING, "Loading module %s failed!\n", v->value);
-					if (cfg)
-						ast_config_destroy(cfg);
+					ast_config_destroy(cfg);
 					return -1;
 				}
 			}
-			v=v->next;
 		}
 	}
+
+	if (preload_only) {
+		ast_config_destroy(cfg);
+		return 0;
+	}
+
 	if (!cfg || ast_true(ast_variable_retrieve(cfg, "modules", "autoload"))) {
 		/* Load all modules */
 		DIR *mods;