diff --git a/src/lib-sieve/plugins/imapflags/cmd-addflag.c b/src/lib-sieve/plugins/imapflags/cmd-addflag.c
index b5900a758af5be681f793eb84c0ed6ade4209f1d..0ee8b0e3fc86836b5ee15addb88ae5c49bbe071f 100644
--- a/src/lib-sieve/plugins/imapflags/cmd-addflag.c
+++ b/src/lib-sieve/plugins/imapflags/cmd-addflag.c
@@ -11,6 +11,11 @@
 
 static bool cmd_addflag_generate
 	(struct sieve_generator *generator,	struct sieve_command_context *ctx);
+	
+static bool cmd_addflag_opcode_execute
+	(const struct sieve_opcode *opcode,	struct sieve_interpreter *interp, 
+		struct sieve_binary *sbin, sieve_size_t *address);
+
 
 /* Addflag command 
  *
@@ -36,8 +41,8 @@ const struct sieve_opcode addflag_opcode = {
 	SIEVE_OPCODE_CUSTOM,
 	&imapflags_extension,
 	EXT_IMAPFLAGS_OPCODE_ADDFLAG,
-	NULL,
-	NULL
+	sieve_opcode_string_dump,
+	cmd_addflag_opcode_execute
 };
 
 
@@ -56,4 +61,26 @@ static bool cmd_addflag_generate
 	return TRUE;
 }
 
+/*
+ * Execution
+ */
+
+static bool cmd_addflag_opcode_execute
+(const struct sieve_opcode *opcode ATTR_UNUSED,
+	struct sieve_interpreter *interp ATTR_UNUSED, 
+	struct sieve_binary *sbin, sieve_size_t *address)
+{
+	string_t *redirect;
+
+	t_push();
 
+	if ( !sieve_opr_string_read(sbin, address, &redirect) ) {
+		t_pop();
+		return FALSE;
+	}
+
+	printf(">> ADDFLAG \"%s\"\n", str_c(redirect));
+
+	t_pop();
+	return TRUE;
+}
diff --git a/src/lib-sieve/plugins/imapflags/cmd-removeflag.c b/src/lib-sieve/plugins/imapflags/cmd-removeflag.c
index 33e2fd2728a840466ac11ec35c944b9e16c1224f..1d2aebdc9190938f93a13f4396c9f2ab81de5b57 100644
--- a/src/lib-sieve/plugins/imapflags/cmd-removeflag.c
+++ b/src/lib-sieve/plugins/imapflags/cmd-removeflag.c
@@ -13,14 +13,9 @@
 static bool cmd_removeflag_generate
 	(struct sieve_generator *generator,	struct sieve_command_context *ctx);
 
-static bool cmd_removeflag_opcode_dump
-	(const struct sieve_opcode *opcode ATTR_UNUSED,
-		struct sieve_interpreter *interp ATTR_UNUSED, struct sieve_binary *sbin, 
-		sieve_size_t *address);
 static bool cmd_removeflag_opcode_execute
-	(const struct sieve_opcode *opcode ATTR_UNUSED,
-		struct sieve_interpreter *interp ATTR_UNUSED, struct sieve_binary *sbin, 
-		sieve_size_t *address);
+	(const struct sieve_opcode *opcode,	struct sieve_interpreter *interp, 
+		struct sieve_binary *sbin, sieve_size_t *address);
 
 /* Removeflag command 
  *
@@ -46,7 +41,7 @@ const struct sieve_opcode removeflag_opcode = {
 	SIEVE_OPCODE_CUSTOM,
 	&imapflags_extension,
 	EXT_IMAPFLAGS_OPCODE_REMOVEFLAG,
-	cmd_removeflag_opcode_dump, 
+	sieve_opcode_string_dump, 
 	cmd_removeflag_opcode_execute 
 };
 
@@ -66,22 +61,7 @@ static bool cmd_removeflag_generate
 
 	return TRUE;
 }
-
-/* 
- * Code dump
- */
  
-static bool cmd_removeflag_opcode_dump
-(const struct sieve_opcode *opcode ATTR_UNUSED,
-	struct sieve_interpreter *interp ATTR_UNUSED, 
-	struct sieve_binary *sbin, sieve_size_t *address)
-{
-	printf("REMOVEFLAG\n");
-
-	return 
-		sieve_opr_string_dump(sbin, address);
-}
-
 /*
  * Execution
  */
diff --git a/src/lib-sieve/plugins/imapflags/cmd-setflag.c b/src/lib-sieve/plugins/imapflags/cmd-setflag.c
index 568c46933d35c9c3b0b7caa3a84089d2423dbbb3..7ac5a899beb6a7d4687134d78a042e860a814d52 100644
--- a/src/lib-sieve/plugins/imapflags/cmd-setflag.c
+++ b/src/lib-sieve/plugins/imapflags/cmd-setflag.c
@@ -12,6 +12,10 @@
 static bool cmd_setflag_generate
 	(struct sieve_generator *generator,	struct sieve_command_context *ctx);
 
+static bool cmd_setflag_opcode_execute
+	(const struct sieve_opcode *opcode,	struct sieve_interpreter *interp, 
+		struct sieve_binary *sbin, sieve_size_t *address);
+
 /* Setflag command 
  *
  * Syntax: 
@@ -36,8 +40,8 @@ const struct sieve_opcode setflag_opcode = {
 	SIEVE_OPCODE_CUSTOM,
 	&imapflags_extension,
 	EXT_IMAPFLAGS_OPCODE_SETFLAG,
-	NULL,
-	NULL
+	sieve_opcode_string_dump,
+	cmd_setflag_opcode_execute
 };
 
 /* Code generation */
