diff --git a/src/lib-sieve/sieve-lexer.c b/src/lib-sieve/sieve-lexer.c
index 6116e4ccc6bfe555612629f0655987229c1cf29d..b88904446c234adda620fc4a8e9e32438dcdfa6d 100644
--- a/src/lib-sieve/sieve-lexer.c
+++ b/src/lib-sieve/sieve-lexer.c
@@ -91,7 +91,7 @@ struct sieve_lexer *sieve_lexer_create
 	
 	lexer->current_line = 1;	
 	lexer->token_type = STT_NONE;
-	lexer->token_str_value = NULL;
+	lexer->token_str_value = str_new(pool, 256);
 	lexer->token_int_value = 0;
 		
 	return lexer;
@@ -391,8 +391,8 @@ static bool sieve_lexer_scan_raw_token(struct sieve_lexer *lexer)
 	case '"':
 		start_line = lexer->current_line;
 		sieve_lexer_shift(lexer);
-		str = str_new(lexer->pool, 16);
-		lexer->token_str_value = str;
+		str_truncate(lexer->token_str_value, 0);
+		str = lexer->token_str_value;
 		
 		while ( sieve_lexer_curchar(lexer) != '"' ) {
 			if ( sieve_lexer_curchar(lexer) == -1 ) {
@@ -493,8 +493,8 @@ static bool sieve_lexer_scan_raw_token(struct sieve_lexer *lexer)
 			sieve_lexer_curchar(lexer) == ':' ) {
   		
 			enum sieve_token_type type = STT_IDENTIFIER;
-			str = str_new(lexer->pool, 16);
-			lexer->token_str_value = str;
+			str_truncate(lexer->token_str_value,0);
+			str = lexer->token_str_value;
   		
 			/* If it starts with a ':' it is a tag and not an identifier */
  			if ( sieve_lexer_curchar(lexer) == ':' ) {
@@ -631,12 +631,6 @@ static bool sieve_lexer_scan_raw_token(struct sieve_lexer *lexer)
 
 bool sieve_lexer_skip_token(struct sieve_lexer *lexer) 
 {
-	/* Free any previously allocated string value */
-	if ( lexer->token_str_value != NULL ) {
-		str_free(&lexer->token_str_value);
-		lexer->token_str_value = NULL;
-	}
-	
 	/* Scan token */
 	if ( !sieve_lexer_scan_raw_token(lexer) ) return FALSE;