diff --git a/js/app/controllers/EpnTapModule.js b/js/app/controllers/EpnTapModule.js
index ab5aa36..327505e 100644
--- a/js/app/controllers/EpnTapModule.js
+++ b/js/app/controllers/EpnTapModule.js
@@ -122,7 +122,7 @@ Ext.define('amdaDesktop.EpnTapModule', {
 		if(target) {
 			// --- Select product types ---
 			if (! target[0] in this.productTypeCB.getStore()) {
-				alert("Sorry, product type " + target[0] + " is not found in available services.");
+				this.display_message("Sorry, product type " + target[0] + " is not found in available services.");
 				return;
 			}
 			this.productTypeCB.select(target[0]);
@@ -130,7 +130,7 @@ Ext.define('amdaDesktop.EpnTapModule', {
 
 			// --- Select target class ---
 			if (! target[1] in this.targetClassCB.getStore()) {
-				alert("Sorry, target class " + this.pretify(target[1]) + " is not found in available services.");
+				this.display_message("Sorry, target class " + this.pretify(target[1]) + " is not found in available services.");
 				return;
 			}
 			this.targetClassCB.select(target[1]);
@@ -138,7 +138,7 @@ Ext.define('amdaDesktop.EpnTapModule', {
 
 			// --- Select target name ---
 			if (! target[2] in this.targetNameCB.getStore()) {
-				alert("Sorry, target name " + this.pretify(target[2]) + " is not found in available services.");
+				this.display_message("Sorry, target name " + this.pretify(target[2]) + " is not found in available services.");
 				return;
 			}
 			this.targetNameCB.select(target[2]);
@@ -437,12 +437,29 @@ Ext.define('amdaDesktop.EpnTapModule', {
 	Among other things, fill the `epnTapGranulesGrid` table (see `EpnTapUI.granulesStore`).
 	*/
 	fillGranules: function(granules) {
+		function display_message(text) {
+			var messageWindow = new Ext.form.Panel({
+				width: 200,
+				height: 100,
+				title: 'Oops',
+				floating: true,
+				closable : true,
+				items: [
+					{ xtype: 'label', text: text, margin: 10},
+					{ xtype: 'button', text: 'Ok', margin: 10, listeners: {
+						click: function() { messageWindow.close(); }
+					}}
+				],
+			});
+			messageWindow.show();
+		};
+
 		if (granules["error"] != null) {
 			console.log('Can not get request response:', granules["error"]);
 			if(granules["error"] == "no result") {
-				alert("There is no result for this query.");
+				display_message('There is no result for this query.');
 			} else {
-				alert("Can not display granules due to an error from the selected epn-tap service.");
+				display_message('Can not display granules due to an error from the selected epn-tap service.');
 			}
 		} else {
 			try {
@@ -450,7 +467,7 @@ Ext.define('amdaDesktop.EpnTapModule', {
 				Ext.getCmp('epnTapGranulesGrid').getStore().add(granules);
 			} catch( e ) {
 				console.log('Can not add granules: ' + e);
-				alert("Can not display granules due to an error from the selected epn-tap service.");
+				display_message('Can not display granules due to an error from the selected epn-tap service.');
 			}
 		}
 		Ext.getCmp('epnTapServicesGrid').setDisabled(false);
@@ -468,6 +485,22 @@ Ext.define('amdaDesktop.EpnTapModule', {
 		this.servicesGrid.getEl().setStyle('cursor', 'wait');  // CSS is correctly changed but without visible result.
 		this.servicesGrid.setDisabled(true);
 		this.granulesGrid.setDisabled(true);
-	}
+	},
 
+	display_message: function(text) {
+		var messageWindow = new Ext.form.Panel({
+			width: 200,
+			height: 100,
+			title: 'Oops',
+			floating: true,
+			closable : true,
+			items: [
+				{ xtype: 'label', text: text, margin: 10},
+				{ xtype: 'button', text: 'Ok', margin: 10, listeners: {
+					click: function() { messageWindow.close(); }
+				}}
+			],
+		});
+		messageWindow.show();
+	}
 });
--
libgit2 0.21.2