diff --git a/src/lib-sieve/cmd-discard.c b/src/lib-sieve/cmd-discard.c
index f62fd0f4ea074e8e80d2b4ea3b93b84a1776467a..c85b86dda4126210a700467acb4fa5b459600b37 100644
--- a/src/lib-sieve/cmd-discard.c
+++ b/src/lib-sieve/cmd-discard.c
@@ -77,13 +77,10 @@ const struct sieve_action_def act_discard = {
  */
  
 static bool cmd_discard_generate
-(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd) 
+(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd ATTR_UNUSED) 
 {
 	sieve_operation_emit(cgenv->sblock, NULL, &cmd_discard_operation);
 
-	/* Emit line number */
-	sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd));
-
 	return TRUE;
 }
 
@@ -97,10 +94,6 @@ static bool cmd_discard_operation_dump
 	sieve_code_dumpf(denv, "DISCARD");
 	sieve_code_descend(denv);
 
-	/* Source line */
-	if ( !sieve_code_source_line_dump(denv, address) )
-		return FALSE;
-
 	return sieve_code_dumper_print_optional_operands(denv, address);
 }
 
@@ -115,10 +108,7 @@ static int cmd_discard_operation_execute
 	unsigned int source_line;
 	
 	/* Source line */
-	if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
-		sieve_runtime_trace_error(renv, "failed to read source line");
-        return SIEVE_EXEC_BIN_CORRUPT;
-	}
+	source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address);
 
 	sieve_runtime_trace(renv, "DISCARD action");
 
diff --git a/src/lib-sieve/cmd-keep.c b/src/lib-sieve/cmd-keep.c
index c228a29433ebfec983e371b843225dace86fe4e6..eff2f09039b6882e3b078558ebdc1486d7387237 100644
--- a/src/lib-sieve/cmd-keep.c
+++ b/src/lib-sieve/cmd-keep.c
@@ -59,9 +59,6 @@ static bool cmd_keep_generate
 	/* Emit opcode */
 	sieve_operation_emit(cgenv->sblock, NULL, &cmd_keep_operation);
 
-	/* Emit line number */
-	sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd));
-
 	/* Generate arguments */
 	return sieve_generate_arguments(cgenv, cmd, NULL);
 }
@@ -76,10 +73,6 @@ static bool cmd_keep_operation_dump
 	sieve_code_dumpf(denv, "KEEP");
 	sieve_code_descend(denv);
 
-	/* Source line */
-	if ( !sieve_code_source_line_dump(denv, address) )
-		return FALSE;
-
 	return sieve_code_dumper_print_optional_operands(denv, address);
 }
 
@@ -88,18 +81,14 @@ static bool cmd_keep_operation_dump
  */
 
 static int cmd_keep_operation_execute
-(const struct sieve_runtime_env *renv ATTR_UNUSED, 
-	sieve_size_t *address ATTR_UNUSED)
+(const struct sieve_runtime_env *renv, sieve_size_t *address)
 {	
 	struct sieve_side_effects_list *slist = NULL;
 	unsigned int source_line;
 	int ret = 0;	
 
 	/* Source line */
-	if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
-		sieve_runtime_trace_error(renv, "invalid source line");
-		return SIEVE_EXEC_BIN_CORRUPT;
-	}
+	source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address);
 	
 	/* Optional operands (side effects only) */
 	if ( (ret=sieve_interpreter_handle_optional_operands
diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c
index 0be56bffe33c94d3f813e80c0c6192bef0894cd7..13d0c8d85cc4dd8c8401e8c742c113267bff2759 100644
--- a/src/lib-sieve/cmd-redirect.c
+++ b/src/lib-sieve/cmd-redirect.c
@@ -162,9 +162,6 @@ static bool cmd_redirect_generate
 {
 	sieve_operation_emit(cgenv->sblock, NULL,  &cmd_redirect_operation);
 
-	/* Emit line number */
-	sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd));
-
 	/* Generate arguments */
 	return sieve_generate_arguments(cgenv, cmd, NULL);
 }
