diff --git a/TODO b/TODO
index e9fb4e4d8129793befb1c3fba481ca088cf370a5..6ae0e6af03824910f212cfa1ba673f8802b8e419 100644
--- a/TODO
+++ b/TODO
@@ -2,10 +2,9 @@ Next (in order of descending priority/precedence):
 
 * Finish the test suite for the base functionality
 * Improve debugging and error handling:
-	- Improve byte code dumping and trace functionality to be a little more 
-  	  user-friendly
 	- Improve argument errors
 * Make sure cmusieve can be replaced seamlessly with the new plugin.
+	- Add simple log rotation to script error log.
 * Fix/Report issues listed in 'doc/rfc/RFC Controversy.txt'
 
 * ## MAKE A FIRST RELEASE (0.1.x) ##
diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index 434f4434dd8d9e4456f9aedd0c04bf5f0e2ada5e..3adfee6c2dbbc07ca708bb53dc445ac6b4ad7812 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -180,7 +180,7 @@ static bool cmd_redirect_operation_dump
 	if ( !sieve_code_dumper_print_optional_operands(denv, address) )
 		return FALSE;
 
-	return sieve_opr_string_dump(denv, address);
+	return sieve_opr_string_dump(denv, address, "reason");
 }
 
 /*
diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c
index 17705faa9dfaa45d3344fa5916e5a1896494c28b..7abd09a80b943b70c200be18654f3b7008d86898 100644
--- a/src/lib-sieve/ext-envelope.c
+++ b/src/lib-sieve/ext-envelope.c
@@ -316,8 +316,8 @@ static bool ext_envelope_operation_dump
 		return FALSE;
 
 	return
-		sieve_opr_stringlist_dump(denv, address) &&
-		sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "envelope part") &&
+		sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /*
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 3e8ef2f4e3b4898cd6d3257bba47e661743e020d..9d37b5daa9f5bec8164e95f15fb3e91e27b4614a 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -160,11 +160,7 @@ static bool ext_fileinto_operation_dump
 		return FALSE;
 	}
 
-	if ( !sieve_opr_string_dump(denv, address) ) {
-		return FALSE;
-	}
-	
-	return TRUE;
+	return sieve_opr_string_dump(denv, address, "folder");
 }
 
 /*
diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c
index 0dd89812bed0344def6c818ee29e0d731807a3d8..70b2c03612d91f4d152f6bd6455322650ee77b40 100644
--- a/src/lib-sieve/ext-reject.c
+++ b/src/lib-sieve/ext-reject.c
@@ -200,7 +200,7 @@ static bool ext_reject_operation_dump
         return FALSE;
 	
 	return
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, "reason");
 }
 
 /*
diff --git a/src/lib-sieve/mcht-is.c b/src/lib-sieve/mcht-is.c
index ecba1e8fa12cd5d23d5fe22fe82588c34af8561c..ddecb7ccf6b9e20409f2c280905b98273163d5a1 100644
--- a/src/lib-sieve/mcht-is.c
+++ b/src/lib-sieve/mcht-is.c
@@ -45,8 +45,6 @@ static int mcht_is_match
 	if ( (val == NULL || val_size == 0) ) 
 		return ( key_size == 0 );
 
-	printf ("VAL '%s' KEY '%s'\n", val, key);
-	
 	if ( mctx->comparator->compare != NULL )
 		return (mctx->comparator->compare(mctx->comparator, 
 			val, val_size, key, key_size) == 0);
diff --git a/src/lib-sieve/plugins/body/tst-body.c b/src/lib-sieve/plugins/body/tst-body.c
index 4730ba5b23429cc0b8af0a50dab2650f26c8d45e..9b3c1ed579d1ead31257ea73ddee60116d7639dc 100644
--- a/src/lib-sieve/plugins/body/tst-body.c
+++ b/src/lib-sieve/plugins/body/tst-body.c
@@ -285,7 +285,7 @@ static bool ext_body_operation_dump
 				sieve_code_dumpf(denv, "BODY-TRANSFORM: CONTENT");
 				
 				sieve_code_descend(denv);
-				if ( !sieve_opr_stringlist_dump(denv, address) )
+				if ( !sieve_opr_stringlist_dump(denv, address, "content types") )
 					return FALSE;
 				sieve_code_ascend(denv);
 				break;
@@ -298,7 +298,7 @@ static bool ext_body_operation_dump
 		}
 	} while ( opt_code != SIEVE_MATCH_OPT_END );
 
-	return sieve_opr_stringlist_dump(denv, address);
+	return sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /*
diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
index c88296ddd6ad5f06e0c1efdb9c6ab60bcb5a3de4..bf45d62aee951754dfb0a1278748556b4c19b6e7 100644
--- a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
+++ b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c
@@ -148,12 +148,15 @@ bool ext_imapflags_command_operands_dump
 
 	if ( sieve_operand_is_variable(operand) ) {	
 		return 
-			sieve_opr_string_dump_data(denv, operand, address) &&
-			sieve_opr_stringlist_dump(denv, address);
+			sieve_opr_string_dump_data(denv, operand, address, 
+				"variable name") &&
+			sieve_opr_stringlist_dump(denv, address, 
+				"list of flags");
 	}
 	
 	return 
-			sieve_opr_stringlist_dump_data(denv, operand, address);
+		sieve_opr_stringlist_dump_data(denv, operand, address,
+			"list of flags");
 }
 
 bool ext_imapflags_command_operation_dump
diff --git a/src/lib-sieve/plugins/imapflags/tag-flags.c b/src/lib-sieve/plugins/imapflags/tag-flags.c
index 5eac559634a86d072e3f9e3d094742bdb878818a..db8cab61ef4c3836f921b0ba8244d06cc350c91d 100644
--- a/src/lib-sieve/plugins/imapflags/tag-flags.c
+++ b/src/lib-sieve/plugins/imapflags/tag-flags.c
@@ -160,7 +160,7 @@ static bool seff_flags_dump_context
 (const struct sieve_side_effect *seffect ATTR_UNUSED, 
 	const struct sieve_dumptime_env *denv, sieve_size_t *address)
 {
-	return sieve_opr_stringlist_dump(denv, address);
+	return sieve_opr_stringlist_dump(denv, address, "flags");
 }
 
 static bool seff_flags_read_context
diff --git a/src/lib-sieve/plugins/imapflags/tst-hasflag.c b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
index 7c4c2ad339f6e88ca8f77fef2f4db88a35c0bb68..047913123979cccd51b341235f8d31dc6f1b9ba2 100644
--- a/src/lib-sieve/plugins/imapflags/tst-hasflag.c
+++ b/src/lib-sieve/plugins/imapflags/tst-hasflag.c
@@ -148,7 +148,7 @@ static bool tst_hasflag_operation_dump
 		case SIEVE_MATCH_OPT_END:
 			break;
 		case OPT_VARIABLES:
-			sieve_opr_stringlist_dump(denv, address);
+			sieve_opr_stringlist_dump(denv, address, "variables");
 			break;
 		default:
 			return FALSE;
@@ -156,7 +156,7 @@ static bool tst_hasflag_operation_dump
 	} while ( opt_code != SIEVE_MATCH_OPT_END );
 			
 	return 
-			sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "list of flags");
 }
 
 /*
diff --git a/src/lib-sieve/plugins/include/cmd-include.c b/src/lib-sieve/plugins/include/cmd-include.c
index e150a4422c6f7af90fa10cc27638078d4de168ea..f76bf90a474b69ee15cdd22008738840d9d5fa91 100644
--- a/src/lib-sieve/plugins/include/cmd-include.c
+++ b/src/lib-sieve/plugins/include/cmd-include.c
@@ -264,7 +264,7 @@ static bool opc_include_dump
 		return FALSE;
 		
 	sieve_code_descend(denv);
-	sieve_code_dumpf(denv, "SCRIPT: %s [ID: %d, BLOCK: %d]", 
+	sieve_code_dumpf(denv, "script: %s [ID: %d, BLOCK: %d]", 
 		sieve_script_filename(included->script), include_id, included->block_id);
 	 
 	return TRUE;
diff --git a/src/lib-sieve/plugins/vacation/cmd-vacation.c b/src/lib-sieve/plugins/vacation/cmd-vacation.c
index 22d1e3abd686450a42bfda995eeb92bd9f9818e6..5ee5257faee996853f5925591c3f3743ce9bb140 100644
--- a/src/lib-sieve/plugins/vacation/cmd-vacation.c
+++ b/src/lib-sieve/plugins/vacation/cmd-vacation.c
@@ -499,20 +499,23 @@ static bool ext_vacation_operation_dump
 			case 0:
 				break;
 			case OPT_DAYS:
-				if ( !sieve_opr_number_dump(denv, address) )
+				if ( !sieve_opr_number_dump(denv, address, "days") )
 					return FALSE;
 				break;
 			case OPT_SUBJECT:
+				if ( !sieve_opr_string_dump(denv, address, "subject") )
+					return FALSE;
+				break;
 			case OPT_FROM:
-				if ( !sieve_opr_string_dump(denv, address) )
+				if ( !sieve_opr_string_dump(denv, address, "from") )
 					return FALSE;
 				break;
 			case OPT_ADDRESSES:
-				if ( !sieve_opr_stringlist_dump(denv, address) )
+				if ( !sieve_opr_stringlist_dump(denv, address, "addresses") )
 					return FALSE;
 				break;
 			case OPT_MIME:
-				sieve_code_dumpf(denv, "MIME");	
+				sieve_code_dumpf(denv, "mime");	
 				break;
 			
 			default:
@@ -523,8 +526,8 @@ static bool ext_vacation_operation_dump
 	
 	/* Dump reason and handle operands */
 	return 
