diff --git ui/app/controllers/CControllerHostView.php ui/app/controllers/CControllerHostView.php
index 8b6ad6a..021732b 100644
--- ui/app/controllers/CControllerHostView.php
+++ ui/app/controllers/CControllerHostView.php
@@ -55,7 +55,8 @@ class CControllerHostView extends CControllerHost {
 		// Validate tags filter.
 		if ($ret && $this->hasInput('tags')) {
 			foreach ($this->getInput('tags') as $filter_tag) {
-				if (count($filter_tag) != 3
+				if (!is_array($filter_tag)
+						|| count($filter_tag) != 3
 						|| !array_key_exists('tag', $filter_tag) || !is_string($filter_tag['tag'])
 						|| !array_key_exists('value', $filter_tag) || !is_string($filter_tag['value'])
 						|| !array_key_exists('operator', $filter_tag) || !is_string($filter_tag['operator'])) {
diff --git ui/app/controllers/CControllerLatestView.php ui/app/controllers/CControllerLatestView.php
index e8b9d05..15a44cd 100644
--- ui/app/controllers/CControllerLatestView.php
+++ ui/app/controllers/CControllerLatestView.php
@@ -136,18 +136,19 @@ class CControllerLatestView extends CControllerLatest {
 
 		$view_curl = (new CUrl('zabbix.php'))->setArgument('action', 'latest.view');
 
-		$refresh_curl = (new CUrl('zabbix.php'))
-			->setArgument('action', 'latest.view.refresh')
-			->setArgument('filter_groupids', $filter['groupids'])
-			->setArgument('filter_hostids', $filter['hostids'])
-			->setArgument('filter_select', $filter['select'])
-			->setArgument('filter_show_without_data', $filter['show_without_data'] ? 1 : null)
-			->setArgument('filter_show_details', $filter['show_details'] ? 1 : null)
-			->setArgument('filter_evaltype', $filter['evaltype'])
-			->setArgument('filter_tags', $filter['tags'])
-			->setArgument('sort', $sort_field)
-			->setArgument('sortorder', $sort_order)
-			->setArgument('page', $this->hasInput('page') ? $this->getInput('page') : null);
+		$refresh_curl = (new CUrl('zabbix.php'))->setArgument('action', 'latest.view.refresh');
+		$refresh_data = array_filter([
+			'filter_groupids' => $filter['groupids'],
+			'filter_hostids' => $filter['hostids'],
+			'filter_select' => $filter['select'],
+			'filter_show_without_data' => $filter['show_without_data'] ? 1 : null,
+			'filter_show_details' => $filter['show_details'] ? 1 : null,
+			'filter_evaltype' => $filter['evaltype'],
+			'filter_tags' => $filter['tags'],
+			'sort' => $sort_field,
+			'sortorder' => $sort_order,
+			'page' => $this->hasInput('page') ? $this->getInput('page') : null
+		]);
 
 		// data sort and pager
 		$prepared_data = $this->prepareData($filter, $sort_field, $sort_order);
@@ -163,6 +164,7 @@ class CControllerLatestView extends CControllerLatest {
 			'sort_order' => $sort_order,
 			'view_curl' => $view_curl,
 			'refresh_url' => $refresh_curl->getUrl(),
+			'refresh_data' => $refresh_data,
 			'refresh_interval' => CWebUser::getRefresh() * 1000,
 			'active_tab' => CProfile::get('web.latest.filter.active', 1),
 			'paging' => $paging,
diff --git ui/app/controllers/CControllerProblemView.php ui/app/controllers/CControllerProblemView.php
index c53f838..06702db 100644
--- ui/app/controllers/CControllerProblemView.php
+++ ui/app/controllers/CControllerProblemView.php
@@ -119,9 +119,6 @@ class CControllerProblemView extends CControllerProblem {
 		}
 
 		$filter = $filter_tabs[$profile->selected];
-		$refresh_curl = (new CUrl('zabbix.php'));
-		$filter['action'] = 'problem.view.refresh';
-		array_map([$refresh_curl, 'setArgument'], array_keys($filter), $filter);
 
 		$data = [
 			'action' => $this->getAction(),
@@ -142,7 +139,6 @@ class CControllerProblemView extends CControllerProblem {
 				] + getTimeselectorActions($profile->from, $profile->to)
 			],
 			'filter_tabs' => $filter_tabs,
-			'refresh_url' => $refresh_curl->getUrl(),
 			'refresh_interval' => CWebUser::getRefresh() * 1000,
 			'inventories' => array_column(getHostInventories(), 'title', 'db_field'),
 			'sort' => $filter['sort'],
diff --git ui/app/views/js/monitoring.host.view.js.php ui/app/views/js/monitoring.host.view.js.php
index bf0948d..f86a730 100644
--- ui/app/views/js/monitoring.host.view.js.php
+++ ui/app/views/js/monitoring.host.view.js.php
@@ -29,28 +29,29 @@
 		function hostPage() {
 			let filter_options = <?= json_encode($data['filter_options']) ?>;
 
-			this.refresh_url = '<?= $data['refresh_url'] ?>';
+			this.refresh_url = new Curl('<?= $data['refresh_url'] ?>', false);
 			this.refresh_interval = <?= $data['refresh_interval'] ?>;
 			this.running = false;
 			this.timeout = null;
 			this.deferred = null;
 
+			const url = new Curl('zabbix.php', false);
+			url.setArgument('action', 'host.view.refresh');
+			this.refresh_simple_url = url.getUrl();
+
 			if (filter_options) {
 				this.refresh_counters = this.createCountersRefresh(1);
 				this.filter = new CTabFilter($('#monitoring_hosts_filter')[0], filter_options);
 				this.filter.on(TABFILTER_EVENT_URLSET, (ev) => {
-					let url = new Curl('', false);
+					this.refresh_url = new Curl('', false);
 
-					url.setArgument('action', 'host.view.refresh');
-					this.refresh_url = url.getUrl();
 					this.unscheduleRefresh();
 					this.refresh();
 
 					var filter_item = this.filter._active_item;
 
 					if (this.filter._active_item.hasCounter()) {
-						$.post('zabbix.php', {
-							action: 'host.view.refresh',
+						$.post(this.refresh_simple_url, {
 							filter_counters: 1,
 							counter_index: filter_item._index
 						}).done((json) => {
@@ -73,8 +74,7 @@
 				return setTimeout(() => this.getFiltersCounters(), timeout);
 			},
 			getFiltersCounters: function() {
-				return $.post('zabbix.php', {
-						action: 'host.view.refresh',
+				return $.post(this.refresh_simple_url, {
 						filter_counters: 1
 					}).done((json) => {
 						if (json.filter_counters) {
@@ -98,7 +98,23 @@
 			refresh: function() {
 				this.setLoading();
 
-				this.deferred = $.getJSON(this.refresh_url);
+				const params = this.refresh_url.getArgumentsObject();
+				const exclude = ['action', 'filter_src', 'filter_show_counter', 'filter_custom_time', 'filter_name'];
+				const post_data = Object.keys(params)
+					.filter(key => !exclude.includes(key))
+					.reduce((post_data, key) => {
+						post_data[key] = (typeof params[key] === 'object')
+							? [...params[key]].filter(i => i)
+							: params[key];
+						return post_data;
+					}, {});
+
+				this.deferred = $.ajax({
+					url: this.refresh_simple_url,
+					data: post_data,
+					type: 'post',
+					dataType: 'json'
+				});
 
 				return this.bindDataEvents(this.deferred);
 			},
diff --git ui/app/views/js/monitoring.latest.view.js.php ui/app/views/js/monitoring.latest.view.js.php
index 8ec934b..c173de8 100644
--- ui/app/views/js/monitoring.latest.view.js.php
+++ ui/app/views/js/monitoring.latest.view.js.php
@@ -31,6 +31,7 @@
 <script type="text/javascript">
 	function latestPage() {
 		this.refresh_url = '<?= $data['refresh_url'] ?>';
+		this.refresh_data = <?= json_encode($data['refresh_data']) ?>;
 		this.refresh_interval = <?= $data['refresh_interval'] ?>;
 		this.running = false;
 		this.timeout = null;
@@ -51,7 +52,12 @@
 	latestPage.prototype.refresh = function() {
 		this.setLoading();
 
-		var deferred = $.getJSON(this.refresh_url);
+		var deferred = $.ajax({
+			url: this.refresh_url,
+			data: this.refresh_data,
+			type: 'post',
+			dataType: 'json'
+		});
 
 		return this.bindDataEvents(deferred);
 	};
diff --git ui/app/views/js/monitoring.problem.view.js.php ui/app/views/js/monitoring.problem.view.js.php
index c525576..0f12639 100644
--- ui/app/views/js/monitoring.problem.view.js.php
+++ ui/app/views/js/monitoring.problem.view.js.php
@@ -29,7 +29,6 @@ if (array_key_exists('filter_options', $data)) { ?>
 		var options = <?= json_encode($data['filter_options']) ?>,
 			filter = new CTabFilter($('#monitoring_problem_filter')[0], options),
 			refresh_interval = <?= $data['refresh_interval'] ?>,
-			refresh_url = '<?= $data['refresh_url'] ?>',
 			refresh_timer,
 			filter_item,
 			filter_counter_fetch,
@@ -39,6 +38,10 @@ if (array_key_exists('filter_options', $data)) { ?>
 				to: options.timeselector.to
 			};
 
+		const url = new Curl('zabbix.php', false);
+		url.setArgument('action', 'problem.view.refresh');
+		const refresh_url = url.getUrl();
+
 		/**
 		 * Update on filter changes.
 		 */
diff --git ui/js/flickerfreescreen.js ui/js/flickerfreescreen.js
index 629e216..cdcbe27 100644
--- ui/js/flickerfreescreen.js
+++ ui/js/flickerfreescreen.js
@@ -118,17 +118,22 @@
 						'screenitemid'
 					]
 				},
-				params_index = type_params[screen.resourcetype] ? screen.resourcetype : 'default';
-				ajax_url = new Curl('jsrpc.php'),
+				params_index = type_params[screen.resourcetype] ? screen.resourcetype : 'default',
 				self = this;
 
-			ajax_url.setArgument('type', 9); // PAGE_TYPE_TEXT
-			ajax_url.setArgument('method', 'screen.get');
-			// TODO: remove, do not use timestamp passing to server and back to ensure newest content will be shown.
-			ajax_url.setArgument('timestamp', screen.timestampActual);
+			const ajax_url = new Curl('jsrpc.php', false);
+			const post_data = {
+				type: 9, // PAGE_TYPE_TEXT
+				method: 'screen.get',
+
+				// TODO: remove, do not use timestamp passing to server and back to ensure newest content will be shown.
+				timestamp: screen.timestampActual
+			};
 
 			$.each(type_params[params_index], function (i, name) {
-				ajax_url.setArgument(name, empty(screen[name]) ? null : screen[name]);
+				if (!empty(screen[name])) {
+					post_data[name] = screen[name];
+				}
 			});
 
 			// set actual timestamp
@@ -137,8 +142,8 @@
 			// timeline params
 			// SCREEN_RESOURCE_HTTPTEST_DETAILS, SCREEN_RESOURCE_DISCOVERY, SCREEN_RESOURCE_HTTPTEST
 			if ($.inArray(screen.resourcetype, [21, 22, 23]) === -1) {
-				ajax_url.setArgument('from', screen.timeline.from);
-				ajax_url.setArgument('to', screen.timeline.to);
+				post_data.from = screen.timeline.from;
+				post_data.to = screen.timeline.to;
 			}
 
 			switch (parseInt(screen.resourcetype, 10)) {
@@ -173,12 +178,12 @@
 						if ('itemids' in screen.data) {
 							$.each(screen.data.itemids, function (i, value) {
 								if (!empty(value)) {
-									ajax_url.setArgument('itemids[' + value + ']', value);
+									post_data['itemids[' + value + ']'] = value;
 								}
 							});
 						}
 						else {
-							ajax_url.setArgument('graphid', screen.data.graphid);
+							post_data['graphid'] = screen.data.graphid;
 						}
 
 						$.each({
@@ -188,16 +193,16 @@
 							'action': screen.data.action
 						}, function (ajax_key, value) {
 							if (!empty(value)) {
-								ajax_url.setArgument(ajax_key, value);
+								post_data[ajax_key] = value;
 							}
 						});
 
-						self.refreshHtml(id, ajax_url);
+						self.refreshHtml(id, ajax_url, post_data);
 					}
 					break;
 
 				default:
-					self.refreshHtml(id, ajax_url);
+					self.refreshHtml(id, ajax_url, post_data);
 					break;
 			}
 
@@ -232,7 +237,7 @@
 			}
 		},
 
-		refreshHtml: function(id, ajaxUrl) {
+		refreshHtml: function(id, ajaxUrl, post_data = {}) {
 			var screen = this.screens[id],
 				request_start = new CDate().getTime();
 
@@ -248,7 +253,7 @@
 					url: ajaxUrl.getUrl(),
 					type: 'post',
 					cache: false,
-					data: {},
+					data: post_data,
 					dataType: 'html',
 					success: function(html) {
 						var html = $(html);
@@ -435,38 +440,6 @@
 			return null;
 		},
 
-		refreshProfile: function(id, ajaxUrl) {
-			var screen = this.screens[id];
-
-			if (screen.isRefreshing) {
-				this.calculateReRefresh(id);
-			}
-			else {
-				screen.isRefreshing = true;
-				screen.timestampResponsiveness = new CDate().getTime();
-
-				var ajaxRequest = $.ajax({
-					url: ajaxUrl.getUrl(),
-					type: 'post',
-					data: {},
-					success: function(data) {
-						screen.timestamp = new CDate().getTime();
-						screen.isRefreshing = false;
-					},
-					error: function() {
-						window.flickerfreeScreen.calculateReRefresh(id);
-					}
-				});
-
-				$.when(ajaxRequest).always(function() {
-					if (screen.isReRefreshRequire) {
-						screen.isReRefreshRequire = false;
-						window.flickerfreeScreen.refresh(id);
-					}
-				});
-			}
-		},
-
 		calculateReRefresh: function(id) {
 			var screen = this.screens[id],
 				time = new CDate().getTime();