diff --git a/src/lib-sieve/Makefile.am b/src/lib-sieve/Makefile.am
index 426941621378d1cd2f686ba9db1a1ce7c625a7ae..ea53f28a8dc4d6024409b093348303424bbbf680 100644
--- a/src/lib-sieve/Makefile.am
+++ b/src/lib-sieve/Makefile.am
@@ -63,6 +63,7 @@ libsieve_la_DEPENDENCIES = $(plugins)
 libsieve_la_LIBADD = $(plugins)
 
 libsieve_la_SOURCES = \
+	rfc2822.c \
 	sieve-limits.c \
 	sieve-message.c \
 	sieve-lexer.c \
@@ -95,6 +96,7 @@ libsieve_la_SOURCES = \
 	sieve.c 
 
 noinst_HEADERS = \
+	rfc2822.h \
 	sieve-config.h \
 	sieve-types.h \
 	sieve-common.h \
diff --git a/src/lib-sieve/rfc2822.c b/src/lib-sieve/rfc2822.c
new file mode 100644
index 0000000000000000000000000000000000000000..00fa5390131e4d3a94d2f29cad91c9cfa858cab9
--- /dev/null
+++ b/src/lib-sieve/rfc2822.c
@@ -0,0 +1,31 @@
+/* Copyright (c) 2002-2008 Dovecot Sieve authors, see the included COPYING file 
+ */
+
+#include "lib.h"
+
+#include "rfc2822.h"
+
+/* NOTE: much of the functionality implemented here should eventually appear
+ * somewhere in Dovecot itself.
+ */
+ 
+bool rfc2822_header_field_name_verify
+(const char *field_name, unsigned int len) 
+{
+	const char *p = field_name;
+	const char *pend = p + len;
+
+	/* field-name   =   1*ftext
+	 * ftext        =   %d33-57 /               ; Any character except
+   *                  %d59-126                ;  controls, SP, and
+   *                                          ;  ":".
+	 */
+	 
+	while ( p < pend ) {
+		if ( *p < 33 || *p == ':' )
+			return FALSE;
+	}	
+	
+	return TRUE;
+}
+
diff --git a/src/lib-sieve/rfc2822.h b/src/lib-sieve/rfc2822.h
new file mode 100644
index 0000000000000000000000000000000000000000..e4b8fe19336374e515e225add54d57115ef178ec
--- /dev/null
+++ b/src/lib-sieve/rfc2822.h
@@ -0,0 +1,10 @@
+/* Copyright (c) 2002-2008 Dovecot Sieve authors, see the included COPYING file 
+ */
+
+#ifndef __RFC2822_H
+#define __RFC2822_H
+
+bool rfc2822_header_field_name_verify
+	(const char *field_name, unsigned int len);
+
+#endif /* __RFC2822_H */