@@ -179,10 +176,6 @@ static bool cmd_redirect_operation_dump
 	sieve_code_dumpf(denv, "REDIRECT");
 	sieve_code_descend(denv);
 
-	/* Source line */
-    if ( !sieve_code_source_line_dump(denv, address) )
-        return FALSE;
-
 	if ( !sieve_code_dumper_print_optional_operands(denv, address) )
 		return FALSE;
 
@@ -205,10 +198,7 @@ static int cmd_redirect_operation_execute
 	int ret = 0;
 
 	/* Source line */
-    if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
-		sieve_runtime_trace_error(renv, "invalid source line");
-        return SIEVE_EXEC_BIN_CORRUPT;
-	}
+	source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address);
 
 	/* Optional operands (side effects) */
 	if ( (ret=sieve_interpreter_handle_optional_operands
diff --git a/src/lib-sieve/ext-fileinto.c b/src/lib-sieve/ext-fileinto.c
index 1d963ab13ee3bf8d62e8d6f0d1a4849d055f677b..994cf513701a8b68d8f2049819e74da1161ad813 100644
--- a/src/lib-sieve/ext-fileinto.c
+++ b/src/lib-sieve/ext-fileinto.c
@@ -125,9 +125,6 @@ static bool cmd_fileinto_generate
 {
 	sieve_operation_emit(cgenv->sblock, cmd->ext, &fileinto_operation);
 
-	/* Emit line number */
-	sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd));
-
 	/* Generate arguments */
 	return sieve_generate_arguments(cgenv, cmd, NULL);
 }
@@ -142,10 +139,6 @@ static bool ext_fileinto_operation_dump
 	sieve_code_dumpf(denv, "FILEINTO");
 	sieve_code_descend(denv);
 
-	/* Source line */
-	if ( !sieve_code_source_line_dump(denv, address) )
-		return FALSE;
-
 	if ( !sieve_code_dumper_print_optional_operands(denv, address) ) {
 		return FALSE;
 	}
@@ -163,7 +156,7 @@ static int ext_fileinto_operation_execute
 	struct sieve_side_effects_list *slist = NULL; 
 	string_t *folder;
 	const char *mailbox;
-	unsigned int source_line;
+	unsigned int source_line; 
 	int ret = 0;
 	
 	/*
@@ -171,10 +164,7 @@ static int ext_fileinto_operation_execute
 	 */
 
 	/* Source line */
-	if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
-		sieve_runtime_trace_error(renv, "invalid source line");
-		return SIEVE_EXEC_BIN_CORRUPT;
-	}
+	source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address);
 	
 	/* Optional operands */
 	if ( (ret=sieve_interpreter_handle_optional_operands(renv, address, &slist)) 
diff --git a/src/lib-sieve/ext-reject.c b/src/lib-sieve/ext-reject.c
index 3b8f70f027885d5a77d6e8a72c14f082ee64245c..7907303db521634155ecfe0a90c615d4395dddb0 100644
--- a/src/lib-sieve/ext-reject.c
+++ b/src/lib-sieve/ext-reject.c
@@ -235,9 +235,6 @@ static bool cmd_reject_generate
 	else
 		sieve_operation_emit(cgenv->sblock, cmd->ext, &ereject_operation);
 
-	/* Emit line number */
-	sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd));
-
 	/* Generate arguments */
 	return sieve_generate_arguments(cgenv, cmd, NULL);
 }
@@ -253,10 +250,6 @@ static bool ext_reject_operation_dump
 
 	sieve_code_dumpf(denv, "%s", sieve_operation_mnemonic(op));
 	sieve_code_descend(denv);
-	
-	/* Source line */
-	if ( !sieve_code_source_line_dump(denv, address) )
-		return FALSE;
 
 	if ( !sieve_code_dumper_print_optional_operands(denv, address) )
 		return FALSE;
@@ -281,10 +274,7 @@ static int ext_reject_operation_execute
 	int ret;
 
 	/* Source line */
