diff --git a/src/lib-sieve/cmd-stop.c b/src/lib-sieve/cmd-stop.c
new file mode 100644
index 0000000000000000000000000000000000000000..0629f6dec4f6dbe51db2b83b000113263837d741
--- /dev/null
+++ b/src/lib-sieve/cmd-stop.c
@@ -0,0 +1,90 @@
+/* Copyright (c) 2002-2008 Dovecot Sieve authors, see the included COPYING file
+ */
+
+#include "sieve-common.h"
+#include "sieve-commands.h"
+#include "sieve-code.h"
+#include "sieve-generator.h"
+#include "sieve-interpreter.h"
+
+/* 
+ * Stop command 
+ * 
+ * Syntax
+ *   stop
+ */	
+
+static bool cmd_stop_generate
+	(const struct sieve_codegen_env *cgenv, 
+		struct sieve_command_context *ctx ATTR_UNUSED);
+static bool cmd_stop_validate
+	(struct sieve_validator *validator, struct sieve_command_context *ctx);
+	
+const struct sieve_command cmd_stop = { 
+	"stop", 
+	SCT_COMMAND, 
+	0, 0, FALSE, FALSE,
+	NULL, NULL,  
+	cmd_stop_validate, 
+	cmd_stop_generate, 
+	NULL 
+};
+
+/* 
+ * Stop operation
+ */
+
+static int opc_stop_execute
+	(const struct sieve_operation *op, 
+		const struct sieve_runtime_env *renv, sieve_size_t *address);
+
+const struct sieve_operation cmd_stop_operation = { 
+	"STOP",
+	NULL,
+	SIEVE_OPERATION_STOP,
+	NULL, 
+	opc_stop_execute 
+};
+
+/*
+ * Command validation
+ */
+ 
+static bool cmd_stop_validate
+(struct sieve_validator *validator ATTR_UNUSED, 
+	struct sieve_command_context *ctx)
+{
+	sieve_command_exit_block_unconditionally(ctx);
+	
+	return TRUE;
+}
+
+/*
+ * Code generation
+ */
+
+static bool cmd_stop_generate
+(const struct sieve_codegen_env *cgenv, 
+	struct sieve_command_context *ctx ATTR_UNUSED) 
+{
+	sieve_operation_emit_code(cgenv->sbin, &cmd_stop_operation);
+
+	return TRUE;
+}
+
+/*
+ * Code execution
+ */
+
+static int opc_stop_execute
+(const struct sieve_operation *op ATTR_UNUSED, 
+	const struct sieve_runtime_env *renv,  
+	sieve_size_t *address ATTR_UNUSED)
+{	
+	sieve_runtime_trace(renv, "STOP");
+	
+	sieve_interpreter_interrupt(renv->interp);
+
+	return SIEVE_EXEC_OK;
+}
+