diff -ur dovecot-2.1.16.orig/src/auth/main.c dovecot-2.1.16/src/auth/main.c
--- dovecot-2.1.16.orig/src/auth/main.c	2012-07-28 18:14:39.000000000 +0200
+++ dovecot-2.1.16/src/auth/main.c	2013-04-23 15:11:51.929385367 +0200
@@ -163,6 +163,7 @@
 {
 	struct module_dir_load_settings mod_set;
 	const char *const *services;
+	const char *moduledir;
 
 	/* Open /dev/urandom before chrooting */
 	random_init();
@@ -186,7 +187,8 @@
 	mod_set.debug = global_auth_settings->debug;
 	mod_set.filter_callback = auth_module_filter;
 
-	modules = module_dir_load(AUTH_MODULE_DIR, NULL, &mod_set);
+	moduledir = getenv("DOVECOT_AUTH_MODULE_DIR");
+	modules = module_dir_load(moduledir == NULL ? AUTH_MODULE_DIR : moduledir, NULL, &mod_set);
 	module_dir_init(modules);
 
 	if (!worker)
diff -ur dovecot-2.1.16.orig/src/config/config-parser.c dovecot-2.1.16/src/config/config-parser.c
--- dovecot-2.1.16.orig/src/config/config-parser.c	2013-04-23 12:28:09.650237982 +0200
+++ dovecot-2.1.16/src/config/config-parser.c	2013-04-23 16:12:48.431440233 +0200
@@ -976,6 +976,55 @@
 	return ret < 0 ? ret : 1;
 }
 
+void config_parse_load_modules_from_dir(char **argv[])
+{
+	struct module_dir_load_settings mod_set;
+	struct module *m;
+	const struct setting_parser_info **roots;
+	ARRAY_DEFINE(new_roots, const struct setting_parser_info *);
+	ARRAY_TYPE(service_settings) new_services;
+	struct service_settings *const *services, *service_set;
+	unsigned int i, count;
+	const char *moduledir;
+
+	memset(&mod_set, 0, sizeof(mod_set));
+	mod_set.version = master_service_get_version_string(master_service);
+	moduledir = (*argv)[1];
+	modules = module_dir_load(moduledir == NULL ? CONFIG_MODULE_DIR : moduledir, NULL, &mod_set);
+	module_dir_init(modules);
+
+	i_array_init(&new_roots, 64);
+	i_array_init(&new_services, 64);
+	for (m = modules; m != NULL; m = m->next) {
+		roots = module_get_symbol_quiet(m,
+			t_strdup_printf("%s_set_roots", m->name));
+		if (roots != NULL) {
+			for (i = 0; roots[i] != NULL; i++)
+				array_append(&new_roots, &roots[i], 1);
+		}
+
+		service_set = module_get_symbol_quiet(m,
+			t_strdup_printf("%s_service_settings", m->name));
+		if (service_set != NULL)
+			array_append(&new_services, &service_set, 1);
+	}
+	if (array_count(&new_roots) > 0) {
+		/* modules added new settings. add the defaults and start
+		   using the new list. */
+		for (i = 0; all_roots[i] != NULL; i++)
+			array_append(&new_roots, &all_roots[i], 1);
+		(void)array_append_space(&new_roots);
+		all_roots = array_idx(&new_roots, 0);
+	}
+	if (array_count(&new_services) > 0) {
+		/* module added new services. update the defaults. */
+		services = array_get(default_services, &count);
+		for (i = 0; i < count; i++)
+			array_append(&new_services, &services[i], 1);
+		*default_services = new_services;
+	}
+}
+
 void config_parse_load_modules(void)
 {
 	struct module_dir_load_settings mod_set;
@@ -985,10 +1034,12 @@
 	ARRAY_TYPE(service_settings) new_services;
 	struct service_settings *const *services, *service_set;
 	unsigned int i, count;
+	const char *moduledir;
 
 	memset(&mod_set, 0, sizeof(mod_set));
 	mod_set.version = master_service_get_version_string(master_service);
-	modules = module_dir_load(CONFIG_MODULE_DIR, NULL, &mod_set);
+	moduledir = getenv("DOVECOT_CONFIG_MODULE_DIR");
+	modules = module_dir_load(moduledir == NULL ? CONFIG_MODULE_DIR : moduledir, NULL, &mod_set);
 	module_dir_init(modules);
 
 	i_array_init(&new_roots, 64);
Only in dovecot-2.1.16.orig/src/config: config-parser.c.rej
diff -ur dovecot-2.1.16.orig/src/config/config-parser.h dovecot-2.1.16/src/config/config-parser.h
--- dovecot-2.1.16.orig/src/config/config-parser.h	2011-12-13 12:35:28.000000000 +0100
+++ dovecot-2.1.16/src/config/config-parser.h	2013-04-23 16:13:07.720440522 +0200
@@ -21,6 +21,8 @@
 int config_parse_file(const char *path, bool expand_values, const char *module,
 		      const char **error_r);
 
+void config_parse_load_modules_from_dir(char **argv[]);
+
 void config_parse_load_modules(void);
 
 bool config_module_want_parser(struct config_module_parser *parsers,
diff -ur dovecot-2.1.16.orig/src/config/main.c dovecot-2.1.16/src/config/main.c
--- dovecot-2.1.16.orig/src/config/main.c	2012-12-20 16:31:13.000000000 +0100
+++ dovecot-2.1.16/src/config/main.c	2013-04-23 16:03:33.986431913 +0200
@@ -26,7 +26,10 @@
 	restrict_access_by_env(NULL, FALSE);
 	restrict_access_allow_coredumps(TRUE);
 
-	config_parse_load_modules();
+	if (argc > 1)
+		config_parse_load_modules_from_dir(&argv);
+	else
+		config_parse_load_modules();
 
 	path = master_service_get_config_path(master_service);
 	if (config_parse_file(path, TRUE, "", &error) <= 0)