@@ -55,4 +59,28 @@ static bool cmd_setflag_generate
 	return TRUE;
 }
 
+/*
+ * Execution
+ */
+
+static bool cmd_setflag_opcode_execute
+(const struct sieve_opcode *opcode ATTR_UNUSED,
+	struct sieve_interpreter *interp ATTR_UNUSED, 
+	struct sieve_binary *sbin, sieve_size_t *address)
+{
+	string_t *redirect;
+
+	t_push();
+
+	if ( !sieve_opr_string_read(sbin, address, &redirect) ) {
+		t_pop();
+		return FALSE;
+	}
+
+	printf(">> SETFLAG \"%s\"\n", str_c(redirect));
+
+	t_pop();
+	return TRUE;
+}
+
 
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
index 9c21edeb1bfaf4ceadf5920c07bed7625ff4aee6..a224e3c05f14eb1e39ac72515b7c7795515b9c93 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
@@ -32,7 +32,7 @@ bool ext_imapflags_command_validate
 			cmd->command->identifier, sieve_ast_argument_name(arg));
 		return FALSE; 
 	}
-	//sieve_validator_argument_activate(validator, arg);
+	sieve_validator_argument_activate(validator, arg);
 
 	arg2 = sieve_ast_argument_next(arg);
 	
@@ -70,7 +70,7 @@ bool ext_imapflags_command_validate
 			return FALSE;
 		}
 
-		//sieve_validator_argument_activate(validator, arg2);
+		sieve_validator_argument_activate(validator, arg2);
 	}	
 	return TRUE;
 }
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags.c b/src/lib-sieve/plugins/imapflags/ext-imapflags.c
index 88b7cdb8b1aed19388b8b1211acc63b4fb678116..789685e0408810ab267ead5fb38a1e21224ee3df 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags.c
@@ -41,7 +41,7 @@ extern const struct sieve_opcode addflag_opcode;
 extern const struct sieve_opcode removeflag_opcode;
 
 const struct sieve_opcode *imapflags_opcodes[] = 
-	{ &setflag_opcode, &addflag_opcode };
+	{ &setflag_opcode, &addflag_opcode, &removeflag_opcode };
 const struct sieve_extension imapflags_extension = { 
 	"imapflags", 
 	ext_imapflags_load,
diff --git a/src/lib-sieve/plugins/imapflags/imapflags.sieve b/src/lib-sieve/plugins/imapflags/imapflags.sieve
index 28fc9f645ab0f002ff23bda7bf3ea25a6f565431..0edd3fc22c47e3afb12c29e1ae9aafce3c0cb890 100644
--- a/src/lib-sieve/plugins/imapflags/imapflags.sieve
+++ b/src/lib-sieve/plugins/imapflags/imapflags.sieve
@@ -1,6 +1,10 @@
 require "imapflags";
 require "fileinto";
 
+setflag "\\Seen";
+addflag "$DSNRequired";
+removeflag "$DSNRequired";
+
 if header :contains "from" "boss@frobnitzm.example.edu" {
 	setflag "\\Flagged";
 	fileinto "INBOX.From Boss";
diff --git a/src/lib-sieve/sieve-code.c b/src/lib-sieve/sieve-code.c
index 26f488c3df86e0549c70907b8576f7da1c891450..e398b79782d62dc12f6d5e5c5220763323d50562 100644
--- a/src/lib-sieve/sieve-code.c
+++ b/src/lib-sieve/sieve-code.c
@@ -695,6 +695,8 @@ static bool opc_jmp_dump(
 	return TRUE;
 }	
 			
+/* Code dump for trivial opcodes */
+
 bool sieve_opcode_trivial_dump
 (const struct sieve_opcode *opcode,
 	struct sieve_interpreter *interp ATTR_UNUSED, 
@@ -705,6 +707,18 @@ bool sieve_opcode_trivial_dump
 	return TRUE;
 }
 
+bool sieve_opcode_string_dump
+(const struct sieve_opcode *opcode,
+	struct sieve_interpreter *interp ATTR_UNUSED, 
+	struct sieve_binary *sbin, sieve_size_t *address)
+{
+	printf("%s\n", opcode->mnemonic);
+
+	return 
+		sieve_opr_string_dump(sbin, address);
+}
+
+
 /* Code execution for core commands */
 
 static bool opc_jmp_execute
diff --git a/src/lib-sieve/sieve-code.h b/src/lib-sieve/sieve-code.h
index d8dd2948f8b1037d21ac0d1b16d693f3f339a11e..72d68e03eca38cac045ee04c5c31b6fa72e83d57 100644
--- a/src/lib-sieve/sieve-code.h
+++ b/src/lib-sieve/sieve-code.h
@@ -154,6 +154,9 @@ const struct sieve_opcode *sieve_operation_read
 bool sieve_opcode_trivial_dump
 	(const struct sieve_opcode *opcode, struct sieve_interpreter *interp, 
 		struct sieve_binary *sbin, sieve_size_t *address);
+bool sieve_opcode_string_dump
+	(const struct sieve_opcode *opcode, struct sieve_interpreter *interp, 
+		struct sieve_binary *sbin, sieve_size_t *address);
 
 /* Core operands */