-		sieve_opr_string_dump(denv, address) &&
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, "reason") &&
+		sieve_opr_string_dump(denv, address, "handle");
 }
 
 /* 
diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c
index ade0eb35844e4d0927d7fe4c2b33c3aa0845821e..084d4bc0596a9a3c54a4edd13ebd6eea2317e4a0 100644
--- a/src/lib-sieve/plugins/variables/cmd-set.c
+++ b/src/lib-sieve/plugins/variables/cmd-set.c
@@ -251,8 +251,8 @@ static bool cmd_set_operation_dump
 	sieve_code_descend(denv);
 	
 	/* Print both variable name and string value */
-	if ( !sieve_opr_string_dump(denv, address) ||
-		!sieve_opr_string_dump(denv, address) )
+	if ( !sieve_opr_string_dump(denv, address, "variable") ||
+		!sieve_opr_string_dump(denv, address, "value") )
 		return FALSE;
 	
 	/* Read the number of applied modifiers we need to read */
diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.c b/src/lib-sieve/plugins/variables/ext-variables-common.c
index 9343f417ab42075618ac209ccbd8c40d17da7172..f54a132e77ad13d0a72514bcbf41ff8ca9651797 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-common.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-common.c
@@ -447,7 +447,7 @@ bool ext_variables_code_dump
 	if ( !sieve_binary_read_offset(denv->sbin, address, &end_offset) )
 		return FALSE;
 	
