diff --git a/src/AlarmHandler.cpp b/src/AlarmHandler.cpp
index 0ce37d8d0fed5973464f95951b47e7a719e9d567..ff34b2872bc727b50b9700ab0fec3325bc449c40 100644
--- a/src/AlarmHandler.cpp
+++ b/src/AlarmHandler.cpp
@@ -1958,7 +1958,7 @@ Tango::DevVarStringArray *AlarmHandler::search_alarm(Tango::DevString argin)
 			os.clear();
 			os << KEY(NAME_KEY) << ai->second.name << SEP << KEY(FORMULA_KEY) << ai->second.formula << SEP << KEY(ONDELAY_KEY) << ai->second.on_delay << SEP << KEY(OFFDELAY_KEY) << ai->second.off_delay <<
 				SEP << KEY(LEVEL_KEY) << ai->second.lev << SEP << KEY(SILENT_TIME_KEY) << ai->second.silent_time << SEP << KEY(GROUP_KEY) << ai->second.grp2str() << SEP << KEY(MESSAGE_KEY) << ai->second.msg << SEP << KEY(URL_KEY) << ai->second.url <<
-				SEP << KEY(ON_COMMAND_KEY) << ai->second.cmd_name_a << SEP << KEY(OFF_COMMAND_KEY) << ai->second.cmd_name_n << SEP << KEY(ENABLED_KEY) << (ai->second.enabled ? "1" : "0");
+				SEP << KEY(ON_COMMAND_KEY) << ai->second.cmd_name_a << SEP << KEY(OFF_COMMAND_KEY) << ai->second.cmd_name_n << SEP << KEY(RECEIVERS_KEY) << ai->second.receivers << SEP << KEY(ENABLED_KEY) << (ai->second.enabled ? "1" : "0");
 			alarm_filtered.push_back(os.str());
 		}
 	}  /* for */
@@ -2256,6 +2256,7 @@ void AlarmHandler::modify(Tango::DevString argin)
 			i->second.cmd_dp_n = alm.cmd_dp_n;
 			i->second.cmd_action_n = alm.cmd_action_n;
 			//i->second.send_arg_n = alm.send_arg_n;
+			i->second.receivers = alm.receivers;
 			i->second.enabled = alm.enabled;
 
 			//update attribute properties
