diff --git a/frontends/php/events.php b/frontends/php/events.php
index 54dd796..c9198bb 100644
--- a/frontends/php/events.php
+++ b/frontends/php/events.php
@@ -70,6 +70,11 @@ $fields = array(
 	'csv_export'=>		array(T_ZBX_STR, O_OPT, P_SYS,	null,		null),
 	'filter_rst'=>		array(T_ZBX_STR, O_OPT, P_SYS,	null,		null),
 	'filter_set'=>		array(T_ZBX_STR, O_OPT, P_SYS,	null,		null),
+	'txt_select'=>		array(T_ZBX_STR, O_OPT,	null,	null,	null),
+	// Severity filters
+	'show_triggers'=>	array(T_ZBX_INT, O_OPT, P_SYS,  IN(array(0,1,2,3)), null),
+	'ack_status'=>		array(T_ZBX_INT, O_OPT, P_SYS,  IN(array(0,1,2)), null),
+	'show_severity'=>	array(T_ZBX_INT, O_OPT, P_SYS,  IN(array(-1,0,1,2,3,4,5)), null),
 	// ajax
 	'filterState' =>	array(T_ZBX_INT, O_OPT, P_ACT,	null,		null),
 	'favobj'=>			array(T_ZBX_STR, O_OPT, P_ACT,	null,		null),
@@ -117,14 +122,26 @@ $source = getRequest('source', CProfile::get('web.events.source', EVENT_SOURCE_T
  */
 if (hasRequest('filter_set')) {
 	CProfile::update('web.events.filter.triggerid', getRequest('triggerid', 0), PROFILE_TYPE_ID);
+	CProfile::update('web.events.filter.txt_select', getRequest('txt_select', ''), PROFILE_TYPE_STR);
+	CProfile::update('web.events.filter.show_triggers',getRequest('show_triggers', EVENTS_SHOW_TRIGGERS_ALL), PROFILE_TYPE_INT);
+	CProfile::update('web.events.filter.ack_status',getRequest('ack_status', EVENTS_SHOW_ALL), PROFILE_TYPE_INT);
+	CProfile::update('web.events.filter.show_severity',getRequest('show_severity', TRIGGER_SEVERITY_NOT_CLASSIFIED), PROFILE_TYPE_INT);
 }
 elseif (hasRequest('filter_rst')) {
 	DBStart();
 	CProfile::delete('web.events.filter.triggerid');
+	CProfile::delete('web.events.filter.txt_select');
+	CProfile::delete('web.events.filter.show_triggers');
+	CProfile::delete('web.events.filter.ack_status');
+	CProfile::delete('web.events.filter.show_severity');
 	DBend();
 }
 
 $triggerId = CProfile::get('web.events.filter.triggerid', 0);
+$txtSelect = CProfile::get('web.events.filter.txt_select', '');
+$showTriggers = CProfile::get('web.events.filter.show_triggers', EVENTS_SHOW_TRIGGERS_ALL);
+$ackStatus = CProfile::get('web.events.filter.ack_status', EVENTS_SHOW_ALL);
+$showSeverity = CProfile::get('web.events.filter.show_severity', TRIGGER_SEVERITY_NOT_CLASSIFIED);
 
 CProfile::update('web.events.source', $source, PROFILE_TYPE_INT);
 
@@ -392,6 +409,35 @@ else {
 			), 'form_row_r')
 		)));
 
