Index: include/db.h
===================================================================
--- include/db.h	(revision 60056)
+++ include/db.h	(working copy)
@@ -261,6 +261,7 @@
 	char		*expression;
 	char		*url;
 	char		*comments;
+	char		*error;
 	unsigned char	priority;
 	unsigned char	type;
 }
Index: src/libs/zbxserver/expression.c
===================================================================
--- src/libs/zbxserver/expression.c	(revision 60056)
+++ src/libs/zbxserver/expression.c	(working copy)
@@ -45,8 +45,9 @@
 #define ZBX_REQUEST_ITEM_KEY		108
 #define ZBX_REQUEST_ITEM_KEY_ORIG	109
 #define ZBX_REQUEST_ITEM_DESCRIPTION	110
-#define ZBX_REQUEST_PROXY_NAME		111
-#define ZBX_REQUEST_PROXY_DESCRIPTION	112
+#define ZBX_REQUEST_ITEM_STATE_ERROR	111
+#define ZBX_REQUEST_PROXY_NAME		112
+#define ZBX_REQUEST_PROXY_DESCRIPTION	113
 
 /* DBget_history_log_value() */
 #define ZBX_REQUEST_ITEM_LOG_DATE	201
@@ -848,7 +849,7 @@
 
 	result = DBselect(
 			"select h.hostid,h.proxy_hostid,h.host,h.name,h.description,i.itemid,i.name,i.key_,"
-				"i.description,ii.ip,ii.dns,ii.useip,ii.type,ii.main"
+				"i.description,i.error,ii.ip,ii.dns,ii.useip,ii.type,ii.main"
 			" from items i"
 				" join hosts h on h.hostid=i.hostid"
 				" left join interface ii on ii.interfaceid=i.interfaceid"
@@ -892,15 +893,15 @@
 				strscpy(dc_item.host.host, row[2]);
 				strscpy(dc_item.host.name, row[3]);
 
-				if (SUCCEED != DBis_null(row[12]))	/* interface type */
+				if (SUCCEED != DBis_null(row[13]))	/* interface type */
 				{
-					dc_item.interface.type = (unsigned char)atoi(row[12]);
-					dc_item.interface.addr = ('1' == *row[11] ? dc_item.interface.ip_orig :
+					dc_item.interface.type = (unsigned char)atoi(row[13]);
+					dc_item.interface.addr = ('1' == *row[12] ? dc_item.interface.ip_orig :
 							dc_item.interface.dns_orig);
 
-					if ('1' != *row[13] || INTERFACE_TYPE_AGENT == dc_item.interface.type)
+					if ('1' != *row[14] || INTERFACE_TYPE_AGENT == dc_item.interface.type)
 					{
-						addr = zbx_strdup(addr, row[9]);	/* ip */
+						addr = zbx_strdup(addr, row[10]);	/* ip */
 						substitute_simple_macros(NULL, NULL, NULL, NULL, NULL, &dc_item.host,
 								NULL, NULL, &addr, MACRO_TYPE_INTERFACE_ADDR_DB,
 								NULL, 0);
@@ -907,7 +908,7 @@
 						strscpy(dc_item.interface.ip_orig, addr);
 						zbx_free(addr);
 
-						addr = zbx_strdup(addr, row[10]);	/* dns */
+						addr = zbx_strdup(addr, row[11]);	/* dns */
 						substitute_simple_macros(NULL, NULL, NULL, NULL, NULL, &dc_item.host,
 								NULL, NULL, &addr, MACRO_TYPE_INTERFACE_ADDR_DB,
 								NULL, 0);
@@ -916,8 +917,8 @@
 					}
 					else
 					{
-						strscpy(dc_item.interface.ip_orig, row[9]);
-						strscpy(dc_item.interface.dns_orig, row[10]);
+						strscpy(dc_item.interface.ip_orig, row[10]);
+						strscpy(dc_item.interface.dns_orig, row[11]);
 					}
 				}
 				else
@@ -951,6 +952,10 @@
 				*replace_to = zbx_strdup(*replace_to, row[8]);
 				ret = SUCCEED;
 				break;
+			case ZBX_REQUEST_ITEM_STATE_ERROR:
+				*replace_to = zbx_strdup(*replace_to, row[9]);
+				ret = SUCCEED;
+				break;
 			case ZBX_REQUEST_PROXY_NAME:
 				ZBX_DBROW2UINT64(proxy_hostid, row[1]);
 
@@ -1681,6 +1686,7 @@
 #define MVAR_ITEM_KEY			"{ITEM.KEY}"
 #define MVAR_ITEM_KEY_ORIG		"{ITEM.KEY.ORIG}"
 #define MVAR_ITEM_STATE			"{ITEM.STATE}"
+#define MVAR_ITEM_STATE_ERROR		"{ITEM.STATE.ERROR}"
 #define MVAR_TRIGGER_KEY		"{TRIGGER.KEY}"			/* deprecated */
 #define MVAR_ITEM_DESCRIPTION		"{ITEM.DESCRIPTION}"
 #define MVAR_ITEM_LOG_DATE		"{ITEM.LOG.DATE}"
@@ -1700,6 +1706,7 @@
 #define MVAR_TRIGGER_NSEVERITY		"{TRIGGER.NSEVERITY}"
 #define MVAR_TRIGGER_STATUS		"{TRIGGER.STATUS}"
 #define MVAR_TRIGGER_STATE		"{TRIGGER.STATE}"
+#define MVAR_TRIGGER_STATE_ERROR	"{TRIGGER.STATE.ERROR}"
 #define MVAR_TRIGGER_TEMPLATE_NAME	"{TRIGGER.TEMPLATE.NAME}"
 #define MVAR_TRIGGER_HOSTGROUP_NAME	"{TRIGGER.HOSTGROUP.NAME}"
 #define MVAR_STATUS			"{STATUS}"			/* deprecated */
@@ -1718,6 +1725,7 @@
 #define MVAR_LLDRULE_NAME			"{LLDRULE.NAME}"
 #define MVAR_LLDRULE_NAME_ORIG			"{LLDRULE.NAME.ORIG}"
 #define MVAR_LLDRULE_STATE			"{LLDRULE.STATE}"
+#define MVAR_LLDRULE_STATE_ERROR		"{LLDRULE.STATE.ERROR}"
 
 #define MVAR_INVENTORY				"{INVENTORY."			/* a prefix for all inventory macros */
 #define MVAR_INVENTORY_TYPE			MVAR_INVENTORY "TYPE}"
@@ -1853,7 +1861,7 @@
 	MVAR_ITEM_ID, MVAR_ITEM_NAME, MVAR_ITEM_NAME_ORIG, MVAR_ITEM_DESCRIPTION,
 	MVAR_ITEM_KEY, MVAR_ITEM_KEY_ORIG, MVAR_TRIGGER_KEY,
 	MVAR_ITEM_LASTVALUE,
-	MVAR_ITEM_STATE,
+	MVAR_ITEM_STATE, MVAR_ITEM_STATE_ERROR,
 	MVAR_ITEM_VALUE,
 	MVAR_ITEM_LOG_DATE, MVAR_ITEM_LOG_TIME, MVAR_ITEM_LOG_AGE, MVAR_ITEM_LOG_SOURCE,
 	MVAR_ITEM_LOG_SEVERITY, MVAR_ITEM_LOG_NSEVERITY, MVAR_ITEM_LOG_EVENTID,
@@ -2881,6 +2889,10 @@
 				{
 					replace_to = zbx_strdup(replace_to, zbx_trigger_state_string(c_event->value));
 				}
+				else if (0 == strcmp(m, MVAR_TRIGGER_STATE_ERROR))
+				{
+					replace_to = zbx_strdup(replace_to, c_event->trigger.error);
+				}
 				else if (0 == strcmp(m, MVAR_TRIGGER_TEMPLATE_NAME))
 				{
 					ret = DBget_trigger_template_name(c_event->objectid, userid, &replace_to);
@@ -3183,6 +3195,11 @@
 				{
 					replace_to = zbx_strdup(replace_to, zbx_item_state_string(c_event->value));
 				}
+				else if (0 == strcmp(m, MVAR_ITEM_STATE_ERROR))
+				{
+					ret = DBget_item_value(c_event->objectid, &replace_to,
+							ZBX_REQUEST_ITEM_STATE_ERROR);
+				}
 				else if (0 == strcmp(m, MVAR_PROXY_NAME))
 				{
 					ret = DBget_item_value(c_event->objectid, &replace_to, ZBX_REQUEST_PROXY_NAME);
@@ -3291,6 +3308,11 @@
 				{
 					replace_to = zbx_strdup(replace_to, zbx_item_state_string(c_event->value));
 				}
+				else if (0 == strcmp(m, MVAR_LLDRULE_STATE_ERROR))
+				{
+					ret = DBget_item_value(c_event->objectid, &replace_to,
+							ZBX_REQUEST_ITEM_STATE_ERROR);
+				}
 				else if (0 == strcmp(m, MVAR_PROXY_NAME))
 				{
 					ret = DBget_item_value(c_event->objectid, &replace_to, ZBX_REQUEST_PROXY_NAME);
Index: src/zabbix_server/escalator/escalator.c
===================================================================
--- src/zabbix_server/escalator/escalator.c	(revision 60056)
+++ src/zabbix_server/escalator/escalator.c	(working copy)
@@ -1162,7 +1162,7 @@
 
 	if (SUCCEED == res && EVENT_OBJECT_TRIGGER == event->object)
 	{
-		result = DBselect("select description,expression,priority,comments,url"
+		result = DBselect("select description,expression,priority,comments,url,error"
 				" from triggers"
 				" where triggerid=" ZBX_FS_UI64,
 				event->objectid);
@@ -1175,6 +1175,7 @@
 			event->trigger.priority = (unsigned char)atoi(row[2]);
 			event->trigger.comments = zbx_strdup(event->trigger.comments, row[3]);
 			event->trigger.url = zbx_strdup(event->trigger.url, row[4]);
+			event->trigger.error = zbx_strdup(event->trigger.error, row[5]);
 		}
 		else
 			res = FAIL;
@@ -1203,6 +1204,7 @@
 		zbx_free(event->trigger.expression);
 		zbx_free(event->trigger.comments);
 		zbx_free(event->trigger.url);
+		zbx_free(event->trigger.error);
 	}
 }
 