@@ -3144,7 +3145,8 @@ Tango::DevVarStringArray *AlarmHandler::get_alarm_info(const Tango::DevVarString
 	complete.push_back(KEY(ON_COMMAND_KEY)+it->second.cmd_name_a);
 	info.insert(make_pair(OFF_COMMAND_KEY,it->second.cmd_name_n));
 	complete.push_back(KEY(OFF_COMMAND_KEY)+it->second.cmd_name_n);
-
+	info.insert(make_pair(RECEIVERS_KEY,it->second.receivers));
+	complete.push_back(KEY(RECEIVERS_KEY)+it->second.receivers);
 	alarms.vlock->readerOut();
 	argout = new Tango::DevVarStringArray();
 	if(argin->length() == 1)
@@ -3274,6 +3276,7 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string>
 	alm.send_arg_n = false;	
 	alm.dp_n = NULL;
 	alm.enabled = 1;
+	alm.receivers.clear();
 	evn.clear();	
 
 	alm.formula_tree = 
@@ -3294,6 +3297,7 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string>
     	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 ";"
+		alm.receivers = std::regex_replace(alm.receivers, 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();
@@ -3358,6 +3362,7 @@ void AlarmHandler::load_alarm(string alarm_string, alarm_t &alm, vector<string>
 	DEBUG_STREAM << "               lev            = '" << alm.lev << "'" << endl;
 	DEBUG_STREAM << "               action_a       = '" << alm.cmd_name_a << "'" << endl;	
 	DEBUG_STREAM << "               action_n       = '" << alm.cmd_name_n << "'" << endl;
+	DEBUG_STREAM << "               receivers      = '" << alm.receivers << "'" << endl;
 	DEBUG_STREAM << "               enabled        = '" << (alm.enabled ? "1" : "0") << "'" << endl;
 	if ((alm.name.empty() == false) && \
 			(alm.formula.empty() == false) && \
@@ -5510,6 +5515,7 @@ void AlarmHandler::prepare_alarm_attr()
 				aid->grp = ai->second.grp;
 				aid->lev = ai->second.lev;
 				aid->is_new = ai->second.is_new;			//copy is_new state
+				aid->receivers = ai->second.receivers;
 				//ai->second.is_new = 0;						//and set state as not more new //12-06-08: StopNew command set it to 0
 #ifdef _CNT_ATOMIC
 				aid->on_counter.store(ai->second.on_counter);
@@ -5560,6 +5566,7 @@ void AlarmHandler::prepare_alarm_attr()
 				aid->grp = ai->second.grp;
 				aid->lev = ai->second.lev;
 				aid->is_new = ai->second.is_new;			//copy is_new state
+				aid->receivers = ai->second.receivers;
 				//ai->second.is_new = 0;						//and set state as not more new //12-06-08: StopNew command set it to 0
 #ifdef _CNT_ATOMIC
 				aid->on_counter.store(ai->second.on_counter);
@@ -5614,6 +5621,7 @@ void AlarmHandler::prepare_alarm_attr()
 				aid->is_new = ai->second.is_new;			//copy is_new state
 				aid->silenced = ai->second.silenced;		//update silenced from alarm table (maybe not necessary)
 				aid->silent_time = ai->second.silent_time;	//if already alarmed and not saved correctly in properties needed to update
+				aid->receivers = ai->second.receivers;
 				//ai->second.is_new = 0;						//and set state as not more new		//12-06-08: StopNew command set it to 0
 				if (aid->ack == ACK) {
 					//if (aid->done)	//TODO: done seems useless
@@ -5816,7 +5824,7 @@ void AlarmHandler::put_signal_property()
 			DECLARE_TIME_VAR	t0, t1;
 			GET_TIME(t0);
 			alarms.save_alarm_conf_db(it.second.attr_name,it.second.name,it.second.stat,it.second.ack,it.second.enabled,
-				it.second.formula,it.second.on_delay,it.second.off_delay,it.second.grp2str(),it.second.lev,it.second.msg,it.second.url,it.second.cmd_name_a,it.second.cmd_name_n,it.second.silent_time);
+				it.second.formula,it.second.on_delay,it.second.off_delay,it.second.grp2str(),it.second.lev,it.second.msg,it.second.url,it.second.cmd_name_a,it.second.cmd_name_n,it.second.receivers,it.second.silent_time);
 			GET_TIME(t1);
 			DEBUG_STREAM << __func__ << ": SAVED '" <<it.first << "' in " << ELAPSED(t0, t1) << " ms" << endl;
 			//alarms.vlock->readerOut();//TODO: avoid keeping lock
@@ -5839,7 +5847,7 @@ void AlarmHandler::put_signal_property()
 				itmap->second = conf_string;
 				savedlock->readerOut();
 				alarms.save_alarm_conf_db(it.second.attr_name,it.second.name,it.second.stat,it.second.ack,it.second.enabled,
-					it.second.formula,it.second.on_delay,it.second.off_delay,it.second.grp2str(),it.second.lev,it.second.msg,it.second.url,it.second.cmd_name_a,it.second.cmd_name_n,it.second.silent_time);
+					it.second.formula,it.second.on_delay,it.second.off_delay,it.second.grp2str(),it.second.lev,it.second.msg,it.second.url,it.second.cmd_name_a,it.second.cmd_name_n,it.second.receivers,it.second.silent_time);
 				GET_TIME(t1);
 				DEBUG_STREAM << __func__ << ": UPDATED '" <<it.first << "' in " << ELAPSED(t0, t1) << " ms" << endl;
 			}
@@ -5988,6 +5996,7 @@ void AlarmHandler::parse_alarm(string &alarm_string, alarm_t &alm)
 	alm.dp_n = NULL;
 	alm.enabled=true;
 	alm.shelved=false;
+	alm.receivers.clear();
 
 	alm.formula_tree =
 	//boost::spirit::tree_parse_info< std::string::iterator, factory_t> tmp =
@@ -6011,6 +6020,7 @@ void AlarmHandler::parse_alarm(string &alarm_string, alarm_t &alm)
     	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 ";"
+		alm.receivers = std::regex_replace(alm.receivers, 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 06c2950686564c37d5ba161461324211835f347b..9723baece1e6aa86c1df31edeaf043a68af68f5a 100644
--- a/src/alarm_grammar.h
+++ b/src/alarm_grammar.h
@@ -71,6 +71,7 @@
 #define URL_KEY			"url"
 #define ON_COMMAND_KEY		"on_command"
 #define OFF_COMMAND_KEY		"off_command"
+#define RECEIVERS_KEY		"receivers"
 #define ENABLED_KEY			"enabled"
 
 #define SILENT_TIME_REMAINING_KEY		"shlvd_end"
@@ -221,6 +222,7 @@ struct alarm_parse : public grammar<alarm_parse>
 					no_node_d[separator] >> no_node_d[url] |
 					no_node_d[separator] >> no_node_d[on_command] |
 					no_node_d[separator] >> no_node_d[off_command] |
+					no_node_d[separator] >> no_node_d[receivers] |
 					no_node_d[separator] >> no_node_d[enabled]
 			;
 
@@ -335,6 +337,16 @@ struct alarm_parse : public grammar<alarm_parse>
 						]		//discard_node_d
 						| epsilon_p)
 				;
+			//------------------------------RECEIVERS------------------------------------	
+			receivers
+				=	discard_node_d[str_p(KEY(RECEIVERS_KEY))]
+					//>> ch_p('"')
+					>> (*(escChar | (anychar_p - ';'))) 		//zero ore more char except ';'
+							[
+								assign_a(self.m_alarm.receivers)
+							]					
+					//>> '"'
+				;
 			//------------------------------ENABLED----------------------------------------
 			enabled
 				=	discard_node_d[str_p(KEY(ENABLED_KEY))] >>
@@ -354,7 +366,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,escChar;
+        rule_t name, name_alm, val, token, oper, msg, url, group, level, on_delay, off_delay, silent_time, on_command, off_command, receivers, enabled, separator,escChar;
 		formula_grammar formula;
 		
 		rule_t const&					
diff --git a/src/alarm_table.cpp b/src/alarm_table.cpp
index 1d7896238918effc0b8603aa1c167bac5066159b..47c7763905ae37f7f770d4d72c32ea29aee8ff4f 100644
--- a/src/alarm_table.cpp
+++ b/src/alarm_table.cpp
@@ -180,6 +180,7 @@ void alarm_t::confstr(string &s)
 			KEY(URL_KEY)<< url <<	SEP <<
 			KEY(ON_COMMAND_KEY)<< cmd_name_a << SEP <<
 			KEY(OFF_COMMAND_KEY)<< cmd_name_n << SEP <<
+			KEY(RECEIVERS_KEY)<< receivers << SEP <<
 			KEY(ENABLED_KEY)<< (enabled ? "1" : "0");
 	s = conf.str();
 }