-	sieve_code_dumpf(denv, "SCOPE (size: %d, end: %08x)", 
+	sieve_code_dumpf(denv, "SCOPE [%d] (end: %08x)", 
 		scope_size, pc + end_offset);
 	
 	/* Read global variable scope */
diff --git a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
index f56341aeaf1dbb6e77c5bf876648bcc4dd94fa18..9713122e9b9654c2fc06e3c3eec9979cd9b0357f 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-modifiers.c
@@ -85,7 +85,7 @@ void ext_variables_register_core_modifiers
  */
  
 const struct sieve_operand_class ext_variables_modifier_operand_class = 
-	{ "MODIFIER" };
+	{ "modifier" };
 	
 static const struct sieve_extension_obj_registry core_modifiers =
 	SIEVE_VARIABLES_DEFINE_MODIFIERS(ext_variables_core_modifiers);
diff --git a/src/lib-sieve/plugins/variables/ext-variables-operands.c b/src/lib-sieve/plugins/variables/ext-variables-operands.c
index 2a123a90e9f095e84c8a222913e32b5184b09218..c551bcd0db942b62cd80de65e991194450037695 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-operands.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-operands.c
@@ -29,7 +29,8 @@
 static bool opr_variable_read_value
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str);
 static bool opr_variable_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+		const char *field_name);
 
 const struct sieve_opr_string_interface variable_interface = { 
 	opr_variable_dump,
@@ -61,7 +62,8 @@ void ext_variables_opr_variable_emit
 }
 
 static bool opr_variable_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	sieve_size_t index = 0;
 	const struct sieve_extension *ext;
@@ -73,15 +75,24 @@ static bool opr_variable_dump
 	if ( !sieve_binary_read_integer(denv->sbin, address, &index) )
 		return FALSE;
 		
-	if ( ext == NULL )
-		sieve_code_dumpf(denv, "VAR: %ld", (long) index);
-	else
-		sieve_code_dumpf(denv, "VAR: [%d:%s] %ld", *ext->id, ext->name, (long) index);
+	if ( ext == NULL ) {
+		if ( field_name != NULL ) 
+			sieve_code_dumpf(denv, "%s: VAR %ld", field_name, (long) index);
+		else
+			sieve_code_dumpf(denv, "VAR %ld", (long) index);
+	} else {
+		if ( field_name != NULL ) 
+			sieve_code_dumpf(denv, "%s: VAR [%s] %ld", 
+				field_name, ext->name, (long) index);
+		else
+			sieve_code_dumpf(denv, "VAR [%s] %ld", 
+				ext->name, (long) index);
+	}
 	return TRUE;
 }
 
 static bool opr_variable_read_value
