diff -uNrp zabbix-2.0.14.orig/include/zbxjson.h zabbix-2.0.14/include/zbxjson.h
--- zabbix-2.0.14.orig/include/zbxjson.h	2015-01-16 10:52:43.908160264 +0900
+++ zabbix-2.0.14/include/zbxjson.h	2015-01-16 13:24:41.602780419 +0900
@@ -34,6 +34,7 @@
 #define ZBX_PROTO_TAG_IP		"ip"
 #define ZBX_PROTO_TAG_DNS		"dns"
 #define ZBX_PROTO_TAG_CONN		"conn"
+#define ZBX_PROTO_TAG_ITEMID		"itemid"
 #define ZBX_PROTO_TAG_KEY		"key"
 #define ZBX_PROTO_TAG_KEY_ORIG		"key_orig"
 #define ZBX_PROTO_TAG_KEYS		"keys"
diff -uNrp zabbix-2.0.14.orig/src/zabbix_agent/active.c zabbix-2.0.14/src/zabbix_agent/active.c
--- zabbix-2.0.14.orig/src/zabbix_agent/active.c	2015-01-16 10:52:43.912160308 +0900
+++ zabbix-2.0.14/src/zabbix_agent/active.c	2015-01-20 09:07:57.358136238 +0900
@@ -51,6 +51,7 @@ static void	init_active_metrics(void)
 
 	active_metrics = zbx_malloc(active_metrics, sizeof(ZBX_ACTIVE_METRIC));
 	active_metrics->key = NULL;
+	active_metrics->itemid = 0;
 
 	if (NULL == buffer.data)
 	{
@@ -123,25 +124,33 @@ static int	get_min_nextcheck(void)
 	return min;
 }
 
