diff --git a/doc/plugins.md b/doc/plugins.md
index 0dccbe848..ae3ef954a 100644
--- a/doc/plugins.md
+++ b/doc/plugins.md
@@ -47,6 +47,22 @@ You can omit the `FUNCTIONNAME` part, if the exported function has got the same
### Client hooks and server hooks
There are server hooks, which will be executed on the server (e.g. `expressCreateServer`), and there are client hooks, which are executed on the client (e.g. `acePopulateDomLine`). Be sure to not make assumptions about the environment your code is running in, e.g. don't try to access `process`, if you know your code will be run on the client, and likewise, don't try to access `window` on the server...
+### Styling
+When you install a client-side plugin (e.g. one that implements at least one client-side hook), the plugin name is added to the `class` attribute of the div `#editorcontainerbox` in the main window.
+This gives you the opportunity of tuning the appearence of the main UI in your plugin.
+
+For example, this is the markup with no plugins installed:
+```html
+
+```
+
+and this is the contents after installing `someplugin`:
+```html
+
+```
+
+This feature was introduced in Etherpad **1.8**.
+
### Parts
As your plugins become more and more complex, you will find yourself in the need to manage dependencies between plugins. E.g. you want the hooks of a certain plugin to be executed before (or after) yours. You can also manage these dependencies in your plugin definition file `ep.json`:
diff --git a/src/static/js/pluginfw/hooks.js b/src/static/js/pluginfw/hooks.js
index cf5fcc4eb..81f56f965 100644
--- a/src/static/js/pluginfw/hooks.js
+++ b/src/static/js/pluginfw/hooks.js
@@ -125,3 +125,29 @@ exports.callAllStr = function(hook_name, args, sep, pre, post) {
}
return newCallhooks.join(sep || "");
}
+
+/*
+ * Returns an array containing the names of the installed client-side plugins
+ *
+ * If no client-side plugins are installed, returns an empty array.
+ * Duplicate names are always discarded.
+ *
+ * A client-side plugin is a plugin that implements at least one client_hook
+ *
+ * EXAMPLE:
+ * No plugins: []
+ * Some plugins: [ 'ep_adminpads', 'ep_add_buttons', 'ep_activepads' ]
+ */
+exports.clientPluginNames = function() {
+ if (!(exports.plugins)) {
+ return [];
+ }
+
+ var client_plugin_names = [...new Set(
+ exports.plugins.parts
+ .filter(part => part.hasOwnProperty('client_hooks'))
+ .map(part => part['plugin'])
+ )];
+
+ return client_plugin_names;
+}
diff --git a/src/templates/pad.html b/src/templates/pad.html
index e2dc89789..a0b401d59 100644
--- a/src/templates/pad.html
+++ b/src/templates/pad.html
@@ -100,7 +100,7 @@
<% e.end_block(); %>
-