@@ -871,7 +872,7 @@ void alarm_table::stop_cmdthread()
 }
 
 void alarm_table::save_alarm_conf_db(const string &att_name, const string &name, const string &status, const string &ack, bool enabled,
-		const string &formula, unsigned int on_delay, unsigned int off_delay, const string &grp, const string &lev, const string &msg, const string &url, const string &cmd_a, const string &cmd_n, int silent_time)
+		const string &formula, unsigned int on_delay, unsigned int off_delay, const string &grp, const string &lev, const string &msg, const string &url, const string &cmd_a, const string &cmd_n, const string &receivers, int silent_time)
 {
 	// We want to put properties for attribute "att_name"
 	Tango::DbDatum dbd_att_name(att_name);
@@ -887,9 +888,10 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name,
 	Tango::DbDatum dbd_oncommand(ON_COMMAND_KEY);
 	Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY);
 	Tango::DbDatum dbd_enabled(ENABLED_KEY);
+	Tango::DbDatum dbd_receivers(RECEIVERS_KEY);
 
 	Tango::DbData db_data;
-	dbd_att_name << (short int)12;                               // Twelve properties for attribute "att_name"
+	dbd_att_name << (short int)13;                               // Thirteen properties for attribute "att_name"
 	dbd_name << name.c_str();
 	dbd_formula << formula.c_str();
 	dbd_on_delay << (Tango::DevLong)on_delay;
@@ -901,6 +903,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name,
 	dbd_url << url.c_str();
 	dbd_oncommand << cmd_a.c_str();
 	dbd_offcommand << cmd_n.c_str();
+	dbd_receivers << receivers.c_str();
 	dbd_enabled << (enabled ? (short int)1 : (short int)0);
 
 	db_data.push_back(dbd_att_name);