+		$triggerStatusComboBox = new CComboBox('show_triggers', $showTriggers);
+		$triggerStatusComboBox->addItem(EVENTS_SHOW_TRIGGERS_ALL, _('Any'));
+		$triggerStatusComboBox->addItem(EVENTS_SHOW_TRIGGERS_OK, _('Ok'));
+		$triggerStatusComboBox->additem(EVENTS_SHOW_TRIGGERS_PROBLEM, _('Problem'));
+		$filterForm->addRow(_('Triggers status'), $triggerStatusComboBox);
+
+		$config = select_config();
+		if($config['event_ack_enable']){
+			$ackStatusComboBox = new CComboBox('ack_status', $ackStatus);
+			$ackStatusComboBox->addItem(EVENTS_SHOW_ALL, _('Any'));
+			$ackStatusComboBox->additem(EVENTS_SHOW_ZBX_ACK, _('Yes'));
+			$ackStatusComboBox->additem(EVENTS_SHOW_ZBX_UNACK, _('No'));
+			$filterForm->addRow(_('Acknowledge status'), $ackStatusComboBox);
+		}
+		$severityComboBox = new CComboBox('show_severity', $showSeverity);
+		$severityComboBox->addItems(array(
+			TRIGGER_SEVERITY_NOT_CLASSIFIED => getSeverityCaption(TRIGGER_SEVERITY_NOT_CLASSIFIED),
+			TRIGGER_SEVERITY_INFORMATION => getSeverityCaption(TRIGGER_SEVERITY_INFORMATION),
+			TRIGGER_SEVERITY_WARNING => getSeverityCaption(TRIGGER_SEVERITY_WARNING),
+			TRIGGER_SEVERITY_AVERAGE => getSeverityCaption(TRIGGER_SEVERITY_AVERAGE),
+			TRIGGER_SEVERITY_HIGH => getSeverityCaption(TRIGGER_SEVERITY_HIGH),
+			TRIGGER_SEVERITY_DISASTER => getSeverityCaption(TRIGGER_SEVERITY_DISASTER)
+		));
+
+		$filterForm->addRow(_('Minimum trigger severity'), $severityComboBox);
+		$filterForm->addRow(_('Filter by name'), new CTextBox('txt_select', $txtSelect, 40));
+
+		$reset = new CButton('filter_rst', _('Reset'), 'javascript: var uri = new Curl(location.href); uri.setArgument("filter_rst",1); location.href = uri.getUrl();');
+		
 		$filterForm->addItemToBottomRow(new CSubmit('filter_set', _('Filter')));
 		$filterForm->addItemToBottomRow(new CSubmit('filter_rst', _('Reset')));
 	}
@@ -667,6 +713,32 @@ else {
 				$triggerOptions['groupids'] = $pageFilter->groupid;
 			}
 