-  (const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
+(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
 { 
 	const struct sieve_extension *ext;
 	unsigned int code = 1; /* Initially set to offset value */
@@ -155,7 +166,8 @@ bool sieve_variable_operand_read
 static bool opr_match_value_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str);
 static bool opr_match_value_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+		const char *field_name);
 
 const struct sieve_opr_string_interface match_value_interface = { 
 	opr_match_value_dump,
@@ -171,19 +183,23 @@ const struct sieve_operand match_value_operand = {
 };	
 
 void ext_variables_opr_match_value_emit
-	(struct sieve_binary *sbin, unsigned int index) 
+(struct sieve_binary *sbin, unsigned int index) 
 {
 	(void) sieve_operand_emit_code(sbin, &match_value_operand);
 	(void) sieve_binary_emit_integer(sbin, index);
 }
 
 static bool opr_match_value_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	sieve_size_t index = 0;
 	
 	if (sieve_binary_read_integer(denv->sbin, address, &index) ) {
-		sieve_code_dumpf(denv, "MVALUE: %ld", (long) index);
+		if ( field_name != NULL )
+			sieve_code_dumpf(denv, "%s: MATCHVAL %ld", field_name, (long) index);
+		else
+			sieve_code_dumpf(denv, "MATCHVAL %ld", (long) index);
 
 		return TRUE;
 	}
@@ -192,7 +208,7 @@ static bool opr_match_value_dump
 }
 
 static bool opr_match_value_read
-  (const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
+(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
 { 
 	sieve_size_t index = 0;
 			
@@ -221,7 +237,8 @@ static bool opr_match_value_read
 static bool opr_variable_string_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str);
 static bool opr_variable_string_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 
 const struct sieve_opr_string_interface variable_string_interface = { 
 	opr_variable_string_dump,
@@ -237,14 +254,15 @@ const struct sieve_operand variable_string_operand = {
 };	
 
 void ext_variables_opr_variable_string_emit
-	(struct sieve_binary *sbin, unsigned int elements) 
+(struct sieve_binary *sbin, unsigned int elements) 
 {
 	(void) sieve_operand_emit_code(sbin, &variable_string_operand);
 	(void) sieve_binary_emit_integer(sbin, elements);
 }
 
 static bool opr_variable_string_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	sieve_size_t elements = 0;
 	unsigned int i;
@@ -252,11 +270,15 @@ static bool opr_variable_string_dump
 	if (!sieve_binary_read_integer(denv->sbin, address, &elements) )
 		return FALSE;
 	
-	sieve_code_dumpf(denv, "VARSTR [%ld]:", (long) elements);
+	if ( field_name != NULL ) 
+		sieve_code_dumpf(denv, "%s: VARSTR [%ld]:", 
+			field_name, (long) elements);
+	else
+		sieve_code_dumpf(denv, "VARSTR [%ld]:", (long) elements);
 
 	sieve_code_descend(denv);
 	for ( i = 0; i < (unsigned int) elements; i++ ) {
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, NULL);
 	}
 	sieve_code_ascend(denv);
 	
@@ -264,7 +286,7 @@ static bool opr_variable_string_dump
 }
 
 static bool opr_variable_string_read
-  (const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
+(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str)
 { 
 	sieve_size_t elements = 0;
 	unsigned int i;
diff --git a/src/lib-sieve/plugins/variables/tst-string.c b/src/lib-sieve/plugins/variables/tst-string.c
index 149c7c7527b409bdde25f47c9d7e96e0ee9ca73e..4b7f78086c45433af3a9bbb53d6f129df7c0cc69 100644
--- a/src/lib-sieve/plugins/variables/tst-string.c
+++ b/src/lib-sieve/plugins/variables/tst-string.c
@@ -154,8 +154,8 @@ static bool tst_string_operation_dump
 		return FALSE;
 		
 	return
-		sieve_opr_stringlist_dump(denv, address) &&
-		sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "source") &&
+		sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /* 
diff --git a/src/lib-sieve/sieve-address-parts.c b/src/lib-sieve/sieve-address-parts.c
index d4206dd92982eb75347c8b2034e1729c0298d29e..6cac837ee027a2bdef4b4933506ae0bf442f4c90 100644
--- a/src/lib-sieve/sieve-address-parts.c
+++ b/src/lib-sieve/sieve-address-parts.c
@@ -195,7 +195,7 @@ static bool tag_address_part_generate
  */
  
 struct sieve_operand_class sieve_address_part_operand_class = 
-	{ "ADDRESS-PART" };
+	{ "address part" };
 
 static const struct sieve_extension_obj_registry core_address_parts =
 	SIEVE_EXT_DEFINE_MATCH_TYPES(sieve_core_address_parts);
diff --git a/src/lib-sieve/sieve-code-dumper.c b/src/lib-sieve/sieve-code-dumper.c
index 5b16d017545dc5b39fa24f392e7b7066905f9bf1..ec693a05e272de9a63c2de709abb7465a515f49d 100644
--- a/src/lib-sieve/sieve-code-dumper.c
+++ b/src/lib-sieve/sieve-code-dumper.c
@@ -181,7 +181,7 @@ void sieve_code_dumper_run(struct sieve_code_dumper *dumper)
 	if ( sieve_binary_read_integer(sbin, &dumper->pc, &ext_count) ) {
 		unsigned int i;
 		
-		sieve_code_dumpf(denv, "EXTENSIONS (count: %d):", ext_count);
+		sieve_code_dumpf(denv, "EXTENSIONS [%d]:", ext_count);
 		sieve_code_descend(denv);
 		
 		for ( i = 0; i < ext_count; i++ ) {
diff --git a/src/lib-sieve/sieve-code.c b/src/lib-sieve/sieve-code.c
index 164bb20fcea6f8a48571c223a994932041ebd401..a77441583e7efdc750f183eb81366059403c209b 100644
--- a/src/lib-sieve/sieve-code.c
+++ b/src/lib-sieve/sieve-code.c
@@ -123,18 +123,23 @@ bool sieve_coded_stringlist_read_all
 
 static bool sieve_coded_stringlist_dump
 (const struct sieve_dumptime_env *denv, sieve_size_t *address, 
-	sieve_size_t length, sieve_size_t end)
+	sieve_size_t length, sieve_size_t end, const char *field_name)
 {
 	unsigned int i;
 	
 	if ( end > sieve_binary_get_code_size(denv->sbin) ) 
   		return FALSE;
     
-	sieve_code_dumpf(denv, "STRLIST [%d] (END %08x)", length, end);
+  if ( field_name != NULL )
+		sieve_code_dumpf(denv, "%s: STRLIST [%d] (end: %08x)", 
+			field_name, length, end);
+	else
+		sieve_code_dumpf(denv, "STRLIST [%d] (end: %08x)", length, end);
+	
 	sieve_code_descend(denv);
 	
 	for ( i = 0; i < length; i++ ) {
-		if ( !sieve_opr_string_dump(denv, address) ) 
+		if ( !sieve_opr_string_dump(denv, address, NULL) ) 
 			return FALSE;
 
 		if ( *address > end ) 
@@ -282,7 +287,8 @@ bool sieve_operand_optional_read
 /* Number */
 
 static bool opr_number_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 static bool opr_number_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, 
 		sieve_size_t *number);
@@ -305,7 +311,8 @@ const struct sieve_operand number_operand = {
 /* String */
 
 static bool opr_string_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 static bool opr_string_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address, string_t **str);
 
@@ -327,7 +334,8 @@ const struct sieve_operand string_operand = {
 /* String List */
 
 static bool opr_stringlist_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 static struct sieve_coded_stringlist *opr_stringlist_read
 	(const struct sieve_runtime_env *renv, sieve_size_t *address);
 
@@ -360,7 +368,7 @@ void sieve_opr_number_emit(struct sieve_binary *sbin, sieve_size_t number)
 
 bool sieve_opr_number_dump_data
 (const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-	sieve_size_t *address) 
+	sieve_size_t *address, const char *field_name) 
 {
 	const struct sieve_opr_number_interface *intf;
 
@@ -372,11 +380,12 @@ bool sieve_opr_number_dump_data
 	if ( intf->dump == NULL )
 		return FALSE;
 
-	return intf->dump(denv, address);  
+	return intf->dump(denv, address, field_name);  
 }
 
 bool sieve_opr_number_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	const struct sieve_operand *operand;
 	
@@ -384,7 +393,7 @@ bool sieve_opr_number_dump
 	
 	operand = sieve_operand_read(denv->sbin, address);
 
-	return sieve_opr_number_dump_data(denv, operand, address);
+	return sieve_opr_number_dump_data(denv, operand, address, field_name);
 }
 
 bool sieve_opr_number_read_data
@@ -414,12 +423,16 @@ bool sieve_opr_number_read
 }
 
 static bool opr_number_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	sieve_size_t number = 0;
 	
 	if (sieve_binary_read_integer(denv->sbin, address, &number) ) {
-		sieve_code_dumpf(denv, "NUM: %llu", (long long) number);
+		if ( field_name != NULL ) 
+			sieve_code_dumpf(denv, "%s: NUM %llu", field_name, (long long) number);
+		else
+			sieve_code_dumpf(denv, "NUM %llu", (long long) number);
 
 		return TRUE;
 	}
@@ -444,7 +457,7 @@ void sieve_opr_string_emit(struct sieve_binary *sbin, string_t *str)
 
 bool sieve_opr_string_dump_data
 (const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-	sieve_size_t *address) 
+	sieve_size_t *address, const char *field_name) 
 {
 	const struct sieve_opr_string_interface *intf;
 	
@@ -456,22 +469,24 @@ bool sieve_opr_string_dump_data
 	if ( intf->dump == NULL ) 
 		return FALSE;
 
-	return intf->dump(denv, address);  
+	return intf->dump(denv, address, field_name);  
 }
 
 bool sieve_opr_string_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	const struct sieve_operand *operand;
 	
 	sieve_code_mark(denv);
 	operand = sieve_operand_read(denv->sbin, address);
 
-	return sieve_opr_string_dump_data(denv, operand, address);
+	return sieve_opr_string_dump_data(denv, operand, address, field_name);
 }
 
 bool sieve_opr_string_dump_ex
-(const struct sieve_dumptime_env *denv, sieve_size_t *address, bool *literal)
+(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+	const char *field_name, bool *literal)
 {
 	const struct sieve_operand *operand;
 	
@@ -480,7 +495,7 @@ bool sieve_opr_string_dump_ex
 
 	*literal = ( operand == &string_operand );	
 
-	return sieve_opr_string_dump_data(denv, operand, address);
+	return sieve_opr_string_dump_data(denv, operand, address, field_name);
 } 
 
 bool sieve_opr_string_read_data
@@ -520,23 +535,34 @@ bool sieve_opr_string_read_ex
 }
 
 static void _dump_string