-	if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
-		sieve_runtime_trace_error(renv, "invalid source line");
-		return SIEVE_EXEC_BIN_CORRUPT;
-	}
+	source_line = sieve_runtime_get_source_location(renv, op->address);
 	
 	/* Optional operands (side effects) */
 	if ( (ret=sieve_interpreter_handle_optional_operands
diff --git a/src/lib-sieve/plugins/enotify/cmd-notify.c b/src/lib-sieve/plugins/enotify/cmd-notify.c
index 4e9500e68c66516f85756a061468a00e789823d0..8dc834d5bca3feb5a0fef9dc699ca7cfb44ea63a 100644
--- a/src/lib-sieve/plugins/enotify/cmd-notify.c
+++ b/src/lib-sieve/plugins/enotify/cmd-notify.c
@@ -336,9 +336,6 @@ static bool cmd_notify_generate
 {		 
 	sieve_operation_emit(cgenv->sblock, cmd->ext, &notify_operation);
 
-	/* Emit source line */
-	sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd));
-
 	/* Generate arguments */
 	return sieve_generate_arguments(cgenv, cmd, NULL);
 }
@@ -355,10 +352,6 @@ static bool cmd_notify_operation_dump
 	sieve_code_dumpf(denv, "NOTIFY");
 	sieve_code_descend(denv);	
 
-	/* Source line */
-	if ( !sieve_code_source_line_dump(denv, address) )
-		return FALSE;
-
 	/* Dump optional operands */
 	if ( sieve_operand_optional_present(denv->sblock, address) ) {
 		while ( opt_code != 0 ) {
@@ -421,10 +414,7 @@ static int cmd_notify_operation_execute
 	 */
 		
 	/* Source line */
-	if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
-		sieve_runtime_trace_error(renv, "invalid source line");
-		return SIEVE_EXEC_BIN_CORRUPT;
-	}
+	source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address);
 	
 	/* Optional operands */	
 	if ( sieve_operand_optional_present(renv->sblock, address) ) {
diff --git a/src/lib-sieve/plugins/notify/cmd-denotify.c b/src/lib-sieve/plugins/notify/cmd-denotify.c
index f1512e56c877df4c30f9d63b08ca904b0adeee74..870f646af565fe8e3b226c0e58cff3d7bd8b66fb 100644
--- a/src/lib-sieve/plugins/notify/cmd-denotify.c
+++ b/src/lib-sieve/plugins/notify/cmd-denotify.c
@@ -220,9 +220,6 @@ static bool cmd_denotify_generate
 {
 	sieve_operation_emit(cgenv->sblock, cmd->ext, &denotify_operation);
 
-	/* Emit source line */
-	sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd));
-
 	/* Generate arguments */
 	return sieve_generate_arguments(cgenv, cmd, NULL);
 }
@@ -240,10 +237,6 @@ static bool cmd_denotify_operation_dump
 	sieve_code_dumpf(denv, "%s", sieve_operation_mnemonic(op));
 	sieve_code_descend(denv);	
 
-	/* Source line */
-	if ( !sieve_code_source_line_dump(denv, address) )
-		return FALSE;
-
 	/* Dump optional operands */
 	if ( sieve_operand_optional_present(denv->sblock, address) ) {
 		while ( opt_code != 0 ) {
@@ -294,18 +287,11 @@ static int cmd_denotify_operation_execute
 	struct sieve_match_context *mctx;
 	struct sieve_result_iterate_context *rictx;
 	const struct sieve_action *action;
-	unsigned int source_line;
 	int ret;
 
 	/*
 	 * Read operands
 	 */
-		
-	/* Source line */
-	if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
-		sieve_runtime_trace_error(renv, "invalid source line");
-		return SIEVE_EXEC_BIN_CORRUPT;
-	}
 	
 	/* Optional operands */	
 	if ( sieve_operand_optional_present(renv->sblock, address) ) {
diff --git a/src/lib-sieve/plugins/notify/cmd-notify.c b/src/lib-sieve/plugins/notify/cmd-notify.c
index 69586a240ab6272244b0dacc5b285db27a4be61c..aa38e5e4ee78ecb35bfe56570cc2260887b310d6 100644
--- a/src/lib-sieve/plugins/notify/cmd-notify.c
+++ b/src/lib-sieve/plugins/notify/cmd-notify.c
@@ -355,9 +355,6 @@ static bool cmd_notify_generate
 {
 	sieve_operation_emit(cgenv->sblock, cmd->ext, &notify_old_operation);
 
-	/* Emit source line */
-	sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd));
-
 	/* Generate arguments */
 	return sieve_generate_arguments(cgenv, cmd, NULL);
 }
