diff --git a/NEWS b/NEWS
index 5102170b1c0e0d32e6603d021748354a9fa4538e..85fd29d9dbb03dbf6e22e2f460f6b52302f2b635 100644
--- a/NEWS
+++ b/NEWS
@@ -91,14 +91,14 @@ v0.3.4 06-04-2013 Stephan Bosch <stephan@rename-it.nl>
 	  checking. This extension is in the process of being standardized
 	  (https://tools.ietf.org/html/draft-bosch-sieve-duplicate-01).
 	+ Sieve date extension: generate warning when invalid date part is specified.
-	- Sieve editheader extension: fixed crash occuring when addheader :last was
+	- Sieve editheader extension: fixed crash occurring when addheader :last was
 	  used.
 	- Sieve include extension: fixed missing error cleanup that caused a resource
 	  leak.
 	- Sieve vacation extension: fixed determination of From: address for when
 	  sieve_vacation_dont_check_recipient is active.
 	- Sieve tools: the -D option wasn't enabled and documented for all tools.
-	- Siev dict script storage: fixed potential segfault occuring when dict
+	- Siev dict script storage: fixed potential segfault occurring when dict
 	  initialization fails.
 	- ManageSieve: fixed bug in skipping of CRLF at end of AUTHENTICATE command.
 	- ManageSieve: fixed handling of unkown commands pre-login.
@@ -296,7 +296,7 @@ v0.2.2 06-12-2010 Stephan Bosch <stephan@rename-it.nl>
 	  notice that the default limits are too low and you need to increase them.
 	  This problem will show up in logs as "out of memory" errors. See
 	  default_vsz_limit and service { vsz_limit } settings.
-	- Imap4flags: fixed segfault bug occuring in multiscript context.
+	- Imap4flags: fixed segfault bug occurring in multiscript context.
 	- Added version checking to the ManageSieve settings plugin. This plugin was
 	  forgotten when the LDA plugin was updated with this change in the previous
 	  release.
@@ -508,7 +508,7 @@ v0.1.13 18-10-2009 Stephan Bosch <stephan@rename-it.nl>
 	+ Body extension: implemented proper handling of the :raw transform and added
 	  various new tests to the test suite. However, :content "multipart" and
 	  :content "message/rfc822" are still not working.
-	+ Fixed race condition occuring when multiple instances are saving the same
+	+ Fixed race condition occurring when multiple instances are saving the same
 	  binary (patch by Timo Sirainen).
 	+ Test suite: added support for testing multiscript execution.
 	- Made compiler more lenient towars missing CRLF at the end of the script in a
@@ -519,7 +519,7 @@ v0.1.13 18-10-2009 Stephan Bosch <stephan@rename-it.nl>
 	- Fixed bugs in multiscript support; subsequent keep actions were not always
 	  merged correctly and implicit side effects were not always handled
 	  correctly.
-	- Fixed a segfault bug in the sieve-test tool occuring when compile fails.
+	- Fixed a segfault bug in the sieve-test tool occurring when compile fails.
 	- Fixed segfault bug in action procesing. It was triggered while merging side
 	  effects in duplicate actions.
 	- Fixed bug in the Sieve plugin that caused it to try to stat() a NULL path,
@@ -610,7 +610,7 @@ v0.1.9 22-07-2009  Stephan Bosch <stephan@rename-it.nl>
 	- Fixed a potential segfault in the argument validation. It didn't surface
 	  because no command could have a :tag followed by an associated parameter as
 	  last argument.
-	- Fixed segfault bug occuring in envelope test when performed on null (<>)
+	- Fixed segfault bug occurring in envelope test when performed on null (<>)
 	  envelope path. The fix involves a rather large restructuring of the code to
 	  make sure envelope addresses are properly handled everywhere (bug reported
 	  by Nikita Koshikov)
@@ -720,11 +720,11 @@ v0.1.3 12-02-2009  Stephan Bosch <stephan@rename-it.nl>
 	  compatibility with CMUSieve. This also implements the mark/unmark commands.
 	- Fixed bugs in the regex extension: 1) if an optional match value did not in
 	  fact match, subsequent match values would get unexpected indexes. 2) fixed
-	  segfault bug occuring when regex is freed.
+	  segfault bug occurring when regex is freed.
 	- Fixed bug in the use of the :from agrument for the vacation command. If this
 	  address included a phrase part, the response would not be a valid RFC822
 	  message.
-	- Plugged a theoretical security hole occuring when a directory is opened as a
+	- Plugged a theoretical security hole occurring when a directory is opened as a
 	  Sieve binary.
 	- Cleaned up and fixed various log messages.
 	- Fixed bug in the outgoing address verification. Addresses ending in ',' were
@@ -789,7 +789,7 @@ v0.11.11:
 	+ Added MAXREDIRECTS capability after login.
 	+ Implemented new script name rules specified in most recent ManageSieve
 	  draft.
-	- Fixed assertion failure occuring with challenge-response SASL mechanisms.
+	- Fixed assertion failure occurring with challenge-response SASL mechanisms.
 	- Made configure complain about trying to compile against installed Dovecot
 	  headers alone.
 	- Fixed compile warning for compilation against CMUSieve.
@@ -912,7 +912,7 @@ v0.10.1
 	  managesieve.
 	+ Added short proxy configuration explanation to the README file
 	+ Added 'Known Issues' section to the README file
-	- Fixed assert bug in sieve-storage occuring when save is canceled.
+	- Fixed assert bug in sieve-storage occurring when save is canceled.
 
 v0.10.0
 	* Upgraded to Dovecot 1.1:
diff --git a/src/lib-sieve/mcht-matches.c b/src/lib-sieve/mcht-matches.c
index 0f733c851b21f2b6d6f236c088ddd00584748bce..a6a2844303884987695e8291660685f8a7368ea5 100644
--- a/src/lib-sieve/mcht-matches.c
+++ b/src/lib-sieve/mcht-matches.c
@@ -313,7 +313,7 @@ static int mcht_matches_match_key
 					!cmp->def->char_match(cmp, &vp, vend, &needle, nend) ) {
 
 					/* Match failed: now we have a problem. We need to backtrack to the previous
-					 * '*' wildcard occurence and start scanning for the next possible match.
+					 * '*' wildcard occurrence and start scanning for the next possible match.
 					 */
 
 					debug_printf("  failed fixed match\n");
diff --git a/src/lib-sieve/plugins/editheader/cmd-deleteheader.c b/src/lib-sieve/plugins/editheader/cmd-deleteheader.c
index 8714919f762344c4ede41550e9093d8535ae2538..a3a73ec806be822a77c7b8b3e16e5b5b83361f53 100644
--- a/src/lib-sieve/plugins/editheader/cmd-deleteheader.c
+++ b/src/lib-sieve/plugins/editheader/cmd-deleteheader.c
@@ -453,11 +453,11 @@ static int cmd_deleteheader_operation_execute
 			sieve_runtime_trace_descend(renv);
 			if ( index_offset != 0 ) {
 				sieve_runtime_trace(renv, 0,
-					"deleting matching occurences of header `%s' at index %u%s",
+					"deleting matching occurrences of header `%s' at index %u%s",
 					str_c(field_name), index_offset, ( index_last ? " from last": ""));
 			} else {
 				sieve_runtime_trace(renv, 0,
-					"deleting matching occurences of header `%s'", str_c(field_name));
+					"deleting matching occurrences of header `%s'", str_c(field_name));
 			}
 		}
 
@@ -511,7 +511,7 @@ static int cmd_deleteheader_operation_execute
 			sieve_runtime_trace(renv, 0, "header `%s' not found", str_c(field_name));
 		} else if ( ret < 0 ) {
 			sieve_runtime_warning(renv, NULL, "deleteheader action: "
-				"failed to delete occurences of header `%s' (this should not happen!)",
+				"failed to delete occurrences of header `%s' (this should not happen!)",
 				str_c(field_name));
 		}
 
@@ -528,15 +528,15 @@ static int cmd_deleteheader_operation_execute
 			}
 		}
 
-		/* Delete all occurences of header */
+		/* Delete all occurrences of header */
 		ret = edit_mail_header_delete(edmail, str_c(field_name), index);
 
 		if ( ret < 0 ) {
 			sieve_runtime_warning(renv, NULL, "deleteheader action: "
-				"failed to delete occurences of header `%s' (this should not happen!)",
+				"failed to delete occurrences of header `%s' (this should not happen!)",
 				str_c(field_name));
 		} else if ( trace ) {
-			sieve_runtime_trace(renv, 0, "deleted %d occurences of header `%s'",
+			sieve_runtime_trace(renv, 0, "deleted %d occurrences of header `%s'",
 				ret, str_c(field_name));
 		}
 
diff --git a/src/lib-sieve/sieve-validator.c b/src/lib-sieve/sieve-validator.c
index 375c76875d0aaf7f79d4fffc96803c183972b82a..7e7c04b2622c331d31b8e371f2845028e8d87da7 100644
--- a/src/lib-sieve/sieve-validator.c
+++ b/src/lib-sieve/sieve-validator.c
@@ -904,7 +904,7 @@ static bool sieve_validate_command_arguments
 		if ( tag_reg == NULL ) {
 			sieve_argument_validate_error(valdtr, arg,
 				"unknown tagged argument ':%s' for the %s %s "
-				"(reported only once at first occurence)",
+				"(reported only once at first occurrence)",
 				sieve_ast_argument_tag(arg), sieve_command_identifier(cmd),
 				sieve_command_type_name(cmd));
 			sieve_validator_register_unknown_tag
@@ -1202,7 +1202,7 @@ static bool sieve_validate_command_context
 	}	else {
 		sieve_validator_error(
 			valdtr, cmd_node->source_line,
-			"unknown %s '%s' (only reported once at first occurence)",
+			"unknown %s '%s' (only reported once at first occurrence)",
 			sieve_ast_type_name(ast_type), cmd_node->identifier);
 
 		sieve_validator_register_unknown_command(valdtr, cmd_node->identifier);
diff --git a/src/lib-sieve/util/edit-mail.c b/src/lib-sieve/util/edit-mail.c
index fda48a89bf518be4182a936bf1ce3a46301c6931..392547d8fd21a8746e061626b6989e3d3723b760 100644
--- a/src/lib-sieve/util/edit-mail.c
+++ b/src/lib-sieve/util/edit-mail.c
@@ -1190,7 +1190,7 @@ static int edit_mail_get_first_header
 		return 0;
 	}
 
-	/* Get the first occurence */
+	/* Get the first occurrence */
 	if ( edmail->header_fields_appended == NULL ) {
 		/* There are no appended headers, so first is found directly */
 		field = header_idx->first->field;
diff --git a/tests/compile/redirect.sieve b/tests/compile/redirect.sieve
index efef440c14a2cd9576fa9dd9bdfdfb2c76eb0ee5..fb9f23d0a7190ec8a6639bedd58262b74e79abb2 100644
--- a/tests/compile/redirect.sieve
+++ b/tests/compile/redirect.sieve
@@ -1,4 +1,4 @@
-# Test various white space occurences
+# Test various white space occurrences
 redirect "stephan@example.org";
 redirect " stephan@example.org";
 redirect "stephan @example.org";