-(const struct sieve_dumptime_env *denv, string_t *str) 
-{
-	if ( str_len(str) > 80 )
-		sieve_code_dumpf(denv, "STR[%ld]: \"%s", 
-			(long) str_len(str), str_sanitize(str_c(str), 80));
-	else
-		sieve_code_dumpf(denv, "STR[%ld]: \"%s\"", 
-			(long) str_len(str), str_sanitize(str_c(str), 80));		
+(const struct sieve_dumptime_env *denv, string_t *str, 
+	const char *field_name) 
+{
+	if ( str_len(str) > 80 ) {
+		if ( field_name != NULL ) 
+			sieve_code_dumpf(denv, "%s: STR[%ld] \"%s", 
+				field_name, (long) str_len(str), str_sanitize(str_c(str), 80));
+		else
+			sieve_code_dumpf(denv, "STR[%ld] \"%s", 
+				(long) str_len(str), str_sanitize(str_c(str), 80));
+	} else {
+		if ( field_name != NULL )
+			sieve_code_dumpf(denv, "%s: STR[%ld] \"%s\"", 
+				field_name, (long) str_len(str), str_sanitize(str_c(str), 80));		
+		else
+			sieve_code_dumpf(denv, "STR[%ld] \"%s\"", 
+				(long) str_len(str), str_sanitize(str_c(str), 80));		
+	}
 }
 
 bool opr_string_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	string_t *str; 
 	
 	if ( sieve_binary_read_string(denv->sbin, address, &str) ) {
-		_dump_string(denv, str);   		
+		_dump_string(denv, str, field_name);   		
 		
 		return TRUE;
 	}
@@ -584,7 +610,7 @@ void sieve_opr_stringlist_emit_end
 
 bool sieve_opr_stringlist_dump_data
 (const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-	sieve_size_t *address) 
+	sieve_size_t *address, const char *field_name) 
 {
 	if ( operand == NULL )
 		return FALSE;
@@ -596,7 +622,7 @@ bool sieve_opr_stringlist_dump_data
 		if ( intf->dump == NULL )
 			return FALSE;
 
-		return intf->dump(denv, address); 
+		return intf->dump(denv, address, field_name); 
 	} else if ( operand->class == &string_class ) {
 		const struct sieve_opr_string_interface *intf =
 			(const struct sieve_opr_string_interface *) operand->interface; 
@@ -604,21 +630,22 @@ bool sieve_opr_stringlist_dump_data
 		if ( intf->dump == NULL ) 
 			return FALSE;
 
-		return intf->dump(denv, address);  
+		return intf->dump(denv, address, field_name);  
 	}
 	
 	return FALSE;
 }
 
 bool sieve_opr_stringlist_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+	const char *field_name) 
 {
 	const struct sieve_operand *operand;
 
 	sieve_code_mark(denv);
 	operand = sieve_operand_read(denv->sbin, address);
 
-	return sieve_opr_stringlist_dump_data(denv, operand, address);
+	return sieve_opr_stringlist_dump_data(denv, operand, address, field_name);
 }
 
 struct sieve_coded_stringlist *sieve_opr_stringlist_read_data