-static void	add_check(const char *key, const char *key_orig, int refresh, zbx_uint64_t lastlogsize, int mtime)
+static void	add_check(zbx_uint64_t itemid, const char *key, const char *key_orig, int refresh, zbx_uint64_t lastlogsize, int mtime)
 {
 	const char	*__function_name = "add_check";
 	int	i;
 
-	zabbix_log(LOG_LEVEL_DEBUG, "In %s() key:'%s' refresh:%d lastlogsize:" ZBX_FS_UI64 " mtime:%d",
-			__function_name, key, refresh, lastlogsize, mtime);
+	zabbix_log(LOG_LEVEL_DEBUG, "In %s() itemid:" ZBX_FS_UI64 " key:'%s' refresh:%d lastlogsize:" ZBX_FS_UI64 " mtime:%d",
+			__function_name, itemid, key, refresh, lastlogsize, mtime);
 
 	for (i = 0; NULL != active_metrics[i].key; i++)
 	{
-		if (0 != strcmp(active_metrics[i].key_orig, key_orig))
+		int m = 0 != itemid & 0 != active_metrics[i].itemid;
+
+		if (0 == m && 0 != strcmp(active_metrics[i].key_orig, key_orig))
 			continue;
 
-		if (0 != strcmp(active_metrics[i].key, key))
+		if ((0 != m && itemid == active_metrics[i].itemid && 0 != strcmp(active_metrics[i].key, key)) ||
+		    (0 == m && 0 != strcmp(active_metrics[i].key, key)))
 		{
 			int	j;
 
 			zbx_free(active_metrics[i].key);
 			active_metrics[i].key = zbx_strdup(NULL, key);
+			if (0 != m)
+			{
+				zbx_free(active_metrics[i].key_orig);
+				active_metrics[i].key_orig = zbx_strdup(NULL, key_orig);
+			}
 			active_metrics[i].lastlogsize = lastlogsize;
 			active_metrics[i].mtime = mtime;
 			active_metrics[i].big_rec = 0;
@@ -167,6 +176,7 @@ static void	add_check(const char *key, c
 	}
 
 	/* add new metric */
+	active_metrics[i].itemid = itemid;
 	active_metrics[i].key = zbx_strdup(NULL, key);
 	active_metrics[i].key_orig = zbx_strdup(NULL, key_orig);
 	active_metrics[i].refresh = refresh;
@@ -217,6 +227,7 @@ out:
 static int	parse_list_of_checks(char *str)
 {
 	const char		*p;
+	zbx_uint64_t		itemid = 0;
 	char			name[MAX_STRING_LEN], key_orig[MAX_STRING_LEN], expression[MAX_STRING_LEN], tmp[MAX_STRING_LEN],
 				exp_delimiter;
 	int			delay, mtime, expression_type, case_sensitive;
@@ -254,6 +265,16 @@ static int	parse_list_of_checks(char *st
  */ 		if (SUCCEED != zbx_json_brackets_open(p, &jp_row))
 			goto json_error;
 
+		if (SUCCEED == zbx_json_value_by_name(&jp_row, ZBX_PROTO_TAG_ITEMID, tmp, sizeof(tmp)))
+		{
+			if (SUCCEED != is_uint64(tmp, &itemid))
+			{
+				zabbix_log(LOG_LEVEL_WARNING, "unable to retrieve value of tag \"%s\"",
+						ZBX_PROTO_TAG_ITEMID);
+				continue;
+			}
+		}
+
 		if (SUCCEED != zbx_json_value_by_name(&jp_row, ZBX_PROTO_TAG_KEY, name, sizeof(name)) || '\0' == *name)
 		{
 			zabbix_log(LOG_LEVEL_WARNING, "unable to retrieve value of tag \"%s\"", ZBX_PROTO_TAG_KEY);
@@ -289,7 +310,7 @@ static int	parse_list_of_checks(char *st
 			mtime = atoi(tmp);
 		}
 
-		add_check(name, key_orig, delay, lastlogsize, mtime);
+		add_check(itemid, name, key_orig, delay, lastlogsize, mtime);
 	}
 
 	clean_regexps_ex(regexps, &regexps_num);
diff -uNrp zabbix-2.0.14.orig/src/zabbix_agent/active.h zabbix-2.0.14/src/zabbix_agent/active.h
--- zabbix-2.0.14.orig/src/zabbix_agent/active.h	2015-01-16 10:52:43.911160297 +0900
+++ zabbix-2.0.14/src/zabbix_agent/active.h	2015-01-16 13:24:41.606780465 +0900
@@ -57,6 +57,7 @@ extern int	CONFIG_LISTEN_PORT;
 
 typedef struct
 {
+	zbx_uint64_t		itemid;
 	char			*key, *key_orig;
 	zbx_uint64_t		lastlogsize;
 	int			refresh;
diff -uNrp zabbix-2.0.14.orig/src/zabbix_server/trapper/active.c zabbix-2.0.14/src/zabbix_server/trapper/active.c
--- zabbix-2.0.14.orig/src/zabbix_server/trapper/active.c	2015-01-16 10:52:43.911160297 +0900
+++ zabbix-2.0.14/src/zabbix_server/trapper/active.c	2015-01-16 13:24:41.604780442 +0900
@@ -338,7 +338,7 @@ int	send_list_of_active_checks_json(zbx_
 	name_esc = DBdyn_escape_string(host);
 
 	zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset,
-			"select i.key_,i.delay,i.lastlogsize,i.mtime"
+			"select i.key_,i.delay,i.lastlogsize,i.mtime,i.itemid"
 			" from items i,hosts h"
 			" where i.hostid=h.hostid"
 				" and h.status=%d"
@@ -393,6 +393,7 @@ int	send_list_of_active_checks_json(zbx_
 		/* The agent expects ALWAYS to have lastlogsize and mtime tags. Removing those would cause older agents to fail. */
 		zbx_json_addstring(&json, ZBX_PROTO_TAG_LOGLASTSIZE, row[2], ZBX_JSON_TYPE_INT);
 		zbx_json_addstring(&json, ZBX_PROTO_TAG_MTIME, row[3], ZBX_JSON_TYPE_INT);
+		zbx_json_addstring(&json, ZBX_PROTO_TAG_ITEMID, row[4], ZBX_JSON_TYPE_INT);
 		zbx_json_close(&json);
 
 		/* special processing for log[] and logrt[] items */
