diff --git a/src/AlarmHandler.cpp b/src/AlarmHandler.cpp
index abf8c2be17cd916224a97cf4974ccd69ddc8dcdf..6cce1938bca0a67e568f90bf6645bd1de3f47b99 100644
--- a/src/AlarmHandler.cpp
+++ b/src/AlarmHandler.cpp
@@ -68,6 +68,7 @@ using namespace boost::spirit::classic;
 #include <cassert>
 #endif 		//_DUMP_TREE_XML
 #include <sstream>
+#include <regex>
 
 std::map<parser_id, std::string> rule_names;  //only for log messages
 
@@ -3098,19 +3099,13 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string>
     	{
     		alm.attr_name = alm.name;
 #if 0
-			size_t start_pos = 0;
-			string from("/");
-			string to("__");
-			while((start_pos = alm.attr_name.find(from, start_pos)) != std::string::npos)
-			{
-				alm.attr_name.replace(start_pos, from.length(), to);
-				start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
-			}
+			alm.attr_name = std::regex_replace(alm.attr_name, std::regex("/"), "_");
 #endif
     	}
     	//std::transform(alm.formula.begin(), alm.formula.end(), alm.formula.begin(), (int(*)(int))tolower);		//transform to lowercase: incorrect, state has to be written uppercase
     	std::transform(alm.lev.begin(), alm.lev.end(), alm.lev.begin(), (int(*)(int))tolower);		//transform to lowercase
-    	
+		alm.msg = std::regex_replace(alm.msg, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";"
+		alm.url = std::regex_replace(alm.url, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";"
     	if(alm.cmd_name_a.length() > 0)
     	{
 			const char *c = alm.cmd_name_a.c_str();
@@ -3151,16 +3146,16 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string>
 		dbg_msg;
 		DEBUG_STREAM << dbg_msg.str() << endl;	
 	}
-    else
-    {
-       	ostringstream o;
+	else
+	{
+		ostringstream o;
 		o << "AlarmHandler::load_alarm(): Parsing Failed, '" << string(alarm_string.begin(), alm.formula_tree.stop) << "' parsed ok, BUT '" << string(alm.formula_tree.stop, alarm_string.end()) << "' not parsed"; //TODO
-       	DEBUG_STREAM << o.str() << endl;
-       	Tango::Except::throw_exception( \
-				(const char*)"Parsing Failed!", \
-				(const char*)o.str().c_str(), \
-				(const char*)"AlarmHandler::load_alarm()", Tango::ERR);
-    }	
+		DEBUG_STREAM << o.str() << endl;
+		Tango::Except::throw_exception( \
+			(const char*)"Parsing Failed!", \
+			(const char*)o.str().c_str(), \
+			(const char*)"AlarmHandler::load_alarm()", Tango::ERR);
+	}
 	alm.ts = gettime();
 	DEBUG_STREAM << "AlarmHandler::load_alarm(): name     = '" << alm.name << "'" << endl;
 	DEBUG_STREAM << "               attr_name      = '" << alm.attr_name << "'" << endl;
@@ -5548,7 +5543,8 @@ void AlarmHandler::parse_alarm(string &alarm_string, alarm_t &alm)
     	std::transform(alm.name.begin(), alm.name.end(), alm.name.begin(), (int(*)(int))tolower);		//transform to lowercase
     	//std::transform(alm.formula.begin(), alm.formula.end(), alm.formula.begin(), (int(*)(int))tolower);		//transform to lowercase: incorrect, state has to be written upercase
     	std::transform(alm.lev.begin(), alm.lev.end(), alm.lev.begin(), (int(*)(int))tolower);		//transform to lowercase
-
+		alm.msg = std::regex_replace(alm.msg, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";"
+		alm.url = std::regex_replace(alm.url, std::regex(R"((\\;)|(;;))"), ";"); //match raw string "\;" or ";;" and replace with ";"
     	if(alm.cmd_name_a.length() > 0)
     	{
 			const char *c = alm.cmd_name_a.c_str();
diff --git a/src/alarm_grammar.h b/src/alarm_grammar.h
index d9fce01d437931dcdd3ba9bd23e07b5aa9bcd35c..0c166bba5d862999cad3e3179d30d24e46546054 100644
--- a/src/alarm_grammar.h
+++ b/src/alarm_grammar.h
@@ -269,10 +269,11 @@ struct alarm_parse : public grammar<alarm_parse>
 						)
 				;
 			//------------------------------MESSAGE--------------------------------------	
+			escChar = (ch_p('\\') | ch_p(';')) >> ch_p(';');	//escaped semicolon: "\;" or ";;"
 			msg
 				=	discard_node_d[str_p(KEY(MESSAGE_KEY))]
 					//>> ch_p('"')
-					>> (+(anychar_p - ';')) 		//one ore more char except ';' TODO: handle escaped "\;"
+					>> (+(escChar | (anychar_p - ';'))) 		//one ore more char except ';'
 							[
 								assign_a(self.m_alarm.msg)
 							]					
@@ -282,7 +283,7 @@ struct alarm_parse : public grammar<alarm_parse>
 			url
 				=	discard_node_d[str_p(KEY(URL_KEY))]
 					//>> ch_p('"')
-					>> (*(anychar_p - ';')) 		//zero ore more char except ';' TODO: handle escaped "\;"
+					>> (*(escChar | (anychar_p - ';'))) 		//zero ore more char except ';'
 							[
 								assign_a(self.m_alarm.url)
 							]					
@@ -358,7 +359,7 @@ struct alarm_parse : public grammar<alarm_parse>
 		rule_t expression, event, option;
         rule<typename lexeme_scanner<ScannerT>::type> symbol;					//needed to use lexeme_d in rule name
         rule<typename lexeme_scanner<ScannerT>::type> symbol_attr_name;		//needed to use lexeme_d in rule name
-        rule_t name, name_alm, val, token, oper, msg, url, group, level, on_delay, off_delay, silent_time, on_command, off_command, enabled, separator;
+        rule_t name, name_alm, val, token, oper, msg, url, group, level, on_delay, off_delay, silent_time, on_command, off_command, enabled, separator,escChar;
 		formula_grammar formula;
 		
 		rule_t const&					
diff --git a/src/alarm_table.cpp b/src/alarm_table.cpp
index dd28d1bfd3aa3c7c9c4e275fe5ea12005c943717..f794ae95ee8ada09e6e49ef95a41b66266eb7745 100644
--- a/src/alarm_table.cpp
+++ b/src/alarm_table.cpp
@@ -18,6 +18,7 @@
 #include "alarm_table.h"
 #include "alarm_grammar.h"
 #include "cmd_thread.h"
+#include <regex>
 
 
 static const char __FILE__rev[] = __FILE__ " $Revision: 1.5 $";
@@ -1022,6 +1023,8 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
 			}
 			i++;
 		}
+		alm_message = std::regex_replace(alm_message, std::regex(";"), "\\;");
+		alm_url = std::regex_replace(alm_url, std::regex(";"), "\\;");
 		stringstream alm;
 		alm << KEY(NAME_KEY)<<alm_name << SEP <<
 				KEY(FORMULA_KEY)<<alm_formula << SEP <<