diff --git a/frontends/php/include/defines.inc.php b/frontends/php/include/defines.inc.php
index ea74a91..34c5c4d 100644
--- a/frontends/php/include/defines.inc.php
+++ b/frontends/php/include/defines.inc.php
@@ -553,6 +553,11 @@ define('SCREEN_SURROGATE_MAX_COLUMNS_MAX', 100);
 
 define('DEFAULT_LATEST_ISSUES_CNT', 20);
 
+define('LATEST_DATA_MATCH_SUBSTRING', 0);
+define('LATEST_DATA_MATCH_NOT_SUBSTRING', 1);
+define('LATEST_DATA_MATCH_REGEX', 2);
+define('LATEST_DATA_MATCH_NOT_REGEX', 3);
+
 // alignments
 define('HALIGN_DEFAULT',	0);
 define('HALIGN_CENTER',		0);
diff --git a/frontends/php/latest.php b/frontends/php/latest.php
index 4fa3c45..6993278 100644
--- a/frontends/php/latest.php
+++ b/frontends/php/latest.php
@@ -43,6 +43,8 @@ $fields = array(
 	'hostids' =>			array(T_ZBX_INT, O_OPT, P_SYS,	DB_ID,		null),
 	'fullscreen' =>			array(T_ZBX_INT, O_OPT, P_SYS,	IN('0,1'),	null),
 	'select' =>				array(T_ZBX_STR, O_OPT, null,	null,		null),
+	'select_val'=>			array(T_ZBX_STR, O_OPT, null,	null,		null),
+	'select_val_opts'=>			array(T_ZBX_INT, O_OPT, null,	null,		null),
 	'show_without_data' =>	array(T_ZBX_INT, O_OPT, null,	IN('0,1'),	null),
 	'show_details' =>		array(T_ZBX_INT, O_OPT, null,	IN('0,1'),	null),
 	'application' =>		array(T_ZBX_STR, O_OPT, null,	null,		null),
@@ -115,6 +117,8 @@ require_once dirname(__FILE__).'/include/views/js/monitoring.latest.js.php';
  */
 if (hasRequest('filter_set')) {
 	CProfile::update('web.latest.filter.select', getRequest('select', ''), PROFILE_TYPE_STR);
+	CProfile::update('web.latest.filter.select_val', getRequest('select_val', ''), PROFILE_TYPE_STR);
+	CProfile::update('web.latest.filter.select_val_opts', getRequest('select_val_opts', LATEST_DATA_MATCH_SUBSTRING), PROFILE_TYPE_STR);
 	CProfile::update('web.latest.filter.show_without_data', getRequest('show_without_data', 0), PROFILE_TYPE_INT);
 	CProfile::update('web.latest.filter.show_details', getRequest('show_details', 0), PROFILE_TYPE_INT);
 	CProfile::update('web.latest.filter.application', getRequest('application', ''), PROFILE_TYPE_STR);
@@ -124,6 +128,8 @@ if (hasRequest('filter_set')) {
 elseif (hasRequest('filter_rst')) {
 	DBStart();
 	CProfile::delete('web.latest.filter.select');
+	CProfile::delete('web.latest.filter.select_val');
+	CProfile::delete('web.latest.filter.select_val_opts');
 	CProfile::delete('web.latest.filter.show_without_data');
 	CProfile::delete('web.latest.filter.show_details');
 	CProfile::delete('web.latest.filter.application');
@@ -134,6 +140,8 @@ elseif (hasRequest('filter_rst')) {
 
 $filter = array(
 	'select' => CProfile::get('web.latest.filter.select', ''),
+	'selectVal' => CProfile::get('web.latest.filter.select_val', ''),
+	'selectValOpts' => CProfile::get('web.latest.filter.select_val_opts', LATEST_DATA_MATCH_SUBSTRING),
 	'showWithoutData' => CProfile::get('web.latest.filter.show_without_data', 1),
 	'showDetails' => CProfile::get('web.latest.filter.show_details'),
 	'application' => CProfile::get('web.latest.filter.application', ''),
@@ -417,6 +425,23 @@ $filterTable->addRow(array(
 	new CCol(new CCheckBox('show_details', $filter['showDetails'], null, 1), 'inputcol'),
 ));
 
+$filterTable->addRow(
+	array(
+		new CCol(bold(_('Show items with values matching').':'),'label'),
+		new CCol(
+			array(
+				new CComboBox(
+					'select_val_opts',
+					$filter['selectValOpts'],
+					null,
+					array('substring', 'not substring', 'regex', 'not regex')
+				),
+				new CTextBox('select_val',$filter['selectVal'],20)
+			)
+		)
+	)
+);
+
 $filterButton = new CSubmit('filter_set', _('Filter'), 'chkbxRange.clearSelectedOnFilterChange();');
 $filterButton->useJQueryStyle();
 
@@ -543,6 +568,31 @@ foreach ($items as $key => $item){
 		$lastValue = UNKNOWN_VALUE;
 	}
 
+	if(!empty($filter['selectVal'])) {
+		switch ($filter['selectValOpts']) {
+			case LATEST_DATA_MATCH_SUBSTRING:
+				$zbxMatch = stristr($lastValue, $filter['selectVal']);
+				break;
+			case LATEST_DATA_MATCH_NOT_SUBSTRING:
+				$zbxMatch = !stristr($lastValue, $filter['selectVal']);
+				break;
+			case LATEST_DATA_MATCH_REGEX:
+				$zbxMatch = preg_match('|'.$filter['selectVal'].'|', $lastValue);
+				break;
+			case LATEST_DATA_MATCH_NOT_REGEX:
+				$zbxMatch = !preg_match('|'.$filter['selectVal'].'|', $lastValue);
+				break;
+		}
+	}
+	else {
+		$zbxMatch = true;
+	}
+
+	// Remove items from application if the value doesn't match the filter
+	if(!$zbxMatch) {
+		continue;
+	}
+
 	// change
 	$digits = ($item['value_type'] == ITEM_VALUE_TYPE_FLOAT) ? 2 : 0;
 	if ($lastHistory && $prevHistory
@@ -651,6 +701,9 @@ foreach ($items as $key => $item){
 			$applications[$applicationId]['item_cnt']++;
 			// objects may have different properties, so it's better to use a copy of it
 			$tab_rows[$applicationId][] = clone $row;
+			if(!$zbxMatch) {
+				$applications[$applicationId]['item_cnt']--;
+			}
 		}
 	}
 
@@ -729,6 +782,32 @@ foreach ($items as $item) {
 		$lastValue = UNKNOWN_VALUE;
 	}
 
+	if(!empty($filter['selectVal'])) {
+		switch ($filter['selectValOpts']) {
+		case LATEST_DATA_MATCH_SUBSTRING:
+			$zbxMatch = stristr($lastValue, $filter['selectVal']);
+			break;
+		case LATEST_DATA_MATCH_NOT_SUBSTRING:
+			$zbxMatch = !stristr($lastValue, $filter['selectVal']);
+			break;
+		case LATEST_DATA_MATCH_REGEX:
+			$zbxMatch = preg_match('|'.$filter['selectVal'].'|', $lastValue);
+			break;
+		case LATEST_DATA_MATCH_NOT_REGEX:
+			$zbxMatch = !preg_match('|'.$filter['selectVal'].'|', $lastValue);
+			break;
+		}
+	}
+	else {
+		$zbxMatch = true;
+	}
+
+	// Remove items from application if the value doesn't match the filter
+	if(!$zbxMatch) {
+		$host['item_cnt']--;
+		continue;
+	}
+
 	// column "change"
 	$digits = ($item['value_type'] == ITEM_VALUE_TYPE_FLOAT) ? 2 : 0;
 	if (isset($lastHistory['value']) && isset($prevHistory['value'])
@@ -852,30 +931,30 @@ foreach ($hosts as $hostId => $dbHost) {
 	$toggle->setAttribute('data-app-id', '0_'.$host['hostid']);
 	$toggle->setAttribute('data-open-state', $openState);
 
-	$hostName = null;
-
-	if (!$singleHostSelected) {
-		$hostName = new CSpan($host['name'],
-			'link_menu menu-host'.(($host['status'] == HOST_STATUS_NOT_MONITORED) ? ' not-monitored' : '')
-		);
-
-		$hostName->setMenuPopup(CMenuPopupHelper::getHost($host, $hostScripts[$host['hostid']]));
+	if ($dbHost['item_cnt'] != 0) {
+		$hostName = null;
+		if (!$singleHostSelected) {
+			$hostName = new CSpan($host['name'],
+				'link_menu menu-host'.(($host['status'] == HOST_STATUS_NOT_MONITORED) ? ' not-monitored' : '')
+			);
+			$hostName->setMenuPopup(CMenuPopupHelper::getHost($host, $hostScripts[$host['hostid']]));
+		}
+	
+		// add toggle row
+		$table->addRow(array(
+			new CCol($toggle),
+			'',
+			$hostName,
+			new CCol(
+				array(
+					bold('- '.('other').' -'),
+					SPACE.'('._n('%1$s Item', '%1$s Items', $dbHost['item_cnt']).')'
+				),
+				null, $filter['showDetails'] ? 10 : 5
+			)
+		), 'odd_row');
 	}
 
-	// add toggle row
-	$table->addRow(array(
-		$toggle,
-		'',
-		$hostName,
-		new CCol(
-			array(
-				bold('- '.('other').' -'),
-				' ('._n('%1$s Item', '%1$s Items', $dbHost['item_cnt']).')'
-			),
-			null, $filter['showDetails'] ? 10 : 5
-		)
-	), 'odd_row');
-
 	// add toggle sub rows
 	foreach($appRows as $row) {
 		$row->setAttribute('parent_app_id', '0_'.$host['hostid']);