+			if($showTriggers == EVENTS_SHOW_TRIGGERS_OK) {
+				$eventOptions['value'] = array(0, 2);
+			}
+			elseif($showTriggers == EVENTS_SHOW_TRIGGERS_PROBLEM) {
+				$eventOptions['value'] = array(1, 2);
+			}
+
+			if($ackStatus == EVENTS_SHOW_ZBX_ACK) {
+				$eventOptions['acknowledged'] = EVENTS_SHOW_ZBX_ACK;
+			}
+			elseif($ackStatus == EVENTS_SHOW_ZBX_UNACK) {
+				$eventOptions['acknowledged'] = EVENTS_SHOW_ZBX_UNACK;
+			}
+
+			#TODO: Use $config instead
+			if(isset($showSeverity)) {
+				# There's no min_severity option as there is for triggers
+				$eventOptions['severity'] = range($showSeverity, TRIGGER_SEVERITY_DISASTER);
+			}
+
+			// Trigger description filter string
+			if(!zbx_empty($txtSelect)){
+				$eventOptions['description'] = $txtSelect;
+			}
+			$events = API::Event()->get($eventOptions);
+
 			$events = array();
 
 			while (true) {
@@ -718,8 +790,13 @@ else {
 			// get paging
 			$paging = getPagingLine($events);
 
+			// Remove value filtering and query again
+			// This allows for a correct counter and correct status filtering results
+			unset($eventOptions['value']);
+			$events = API::Event()->get($eventOptions);
+
 			// query event with extend data
-			$events = API::Event()->get(array(
+			$eventOptions = array(
 				'source' => EVENT_SOURCE_TRIGGERS,
 				'object' => EVENT_OBJECT_TRIGGER,
 				'eventids' => zbx_objectValues($events, 'eventid'),
@@ -728,7 +805,34 @@ else {
 				'sortfield' => array('clock', 'eventid'),
 				'sortorder' => ZBX_SORT_DOWN,
 				'nopermissions' => true
-			));
+			);
+
+			if($showTriggers == EVENTS_SHOW_TRIGGERS_OK) {
+				$eventOptions['value'] = array(0, 2);
+			}
+			elseif($showTriggers == EVENTS_SHOW_TRIGGERS_PROBLEM) {
+				$eventOptions['value'] = array(1, 2);
+			}
+
+			if($ackStatus == EVENTS_SHOW_ZBX_ACK) {
+				$eventOptions['acknowledged'] = EVENTS_SHOW_ZBX_ACK;
+			}
+			elseif($ackStatus == EVENTS_SHOW_ZBX_UNACK) {
+				$eventOptions['acknowledged'] = EVENTS_SHOW_ZBX_UNACK;
+			}
+
+            #TODO: Use $config instead
+			if(isset($showSeverity)) {
+                # There's no min_severity option as there is for triggers
+				$eventOptions['severity'] = range($showSeverity, TRIGGER_SEVERITY_DISASTER);
+			}
+
+            // Trigger description filter string
+            if(!zbx_empty($txtSelect)){
+                $eventOptions['description'] = $txtSelect;
+			}
+
+			$events = API::Event()->get($eventOptions);
 
 			if (!$csvExport) {
 				$csvDisabled = zbx_empty($events);
@@ -797,6 +901,12 @@ else {
 					? zbx_date2age($event['clock'], $nextEvent['clock'])
 					: zbx_date2age($event['clock']);
 
+				// Only abandon an event after calculating the duration
+				// if it doesn't match the status filter
+				if (!($showTriggers == $event['value'] || $showTriggers == EVENTS_SHOW_TRIGGERS_ALL)) {
+					continue;
+				}
+				
 				// action
 				$action = isset($actions[$event['eventid']]) ? $actions[$event['eventid']] : ' - ';
 
diff --git a/frontends/php/include/classes/api/services/CEvent.php b/frontends/php/include/classes/api/services/CEvent.php
index e44cc7c..1f2a05c 100644
--- a/frontends/php/include/classes/api/services/CEvent.php
+++ b/frontends/php/include/classes/api/services/CEvent.php
@@ -92,6 +92,7 @@ class CEvent extends CApiService {
 			'object'					=> EVENT_OBJECT_TRIGGER,
 			'source'					=> EVENT_SOURCE_TRIGGERS,
 			'acknowledged'				=> null,
+			'severity'                  => null,
 			'nopermissions'				=> null,
 			// filter
 			'value'						=> null,
@@ -102,6 +103,7 @@ class CEvent extends CApiService {
 			// filter
 			'filter'					=> null,
 			'search'					=> null,
+			'description'               => null,
 			'searchByAny'				=> null,
 			'startSearch'				=> null,
 			'excludeSearch'				=> null,
@@ -270,6 +272,29 @@ class CEvent extends CApiService {
 		if (!is_null($options['acknowledged'])) {
 			$sqlParts['where'][] = 'e.acknowledged='.($options['acknowledged'] ? 1 : 0);
 		}
+		
+		// severity
+		if (!is_null($options['severity'])) {
+			zbx_value2array($options['severity']);
+			$sqlParts['from']['triggers'] = 'triggers t';
+			$sqlParts['where'][] = 'e.objectid=t.triggerid';
+			$sqlParts['where'][] = dbConditionInt('t.priority', $options['severity']);
+		}
+		
+		// description
+        if (!is_null($options['description'])) {
+            $sqlParts['from']['triggers'] = 'triggers t';
+            $sqlParts['where'][] = 'e.objectid=t.triggerid';
+            $descriptionSearch = array(
+                'search' => array(
+                    'description' => $options['description'],
+                    ),
+                'startSearch' => null,
+                'searchByAny' => null,
+                'excludeSearch' => null
+            );
+            zbx_db_search('triggers t', $descriptionSearch, $sqlParts);
+        }
 
 		// time_from
 		if (!is_null($options['time_from'])) {
diff --git a/frontends/php/include/defines.inc.php b/frontends/php/include/defines.inc.php
index ea74a91..b69c94c 100644
--- a/frontends/php/include/defines.inc.php
+++ b/frontends/php/include/defines.inc.php
@@ -89,6 +89,16 @@ define('EVENTS_OPTION_NOEVENT', 1);
 define('EVENTS_OPTION_ALL',		2);
 define('EVENTS_OPTION_NOT_ACK', 3);
 
+// Event tracking
+define('EVENTS_SHOW_ZBX_UNACK',        0);
+define('EVENTS_SHOW_ZBX_ACK',  1);
+define('EVENTS_SHOW_ALL',      2);
+
+define('EVENTS_SHOW_TRIGGERS_OK',      0);
+define('EVENTS_SHOW_TRIGGERS_PROBLEM', 1);
+define('EVENTS_SHOW_TRIGGERS_UNKNOWN', 2);
+define('EVENTS_SHOW_TRIGGERS_ALL',     3);
+
 define('ZBX_FONT_NAME', 'DejaVuSans');
 
 define('ZBX_AUTH_INTERNAL',	0);