@@ -374,10 +371,6 @@ static bool cmd_notify_operation_dump
 	sieve_code_dumpf(denv, "NOTIFY");
 	sieve_code_descend(denv);	
 
-	/* Source line */
-	if ( !sieve_code_source_line_dump(denv, address) )
-		return FALSE;
-
 	/* Dump optional operands */
 	if ( sieve_operand_optional_present(denv->sblock, address) ) {
 		while ( opt_code != 0 ) {
@@ -436,10 +429,7 @@ static int cmd_notify_operation_execute
 	 */
 		
 	/* Source line */
-	if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
-		sieve_runtime_trace_error(renv, "invalid source line");
-		return SIEVE_EXEC_BIN_CORRUPT;
-	}
+	source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address);
 	
 	/* Optional operands */	
 	if ( sieve_operand_optional_present(renv->sblock, address) ) {
diff --git a/src/lib-sieve/plugins/vacation/cmd-vacation.c b/src/lib-sieve/plugins/vacation/cmd-vacation.c
index 52dfe4702ed29d7a1263b3d6e6369d31e010a414..48d8e5a30cd0caaaf433ede35614be70bcea73e6 100644
--- a/src/lib-sieve/plugins/vacation/cmd-vacation.c
+++ b/src/lib-sieve/plugins/vacation/cmd-vacation.c
@@ -465,9 +465,6 @@ static bool cmd_vacation_generate
 		 
 	sieve_operation_emit(cgenv->sblock, cmd->ext, &vacation_operation);
 
-	/* Emit source line */
-	sieve_code_source_line_emit(cgenv->sblock, sieve_command_source_line(cmd));
-
 	/* Generate arguments */
 	if ( !sieve_generate_arguments(cgenv, cmd, NULL) )
 		return FALSE;	
@@ -490,10 +487,6 @@ static bool ext_vacation_operation_dump
 	sieve_code_dumpf(denv, "VACATION");
 	sieve_code_descend(denv);	
 
-	/* Source line */
-	if ( !sieve_code_source_line_dump(denv, address) )
-		return FALSE;
-
 	/* Dump optional operands */
 	if ( sieve_operand_optional_present(denv->sblock, address) ) {
 		while ( opt_code != 0 ) {
@@ -561,10 +554,7 @@ static int ext_vacation_operation_execute
 	 */
 		
 	/* Source line */
-	if ( !sieve_code_source_line_read(renv, address, &source_line) ) {
-		sieve_runtime_trace_error(renv, "invalid source line");
-		return SIEVE_EXEC_BIN_CORRUPT;
-	}
+	source_line = sieve_runtime_get_source_location(renv, renv->oprtn.address);
 	
 	/* Optional operands */	
 	if ( sieve_operand_optional_present(renv->sblock, address) ) {
diff --git a/src/lib-sieve/sieve-code.c b/src/lib-sieve/sieve-code.c
index ea93fbd1ac7ecfb3bbf1095fe4640ca998d98855..c63a10482bab63efd0b942721836ddb1eeb71ffa 100644
--- a/src/lib-sieve/sieve-code.c
+++ b/src/lib-sieve/sieve-code.c
@@ -157,38 +157,6 @@ static bool sieve_coded_stringlist_dump
 		
 	return TRUE;
 }
-	
-/*
- * Source line coding
- */
-
-void sieve_code_source_line_emit
-(struct sieve_binary_block *sblock, unsigned int source_line)
-{
-	(void)sieve_binary_emit_unsigned(sblock, source_line);
-}
-
-bool sieve_code_source_line_dump
-(const struct sieve_dumptime_env *denv, sieve_size_t *address)
-{
-	unsigned int number = 0;
-
-	sieve_code_mark(denv);
-	if (sieve_binary_read_unsigned(denv->sblock, address, &number) ) {
-		sieve_code_dumpf(denv, "(source line: %lu)", (unsigned long) number);
-
-		return TRUE;
-	}
-
-	return FALSE;
-}
-
-bool sieve_code_source_line_read
-(const struct sieve_runtime_env *renv, sieve_size_t *address,
-	unsigned int *source_line_r)
-{
-	return sieve_binary_read_unsigned(renv->sblock, address, source_line_r);
-}
 
 /*
  * Core operands
diff --git a/src/lib-sieve/sieve-code.h b/src/lib-sieve/sieve-code.h
index 46963cea5762410bb65f28503c387b3618f30abb..47583d1415ed801357a31d6d505e3cf4582e6357 100644
--- a/src/lib-sieve/sieve-code.h
+++ b/src/lib-sieve/sieve-code.h
@@ -32,18 +32,6 @@ sieve_size_t sieve_coded_stringlist_get_end_address
 sieve_size_t sieve_coded_stringlist_get_current_offset
 	(struct sieve_coded_stringlist *strlist);
 
-/* 
- * Source line coding
- */
-
-void sieve_code_source_line_emit
-	(struct sieve_binary_block *sblock, unsigned int source_line);
-bool sieve_code_source_line_dump
-	(const struct sieve_dumptime_env *denv, sieve_size_t *address);
-bool sieve_code_source_line_read
-	(const struct sieve_runtime_env *renv, sieve_size_t *address, 
-    	unsigned int *source_line_r);
-
 /* 
  * Operand object
  */
diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c
index 0c4e5ee769356854a3cfd17fa253aa6fd2020d1d..c0da74b3696501343aa402cbe23ec62af87d76ad 100644
--- a/src/lib-sieve/sieve-interpreter.c
+++ b/src/lib-sieve/sieve-interpreter.c
@@ -282,6 +282,15 @@ void sieve_runtime_log
  * Runtime trace
  */
 
+unsigned int sieve_runtime_get_source_location
+(const struct sieve_runtime_env *renv, sieve_size_t code_address)
+{
+	if ( renv->interp->dreader != NULL ) 
+		return sieve_binary_debug_read_line(renv->interp->dreader, code_address);
+
+	return 0;
+}
+
 #ifdef SIEVE_RUNTIME_TRACE
 void _sieve_runtime_trace
 (const struct sieve_runtime_env *runenv, const char *fmt, ...)
@@ -465,7 +474,7 @@ int sieve_interpreter_handle_optional_operands
  * Code execute 
  */
 
-static int sieve_interpreter_execute_operation
+static int sieve_interpreter_operation_execute
 (struct sieve_interpreter *interp) 
 {
 	struct sieve_operation *oprtn = &(interp->runenv.oprtn);
@@ -504,7 +513,7 @@ int sieve_interpreter_continue
 	while ( ret == SIEVE_EXEC_OK && !interp->interrupted && 
 		interp->pc < sieve_binary_block_get_size(interp->runenv.sblock) ) {
 		
-		ret = sieve_interpreter_execute_operation(interp);
+		ret = sieve_interpreter_operation_execute(interp);
 
 		if ( ret != SIEVE_EXEC_OK ) {
 			sieve_runtime_trace(&interp->runenv, "[[EXECUTION ABORTED]]");
diff --git a/src/lib-sieve/sieve-interpreter.h b/src/lib-sieve/sieve-interpreter.h
index 41336be9accc509424441d73138963f1ca26ced9..ba08f8f63aca096a5f59ff078097f7df7b17f6fc 100644
--- a/src/lib-sieve/sieve-interpreter.h
+++ b/src/lib-sieve/sieve-interpreter.h
@@ -98,6 +98,9 @@ bool sieve_interpreter_get_test_result
  * Error handling 
  */
 
+unsigned int sieve_runtime_get_source_location
+	(const struct sieve_runtime_env *renv, sieve_size_t code_address);
+
 /* This is not particularly user-friendly, so avoid using this.. */
 const char *sieve_runtime_location(const struct sieve_runtime_env *runenv);