@@ -661,7 +688,8 @@ struct sieve_coded_stringlist *sieve_opr_stringlist_read
 }
 
 static bool opr_stringlist_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address) 
+(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+	const char *field_name) 
 {
 	sieve_size_t pc = *address;
 	sieve_size_t end; 
@@ -676,7 +704,7 @@ static bool opr_stringlist_dump
 	if ( !sieve_binary_read_integer(denv->sbin, address, &length) ) 
 		return FALSE;	
   	
-	return sieve_coded_stringlist_dump(denv, address, length, end); 
+	return sieve_coded_stringlist_dump(denv, address, length, end, field_name); 
 }
 
 static struct sieve_coded_stringlist *opr_stringlist_read
@@ -877,20 +905,3 @@ static int opc_jmpfalse_execute
 	
 	return sieve_interpreter_program_jump(renv->interp, !result);
 }	
-
-/*
- * Utility
- */
-
-/* Code dump for trivial operations */
-
-bool sieve_operation_string_dump
-(const struct sieve_operation *op,
-	const struct sieve_dumptime_env *denv, sieve_size_t *address)
-{
-	sieve_code_dumpf(denv, "%s", op->mnemonic);
-
-	return 
-		sieve_opr_string_dump(denv, address);
-}
-
diff --git a/src/lib-sieve/sieve-code.h b/src/lib-sieve/sieve-code.h
index 8f59a49feaa7ab659cbfbc9b9437c03e932f393a..9b8c2ccf4cf547a515444194081eeb51898ce285 100644
--- a/src/lib-sieve/sieve-code.h
+++ b/src/lib-sieve/sieve-code.h
@@ -109,7 +109,8 @@ extern const unsigned int sieve_operand_count;
 
 struct sieve_opr_number_interface {
 	bool (*dump)	
-		(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+		(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+			const char *field_name);
 	bool (*read)
 	  (const struct sieve_runtime_env *renv, sieve_size_t *address, 
 	  	sieve_size_t *number);
@@ -117,7 +118,8 @@ struct sieve_opr_number_interface {
 
 struct sieve_opr_string_interface {
 	bool (*dump)
-		(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+		(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+			const char *field_name);
 	bool (*read)
 		(const struct sieve_runtime_env *renv, sieve_size_t *address, 
 			string_t **str);
@@ -125,7 +127,8 @@ struct sieve_opr_string_interface {
 
 struct sieve_opr_stringlist_interface {
 	bool (*dump)
-		(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+		(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+			const char *field_name);
 	struct sieve_coded_stringlist *(*read)
 		(const struct sieve_runtime_env *renv, sieve_size_t *address);
 };
@@ -139,9 +142,10 @@ struct sieve_opr_stringlist_interface {
 void sieve_opr_number_emit(struct sieve_binary *sbin, sieve_size_t number);
 bool sieve_opr_number_dump_data	
 	(const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-		sieve_size_t *address); 
+		sieve_size_t *address, const char *field_name); 
 bool sieve_opr_number_dump	
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address); 
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name); 
 bool sieve_opr_number_read_data
 	(const struct sieve_runtime_env *renv, const struct sieve_operand *operand,
 		sieve_size_t *address, sieve_size_t *number);
@@ -160,11 +164,13 @@ static inline bool sieve_operand_is_number
 void sieve_opr_string_emit(struct sieve_binary *sbin, string_t *str);
 bool sieve_opr_string_dump_data
 	(const struct sieve_dumptime_env *denv, const struct sieve_operand *operand,
-		sieve_size_t *address); 
+		sieve_size_t *address, const char *field_name); 
 bool sieve_opr_string_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address); 
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name); 
 bool sieve_opr_string_dump_ex
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address, bool *literal); 
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address, 
+		const char *field_name, bool *literal); 
 bool sieve_opr_string_read_data
 	(const struct sieve_runtime_env *renv, const struct sieve_operand *operand,
 		sieve_size_t *address, string_t **str);
