diff --git a/src/messenger/webim/libs/common/response.php b/src/messenger/webim/libs/common/response.php
index 288bbaac..ab39f83a 100644
--- a/src/messenger/webim/libs/common/response.php
+++ b/src/messenger/webim/libs/common/response.php
@@ -65,78 +65,98 @@ function topage($text)
 }
 
 /**
- * Load additional CSS files, required by plugins, and build HTML code to include them
+ * Load additional CSS files, required by plugins, and build HTML code to
+ * include them
+ *
+ * Triggers 'pageAddCSS' and pass listeners associative array with
+ * following keys:
+ *  - 'page': string, name of page to which CSS files will be attached.
+ *  - 'js': array, with CSS files paths. Modify this array to add or remove
+ *    additional CSS files.
  *
  * @param string $page_name CSS files load to this page
  * @return string HTML block of 'link' tags
  */
 function get_additional_css($page_name) {
-	$method = $page_name . 'AddCss';
-	$plugins = PluginManager::getAllPlugins();
+	// Prepare event arguments array
+	$args = array(
+		'page' => $page_name,
+		'css' => array()
+	);
+
+	// Trigger event
+	$dispatcher = EventDispatcher::getInstance();
+	$dispatcher->triggerEvent('pageAddCSS', $args);
+
+	// Build resulting css list
 	$result = array();
-	// Check all plugins
-	foreach ($plugins as $plugin) {
-		if (is_callable(array($plugin, $method))) {
-			// Try to invoke '<$page_name>AddCss' method
-			$css_list = $plugin->$method();
-			foreach ($css_list as $css) {
-				// Add script tag for each javascript file
-				$result[] = '';
-			}
-		}
+	foreach($args['css'] as $css) {
+		$result[] = '';
 	}
+
 	return implode("\n", $result);
 }
 
 /**
- * Load additional JavaScript files, required by plugins, and build HTML code to include them
+ * Load additional JavaScript files, required by plugins, and build HTML code
+ * to include them
+ *
+ * Triggers 'pageAddJS' and pass listeners associative array with
+ * following keys:
+ *  - 'page': string, name of page to which JavaScript files will be attached.
+ *  - 'js': array, with JavaScript files paths. Modify this array to add or
+ *    remove additional JavaScript files.
  *
  * @param string $page_name JavaScript files load to this page
  * @return string HTML block of 'script' tags
  */
 function get_additional_js($page_name) {
-	$method = $page_name . 'AddJs';
-	$plugins = PluginManager::getAllPlugins();
+	// Prepare event arguments array
+	$args = array(
+		'page' => $page_name,
+		'js' => array()
+	);
+
+	// Trigger event
+	$dispatcher = EventDispatcher::getInstance();
+	$dispatcher->triggerEvent('pageAddJS', $args);
+
+	// Build resulting css list
 	$result = array();
-	// Check all plugins
-	foreach ($plugins as $plugin) {
-		if (is_callable(array($plugin, $method))) {
-			// Try to invoke '<$page_name>AddJs' method
-			$js_list = $plugin->$method();
-			foreach ($js_list as $js) {
-				// Add script tag for each javascript file
-				$result[] = '';
-			}
-		}
+	foreach($args['js'] as $js) {
+		$result[] = '';
 	}
+
 	return implode("\n", $result);
 }
 
+
 /**
- * Build Javascript code that contains initializing options for JavaScript plugins
+ * Build Javascript code that contains initializing options for JavaScript
+ * plugins
+ *
+ * Triggers 'pageAddJSPluginOptions' and pass listeners associative array with
+ * following keys:
+ *  - 'page': string, name of page at which plugins will work.
+ *  - 'plugins': associative array, whose keys are plugins names and values are
+ *    plugins options. Modify this array to add or change plugins options
  *
  * @param string $page_name Plugins initialize at this page
  * @return string JavaScript options block
  */
 function get_js_plugin_options($page_name) {
-	$method = $page_name . 'AddJsPluginOptions';
-	$plugins = PluginManager::getAllPlugins();
-	$result = array();
-	// Check all plugins
-	foreach ($plugins as $plugin) {
-		if (is_callable(array($plugin, $method))) {
-			// Try to invoke '<$page_name>AddJsPluginOptions' method
-			$js_plugins = $plugin->$method();
-			foreach ($js_plugins as $js_plugin => $js_options) {
-				// Add plugin's initialization options code
-				if (empty($result[$js_plugin])) {
-					$result[$js_plugin] = array();
-				}
-				$result[$js_plugin] = array_merge($result[$js_plugin], $js_options);
-			}
-		}
-	}
-	return json_encode($result);
+	// Prepare event arguments array
+	$args = array(
+		'page' => $page_name,
+		'plugins' => array()
+	);
+
+	// Trigger event
+	$dispatcher = EventDispatcher::getInstance();
+	$dispatcher->triggerEvent('pageAddJSPluginOptions', $args);
+
+	// Return encoded options
+	return json_encode($args['plugins']);
 }
 
 function no_field($key)