Index: src/Common/SemanticError.cc
===================================================================
--- src/Common/SemanticError.cc	(revision 623c16ab8634ddb9a4f072fd8516d987872c869d)
+++ src/Common/SemanticError.cc	(revision 161cdf1c71c97c71ad36951e9dbd349acb64b7d9)
@@ -16,12 +16,58 @@
 #include <cstdarg>
 #include <cstdio>										// for fileno, stderr
+#include <cstring>
 #include <unistd.h>										// for isatty
 #include <iostream>										// for basic_ostream, operator<<, ostream
 #include <list>											// for list, _List_iterator
 #include <string>										// for string, operator<<, operator+, to_string
+#include <vector>
 
 #include "Common/utility.h"								// for to_string, CodeLocation (ptr only)
 #include "SemanticError.h"
 
+//-----------------------------------------------------------------------------
+// Severity Handling
+std::vector<Severity> & get_severities() {
+	static std::vector<Severity> severities;
+	if(severities.empty()) {
+		severities.reserve((size_t)Warning::NUMBER_OF_WARNINGS);
+		for ( const auto w : WarningFormats ) {
+			severities.push_back( w.default_severity );
+		} // for
+	}
+	return severities;
+}
+
+void SemanticWarning_SuppressAll() {
+	for( auto & s : get_severities() ) {
+		s = Severity::Suppress;
+	}
+}
+
+void SemanticWarning_EnableAll() {
+	for( auto & s : get_severities() ) {
+		s = Severity::Warn;
+	}
+}
+
+void SemanticWarning_WarningAsError() {
+	for( auto & s : get_severities() ) {
+		if(s == Severity::Warn) s = Severity::Error;
+	}
+}
+
+void SemanticWarning_Set(const char * const name, Severity s) {
+	size_t idx = 0;
+	for ( auto  & w : WarningFormats ) {
+		if ( std::strcmp( name, w.name ) == 0 ) {
+			get_severities()[idx] = s;
+			break;
+		}
+		idx++;
+	}
+}
+
+//-----------------------------------------------------------------------------
+// Semantic Error
 SemanticErrorException::SemanticErrorException( CodeLocation location, std::string error ) {
 	append( location, error );
@@ -69,5 +115,5 @@
 
 void SemanticWarningImpl( CodeLocation location, Warning warning, const char * const fmt, ... ) {
-	Severity severity = WarningFormats[(int)warning].severity;
+	Severity severity = get_severities()[(int)warning];
 	switch(severity) {
 	case Severity::Suppress :
Index: src/Common/SemanticError.h
===================================================================
--- src/Common/SemanticError.h	(revision 623c16ab8634ddb9a4f072fd8516d987872c869d)
+++ src/Common/SemanticError.h	(revision 161cdf1c71c97c71ad36951e9dbd349acb64b7d9)
@@ -46,10 +46,10 @@
 	const char * const name;
 	const char * const message;
-	mutable Severity severity;
+	const Severity default_severity;
 };
 
 constexpr WarningData WarningFormats[] = {
-	{"self-assign"         , "self assignment of expression: %s"           , Severity::Warn},
-	{"reference-conversion", "rvalue to reference conversion of rvalue: %s", Severity::Warn},
+	{"self-assign"            , "self assignment of expression: %s"            , Severity::Warn},
+	{"reference-conversion"   , "rvalue to reference conversion of rvalue: %s" , Severity::Warn},
 	{"qualifiers-zero_t-one_t", "questionable use of type qualifier %s with %s", Severity::Warn},
 };
@@ -71,4 +71,8 @@
 void SemanticWarningImpl (CodeLocation loc, Warning warn, const char * const fmt, ...) __attribute__((format(printf, 3, 4)));
 
+void SemanticWarning_SuppressAll   ();
+void SemanticWarning_EnableAll     ();
+void SemanticWarning_WarningAsError();
+void SemanticWarning_Set           (const char * const name, Severity s);
 
 //-----------------------------------------------------------------------------
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 623c16ab8634ddb9a4f072fd8516d987872c869d)
+++ src/main.cc	(revision 161cdf1c71c97c71ad36951e9dbd349acb64b7d9)
@@ -508,13 +508,9 @@
 			break;
 		  case 'w':
-			for ( auto & w : WarningFormats ) {
-				w.severity = Severity::Suppress;
-			} // for
+			SemanticWarning_SuppressAll();
 			break;
 		  case 'W':
 			if ( strcmp( optarg, "all" ) == 0 ) {
-				for ( auto & w : WarningFormats ) {
-					if ( w.severity == Severity::Suppress ) w.severity = Severity::Warn;
-				} // for
+				SemanticWarning_EnableAll();
 			} else if ( strcmp( optarg, "error" ) == 0 ) {
 				Werror = true;
@@ -528,10 +524,5 @@
 					s = Severity::Warn;
 				} // if
-				for ( auto  & w : WarningFormats ) {
-					if ( strcmp( warning, w.name ) == 0 ) {	// replace the argument for cfa-cpp
-						w.severity = s;
-						break;
-					} // if
-				} // for
+				SemanticWarning_Set( warning, s );
 			} // if
 			break;
@@ -566,7 +557,5 @@
 
 	if ( Werror ) {
-		for ( auto & w : WarningFormats ) {
-			if ( w.severity == Severity::Warn ) w.severity = Severity::Error;
-		} // for
+		SemanticWarning_WarningAsError();
 	} // if
 	// for ( const auto w : WarningFormats ) {