@@ -190,9 +196,10 @@ void sieve_opr_stringlist_emit_end
 	(struct sieve_binary *sbin, void *context);
 bool sieve_opr_stringlist_dump_data
 	(const struct sieve_dumptime_env *denv, const struct sieve_operand *operand, 
-		sieve_size_t *address);
+		sieve_size_t *address, const char *field_name);
 bool sieve_opr_stringlist_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
+	(const struct sieve_dumptime_env *denv, sieve_size_t *address,
+		const char *field_name);
 struct sieve_coded_stringlist *sieve_opr_stringlist_read_data
 	(const struct sieve_runtime_env *renv, const struct sieve_operand *operand, 
 		sieve_size_t op_address, sieve_size_t *address);
@@ -266,12 +273,4 @@ extern const struct sieve_operation sieve_jmpfalse_operation;
 extern const struct sieve_operation *sieve_operations[];
 extern const unsigned int sieve_operations_count;
 
-/*
- * Utilitity
- */
-
-bool sieve_operation_string_dump
-	(const struct sieve_operation *op,
-		const struct sieve_dumptime_env *denv, sieve_size_t *address);
-
 #endif
diff --git a/src/lib-sieve/sieve-comparators.c b/src/lib-sieve/sieve-comparators.c
index 4cb06c844cadb9d45687fead7fb2b65e62ab19c5..706b8ca64bc3d17bb091d32b64c96e8a0a6501bf 100644
--- a/src/lib-sieve/sieve-comparators.c
+++ b/src/lib-sieve/sieve-comparators.c
@@ -236,7 +236,7 @@ const struct sieve_comparator *sieve_comparator_tag_get
  */
  
 const struct sieve_operand_class sieve_comparator_operand_class = 
-	{ "COMPARATOR" };
+	{ "comparator" };
 	
 static const struct sieve_extension_obj_registry core_comparators =
 	SIEVE_EXT_DEFINE_COMPARATORS(sieve_core_comparators);
diff --git a/src/lib-sieve/sieve-match-types.c b/src/lib-sieve/sieve-match-types.c
index 18d9b2dd1c69987170942e53c387e38d93f64e98..23d8c65b3089ad596d5f39352689e6e4034845a0 100644
--- a/src/lib-sieve/sieve-match-types.c
+++ b/src/lib-sieve/sieve-match-types.c
@@ -221,8 +221,7 @@ static string_t *sieve_match_values_add_entry
 		
 	if ( mvalues->count >= array_count(&mvalues->values) ) {
 		entry = str_new(mvalues->pool, 64);
-		array_append(&mvalues->values, &entry, 1);
-	} else {
+		array_append(&mvalues->values, &entry, 1);	} else {
 		string_t * const *ep = array_idx(&mvalues->values, mvalues->count);
 		entry = *ep;
 		str_truncate(entry, 0);
@@ -481,7 +480,7 @@ bool sieve_match_type_validate
  */
  
 struct sieve_operand_class sieve_match_type_operand_class = 
-	{ "MATCH-TYPE" };
+	{ "match type" };
 	
 static const struct sieve_extension_obj_registry core_match_types =
 	SIEVE_EXT_DEFINE_MATCH_TYPES(sieve_core_match_types);
diff --git a/src/lib-sieve/tst-address.c b/src/lib-sieve/tst-address.c
index 4874c5a54931145461ff92e0f784d60de0ae1f1a..9a44da4300cf60e0e818b45ecbd78108ef5000d0 100644
--- a/src/lib-sieve/tst-address.c
+++ b/src/lib-sieve/tst-address.c
@@ -199,8 +199,8 @@ static bool tst_address_operation_dump
 		return FALSE;
 
 	return
-		sieve_opr_stringlist_dump(denv, address) &&
-		sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "header list") &&
+		sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /* 
diff --git a/src/lib-sieve/tst-exists.c b/src/lib-sieve/tst-exists.c
index 4e74b9c87de30a6bb47815b2e389fb749e6cd3c7..9bcb30f21ee45481f7c5d166255d1cbeb2c88eb1 100644
--- a/src/lib-sieve/tst-exists.c
+++ b/src/lib-sieve/tst-exists.c
@@ -92,7 +92,7 @@ static bool tst_exists_operation_dump
     sieve_code_dumpf(denv, "EXISTS");
 	sieve_code_descend(denv);
 
-	return sieve_opr_stringlist_dump(denv, address);
+	return sieve_opr_stringlist_dump(denv, address, "header names");
 }
 
 /* 
diff --git a/src/lib-sieve/tst-header.c b/src/lib-sieve/tst-header.c
index 675f6b1b3847b0bcae3a228eb2ead7701ff32792..fe8db57830a3853a9dca3a9cd3e96adc5a39df9e 100644
--- a/src/lib-sieve/tst-header.c
+++ b/src/lib-sieve/tst-header.c
@@ -137,8 +137,8 @@ static bool tst_header_operation_dump
 		return FALSE;
 	
 	return
-		sieve_opr_stringlist_dump(denv, address) &&
-		sieve_opr_stringlist_dump(denv, address);
+		sieve_opr_stringlist_dump(denv, address, "header names") &&
+		sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /* 
diff --git a/src/lib-sieve/tst-size.c b/src/lib-sieve/tst-size.c
index 44aca56fbea3966f80c94ead59f20be9d77da1e5..8ff7e355d9083ec039c53ee7a45e62b005784ab1 100644
--- a/src/lib-sieve/tst-size.c
+++ b/src/lib-sieve/tst-size.c
@@ -216,7 +216,7 @@ static bool tst_size_operation_dump
 	sieve_code_descend(denv);
 	
 	return 
-		sieve_opr_number_dump(denv, address);
+		sieve_opr_number_dump(denv, address, "limit");
 }
 
 /* 
diff --git a/src/testsuite/cmd-test-fail.c b/src/testsuite/cmd-test-fail.c
index b4632695449ff716b38dc6ba86dc87573fe754a2..3b1ec240623716a28497a0d15ae7ad5950c0af49 100644
--- a/src/testsuite/cmd-test-fail.c
+++ b/src/testsuite/cmd-test-fail.c
@@ -113,13 +113,13 @@ static bool cmd_test_fail_operation_dump
 	sieve_code_dumpf(denv, "TEST_FAIL:");
 	sieve_code_descend(denv);
 
-	if ( !sieve_opr_string_dump(denv, address) ) 
+	if ( !sieve_opr_string_dump(denv, address, "reason") ) 
 		return FALSE;
 
 	sieve_code_mark(denv);
 	pc = *address;
 	if ( sieve_binary_read_offset(denv->sbin, address, &offset) )
-		sieve_code_dumpf(denv, "OFFSET: %d [%08x]", offset, pc + offset);
+		sieve_code_dumpf(denv, "offset: %d [%08x]", offset, pc + offset);
 	else
 		return FALSE;
 
diff --git a/src/testsuite/cmd-test-set.c b/src/testsuite/cmd-test-set.c
index ee4e7a9776329736bd351b9c763fa8202d515598..8b70d7262ddfb4fa8fb55edf82b5e5abf90ad31b 100644
--- a/src/testsuite/cmd-test-set.c
+++ b/src/testsuite/cmd-test-set.c
@@ -93,7 +93,7 @@ static bool cmd_test_set_validate
 }
 
 /*
- * Generation
+ * Code generation
  */
  
 static bool cmd_test_set_generate
