diff --git a/src/AlarmHandler.cpp b/src/AlarmHandler.cpp
index 948725704e6b0b655a61f4fcb6e832c8c05f9d88..dfe1bb6262b101f599824c8cec58af3c0f2ab9f4 100644
--- a/src/AlarmHandler.cpp
+++ b/src/AlarmHandler.cpp
@@ -3083,15 +3083,17 @@ Tango::DevVarStringArray *AlarmHandler::get_alarm_info(const Tango::DevVarString
 
 
 	ostringstream tmp_qual;
-	/*size_t siz = formula_grammar.attr_quality.size();
-	if((it->second.quality) >= 0 && (it->second.quality) < siz)
-		tmp_qual << formula_grammar.attr_quality[it->second.quality];
-	 */
-	tmp_qual << it->second.quality;
-	info.insert(make_pair(QUALITY_KEY,tmp_qual.str()));	//TODO: enum label ATTR_VALID, ...
-	complete.push_back(KEY(QUALITY_KEY)+tmp_qual.str());//TODO: enum label ATTR_VALID, ...
+	try
+	{
+		tmp_qual << quality_labels.at(it->second.quality);
+	} catch(std::out_of_range& ex)
+	{
+		tmp_qual << it->second.quality;
+	}
+	info.insert(make_pair(QUALITY_KEY,tmp_qual.str()));
+	complete.push_back(KEY(QUALITY_KEY)+tmp_qual.str());
 	ostringstream tmp;
-#if 0
+//#if 0
 	tmp.str("");
 	tmp << (it->second.enabled ? "1" : "0");
 	info.insert(make_pair(ENABLED_KEY,tmp.str()));	//TODO: redundant, information already in attr_value
@@ -3100,9 +3102,11 @@ Tango::DevVarStringArray *AlarmHandler::get_alarm_info(const Tango::DevVarString
 	tmp << (it->second.shelved ? "1" : "0");
 	info.insert(make_pair(SHELVED_KEY,tmp.str()));	//TODO: redundant, information already in attr_value
 	complete.push_back(KEY(SHELVED_KEY)+tmp.str());	//TODO: redundant, information already in attr_value
-	info.insert(make_pair(ACKNOWLEDGED_KEY,it->second.ack));	//TODO: redundant, information already in attr_value
-	complete.push_back(KEY(ACKNOWLEDGED_KEY)+it->second.ack);	//TODO: redundant, information already in attr_value
-#endif
+	tmp.str("");
+	tmp << ((it->second.ack == "ACK") ? "1" : "0");
+	info.insert(make_pair(ACKNOWLEDGED_KEY,tmp.str()));	//TODO: redundant, information already in attr_value
+	complete.push_back(KEY(ACKNOWLEDGED_KEY)+tmp.str());	//TODO: redundant, information already in attr_value
+//#endif
 	tmp.str("");
 	tmp << (it->second.is_new ? "1" : "0");
 	info.insert(make_pair(AUDIBLE_KEY,tmp.str()));
@@ -5005,18 +5009,26 @@ void AlarmHandler::prepare_alarm_attr()
 			}
 		}
 
+		tm time_tm;
+		time_t time_sec= ai->second.ts.tv_sec;
+		//gmtime_r(&time_sec,&time_tm); //-> UTC
+		localtime_r(&time_sec,&time_tm);
+		char time_buf[64];
+		strftime(time_buf, sizeof(time_buf), "%Y-%m-%d %H:%M:%S", &time_tm);
 
 #ifndef ALM_SUM_STR
 		alm_summary << KEY(VALUE_KEY) << almstate << SEP;	//TODO: string or enum value?
 		alm_summary << KEY(LEVEL_KEY) << ai->second.lev << SEP;
-		alm_summary << KEY(ALARM_TIME_KEY) << ai->second.ts.tv_sec << "." << ai->second.ts.tv_usec << SEP;
+		alm_summary << KEY(ALARM_TIME_KEY) << time_buf << "." << ai->second.ts.tv_usec << SEP;
+		alm_summary << KEY(FORMULA_KEY) << ai->second.formula << SEP;
 		alm_summary << KEY(MESSAGE_KEY) << ai->second.msg;	//TODO: escape ';'
 #else
 		alm_summary += string(KEY(VALUE_KEY)) + almstate + SEP;	//TODO: string or enum value?
 		alm_summary += KEY(LEVEL_KEY) + ai->second.lev + SEP;
 		stringstream sval;
-		sval << ai->second.ts.tv_sec << "." << ai->second.ts.tv_usec;
+		sval << time_buf << "." << ai->second.ts.tv_usec;
 		alm_summary += KEY(ALARM_TIME_KEY) + sval.str() + SEP;
+		alm_summary += KEY(FORMULA_KEY) + ai->second.formula + SEP;
 		alm_summary += KEY(MESSAGE_KEY) + ai->second.msg;	//TODO: escape ';'
 #endif
 
diff --git a/src/formula_grammar.h b/src/formula_grammar.h
index a5694908b3fa521d42dc5e0804c34e7feafa4b23..2dc2940b02f0ffb4f77fe12f570c492223e91d61 100644
--- a/src/formula_grammar.h
+++ b/src/formula_grammar.h
@@ -92,6 +92,8 @@ enum _AlarmStateEnum {
 	_ERROR
 } ;
 
+static vector<string> quality_labels;
+
 struct formula_grammar : public grammar<formula_grammar>
 {
 
@@ -154,11 +156,17 @@ struct formula_grammar : public grammar<formula_grammar>
 		tango_states.add("DISABLE", (unsigned int)Tango::DISABLE);
 		tango_states.add("UNKNOWN", (unsigned int)Tango::UNKNOWN);
 
-		attr_quality.add("ATTR_VALID", (unsigned int)Tango::ATTR_VALID);
-		attr_quality.add("ATTR_INVALID", (unsigned int)Tango::ATTR_INVALID);
-		attr_quality.add("ATTR_ALARM", (unsigned int)Tango::ATTR_ALARM);
-		attr_quality.add("ATTR_CHANGING", (unsigned int)Tango::ATTR_CHANGING);
-		attr_quality.add("ATTR_WARNING", (unsigned int)Tango::ATTR_WARNING);
+		quality_labels.push_back("ATTR_VALID");
+		attr_quality.add(quality_labels.back().c_str(), (unsigned int)Tango::ATTR_VALID);
+		quality_labels.push_back("ATTR_INVALID");
+		attr_quality.add(quality_labels.back().c_str(), (unsigned int)Tango::ATTR_INVALID);
+		quality_labels.push_back("ATTR_ALARM");
+		attr_quality.add(quality_labels.back().c_str(), (unsigned int)Tango::ATTR_ALARM);
+		quality_labels.push_back("ATTR_CHANGING");
+		attr_quality.add(quality_labels.back().c_str(), (unsigned int)Tango::ATTR_CHANGING);
+		quality_labels.push_back("ATTR_WARNING");
+		attr_quality.add(quality_labels.back().c_str(), (unsigned int)Tango::ATTR_WARNING);
+
 
 		alarm_enum_states.add("NORM", (unsigned int)_NORM);
 		alarm_enum_states.add("UNACK", (unsigned int)_UNACK);