@@ -916,6 +919,7 @@ void alarm_table::save_alarm_conf_db(const string &att_name, const string &name,
 	db_data.push_back(dbd_oncommand);
 	db_data.push_back(dbd_offcommand);
 	db_data.push_back(dbd_enabled);
+	db_data.push_back(dbd_receivers);
 
 	string dev_name(mydev->get_name());
 
@@ -947,6 +951,7 @@ void alarm_table::delete_alarm_conf_db(string att_name)
 	Tango::DbDatum dbd_oncommand(ON_COMMAND_KEY);
 	Tango::DbDatum dbd_offcommand(OFF_COMMAND_KEY);
 	Tango::DbDatum dbd_enabled(ENABLED_KEY);
+	Tango::DbDatum dbd_receivers(RECEIVERS_KEY);
 
 	Tango::DbData db_data;
 
@@ -963,6 +968,7 @@ void alarm_table::delete_alarm_conf_db(string att_name)
 	db_data.push_back(dbd_oncommand);
 	db_data.push_back(dbd_offcommand);
 	db_data.push_back(dbd_enabled);
+	db_data.push_back(dbd_receivers);
 
 	string dev_name(mydev->get_name());
 
@@ -1019,6 +1025,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
 		string alm_on_command("");
 		string alm_off_command("");
 		string alm_enabled("1");
+		string alm_receivers("");
 		for (long k=0;k < nb_prop;k++)
 		{
 			string &prop_name = db_data[i].name;
@@ -1047,6 +1054,8 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
 				db_data[i] >> alm_off_command;
 			else if (prop_name == ENABLED_KEY)
 				db_data[i] >> alm_enabled;
+			else if (prop_name == RECEIVERS_KEY)
+				db_data[i] >> alm_receivers;
 			else
 			{
 				cout << "att_name="<<att_name<<" UNKWNOWN prop_name="<<prop_name<<endl;
@@ -1057,6 +1066,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
 		}
 		alm_message = std::regex_replace(alm_message, std::regex(";"), "\\;");
 		alm_url = std::regex_replace(alm_url, std::regex(";"), "\\;");
+		alm_receivers = std::regex_replace(alm_receivers, std::regex(";"), "\\;");
 		stringstream alm;
 		alm << KEY(NAME_KEY)<<alm_name << SEP <<
 				KEY(FORMULA_KEY)<<alm_formula << SEP <<
@@ -1069,6 +1079,7 @@ void alarm_table::get_alarm_list_db(vector<string> &al_list, map<string, string>
 				KEY(URL_KEY)<< alm_url <<	SEP <<
 				KEY(ON_COMMAND_KEY)<< alm_on_command << SEP <<
 				KEY(OFF_COMMAND_KEY)<< alm_off_command << SEP <<
+				KEY(RECEIVERS_KEY)<< alm_receivers << SEP <<
 				KEY(ENABLED_KEY)<< alm_enabled;
 		if(alm_name.empty() || alm_formula.empty() || alm_level.empty() || alm_group.empty() || alm_message.empty()) //TODO: decide if all mandatory
 		{
diff --git a/src/alarm_table.h b/src/alarm_table.h
index f4a4378e1ccccf729c82e7ce9169eb7bda881e39..3d0bc84dce35b564c53ec325b3ec2fb23433d5f2 100644
--- a/src/alarm_table.h
+++ b/src/alarm_table.h
@@ -309,6 +309,7 @@ class alarm_t {
 		bool to_be_evaluated;
 		string msg;
 		string url;
+		string receivers;
 		unsigned int grp{0};
 		string lev;
 		set<string> s_event;
@@ -392,7 +393,7 @@ class alarm_table {
 		void del_rwlock();
 
 		void save_alarm_conf_db(const string &att_name, const string &name, const string &status, const string &ack, bool enabled,
-				 const string &formula, unsigned int on_delay, unsigned int off_delay, const string &grp, const string &url, const string &lev, const string &msg, const string &cmd_a, const string &cmd_n, int silent_time);
+				 const string &formula, unsigned int on_delay, unsigned int off_delay, const string &grp, const string &url, const string &lev, const string &msg, const string &cmd_a, const string &cmd_n, const string &receivers, int silent_time);
 		void delete_alarm_conf_db(string att_name);
 		void get_alarm_list_db(vector<string> &al_list, map<string, string> &saved_alarms, ReadersWritersLock *savedlock);
 		void init_cmdthread();