diff --git a/src/managesieve-login/managesieve-login-settings.c b/src/managesieve-login/managesieve-login-settings.c
index 440b1b58d30e9d908a75ef5bb54d17726f4897a7..42feef07b94cb462191d5135fad67a4cc75e49f8 100644
--- a/src/managesieve-login/managesieve-login-settings.c
+++ b/src/managesieve-login/managesieve-login-settings.c
@@ -20,40 +20,6 @@
 #include <sys/wait.h>
 #include <sysexits.h>
 
-/* <settings checks> */
-static struct file_listener_settings managesieve_login_unix_listeners_array[] = {
-	{
-		.path = "srv.managesieve-login/%{pid}",
-		.type = "admin",
-		.mode = 0600,
-		.user = "",
-		.group = ""
-	},
-};
-static struct file_listener_settings *managesieve_login_unix_listeners[] = {
-	&managesieve_login_unix_listeners_array[0],
-};
-static buffer_t managesieve_login_unix_listeners_buf = {
-	{ { managesieve_login_unix_listeners,
-	    sizeof(managesieve_login_unix_listeners) } }
-};
-
-static struct inet_listener_settings managesieve_login_inet_listeners_array[] = {
-	{
-		.name = "sieve",
-		.address = "",
-		.port = MANAGESIEVE_DEFAULT_PORT,
-	},
-};
-static struct inet_listener_settings *managesieve_login_inet_listeners[] = {
-	&managesieve_login_inet_listeners_array[0]
-};
-static buffer_t managesieve_login_inet_listeners_buf = {
-	{ { managesieve_login_inet_listeners,
-	    sizeof(managesieve_login_inet_listeners) } }
-};
-/* </settings checks> */
-
 struct service_settings managesieve_login_settings_service_settings = {
 	.name = "managesieve-login",
 	.protocol = "sieve",
@@ -74,13 +40,24 @@ struct service_settings managesieve_login_settings_service_settings = {
 	.idle_kill = 0,
 	.vsz_limit = (uoff_t)-1,
 
-	.unix_listeners = { { &managesieve_login_unix_listeners_buf,
-			      sizeof(managesieve_login_unix_listeners[0]) } },
+	.unix_listeners = ARRAY_INIT,
 	.fifo_listeners = ARRAY_INIT,
-	.inet_listeners = { { &managesieve_login_inet_listeners_buf,
-			      sizeof(managesieve_login_inet_listeners[0]) } }
+	.inet_listeners = ARRAY_INIT,
 };
 
+const struct setting_keyvalue managesieve_login_settings_service_settings_defaults[] = {
+	{ "unix_listener", "srv.managesieve-login\\s%{pid}" },
+
+	{ "unix_listener/srv.managesieve-login\\s%{pid}/path", "srv.managesieve-login/%{pid}" },
+	{ "unix_listener/srv.managesieve-login\\s%{pid}/type", "admin" },
+	{ "unix_listener/srv.managesieve-login\\s%{pid}/mode", "0600" },
+
+	{ "inet_listener", "sieve" },
+
+	{ "inet_listener/sieve/port", "4190" },
+
+	{ NULL, NULL }
+};
 #undef DEF
 #define DEF(type, name) \
 	SETTING_DEFINE_STRUCT_##type(#name, name, struct managesieve_login_settings)
@@ -99,11 +76,6 @@ static const struct managesieve_login_settings managesieve_login_default_setting
 	.managesieve_notify_capability = NULL
 };
 
-static const struct setting_parser_info *managesieve_login_setting_dependencies[] = {
-	&login_setting_parser_info,
-	NULL
-};
-
 const struct setting_parser_info managesieve_login_setting_parser_info = {
 	.name = "managesieve_login",
 
@@ -113,8 +85,6 @@ const struct setting_parser_info managesieve_login_setting_parser_info = {
 	.struct_size = sizeof(struct managesieve_login_settings),
 	.pool_offset1 = 1 + offsetof(struct managesieve_login_settings, pool),
 	.parent = NULL,
-
-	.dependencies = managesieve_login_setting_dependencies
 };
 
 const struct setting_parser_info *managesieve_login_settings_set_roots[] = {
diff --git a/src/managesieve/managesieve-settings.c b/src/managesieve/managesieve-settings.c
index 7580a2479ec897c3fb5250caf50b82f347e81252..8416a6df559dd8a99efe0b81db5bad1577f067fd 100644
--- a/src/managesieve/managesieve-settings.c
+++ b/src/managesieve/managesieve-settings.c
@@ -17,31 +17,6 @@
 static bool managesieve_settings_verify(void *_set, pool_t pool,
 				 const char **error_r);
 
-/* <settings checks> */
-static struct file_listener_settings managesieve_unix_listeners_array[] = {
-	{
-		.path = "login/sieve",
-		.mode = 0666,
-		.user = "",
-		.group = "",
-	},
-	{
-		.path = "srv.managesieve/%{pid}",
-		.type = "admin",
-		.mode = 0600,
-		.user = "",
-		.group = "",
-	},
-};
-static struct file_listener_settings *managesieve_unix_listeners[] = {
-	&managesieve_unix_listeners_array[0],
-	&managesieve_unix_listeners_array[1],
-};
-static buffer_t managesieve_unix_listeners_buf = {
-	{ { managesieve_unix_listeners, sizeof(managesieve_unix_listeners) } }
-};
-/* </settings checks> */
-
 struct service_settings managesieve_settings_service_settings = {
 	.name = "managesieve",
 	.protocol = "sieve",
@@ -62,12 +37,24 @@ struct service_settings managesieve_settings_service_settings = {
 	.idle_kill = 0,
 	.vsz_limit = (uoff_t)-1,
 
-	.unix_listeners = { { &managesieve_unix_listeners_buf,
-				   sizeof(managesieve_unix_listeners[0]) } },
+	.unix_listeners = ARRAY_INIT,
 	.fifo_listeners = ARRAY_INIT,
 	.inet_listeners = ARRAY_INIT
 };
 
+const struct setting_keyvalue managesieve_settings_service_settings_defaults[] = {
+	{ "unix_listener", "login\\ssieve srv.managesieve\\s%{pid}" },
+
+	{ "unix_listener/login\\ssieve/path", "login/sieve" },
+	{ "unix_listener/login\\ssieve/mode", "0666" },
+
+	{ "unix_listener/srv.managesieve\\s%{pid}/path", "srv.managesieve/%{pid}" },
+	{ "unix_listener/srv.managesieve\\s%{pid}/type", "admin" },
+	{ "unix_listener/srv.managesieve\\s%{pid}/mode", "0600" },
+
+	{ NULL, NULL }
+};
+
 #undef DEF
 #define DEF(type, name) \
 	SETTING_DEFINE_STRUCT_##type(#name, name, struct managesieve_settings)
@@ -102,11 +89,6 @@ static struct managesieve_settings managesieve_default_settings = {
 	.managesieve_max_compile_errors = 5
 };
 
-static const struct setting_parser_info *managesieve_setting_dependencies[] = {
-	&mail_user_setting_parser_info,
-	NULL
-};
-
 const struct setting_parser_info managesieve_setting_parser_info = {
 	.name = "managesieve",
 
@@ -118,7 +100,6 @@ const struct setting_parser_info managesieve_setting_parser_info = {
 	.parent = NULL,
 
 	.check_func = managesieve_settings_verify,
-	.dependencies = managesieve_setting_dependencies
 };
 
 static const struct setting_define plugin_setting_defines[] = {