@@ -118,7 +118,7 @@ static bool cmd_test_set_operation_dump
 
 	return 
 		testsuite_object_dump(denv, address) &&
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, "value");
 }
 
 /*
diff --git a/src/testsuite/cmd-test.c b/src/testsuite/cmd-test.c
index 15041ddd1700b667a1811ffb948c434dc9e7e678..bcd85eb89bfcf7c23ba4f5fbe2f67315f4690787 100644
--- a/src/testsuite/cmd-test.c
+++ b/src/testsuite/cmd-test.c
@@ -143,7 +143,7 @@ static bool cmd_test_operation_dump
 	sieve_code_descend(denv);
 
 	return 
-		sieve_opr_string_dump(denv, address);
+		sieve_opr_string_dump(denv, address, "test name");
 }
 
 /*
diff --git a/src/testsuite/testsuite-objects.c b/src/testsuite/testsuite-objects.c
index eb91d09663a7e834e1f4746c9b6457e5a856b2eb..3b4bd6cda5a4ba78c988f202350b4cfcfb6f39a0 100644
--- a/src/testsuite/testsuite-objects.c
+++ b/src/testsuite/testsuite-objects.c
@@ -80,7 +80,7 @@ void testsuite_register_core_objects
  */ 
  
 const struct sieve_operand_class sieve_testsuite_object_operand_class = 
-	{ "TESTSUITE-OBJECT" };
+	{ "testsuite object" };
 
 static const struct sieve_extension_obj_registry core_testsuite_objects =
 	SIEVE_EXT_DEFINE_OBJECTS(testsuite_core_objects);
diff --git a/src/testsuite/tst-test-compile.c b/src/testsuite/tst-test-compile.c
index ae9f72108a1551e3b363a0c60c7749ce5dbb9a2d..19ca3244e9695172113b53bb05671a9f16863ce1 100644
--- a/src/testsuite/tst-test-compile.c
+++ b/src/testsuite/tst-test-compile.c
@@ -103,7 +103,7 @@ static bool tst_test_compile_operation_dump
 	sieve_code_dumpf(denv, "TEST_COMPILE:");
 	sieve_code_descend(denv);
 
-	if ( !sieve_opr_string_dump(denv, address) ) 
+	if ( !sieve_opr_string_dump(denv, address, "script") ) 
 		return FALSE;
 
 	return TRUE;
diff --git a/src/testsuite/tst-test-error.c b/src/testsuite/tst-test-error.c
index bf842a6a7118e9829c76f1fb0e47836168927e48..607ceb7dbaf1c18ef1f9e4dc4ea7c854f6f87988 100644
--- a/src/testsuite/tst-test-error.c
+++ b/src/testsuite/tst-test-error.c
@@ -193,7 +193,7 @@ static bool tst_test_error_operation_dump
 		case SIEVE_MATCH_OPT_END:
 			break;
 		case OPT_INDEX:
-			if ( !sieve_opr_number_dump(denv, address) )
+			if ( !sieve_opr_number_dump(denv, address, "index") )
 				return FALSE;
 			break;
 		default:
@@ -201,7 +201,7 @@ static bool tst_test_error_operation_dump
 		}
 	} while ( opt_code != SIEVE_MATCH_OPT_END );
 
-	return sieve_opr_stringlist_dump(denv, address);
+	return sieve_opr_stringlist_dump(denv, address, "key list");
 }
 
 /*