diff --git a/src/lib-sieve/Makefile.am b/src/lib-sieve/Makefile.am
index 10d3818e9ab4e7369eb7195358f2e31538b4a85a..9bffcf1eb9f34d148e53b9f8da40bd6097a693b5 100644
--- a/src/lib-sieve/Makefile.am
+++ b/src/lib-sieve/Makefile.am
@@ -71,7 +71,7 @@ libdovecot_sieve_la_LIBADD = $(plugins)
 
 libdovecot_sieve_la_SOURCES = \
 	rfc2822.c \
-	sieve-limits.c \
+	sieve-settings.c \
 	sieve-message.c \
 	sieve-smtp.c \
 	sieve-lexer.c \
@@ -109,6 +109,7 @@ headers = \
 	sieve-types.h \
 	sieve-common.h \
 	sieve-limits.h \
+	sieve-settings.h \
 	sieve-message.h \
 	sieve-smtp.h \
 	sieve-lexer.h \
diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index d035a2212222c7a1465c3d731e77113c8826ed71..3bc201d70d6e863a30936dbac72f3e391bbb7c3b 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -196,6 +196,7 @@ static bool cmd_redirect_operation_dump
 static int cmd_redirect_operation_execute
 (const struct sieve_runtime_env *renv, sieve_size_t *address)
 {
+	struct sieve_instance *svinst = renv->svinst;
 	struct sieve_side_effects_list *slist = NULL;
 	struct act_redirect_context *act;
 	string_t *redirect;
@@ -234,7 +235,7 @@ static int cmd_redirect_operation_execute
 	
 	ret = sieve_result_add_action
 		(renv, NULL, &act_redirect, slist, source_line, (void *) act,
-			sieve_max_redirects);
+			svinst->max_redirects);
 	
 	return ( ret >= 0 );
 }
diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c
index d6715932f44a5c7227909852779024957746d731..0941f9d068227c5825d8c9b2ea6176541afe56ce 100644
--- a/src/lib-sieve/plugins/include/ext-include-common.c
+++ b/src/lib-sieve/plugins/include/ext-include-common.c
@@ -7,6 +7,7 @@
 #include "home-expand.h"
 
 #include "sieve-common.h"
+#include "sieve-settings.h"
 #include "sieve-error.h"
 #include "sieve-script.h"
 #include "sieve-ast.h"
diff --git a/src/lib-sieve/plugins/subaddress/ext-subaddress.c b/src/lib-sieve/plugins/subaddress/ext-subaddress.c
index d7f714b3e4794ecaf06be429d7d6ff2bbd5f1cc9..17de8d5e16d9e45636eeecebcfaae2cc9db02aeb 100644
--- a/src/lib-sieve/plugins/subaddress/ext-subaddress.c
+++ b/src/lib-sieve/plugins/subaddress/ext-subaddress.c
@@ -13,6 +13,7 @@
  
 #include "sieve-common.h"
 
+#include "sieve-settings.h"
 #include "sieve-code.h"
 #include "sieve-address.h"
 #include "sieve-extensions.h"
diff --git a/src/lib-sieve/sieve-common.h b/src/lib-sieve/sieve-common.h
index e92f83d4be96d3a61fc11864d312acde8e91a204..80d9dc0563277dac02f6b993166ed312b332a441 100644
--- a/src/lib-sieve/sieve-common.h
+++ b/src/lib-sieve/sieve-common.h
@@ -10,6 +10,7 @@
 #include "sieve-types.h"
 
 #include <sys/types.h>
+#include <stdlib.h>
 
 /* 
  * Types
@@ -144,21 +145,10 @@ struct sieve_instance {
 
 	/* Extension registry */
 	struct sieve_extension_registry *ext_reg;
-};
-
-/*
- * Settings
- */
 
-static inline const char *sieve_get_setting
-(struct sieve_instance *svinst, const char *identifier)
-{
-	const struct sieve_callbacks *callbacks = svinst->callbacks;
-
-	if ( callbacks == NULL || callbacks->get_setting == NULL )
-		return NULL;
-
-	return callbacks->get_setting(svinst->context, identifier);
-}
+	/* Limits */
+	unsigned int max_actions;
+	unsigned int max_redirects;
+};
 
 #endif /* __SIEVE_COMMON_H */
diff --git a/src/lib-sieve/sieve-limits.c b/src/lib-sieve/sieve-limits.c
deleted file mode 100644
index dcc664f24727f06964b5b1b809c9ed4a7996eb57..0000000000000000000000000000000000000000
--- a/src/lib-sieve/sieve-limits.c
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file
- */
-
-#include "sieve-common.h"
-#include "sieve-limits.h"
-
-unsigned int sieve_max_actions = SIEVE_DEFAULT_MAX_ACTIONS;
-unsigned int sieve_max_redirects = SIEVE_DEFAULT_MAX_REDIRECTS;
-
diff --git a/src/lib-sieve/sieve-limits.h b/src/lib-sieve/sieve-limits.h
index 94f6a2ad1b55899aa16cd554b89d4ae88552741b..7ac4ba6f89e163a014b9da61072352612e39b72d 100644
--- a/src/lib-sieve/sieve-limits.h
+++ b/src/lib-sieve/sieve-limits.h
@@ -32,7 +32,4 @@
 #define SIEVE_DEFAULT_MAX_ACTIONS   32
 #define SIEVE_DEFAULT_MAX_REDIRECTS 4
 
-extern unsigned int sieve_max_actions;
-extern unsigned int sieve_max_redirects;
-
 #endif /* __SIEVE_LIMITS_H */
diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c
index 5476b95de7e7ec89c7cbfb85b322dae0fe64c038..ff875591ce1b0f89d96ee0b7d8e1c79308e5bcd6 100644
--- a/src/lib-sieve/sieve-result.c
+++ b/src/lib-sieve/sieve-result.c
@@ -491,6 +491,7 @@ static int _sieve_result_add_action
 {
 	int ret = 0;
 	unsigned int instance_count = 0;
+	struct sieve_instance *svinst = renv->svinst;
 	struct sieve_result *result = renv->result;
 	struct sieve_result_action *raction = NULL, *kaction = NULL;
 	struct sieve_action action;
@@ -591,7 +592,8 @@ static int _sieve_result_add_action
 	}
 
 	/* Check policy limit on total number of actions */
-	if ( sieve_max_actions > 0 && result->action_count >= sieve_max_actions ) {
+	if ( svinst->max_actions > 0 && result->action_count >= svinst->max_actions ) 
+		{
 		sieve_runtime_error(renv, action.location, 
 			"total number of actions exceeds policy limit");
 		return -1;
diff --git a/src/lib-sieve/sieve-settings.c b/src/lib-sieve/sieve-settings.c
new file mode 100644
index 0000000000000000000000000000000000000000..45061cd0d374915f8a7124698fac1404e053e187
--- /dev/null
+++ b/src/lib-sieve/sieve-settings.c
@@ -0,0 +1,49 @@
+/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file
+ */
+
+#include "lib.h"
+
+#include "sieve-common.h"
+#include "sieve-settings.h"
+
+#include <stdlib.h>
+
+bool sieve_get_uint_setting
+(struct sieve_instance *svinst, const char *identifier,
+	unsigned long long int *value_r)
+{
+	const char *str_value;
+	char *endp;
+
+	str_value = sieve_get_setting(svinst, identifier);
+
+	if ( str_value == NULL || *str_value == '\0' )
+		return FALSE;
+
+	*value_r = strtoull(str_value, &endp, 10);
+
+	if ( *endp != '\0' )
+		return FALSE;
+	
+	return TRUE;	
+}
+
+bool sieve_get_int_setting
+(struct sieve_instance *svinst, const char *identifier,
+	long long int *value_r)
+{
+	const char *str_value;
+	char *endp;
+
+	str_value = sieve_get_setting(svinst, identifier);
+
+	if ( str_value == NULL || *str_value == '\0' )
+		return FALSE;
+
+	*value_r = strtoll(str_value, &endp, 10);
+
+	if ( *endp != '\0' )
+		return FALSE;
+	
+	return TRUE;	
+}
diff --git a/src/lib-sieve/sieve-settings.h b/src/lib-sieve/sieve-settings.h
new file mode 100644
index 0000000000000000000000000000000000000000..e0cd91187c9ca2fcc1e7e8f85042296325930a6a
--- /dev/null
+++ b/src/lib-sieve/sieve-settings.h
@@ -0,0 +1,28 @@
+/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file
+ */
+
+#ifndef __SIEVE_SETTINGS_H
+#define __SIEVE_SETTINGS_H
+
+#include "sieve-common.h"
+
+static inline const char *sieve_get_setting
+(struct sieve_instance *svinst, const char *identifier)
+{
+	const struct sieve_callbacks *callbacks = svinst->callbacks;
+
+	if ( callbacks == NULL || callbacks->get_setting == NULL )
+		return NULL;
+
+	return callbacks->get_setting(svinst->context, identifier);
+}
+
+bool sieve_get_uint_setting
+(struct sieve_instance *svinst, const char *identifier,
+	unsigned long long int *value_r);
+
+bool sieve_get_int_setting
+(struct sieve_instance *svinst, const char *identifier,
+	long long int *value_r);
+
+#endif /* __SIEVE_SETTINGS_H */
diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c
index f5d2879a9d8047d44dc85d4632ff9d0d057c3487..e4c69a19d7f9d995502f889c9a0ec41f115acf25 100644
--- a/src/lib-sieve/sieve.c
+++ b/src/lib-sieve/sieve.c
@@ -6,6 +6,8 @@
 #include "istream.h"
 #include "buffer.h"
 
+#include "sieve-limits.h"
+#include "sieve-settings.h"
 #include "sieve-extensions.h"
 
 #include "sieve-script.h"
@@ -39,14 +41,32 @@ struct sieve_instance *sieve_init
 (const struct sieve_callbacks *callbacks, void *context)
 {
 	struct sieve_instance *svinst;
+	unsigned long long int uint_setting;
 	pool_t pool;
 
+	/* Create Sieve engine instance */
 	pool = pool_alloconly_create("sieve", 8192);
 	svinst = p_new(pool, struct sieve_instance, 1);
 	svinst->pool = pool;
 	svinst->callbacks = callbacks;
 	svinst->context = context;
 
+	/* Read limits from configuration */
+
+	svinst->max_actions = SIEVE_DEFAULT_MAX_ACTIONS;
+	svinst->max_redirects = SIEVE_DEFAULT_MAX_REDIRECTS;
+	
+	if ( sieve_get_uint_setting
+		(svinst, "sieve_max_actions", &uint_setting) ) {
+		svinst->max_actions = (unsigned int) uint_setting;
+	}
+
+	if ( sieve_get_uint_setting
+		(svinst, "sieve_max_redirects", &uint_setting) ) {
+		svinst->max_redirects = (unsigned int) uint_setting;
+	}
+	
+	/* Initialize extensions */
 	if ( !sieve_extensions_init(svinst) ) {
 		sieve_deinit(&svinst);
 		return NULL;