Repository: julien6387/supvisors (language: python)

Issue:
unknown error (try "tail xxx") 
when a FATAL state is forced by supvisors, it is displayed differently in procaddress and application pages.
the procaddress seems correct (e.g. 'no resource available'), whereas the application page displays 'unknown error (try "tail xxx")'


Discussion / hints:

Fix patch:
diff --git a/CHANGES.txt b/CHANGES.txt
index c1430f09..619ae74f 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,10 +1,28 @@
+0.3 (2020-12-29)
+----------------
+
+* Fixed https://github.com/julien6387/supvisors/issues/81
+  When Supvisors logfile is set to AUTO, Supvisors uses the same logger as Supervisor
+
+* Fixed https://github.com/julien6387/supvisors/issues/79
+  When FATAL or UNKNOWN Process state is forced by Supvisors, spawnerr was missing in the listener payload
+
+* Documentation updated
+
+* Useless folder rsc_ref deleted
+
+* 'design' folder moved to a dedicated GitHub repository
+
+* 100% coverage reached in unit tests.
+
+
 0.2 (2020-12-14)
 ----------------
 
 * Migration to Python 3.6
   Versions of dependencies are refreshed, more particularly supervisor 4.2.1
 
-* Updated CSS of Web UI
+* CSS of Web UI updated / simplified
 
 * New action added to Host Process page of WebUI
   'tail -f stderr' button
@@ -22,7 +40,7 @@
 * Fixed https://github.com/julien6387/supvisors/issues/72
   The extra arguments are shared between all Supvisors instances
 
-* Fixed some document formatting issues
+* Documentation formatting issues fixed
 
 * README.rst replaced with README.md
 
diff --git a/README.md b/README.md
index 9d16be1a..79b67f64 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,13 @@ The main features are:
 
 ![Image of Supvisors' Dashboard](https://github.com/julien6387/supvisors/blob/master/docs/images/supvisors_address_process_section.png)
 
+## Supervisor Enhancements
+
+By design, **Supvisors** proposes a fix to the following Supervisor issues:
+   * [#122 - supervisord Starts All Processes at the Same Time](https://github.com/Supervisor/supervisor/issues/122)
+   * [#456 - Add the ability to set different "restart policies" on process workers](https://github.com/Supervisor/supervisor/issues/456)
+   * [#520 - allow a program to wait for another to stop before being stopped?](https://github.com/Supervisor/supervisor/issues/520)
+   * [#1023 - Pass arguments to program when starting a job?](https://github.com/Supervisor/supervisor/issues/1023)
 
 ## Supported Platforms
 
@@ -71,7 +78,6 @@ You can view the current **Supvisors** documentation [here](http://supvisors.rea
 
 You will find detailed installation and configuration documentation.
 
-
 ## Reporting Bugs and Viewing the Source Repository
 
 Please report bugs in the [Github issue tracker](https://github.com/julien6387/supvisors/issues).
@@ -81,4 +87,3 @@ You can view the [source repository](https://github.com/julien6387/supvisors) fo
 ## Contributing
 
 Not opened yet.
-
diff --git a/docs/configuration.rst b/docs/configuration.rst
index 40283bca..efdb0477 100644
--- a/docs/configuration.rst
+++ b/docs/configuration.rst
@@ -6,8 +6,7 @@ Configuration
 Supervisor's Configuration File
 -------------------------------
 
-This section explains how **Supvisors** uses and complements the
-`Supervisor configuration <http://supervisord.org/configuration.html>`_.
+This section explains how **Supvisors** uses and complements the `Supervisor configuration <http://supervisord.org/configuration.html>`_.
 
 
 Extension points
@@ -21,7 +20,7 @@ Extension points
     supervisor.rpcinterface_factory = supvisors.plugin:make_supvisors_rpcinterface
 
 **Supvisors** extends also `supervisorctl <http://supervisord.org/running.html#running-supervisorctl>`_.
-This possibility is not documented in Supervisor.
+This feature is not described in Supervisor documentation.
 
 .. code-block:: ini
 
@@ -38,7 +37,7 @@ The parameters of **Supvisors** are set through an additional section ``[supviso
 
 ``address_list``
 
-    The list of host names where **Supvisors** will be running, separated by commas.
+    The list of node names where **Supvisors** will be running, separated by commas.
 
     *Default*:  None.
 
@@ -46,15 +45,15 @@ The parameters of **Supvisors** are set through an additional section ``[supviso
 
     .. attention::
 
-        The host names (also called host nodes in Supervisor) are expected to be known to every related systems in the list.
+        The node names are expected to be known to every related systems in the list.
         If it's not the case, check the network configuration.
 
     .. hint::
 
         If the `netifaces <https://pypi.python.org/pypi/netifaces>`_ package is installed, it is possible to use IP addresses
-        in addition to host names.
+        in addition to node names.
 
-        Like the host names, the IP addresses are expected to be known to every related systems in the list.
+        Like the node names, the IP addresses are expected to be known to every related systems in the list.
         If it's not the case, check the network configuration.
 
 
@@ -68,10 +67,10 @@ The parameters of **Supvisors** are set through an additional section ``[supviso
 
 ``auto_fence``
 
-    When true, **Supvisors** won't try to reconnect to a **Supvisors** instance that has been inactive.
+    When true, **Supvisors** won't try to reconnect to a **Supvisors** instance that is inactive.
     This functionality is detailed in :ref:`auto_fencing`.
 
-    *Default*:  false.
+    *Default*:  ``false``.
 
     *Required*:  No.
 
@@ -80,7 +79,7 @@ The parameters of **Supvisors** are set through an additional section ``[supviso
     The internal port number used to publish local events to remote **Supvisors** instances.
     Events are published through a PyZMQ TCP socket.
 
-    *Default*:  65001.
+    *Default*:  ``65001``.
 
     *Required*:  No.
 
@@ -90,7 +89,7 @@ The parameters of **Supvisors** are set through an additional section ``[supviso
     The port number used to publish all **Supvisors** events (Address, Application and Process events).
     Events are published through a PyZMQ TCP socket. The protocol of this interface is explained in :ref:`event_interface`.
 
-    *Default*:  65002.
+    *Default*:  ``65002``.
 
     *Required*:  No.
 
@@ -99,13 +98,13 @@ The parameters of **Supvisors** are set through an additional section ``[supviso
     The time in seconds that **Supvisors** waits for all expected **Supvisors** instances to publish.
     This use of this option is detailed in :ref:`synchronizing`.
 
-    *Default*:  15.
+    *Default*:  ``15``.
 
     *Required*:  No.
 
 ``starting_strategy``
 
-    The strategy used to start applications on addresses.
+    The strategy used to start applications on nodes.
     Possible values are in { ``CONFIG``, ``LESS_LOADED``, ``MOST_LOADED`` }.
     The use of this option is detailed in :ref:`starting_strategy`.
 
@@ -126,17 +125,17 @@ The parameters of **Supvisors** are set through an additional section ``[supviso
 ``stats_periods``
 
     The list of periods for which the statistics will be provided in the **Supvisors** :ref:`dashboard`, separated by commas.
-    Up to 3 values are allowed in [5 ; 3600] seconds, each of them MUST be a multiple of 5.
+    Up to 3 values are allowed in [``5`` ; ``3600``] seconds, each of them MUST be a multiple of ``5``.
 
-    *Default*:  10.
+    *Default*:  ``10``.
 
     *Required*:  No.
 
 ``stats_histo``
 
-    The depth of the statistics history. Value in [10 ; 1500].
+    The depth of the statistics history. Value in [``10`` ; ``1500``].
 
-    *Default*:  200.
+    *Default*:  ``200``.
 
     *Required*:  No.
 
@@ -146,43 +145,51 @@ The parameters of **Supvisors** are set through an additional section ``[supviso
     If true, values are displayed in 'IRIX' mode.
     If false, values are displayed in 'Solaris' mode.
 
-    *Default*:  false.
+    *Default*:  ``false``.
 
     *Required*:  No.
 
 The logging options are strictly identical to Supervisor's. By the way, it is the same logger that is used.
-These options are more detailed in
-`supervisord Section values <http://supervisord.org/configuration.html#supervisord-section-values>`_.
+These options are more detailed in `supervisord Section values <http://supervisord.org/configuration.html#supervisord-section-values>`_.
 
 ``logfile``
 
-    The absolute or relative path of the **Supvisors** log file.
+    The path to the **Supvisors** activity log of the supervisord process. This option can include the value ``%(here)s``,
+    which expands to the directory in which the supervisord configuration file was found.
+    If ``logfile`` is unset or set to ``AUTO``, **Supvisors** will use the same logger as Supervisor. It makes it easier
+    to understand what happens when Supervisor and **Supvisors** output sequentially.
 
-    *Default*:  :file:`supvisors.log`.
+    *Default*:  ``AUTO``.
 
     *Required*:  No.
 
 ``logfile_maxbytes``
 
-    The maximum size of the **Supvisors** log file.
+    The maximum number of bytes that may be consumed by the **Supvisors** activity log file before it is rotated
+    (suffix multipliers like ``KB``, ``MB``, and ``GB`` can be used in the value).
+    Set this value to ``0`` to indicate an unlimited log size. No effect if ``logfile`` is unset or set to ``AUTO``.
 
-    *Default*:  50MB.
+    *Default*:  ``50MB``.
 
     *Required*:  No.
 
 ``logfile_backups``
 
-    The number of **Supvisors** backup log files.
+    The number of backups to keep around resulting from **Supvisors** activity log file rotation.
+    If set to ``0``, no backups will be kept. No effect if ``logfile`` is unset or set to ``AUTO``.
 
-    *Default*:  10.
+    *Default*:  ``10``.
 
     *Required*:  No.
 
 ``loglevel``
 
-    The logging level.
+    The logging level, dictating what is written to the **Supvisors** activity log.
+    One of [``critical``, ``error``, ``warn``, ``info``, ``debug``, ``trace``,  ``blather``].
+    See also: `supervisord Activity Log Levels <http://supervisord.org/logging.html#activity-log-levels>`_.
+    No effect if ``logfile`` is unset or set to ``AUTO``.
 
-    *Default*:  info.
+    *Default*:  ``info``.
 
     *Required*:  No.
 
@@ -252,7 +259,7 @@ the XML rules file before it is used.
 
 .. hint::
 
-    It is still possbile to validate the XML rules file manually.
+    It is still possible to validate the XML rules file manually.
     The XSD contents used to validate the XML can be found in the module ``supvisors.parser``.
     Once extracted to a file (here :file:`rules.xsd`), just use :command:`xmllint` to validate:
 
@@ -286,11 +293,11 @@ Here follows the definition of the rules applicable to a program.
 
 ``addresses``
 
-    This element gives the list of addresses where the process can be started, separated by commas. Applicable values are:
+    This element gives the list of nodes where the process can be started, separated by commas. Applicable values are:
 
         * a subset of the ``address_list`` defined in `[supvisors] Section Values`_,
         * ``*``: stands for all values in ``address_list``.
-        * ``#``: stands for the address in ``address_list`` having the same index as the program in a homogeneous group. This will be detailed in the `Pattern Rules`_.
+        * ``#``: stands for the node in ``address_list`` having the same index as the program in a homogeneous group. This will be detailed in the `Pattern Rules`_.
 
     *Default*:  ``*``.
 
@@ -302,48 +309,47 @@ Here follows the definition of the rules applicable to a program.
     If true (resp. false), a failure of the program is considered major (resp. minor).
     This is quite informative and is mainly used to give the operational status of the application.
 
-    *Default*:  false.
+    *Default*:  ``false``.
 
     *Required*:  No.
 
 ``start_sequence``
 
     This element gives the starting rank of the program when the application is starting.
-    When <= 0, the program is not automatically started.
-    When > 0, the program is started automatically in the given order.
+    When <= ``0``, the program is not automatically started.
+    When > ``0``, the program is started automatically in the given order.
 
-    *Default*:  0.
+    *Default*:  ``0``.
 
     *Required*:  No.
 
 ``stop_sequence``
 
     This element gives the stopping rank of the program when the application is stopping.
-    When <= 0, the program is stopped immediately if running.
-    When > 0, the program is stopped in the given order.
+    When <= ``0``, the program is stopped immediately if running.
+    When > ``0``, the program is stopped in the given order.
 
-    *Default*:  0.
+    *Default*:  ``0``.
 
     *Required*:  No.
 
 ``wait_exit``
 
-    If the value of this element is set to true, Supvisors waits for the process to exit
-    before starting the next sequence. This may be useful for scripts used to load a database,
-    to mount disks, to prepare the application working directory, etc.
+    If the value of this element is set to true, Supvisors waits for the process to exit before starting the next sequence.
+    This is particularly useful for scripts used to load a database, to mount disks, to prepare the application working directory, etc.
 
-    *Default*:  false.
+    *Default*:  ``false``.
 
     *Required*:  No.
 
 ``loading``
 
-    This element gives the expected percent usage of resources. The value is a estimation and the meaning
+    This element gives the expected percent usage of *resources*. The value is a estimation and the meaning
     in terms of resources (CPU, memory, network) is in the user's hands.
 
     This can be used in **Supvisors** to ensure that a system is not overloaded with greedy processes.
-    When multiple addresses are available, the `` loading`` value helps to distribute processes over
-    the systems available, so that the system remains safe.
+    When multiple nodes are available, the ``loading`` value helps to distribute processes over the available nodes,
+    so that the system remains safe.
 
     .. note:: *About the choice of a user estimation.*
 
@@ -354,7 +360,7 @@ Here follows the definition of the rules applicable to a program.
         It is recommended to give a value based on a average usage of the resources in worst case
         configuration and to add a margin corresponding to the standard deviation.
 
-    *Default*:  1.
+    *Default*:  ``1``.
 
     *Required*:  No.
 
@@ -400,7 +406,7 @@ Here follows the definition of the rules applicable to a program.
 ``pattern`` Rules
 ~~~~~~~~~~~~~~~~~
 
-It may be quite tedious to give these informations to each program, especially if multiple programs use common rules.
+It may be quite tedious to give all this information to each program, especially if multiple programs use common rules.
 So two mechanisms were put in place to help.
 
 The first is the ``pattern``. It can be used to configure a set of programs in a more flexible way than just
@@ -427,13 +433,13 @@ The difference is in the ``name`` usage. For a pattern definition, a substring o
     before trying to associate a ``pattern`` definition.
 
     It also may happen that several patterns match the same program name. In this case, **Supvisors** chooses the pattern
-    with the greatest matching, or arbitrarily the first of them if such a rule does not discrimate enough. So given two pattern
-    names ``prg`` and ``prg_``, **Supvisors** applies the rules associated to ``prg_`` when consirering the program
+    with the greatest matching, or arbitrarily the first of them if such a rule does not discriminate enough. So given two pattern
+    names ``prg`` and ``prg_``, **Supvisors** applies the rules associated to ``prg_`` when considering the program
     ``prg_00``.
 
-.. note:: *About the use of ``#`` in ``addresses``.*
+.. note:: *About the use of* ``#`` *in* ``addresses``.
 
-    The intention is for a program that is meant to be started on each address in the address list.
+    The intention is for a program that is meant to be started on each node in the address list.
     As an example, consider an extract of the following Supervisor configuration:
 
     .. code-block:: ini
@@ -453,7 +459,7 @@ The difference is in the ``name`` usage. For a pattern definition, a substring o
             <addresses>cliche01</addresses>
         </program>
 
-        <!-- definitions for prg_01, prg_02, prg_03 -->
+        <!-- similar definitions for prg_01, prg_02, prg_03 -->
 
         <program name="prg_04">
             <addresses>cliche05</addresses>
@@ -469,15 +475,16 @@ The difference is in the ``name`` usage. For a pattern definition, a substring o
 
 .. attention::
 
-    Addresses are chosen in accordance with the sequence given in ``address_list``.
-    In the example above, if the two first addresses are swapped, ``prg_00`` will be addressed to ``cliche02`` and ``prg_01`` to ``cliche01``.
+    Nodes are chosen in accordance with the sequence given in ``address_list``.
+    In the example above, if the two first nodes are swapped, ``prg_00`` will be addressed to ``cliche02``
+    and ``prg_01`` to ``cliche01``.
 
 .. attention::
 
     In the program configuration file, it is expected that the ``numprocs`` value matches the number of elements in ``address_list``.
-    If the length of ``address_list`` is greater than the ``numprocs`` value, programs will be addressed to the ``numprocs`` first addresses.
+    If the length of ``address_list`` is greater than the ``numprocs`` value, programs will be addressed to the ``numprocs`` first nodes.
     On the other side, if the length of ``address_list`` is lower than the ``numprocs`` value,
-    the last programs won't be addressed to any address and it won't be possible to start them using **Supvisors**.
+    the last programs won't be addressed to any node and it won't be possible to start them using **Supvisors**.
     Nevertheless, in this case, it will be still possible to start them with Supervisor.
 
 
@@ -530,20 +537,20 @@ Here follows the definition of the rules applicable to an application.
 ``start_sequence``
 
     This element gives the starting rank of the application in the ``DEPLOYMENT`` state, when applications are started automatically.
-    When <= 0, the application is not started.
-    When > 0, the application is started in the given order.
+    When <= ``0``, the application is not started.
+    When > ``0``, the application is started in the given order.
 
-    *Default*:  0.
+    *Default*:  ``0``.
 
     *Required*:  No.
 
 ``stop_sequence``
 
     This element gives the stopping rank of the application when all applications are stopped just before **Supvisors** is restarted or shut down.
-    When <= 0, **Supvisors** does nothing and let Supervisor do the job, i.e. stop everything in any order.
-    When > 0, **Supvisors** stops the application in the given order BEFORE the restart or shutdown of Supervisor is requested.
+    When <= ``0``, **Supvisors** does nothing and let Supervisor do the job, i.e. stop everything in any order.
+    When > ``0``, **Supvisors** stops the application in the given order BEFORE the restart or shutdown of Supervisor is requested.
 
-    *Default*:  0.
+    *Default*:  ``0``.
 
     *Required*:  No.
 
@@ -554,7 +561,7 @@ Here follows the definition of the rules applicable to an application.
             * when calling Supervisor's ``restart`` or ``shutdown`` XML-RPC,
             * when stopping the :command:`supervisord` daemon.
 
-        It only works when calling **Supvisor**'s ``restart`` or ``shutdown``.
+        It only works when calling **Supvisors**' ``restart`` or ``shutdown``.
 
 ``starting_failure_strategy``
 
@@ -565,7 +572,7 @@ Here follows the definition of the rules applicable to an application.
         * ``STOP``: Stop the application.
         * ``CONTINUE``: Skip the failure and continue the application starting.
 
-    *Default*:  ABORT.
+    *Default*:  ``ABORT``.
 
     *Required*:  No.
 
diff --git a/docs/dashboard.rst b/docs/dashboard.rst
index 20fb1fed..adaf543f 100644
--- a/docs/dashboard.rst
+++ b/docs/dashboard.rst
@@ -34,7 +34,7 @@ Common Menu
 Clicking on the 'Supvisors' title brings the `Main page`_ back or the `Conciliation page`_ if it blinks in red.
 The version of **Supvisors** is displayed underneath.
 
-Below is the Addresses part that lists all the addresses defined in the :ref:`supvisors_section` of the Supervisor configuration file.
+Below is the Addresses part that lists all the nodes defined in the :ref:`supvisors_section` of the Supervisor configuration file.
 The color gives the state of the Address, as seen by the **Supvisors** instance that is displaying this page:
 
     * grey for ``UNKNOWN``,
@@ -43,7 +43,7 @@ The color gives the state of the Address, as seen by the **Supvisors** instance
     * green for ``RUNNING``,
     * red for ``ISOLATED``.
 
-Only the hyperlinks of the ``RUNNING`` addresses are active. The browser is redirected to the `Address page`_ of the corresponding Web Server.
+Only the hyperlinks of the ``RUNNING`` nodes are active. The browser is redirected to the `Address page`_ of the corresponding Web Server.
 The **Supvisors** instance playing the role of "Master" is pointed out with the ✪ sign.
 
 Below is the Application part that lists all the applications defined through the
@@ -80,8 +80,7 @@ The state of **Supvisors** is displayed on the left side of the header:
     This is the **Supvisors** starting phase, waiting for all **Supvisors** instances to connect themselves.
     Refer to the :ref:`synchronizing` section for more details.
 
-    In this state, the **Supvisors** :ref:`xml_rpc` is restricted so that version, master and address
-    information only are available.
+    In this state, the **Supvisors** :ref:`xml_rpc` is restricted so that version, master and node information only are available.
 
 ``DEPLOYMENT``
 
@@ -140,20 +139,22 @@ On the right side, 3 buttons are available:
 Main Page Contents
 ~~~~~~~~~~~~~~~~~~
 
-For every addresses, a box is displayed in the contents of the **Supvisors** Main Page.
+For every nodes, a box is displayed in the contents of the **Supvisors** Main Page.
 Each box contains:
 
-    * the address name, which is a hyperlink to the corresponding `Address Page`_ if the Address state is ``RUNNING``,
-    * the state of the Address, colored with the same rules used in the `Common Menu`_,
-    * the process loading of the Address,
-    * the list of all processes that are running on this address.
+    * the Address name, which is a hyperlink to the corresponding `Address Page`_ if the Address state is ``RUNNING``,
+    * the Address state, colored with the same rules used in the `Common Menu`_,
+    * the Address process loading,
+    * the list of all processes that are running on this node.
 
 
 Conciliation Page
 -----------------
 
-If the page is refreshed when **Supvisors** is in ``CONCILIATION`` state, the 'Supvisors' label in the top left of the `Common Menu`_ becomes red and blinks.
-This situation is unlikely to happen if the ``conciliation_strategy`` chosen in the :ref:`supvisors_section` of the Supervisor configuration file is different from ``USER``, as the other values will lead to an immediate conciliation of the conflicts.
+If the page is refreshed when **Supvisors** is in ``CONCILIATION`` state, the 'Supvisors' label in the top left
+of the `Common Menu`_ becomes red and blinks.
+This situation is unlikely to happen if the ``conciliation_strategy`` chosen in the :ref:`supvisors_section`
+of the Supervisor configuration file is different from ``USER``, as the other values will lead to an immediate conciliation of the conflicts.
 
 The Conciliation Page can be reached by clicking on this blinking red label.
 
@@ -176,8 +177,8 @@ A process conflict is raised when the same program is running on several hosts.
 So the table lists, for each conflict:
 
     * the name of the program incriminated,
-    * the list of addresses where it is running,
-    * the uptime of the corresponding process on each address,
+    * the list of nodes where it is running,
+    * the uptime of the corresponding process on each node,
     * for each process, a list of actions helping to the solving of this conflict:
 
         + Stop the process,
@@ -192,20 +193,21 @@ Address Page
 ------------
 
 The Address Page of **Supvisors** is a bit less "sparse" than the web page provided by Supervisor.
-It shows the status of the address, as seen by the local **Supvisors** instance.
-It also enables the user to command the processes declared on this address and provides statistics that may be useful at software integration time.
+It shows the status of the node, as seen by the local **Supvisors** instance.
+It also enables the user to command the processes declared on this node and provides statistics that may be useful at software integration time.
 
 Address Page Header
 ~~~~~~~~~~~~~~~~~~~
 
 The status of the Address is displayed on the left side of the header:
 
-    * the name of the address, marked with the ✪ sign if it corresponds to the "Master",
-    * the current loading of the processes running on this address,
-    * the state of this address,
-    * the date of the last tick received from Supervisor on this address.
+    * the Address name, marked with the ✪ sign if it corresponds to the "Master",
+    * the current loading of the processes running on this node,
+    * the Address state,
+    * the date of the last tick received from the Supervisor running on this node.
 
-In the middle of the header, the 'Statistics View' box enables the user to choose the information presented on this page. By default, the `Processes Section`_ is displayed. The other choice is the `Host Section`_.
+In the middle of the header, the 'Statistics View' box enables the user to choose the information presented on this page.
+By default, the `Processes Section`_ is displayed. The other choice is the `Host Section`_.
 The periods can be updated in the :ref:`supvisors_section` of the Supervisor configuration file.
 
 Next to it, the 'Statistics Period' box enables the user to choose the period used for the statistics of this page.
@@ -213,9 +215,9 @@ The periods can be updated in the :ref:`supvisors_section` of the Supervisor con
 
 On the right side, 4 buttons are available:
 
-    * |stop| stops all processes handled by Supervisor on this address,
-    * |restart| restarts Supervisor on this address,
-    * |shutdown| shuts down Supervisor on this address,
+    * |stop| stops all processes handled by Supervisor on this node,
+    * |restart| restarts Supervisor on this node,
+    * |shutdown| shuts down Supervisor on this node,
     * |refresh| refreshes the current page.
 
 Processes Section
@@ -226,9 +228,10 @@ Processes Section
     :align: center
 
 The Processes Section looks like the page provided by Supervisor.
-Indeed, it lists the programs that are configured in Supervisor, it presents their current state with an associated description and enables the user to perform some actions on them:
+Indeed, it lists the programs that are configured in Supervisor, it presents their current state with an associated
+description and enables the user to perform some actions on them:
 
-    * log tail (with a refresh button, click on the program name itself),
+    * Log tail (with a refresh button, click on the program name itself),
     * Start,
     * Stop,
     * Restart,
@@ -270,7 +273,7 @@ Host Section
     :alt: Host Section of Supvisors Address Page
     :align: center
 
-The Host Section contains CPU, Memory and Network statistics for the considered address.
+The Host Section contains CPU, Memory and Network statistics for the considered node.
 
 The CPU table shows statistics about the CPU on each core of the processor and about the average CPU of the processor.
 
@@ -284,7 +287,8 @@ Clicking on a button associated to the resource displays detailed statistics (gr
 Application Page
 ----------------
 
-The Application Page of **Supvisors** shows the status of the application, as seen by the requested **Supvisors** instance, enables the user to command the application and its processes, and provides statistics that may be useful at software integration time.
+The Application Page of **Supvisors** shows the status of the application, as seen by the requested **Supvisors** instance,
+enables the user to command the application and its processes, and provides statistics that may be useful at software integration time.
 
 .. image:: images/supvisors_application_page.png
     :alt: Supvisors Application page
@@ -304,11 +308,13 @@ The status of the Address is displayed on the left side of the header:
         + orange if ``RUNNING`` and at least one minor failure is detected, and no major failure,
         + green if ``RUNNING`` and no failure is detected.
 
-The second part of the header is the 'Starting strategy' box that enables the user to choose the strategy to start the application programs listed below.
+The second part of the header is the 'Starting strategy' box that enables the user to choose the strategy
+to start the application programs listed below.
 
 Strategies are detailed in :ref:`starting_strategy`.
 
-The third part of the header is the 'Statistics Period' box that enables the user to choose the period used for the statistics of this page. The periods can be updated in the :ref:`supvisors_section` of the Supervisor configuration file.
+The third part of the header is the 'Statistics Period' box that enables the user to choose the period used
+for the statistics of this page. The periods can be updated in the :ref:`supvisors_section` of the Supervisor configuration file.
 
 On the right side, 4 buttons are available:
 
@@ -323,7 +329,7 @@ Application Page Contents
 The table lists all the programs belonging to the application, and it shows:
 
     * the 'synthetic' state of the process (refer to this note for details about the synthesis),
-    * the address where it runs, if appropriate,
+    * the node where it runs, if appropriate,
     * the description (from Supervisor),
     * the loading declared for the process in the rules file,
     * the CPU usage of the process during the last period (only if the process is ``RUNNING``),
@@ -338,8 +344,9 @@ Like the `Address page`_, the Application page enables the user to perform some
     * Tail stdout log (auto-refreshed),
     * Tail stderr log (auto-refreshed).
 
-The difference is that the process is not started necessarily on the address that displays this page.
-Indeed, **Supvisors** uses the rules of the program (as defined in the rules file) and the starting strategy selected in the header part to choose a relevant address.
+The difference is that the process is not started necessarily on the node that displays this page.
+Indeed, **Supvisors** uses the rules of the program (as defined in the rules file) and the starting strategy selected
+in the header part to choose a relevant node.
 
 As previously, a click on the CPU or Memory measures shows detailed statistics about the process.
 
diff --git a/docs/event_interface.rst b/docs/event_interface.rst
index ffd7eec6..56864781 100644
--- a/docs/event_interface.rst
+++ b/docs/event_interface.rst
@@ -7,9 +7,8 @@ Protocol
 --------
 
 The **Supvisors** Event Interface relies on a `ZeroMQ <http://zeromq.org>`_ socket.
-To receive the **Supvisors** events, the client application must configure a socket
-with a ``SUBSCRIBE`` pattern and connect it on localhost using the ``event_port``
-defined in the :ref:`supvisors_section` of the Supervisor configuration file.
+To receive the **Supvisors** events, the client application must configure a socket with a ``SUBSCRIBE`` pattern
+and connect it on localhost using the ``event_port`` defined in the :ref:`supvisors_section` of the Supervisor configuration file.
 
 **Supvisors** publishes the events in multi-parts messages.
 
@@ -17,8 +16,8 @@ defined in the :ref:`supvisors_section` of the Supervisor configuration file.
 Message header
 --------------
 
-The first part is a header that consists in an unicode string. This header
-identifies the type of the event, defined as follows in the supvisors.utils module:
+The first part is a header that consists in an unicode string. This header identifies the type of the event,
+defined as follows in the supvisors.utils module:
 
 .. code-block:: python
 
@@ -28,11 +27,9 @@ identifies the type of the event, defined as follows in the supvisors.utils modu
     PROCESS_STATUS_HEADER = u'process'
     PROCESS_EVENT_HEADER = u'event'
 
-ZeroMQ makes it possible to filter the messages received on the client side by
-subcribing to a part of them.
+ZeroMQ makes it possible to filter the messages received on the client side by subscribing to a part of them.
 To receive all messages, just subscribe using an empty string.
-For example, the following lines in python configure the ZMQ socket so as to
-receive only the ``Supvisors`` and ``Process`` events:
+For example, the following lines in python configure the ZMQ socket so as to receive only the ``Supvisors`` and ``Process`` events:
 
 .. code-block:: python
 
@@ -43,8 +40,7 @@ receive only the ``Supvisors`` and ``Process`` events:
 Message data
 ------------
 
-The second part of the message is a dictionary serialized in JSON. Of course,
-the contents depends on the message type.
+The second part of the message is a dictionary serialized in JSON. Of course, the contents depends on the message type.
 
 
 **Supvisors** status
@@ -64,12 +60,12 @@ Address status
 ================== ==================
 Key	               Value
 ================== ==================
-'address_name'     The name of the address.
-'statecode'        The state of the address, in [0;5].
-'statename'        The string state of the address, among { ``'UNKNOWN'``, ``'CHECKING'``, ``'RUNNING'``, ``'SILENT'``, ``'ISOLATING'``, ``'ISOLATED'`` }.
-'remote_time'      The date of the last ``TICK`` event received from this address, in ms.
-'local_time'       The local date of the last ``TICK`` event received from this address, in ms.
-'loading'          The sum of the expected loading of the processes running on the address, in [0;100]%.
+'address_name'     The Address name.
+'statecode'        The Address state, in [0;5].
+'statename'        The Address state as string, among { ``'UNKNOWN'``, ``'CHECKING'``, ``'RUNNING'``, ``'SILENT'``, ``'ISOLATING'``, ``'ISOLATED'`` }.
+'remote_time'      The date of the last ``TICK`` event received from this node, in ms.
+'local_time'       The local date of the last ``TICK`` event received from this node, in ms.
+'loading'          The sum of the expected loading of the processes running on the node, in [0;100]%.
 ================== ==================
 
 
@@ -79,9 +75,9 @@ Application status
 ================== ==================
 Key	               Value
 ================== ==================
-'application_name' The name of the application.
-'statecode'        The state of the application, in [0;3].
-'statename'        The string state of the application, among { ``'STOPPED'``, ``'STARTING'``, ``'RUNNING'``, ``'STOPPING'`` }.
+'application_name' The Application name.
+'statecode'        The Application state, in [0;3].
+'statename'        The Application state as string, among { ``'STOPPED'``, ``'STARTING'``, ``'RUNNING'``, ``'STOPPING'`` }.
 'major_failure'    True if the application is running and at least one required process is not started.
 'minor_failure'    True if the application is running and at least one optional (not required) process is not started.
 ================== ==================
@@ -93,13 +89,13 @@ Process status
 ================== ==================
 Key	               Value
 ================== ==================
-'application_name' The name of the application.
-'process_name'     The name of the process.
-'statecode'        The state of the process, in {0, 10, 20, 30, 40, 100, 200, 1000}.
-'statename'        The string state of the process, among { ``'STOPPED'``, ``'STARTING'``, ``'RUNNING'``, ``'BACKOFF'``, ``'STOPPING'``, ``'EXITED'``, ``'FATAL'``, ``'UNKNOWN'`` }.
+'application_name' The Application name.
+'process_name'     The Process name.
+'statecode'        The Process state, in {0, 10, 20, 30, 40, 100, 200, 1000}.
+'statename'        The Process state as string, among { ``'STOPPED'``, ``'STARTING'``, ``'RUNNING'``, ``'BACKOFF'``, ``'STOPPING'``, ``'EXITED'``, ``'FATAL'``, ``'UNKNOWN'`` }.
 'expected_exit'    True if the exit status is expected (only when state is ``EXITED``).
-'last_event_time'  The date of the last process event received for this process, regardless of the originating **Supvisor** instance.
-'addresses'        The list of addresses where the process is running.
+'last_event_time'  The date of the last process event received for this process, regardless of the originating **Supvisors** instance.
+'addresses'        The list of nodes where the process is running.
 'extra_args'       The additional arguments passed to the command line of the process.
 ================== ==================
 
@@ -110,13 +106,13 @@ Process event
 ================== ==================
 Key                Value
 ================== ==================
-'group'            The name of the application.
-'name'             The name of the process.
-'state'            The state of the process, in {0, 10, 20, 30, 40, 100, 200, 1000}.
+'group'            The Application name.
+'name'             The Process name.
+'state'            The Process state, in {0, 10, 20, 30, 40, 100, 200, 1000}.
 'expected'         True if the exit status is expected (only when state is 100 - ``EXITED``).
-'now'              The date of the event in the reference time of the address.
+'now'              The date of the event in the reference time of the node.
 'pid'              The UNIX process ID (only when state is 20 - ``RUNNING`` or 40 - ``STOPPING``).
-'address'          The address where the event comes from.
+'address'          The node where the event comes from.
 'extra_args'       The additional arguments passed to the command line of the process.
 ================== ==================
 
@@ -124,15 +120,13 @@ Key                Value
 Event Clients
 -------------
 
-This section explains how to use receive the **Supvisors** Events from a Python,
-JAVA or C++ client.
+This section explains how to use receive the **Supvisors** Events from a Python or JAVA client.
 
 
 Python Client
 ~~~~~~~~~~~~~
 
-The *SupvisorsEventInterface* is designed to receive the **Supvisors** events
-from the local **Supvisors** instance.
+The *SupvisorsEventInterface* is designed to receive the **Supvisors** events from the local **Supvisors** instance.
 No additional third party is required.
 
 
@@ -162,13 +156,12 @@ JAVA Client
 ~~~~~~~~~~~
 
 Each **Supvisors** release includes a JAR file that contains a JAVA client.
-It can be downloaded from the `Supvisors releases
-<https://github.com/julien6387/supvisors/releases>`_.
+It can be downloaded from the `Supvisors releases <https://github.com/julien6387/supvisors/releases>`_.
 
-The *SupvisorsEventSubscriber* of the ``org.supvisors.event package`` is
-designed to receive the **Supvisors** events from the local **Supvisors** instance.
-A *SupvisorsEventListener* with a specialization of the methods ``onXxxStatus``
-must be attached to the *SupvisorsEventSubscriber* instance to receive the notifications.
+The *SupvisorsEventSubscriber* of the ``org.supvisors.event package`` is designed to receive the **Supvisors** events
+from the local **Supvisors** instance.
+A *SupvisorsEventListener* with a specialization of the methods ``onXxxStatus`` must be attached to
+the *SupvisorsEventSubscriber* instance to receive the notifications.
 
 It requires the following additional dependencies:
 
diff --git a/docs/introduction.rst b/docs/introduction.rst
index e1b68df8..351272a9 100644
--- a/docs/introduction.rst
+++ b/docs/introduction.rst
@@ -4,17 +4,15 @@ Introduction
 Overview
 --------
 
-**Supvisors** is a control system for distributed applications over multiple
-Supervisor_ instances.
+**Supvisors** is a control system for distributed applications over multiple Supervisor_ instances.
 
-This piece of software is born from a common need in embedded systems where
-applications are distributed over several boards.
+This piece of software is born from a common need in embedded systems where applications are distributed over several nodes.
 
 This problematic comes with the following challenges:
 
     * have a detailed status of the application,
     * have basic statistics about the resources taken by the application,
-    * have a basic status of the boards,
+    * have a basic status of the nodes,
     * start / stop processes dynamically,
     * distribute the same application according to different platforms,
     * control the application from outside of the platform,
@@ -22,19 +20,17 @@ This problematic comes with the following challenges:
     * deal with loading (CPU, memory, etc),
     * deal with failures:
 
-        + missing board when starting,
+        + missing node when starting,
         + crash of a process,
-        + crash of a board.
+        + crash of a node.
 
 Icing on the cake:
 
     * it should be free, open source, without export control,
     * it shouldn't require specific administration rights (root).
 
-After some researches on the net, it seems that there is no simple,
-free and open source solution that meets all these requirements.
-Supervisor_ can handle a part of these requirements but it only
-works on a single UNIX-like operating system.
+After some researches on the net, it seems that there is no simple, free and open source solution that meets all these requirements.
+Supervisor_ can handle a part of these requirements but it only works on a single UNIX-like operating system.
 
 The Supervisor website references some `third parties <http://supervisord.org/plugins.html>`_
 that deal with multiple Supervisor instances but they only consist in dashboards and none of them is focused on the application itself.
@@ -121,21 +117,19 @@ Install **Supvisors** with the following command:
 Running **Supvisors**
 ---------------------
 
-**Supvisors** runs as a plugin of Supervisor so it follows the same principle as
-`Running Supervisor <http://supervisord.org/running.html>`_ but using multiple
-UNIX-like operating systems.
+**Supvisors** runs as a plugin of Supervisor so it follows the same principle as `Running Supervisor <http://supervisord.org/running.html>`_
+but using multiple UNIX-like operating systems.
 
-However, the Supervisor configuration file MUST:
+However, the Supervisor configuration file **MUST**:
 
     * be configured with an internet socket (refer to the `inet-http-server <http://supervisord.org/configuration.html#inet-http-server-section-settings>`_ section settings),
     * include the :command:`[supvisors]` section (refer to the :ref:`Configuration` part).
 
 .. note::
 
-    A script may be required to start Supervisor on several addresses if not configured
-    to run automatically at startup (ssh loop for example).
+    A script may be required to start Supervisor on several addresses if not configured to run automatically at startup (ssh loop for example).
 
-    All Supervisor instances should be started during a given lap of time so that **Supvisors** works as expected.
+    All Supervisor instances should be started during a configurable lap of time so that **Supvisors** works as expected.
 
 .. _Supervisor: http://supervisord.org
 .. _PyZMQ: http://pyzmq.readthedocs.io
@@ -143,4 +137,3 @@ However, the Supervisor configuration file MUST:
 .. _netifaces: https://pypi.python.org/pypi/netifaces
 .. _matplotlib: http://matplotlib.org
 .. _lxml: http://lxml.de
-
diff --git a/docs/special.rst b/docs/special.rst
index 38eeb621..b8d6c20b 100644
--- a/docs/special.rst
+++ b/docs/special.rst
@@ -1,71 +1,61 @@
-Special Functionalities
-=======================
+Special Features
+================
 
 .. _synchronizing:
 
 Synchronizing **Supvisors** instances
 -------------------------------------
 
-The ``INITIALIZATION`` state of **Supvisors** is used as a synchronization phase
-so that all **Supvisors** instances are aware of all of them.
+The ``INITIALIZATION`` state of **Supvisors** is used as a synchronization phase so that all **Supvisors** instances are mutually aware of each other.
 
-The following options defined in the :ref:`supvisors_section` of the Supervisor
-configuration file are particularly used for synchronizing multiple instances
-of Supervisor:
+The following options defined in the :ref:`supvisors_section` of the Supervisor configuration file are particularly
+used for synchronizing multiple instances of Supervisor:
 
     * the ``address_list``,
     * the ``internal_port``,
     * the ``synchro_timeout``,
     * the ``auto_fence``.
 
-Once started, all **Supvisors** instances publish the events received,
-especially the ``TICK`` events that are produced every 5 seconds, on their
-``PUBLISH`` ZeroMQ socket bound on the ``internal_port``.
+Once started, all **Supvisors** instances publish the events received, especially the ``TICK`` events that are
+triggered every 5 seconds, on their ``PUBLISH`` ZeroMQ socket bound on the ``internal_port``.
 
-On the other side, all **Supvisors** instances start a thread that subscribes
-to the internal events through an internal ``SUBSCRIBE`` ZeroMQ socket
-connected to the ``internal_port`` of **all** addresses of the ``address_list``.
+On the other side, all **Supvisors** instances start a thread that subscribes to the internal events
+through an internal ``SUBSCRIBE`` ZeroMQ socket connected to the ``internal_port`` of **all** nodes of the ``address_list``.
 
-At the beginning, all addresses are in an ``UNKNOWN`` state.
-When the first ``TICK`` event is received from a remote **Supvisors** instance,
-the local **Supvisors** instance:
+At the beginning, all Address instances are in an ``UNKNOWN`` state.
+When the first ``TICK`` event is received from a remote **Supvisors** instance, the local **Supvisors** instance:
 
-    * sets the remote address state to ``CHECKING``,
+    * sets the remote Address state to ``CHECKING``,
     * performs a ``supvisors.get_address_info(local_address)`` XML-RPC to the remote **Supvisors** instance, in order to know how it is seen by the remote instance.
-    * 2 possibilities:
 
-        + the local **Supvisors** instance is seen as ``ISOLATED`` by the remote instance:
+At this stage, 2 possibilities:
 
-            - it sets the remote address state to ``ISOLATED``,
-            - it disconnects the URL of the remote **Supvisors** instance from the ``SUBSCRIBE`` ZeroMQ socket,
+    * the local **Supvisors** instance is seen as ``ISOLATED`` by the remote instance:
 
-        + the local **Supvisors** instance is NOT seen as ``ISOLATED`` by the remote instance:
+        + it sets the remote Address state to ``ISOLATED``,
+        + it disconnects the URL of the remote **Supvisors** instance from the ``SUBSCRIBE`` ZeroMQ socket,
 
-            - it performs a ``supervisor.getAllProcessInfo()`` XML-RPC to the remote instance,
-            - it loads the processes information into the internal data model,
-            - it sets the remote address state to ``RUNNING``.
+    * the local **Supvisors** instance is NOT seen as ``ISOLATED`` by the remote instance:
 
-When all **Supvisors** instances are identified as ``RUNNING`` or ``ISOLATED``,
-the synchronization is completed.
-**Supvisors** then is able to work with the whole set of addresses declared in
-``address_list``.
+        + it performs a ``supervisor.getAllProcessInfo()`` XML-RPC to the remote instance,
+        + it loads the processes information into the internal data model,
+        + it sets the remote address state to ``RUNNING``.
 
-However, it may happen that some **Supvisors** instances do not publish as
-expected (very late starting, no starting at all, system down, network down,
-etc). Each **Supvisors** instance waits for ``synchro_timeout`` seconds to give
-a chance to all other instances to publish. When this delay is exceeded, all
-the **Supvisors** instances that are **not** identified as ``RUNNING`` or
-``ISOLATED`` are set to:
+When all **Supvisors** instances are identified as ``RUNNING`` or ``ISOLATED``, the synchronization is completed.
+**Supvisors** then is able to work with the set (or subset) of nodes declared in ``address_list``.
+
+However, it may happen that some **Supvisors** instances do not publish as expected (very late starting,
+no starting at all, system down, network down, etc). Each **Supvisors** instance waits for ``synchro_timeout``
+seconds to give a chance to all other instances to publish. When this delay is exceeded, all the **Supvisors**
+instances that are **not** identified as ``RUNNING`` or ``ISOLATED`` are set to:
 
     * ``SILENT`` if `Auto-Fencing`_ is **not** activated,
     * ``ISOLATED`` if `Auto-Fencing`_ is activated.
 
-In this case, **Supvisors** will work with a sub-set of the addresses declared
-in ``address_list``.
+In this case, **Supvisors** will work with a subset of the nodes declared in ``address_list``.
 
-Whatever the number of available addresses, **Supvisors** elect a Master among
-the active addresses and enters in the ``DEPLOYMENT`` phase to start
-automatically the applications.
+Whatever the number of available nodes, **Supvisors** elects a Master among the active nodes
+and enters in the ``DEPLOYMENT`` phase to start automatically the applications.
 
 
 .. _auto_fencing:
@@ -73,47 +63,79 @@ automatically the applications.
 Auto-Fencing
 ------------
 
-Auto-fencing is applied when the ``auto_fence`` option of the
-:ref:`supvisors_section` is set.
-It takes place when one of the **Supvisors** instance is seen as inactive
-(crash, system power down, network failure) from the other **Supvisors**
-instances.
-
-In this case, the running **Supvisors** instances disconnect the corresponding
-URL from their subscription socket.
-The address is marked as ``ISOLATED`` and, in accordance with the rules defined
-and the value of the ``autorestart`` option of the program, **Supvisors** may
-try to restart somewhere else the processes that were eventually running
-on that address.
-
-If the incriminated system restarts, and the **Supvisors** instance is
-restarted on that system too, the isolation doesn't prevent the new
-**Supvisors** instance to receive events from the other instances that have
-isolated it.
-Indeed, it is not possible to filter the subscribers from the ``PUBLISH`` side
-of a ZeroMQ socket.
+Auto-fencing is applied when the ``auto_fence`` option of the :ref:`supvisors_section` is set.
+It takes place when one of the **Supvisors** instance is seen as inactive (crash, system power down, network failure)
+from the other **Supvisors** instances.
+
+In this case, the running **Supvisors** instances disconnect the corresponding URL from their subscription socket.
+The Address is marked as ``ISOLATED`` and, in accordance with the rules defined and the value of the ``autorestart``
+option of the program, **Supvisors** may try to restart somewhere else the processes that were eventually running
+on that node.
+
+If the incriminated node restarts, and the **Supvisors** instance is restarted on that system too, the isolation
+doesn't prevent the new **Supvisors** instance to receive events from the other instances that have isolated it.
+Indeed, it is not possible to filter the subscribers from the ``PUBLISH`` side of a ZeroMQ socket.
 
 That's why a kind of port-knocking is performed in :ref:`synchronizing`.
-Each newly arrived **Supvisors** instance asks to the others if it has been
-previously isolated before taking into account the incoming events.
+Each newly arrived **Supvisors** instance asks to the others if it has been previously isolated before taking
+into account the incoming events.
 
-In the case of a network failure, the same mechanism is of course applied on
-the other side. Here comes the premices of a *split-brain syndrome*, as it
-leads to have 2 separate and identical sets of applications.
+In the case of a network failure, the same mechanism is of course applied on the other side.
+Here comes the premises of a *split-brain syndrome*, as it leads to have 2 separate and identical sets of applications.
 
-If the network failure is fixed, both sets of **Supvisors** are still running
-but do not communicate between them.
+If the network failure is fixed, both sets of **Supvisors** are still running but do not communicate between them.
 
 .. attention::
 
-    **Supvisors** does NOT isolate the addresses at the operating system level,
-    so that when the incriminated systems become active again, it is still
-    possible to perform network requests between all systems, despite the
+    **Supvisors** does NOT isolate the nodes at the Operating System level, so that when the incriminated nodes
+    become active again, it is still possible to perform network requests between all nodes, despite the
     **Supvisors** instances do not communicate anymore.
 
-    Similarly, it is outside the scope of **Supvisors** to isolate the address
-    at application level. It is the user's responsibility to isolate his
-    applications.
+    Similarly, it is outside the scope of **Supvisors** to isolate the nodes at application level.
+    It is the user's responsibility to isolate his applications.
+
+
+.. _extra_arguments:
+
+Extra Arguments
+----------------
+
+When using Supervisor, colleagues have often asked if it would be possible to add extra arguments to the command
+line of a program without declaring them in the ini file. Indeed, the applicative context is evolving at runtime and it may
+be quite useful to give some information to the new process (options, path, URL of a server, URL of a display, ...),
+especially when dealing with distributed applications.
+
+With Supervisor, it is possible to inform the process with a ``supervisor.sendProcessStdin`` XML-RPC.
+The first drawback is that it requires to update the source code of an existing program that is already capable of
+reading instructions from its command line. That is not always possible.
+On the other hand, colleagues found the solution so clumsy that they finally preferred to use a dedicated com to configure the process.
+
+So, **Supvisors** introduces new XML-RPCs that are capable of taking into account extra arguments that are passed
+to the command line before the process is started:
+
+   * ``supvisors.start_args``: start a process on the local system,
+   * ``supvisors.start_process``: start a process using a starting strategy.
+
+.. hint::
+
+    These additional commands are an answer to the following Supervisor request:
+
+        * `#1023 - Pass arguments to program when starting a job? <https://github.com/Supervisor/supervisor/issues/1023>`_
+
+.. note::
+
+    The extra arguments of the program are shared by all Supervisor instances.
+    Once used, they are published through a **Supvisors** internal event and are stored directly into the Supervisor
+    internal configuration of the programs.
+
+    In other words, considering 2 nodes A and B, a process that is started on node A with extra arguments and
+    configured to restart on node crash (refer to `Running Failure strategy`_), if the node A crashes (or simply
+    becomes unreachable), the process will be restarted on node B with the same extra arguments.
+
+.. attention::
+
+    A limitation however: the extra arguments are reset each time a new node connects to the other ones,
+    either because it has started later or because it has been disconnected for a while due to a network issue.
 
 
 .. _running_failure_strategy:
@@ -121,19 +143,14 @@ but do not communicate between them.
 Running Failure strategy
 ------------------------
 
-The ``autorestart`` option of Supervisor may be used to restart automatically a
-process that has crashed or has exited unexpectedly (or not).
-However, when the system itself crashes or becomes unreachable, the other
-Supervisor instances cannot do anything about that.
+The ``autorestart`` option of Supervisor may be used to restart automatically a process that has crashed or has exited unexpectedly (or not).
+However, when the node itself crashes or becomes unreachable, the other Supervisor instances cannot do anything about that.
 
-**Supvisors** uses the ``running_failure_strategy`` option of the rules file to
-warm restart a process that was running on a system that has crashed, in
-accordance with the default ``starting_strategy`` set in the
-:ref:`supvisors_section` and with the ``address_list`` program rules set in the
-:ref:`rules_file`.
+**Supvisors** uses the ``running_failure_strategy`` option of the rules file to warm restart a process that was
+running on a node that has crashed, in accordance with the default ``starting_strategy`` set in the
+:ref:`supvisors_section` and with the ``address_list`` program rules set in the :ref:`rules_file`.
 
-This option can be also used to stop or restart the whole application after a
-process crash.
+This option can be also used to stop or restart the whole application after a process crash.
 
 Possible values are:
 
@@ -148,46 +165,39 @@ Possible values are:
 Starting strategy
 -----------------
 
-**Supvisors** provides a means to start a process without telling explicitly
-where it has to be started, and in accordance with the rules defined for this
-program, i.e. the ``address_list``.
+**Supvisors** provides a means to start a process without telling explicitly where it has to be started,
+and in accordance with the rules defined for this program, i.e. the ``address_list``.
 
 
-Choosing an address
+Choosing a node
 ~~~~~~~~~~~~~~~~~~~
 
-Two rules are applicable with all strategies:
+The following rules are applicable whatever the chosen strategy:
 
-    * the chosen address must be ``RUNNING``,
+    * the chosen node must be ``RUNNING``,
     * the *loading* of the chosen address must not exceed 100% when adding the ``loading`` of the process to be started.
 
-The *loading* of the chosen address is defined as the sum of the ``loading``
-of each process running on this address.
+The *loading* of the chosen node is defined as the sum of the ``loading`` of each process running on this address.
 
-When applying the ``CONFIG`` strategy, **Supvisors** chooses the first address
-available in the ``address_list``.
+When applying the ``CONFIG`` strategy, **Supvisors** chooses the first node available in the ``address_list``.
 
-When applying the ``LESS_LOADED`` strategy, **Supvisors** chooses the address
-in the ``address_list`` having the lowest expected *loading*.
-The aim is to distribute the process loading among the available hosts.
+When applying the ``LESS_LOADED`` strategy, **Supvisors** chooses the node in the ``address_list`` having the lowest expected *loading*.
+The aim is to distribute the process loading among the available nodes.
 
-When applying the ``MOST_LOADED`` strategy, with respect of the common rules,
-**Supvisors** chooses the address
-in the ``address_list`` having the greatest expected *loading*.
-The aim is to maximize the loading of a host before starting to load another
-host.
+When applying the ``MOST_LOADED`` strategy, with respect of the common rules, **Supvisors** chooses the node in
+the ``address_list`` having the greatest expected *loading*.
+The aim is to maximize the loading of a node before starting to load another node.
 This strategy is more interesting when the resources are limited.
 
 
 Starting a process
 ~~~~~~~~~~~~~~~~~~
 
-The internal *Starter* of **Supervisors** applies the following algorithm to
-start a process:
+The internal *Starter* of **Supvisors** applies the following algorithm to start a process:
 
 | if process state is not ``RUNNING``:
-|     choose a starting address for the program in accordance with the rules defined above
-|     perform a ``supvisors.start_args(namespec)`` XML-RPC to the **Supvisors** instance running on the chosen address
+|     choose a starting node for the program in accordance with the rules defined above
+|     perform a ``supvisors.start_args(namespec)`` XML-RPC to the **Supvisors** instance running on the chosen node
 |
 
 This single job is considered completed when:
@@ -197,73 +207,30 @@ This single job is considered completed when:
     * an error is encountered (``FATAL`` event, ``EXITED`` event with an unexpected exit code),
     * no ``STARTING`` event has been received 5 seconds after the XML-RPC.
 
-This principle is used for starting a single process using a
-``supvisors.start_process`` XML-RPC.
-
-
-Extra Arguments
-~~~~~~~~~~~~~~~
-
-When using Supervisor, collegues have often asked if it would be possible to
-add extra arguments on the command line of a program without declaring them in
-the ini file. Indeed, the applicative context is evolving at runtime and it may
-be quite useful to give some information to the new process (options, path,
-URL of a server, URL of a display, ...), especially when dealing with
-distributed applications.
-
-With Supervisor, it is possible to inform the process with a
-``supervisor.sendProcessStdin`` XML-RPC.
-The first drawback is that it requires to update the source code of an existing
-program that is already capable of reading instructions from its command line.
-That is not always possible.
-On the other hand, collegues found the solution so clumsy that they finally
-preferred to use a dedicated com to configure the process. Taste and colours...
-
-So, **Supvisors** introduces new XML-RPCs that are capable of taking into
-account extra arguments that are passed to the command line before the process
-is started:
-
-   * ``supvisors.start_args``: start a process on the local system,
-   * ``supvisors.start_process``: start a process using a starting strategy.
-
-.. note::
-
-    The extra arguments of the program are shared by all Supervisor instances.
-    Once used, they are published through a **Supvisors** internal event and
-    are stored directly into the Supervisor internal configuration of the
-    programs.
-
-    In other words, considering 2 systems A and B, a process that is started on
-    system A with extra arguments and configured to restart on system crash
-    (refer to `Running Failure strategy`_), if the system A crashes (or simply
-    becomes unreachable), the process will be restarted on system B with the
-    same extra arguments.
-
-.. attention::
-
-    A limitation however: the extra arguments are reset each time a new system
-    connects to the other ones, either because it has started later or because
-    it has been disconnected for a while due to a network issue.
-
+This principle is used for starting a single process using a ``supvisors.start_process`` XML-RPC.
 
 
 Starting an application
 ~~~~~~~~~~~~~~~~~~~~~~~
 
-The application start sequence is defined at the beginning the ``DEPLOYMENT``
-phase of **Supvisors**.
+The application start sequence is defined at the beginning the ``DEPLOYMENT`` phase of **Supvisors**.
 It corresponds to a dictionary where:
 
     * the keys correspond to the list of ``start_sequence`` values defined in the program rules of the application,
     * the value associated to a key is the list of programs having this key as ``start_sequence``.
 
+.. hint::
+
+    The logic applied here is an answer to the following Supervisor unresolved issues:
+
+        * `#122 - supervisord Starts All Processes at the Same Time <https://github.com/Supervisor/supervisor/issues/122>`_
+        * `#456 - Add the ability to set different "restart policies" on process workers <https://github.com/Supervisor/supervisor/issues/456>`_
+
 .. note::
 
-    The programs having a ``start_sequence`` lower or equal to 0 are not
-    considered, as they are not meant to be autostarted.
+    The programs having a ``start_sequence`` lower or equal to 0 are not considered, as they are not meant to be autostarted.
 
-The internal *Starter* of **Supervisors** applies the following algorithm to
-start an application:
+The internal *Starter* of **Supvisors** applies the following algorithm to start an application:
 
 | while application start sequence is not empty:
 |     pop the process list having the lower (strictly positive) ``start_sequence``
@@ -274,24 +241,21 @@ start an application:
 |     wait for the jobs to complete
 |
 
-This principle is used for starting a single application using a
-``supvisors.start_application`` XML-RPC.
+This principle is used for starting a single application using a ``supvisors.start_application`` XML-RPC.
 
 
 Starting all applications
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-When entering the ``DEPLOYMENT`` state, each **Supvisors** instance evaluates
-the global start sequence using the ``start_sequence`` rule configured for the
-applications and processes.
+When entering the ``DEPLOYMENT`` state, each **Supvisors** instance evaluates the global start sequence using
+the ``start_sequence`` rule configured for the applications and processes.
 
 The global start sequence corresponds to a dictionary where:
 
     * the keys correspond to the list of ``start_sequence`` values defined in the application rules,
     * the value associated to a key is the list of application start sequences whose applications have this key as ``start_sequence``.
 
-The **Supvisors** Master instance uses the global start sequence to start the
-applications in the defined order.
+The **Supvisors** Master instance uses the global start sequence to start the applications in the defined order.
 The following pseudo-code explains the algorithm used:
 
 | while global start sequence is not empty:
@@ -310,25 +274,21 @@ The following pseudo-code explains the algorithm used:
 
 .. note::
 
-    The applications having a ``start_sequence`` lower or equal to 0 are not
-    considered, as they are not meant to be autostarted.
+    The applications having a ``start_sequence`` lower or equal to 0 are not considered, as they are not meant to be autostarted.
 
 
 .. _stopping_strategy:
 
-
 Stopping strategy
 -----------------
 
-**Supvisors** provides a means to stop a process without telling explicitly
-where it is running.
+**Supvisors** provides a means to stop a process without telling explicitly where it is running.
 
 
 Stopping a process
 ~~~~~~~~~~~~~~~~~~
 
-The internal *Stopper* of **Supervisors** applies the following algorithm to
-stop a process:
+The internal *Stopper* of **Supvisors** applies the following algorithm to stop a process:
 
 | if process state is ``RUNNING``:
 |     perform a ``supervisor.stopProcess(namespec)`` XML-RPC to the Supervisor instance where the process is running
@@ -340,22 +300,25 @@ This single job is considered completed when:
     * an error is encountered (``FATAL`` event, ``EXITED`` event whatever the exit code),
     * no ``STOPPING`` event has been received 5 seconds after the XML-RPC.
 
-This principle is used for stopping a single process using a
-``supvisors.stop_process`` XML-RPC,
+This principle is used for stopping a single process using a ``supvisors.stop_process`` XML-RPC.
 
 
 Stopping an application
 ~~~~~~~~~~~~~~~~~~~~~~~
 
-The application stop sequence is defined at the beginning the ``DEPLOYMENT``
-phase of **Supvisors**.
+The application stop sequence is defined at the beginning the ``DEPLOYMENT`` phase of **Supvisors**.
 It corresponds to a dictionary where:
 
     * the keys correspond to the list of ``stop_sequence`` values defined in the program rules of the application,
     * the value associated to a key is the list of programs having this key as ``stop_sequence``.
 
-The internal *Stopper* of **Supervisors** applies the following algorithm to
-stop an application:
+.. hint::
+
+    The logic applied here is an answer to the following Supervisor unresolved issue:
+
+        * `#520 - allow a program to wait for another to stop before being stopped? <https://github.com/Supervisor/supervisor/issues/520>`_
+
+The internal *Stopper* of **Supvisors** applies the following algorithm to stop an application:
 
 | while application stop sequence is not empty:
 |     pop the process list having the lower ``stop_sequence``
@@ -366,28 +329,24 @@ stop an application:
 |     wait for the jobs to complete
 |
 
-This principle is used for stopping a single application using a
-``supvisors.stop_application`` XML-RPC.
+This principle is used for stopping a single application using a ``supvisors.stop_application`` XML-RPC.
 
 
 Stopping all applications
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-The applications are stopped when **Supvisors** is requested to restart or shut
-down.
+The applications are stopped when **Supvisors** is requested to restart or shut down.
 
-When entering the ``DEPLOYMENT`` state, each **Supvisors** instance evaluates
-also the global stop sequence using
-the ``stop_sequence`` rule configured for the applications and processes.
+When entering the ``DEPLOYMENT`` state, each **Supvisors** instance evaluates also the global stop sequence
+using the ``stop_sequence`` rule configured for the applications and processes.
 
 The global stop sequence corresponds to a dictionary where:
 
     * the keys correspond to the list of ``stop_sequence`` values defined in the application rules,
     * the value associated to a key is the list of application stop sequences whose applications have this key as ``stop_sequence``.
 
-Upon reception of the ``supvisors.restart`` or ``supvisors.shutdown``, the
-**Supvisors** instance uses the global stop sequence
-to stop all the running applications in the defined order.
+Upon reception of the ``supvisors.restart`` or ``supvisors.shutdown``, the **Supvisors** instance uses
+the global stop sequence to stop all the running applications in the defined order.
 The following pseudo-code explains the algorithm used:
 
 | while global stop sequence is not empty:
@@ -410,65 +369,52 @@ The following pseudo-code explains the algorithm used:
 Conciliation
 ------------
 
-**Supvisors** is designed so that there should be only one instance of the same
-program running on a set of systems, although all of them may have the
-capability to start it.
+**Supvisors** is designed so that there should be only one instance of the same program running on a set of systems,
+although all of them may have the capability to start it.
 
-Nevetheless, it is still likely to happen in a few cases:
+Nevertheless, it is still likely to happen in a few cases:
 
     * using a request to Supervisor itself (through web ui, supervisorctl, XML-RPC),
     * upon a network failure.
 
 .. attention::
 
-    In the case of a network failure, as described in :ref:`auto_fencing`,
-    and if the ``auto_fence`` option is not set, the address is set to
-    ``SILENT`` instead of ``ISOLATED`` and its URL is not disconnected from
-    the subscriber socket.
+    In the case of a network failure, as described in :ref:`auto_fencing`, and if the ``auto_fence`` option is not set,
+    the Address is set to ``SILENT`` instead of ``ISOLATED`` and its URL is not disconnected from the subscriber socket.
 
-    When the network failure is fixed, **Supvisors** has likely to deal with a
-    duplicated list of applications and processes.
+    When the network failure is fixed, **Supvisors** has likely to deal with a duplicated list of applications and processes.
 
-When such a conflict is detected, **Supvisors** enters in a ``CONCILIATION``
-phase. Depending on the ``conciliation_strategy`` option set in the
-:ref:`supvisors_section`, it applies a strategy to be rid of all duplicates:
+When such a conflict is detected, **Supvisors** enters a ``CONCILIATION`` phase.
+Depending on the ``conciliation_strategy`` option set in the :ref:`supvisors_section`, it applies a strategy to be rid of all duplicates:
 
 ``SENICIDE``
 
-    When applying the ``SENICIDE`` strategy, **Supvisors** keeps the youngest
-    process, i.e. the process that has been started the most recently, and
-    stops all the others.
+    When applying the ``SENICIDE`` strategy, **Supvisors** keeps the youngest process, i.e. the process
+    that has been started the most recently, and stops all the others.
 
 ``INFANTICIDE``
 
-    When applying the ``INFANTICIDE`` strategy, **Supvisors** keeps the oldest
-    process and stops all the others.
+    When applying the ``INFANTICIDE`` strategy, **Supvisors** keeps the oldest process and stops all the others.
 
 ``USER``
 
-    That's the easy one. When applying the ``USER`` strategy, **Supvisors**
-    just waits for an user application to solve the conflicts using
-    :command:`supervisorctl`, XML-RPC, process signals, or any other solution.
+    That's the easy one. When applying the ``USER`` strategy, **Supvisors** just waits for an user application
+    to solve the conflicts using Web UI, :command:`supervisorctl`, XML-RPC, process signals, or any other solution.
 
 ``STOP``
 
-    When applying the ``STOP`` strategy, **Supvisors** stops all conflicting
-    processes, which may lead the corresponding applications to a degraded
-    state.
+    When applying the ``STOP`` strategy, **Supvisors** stops all conflicting processes, which may lead
+    the corresponding applications to a degraded state.
 
 ``RESTART``
 
-    When applying the ``RESTART`` strategy, **Supvisors** stops all conflicting
-    processes and restarts a new one.
+    When applying the ``RESTART`` strategy, **Supvisors** stops all conflicting processes and restarts a new one.
 
 ``RUNNING_FAILURE``
 
-    When applying the ``RUNNING_FAILURE`` strategy, **Supvisors** stops all
-    conflicting processes and deals with the conflict as it would deal with a
-    running failure, depending on the strategy defined for the process.
-    So, after the conflicting processes are all stopped, **Supvisors** may
-    restart the process, stop the application, restart the application or do
-    nothing at all.
+    When applying the ``RUNNING_FAILURE`` strategy, **Supvisors** stops all conflicting processes and deals
+    with the conflict as it would deal with a running failure, depending on the strategy defined for the process.
+    So, after the conflicting processes are all stopped, **Supvisors** may restart the process, stop the application,
+    restart the application or do nothing at all.
 
-**Supvisors** leaves the ``CONCILIATION`` state when all conflicts are
-conciliated.
+**Supvisors** leaves the ``CONCILIATION`` state when all conflicts are conciliated.
diff --git a/docs/supervisorctl.rst b/docs/supervisorctl.rst
index 854d8b4a..764551b1 100644
--- a/docs/supervisorctl.rst
+++ b/docs/supervisorctl.rst
@@ -2,8 +2,7 @@
 ==================================
 
 This is an extension of the existing :command:`supervisorctl` API.
-The additional commands provided by **Supvisors** are available by typing
-:command:`help` at the prompt.
+The additional commands provided by **Supvisors** are available by typing :command:`help` at the prompt.
 
 .. code-block:: bash
 
@@ -51,8 +50,7 @@ Status
 
 ``address_status addr``
 
-    Get the status of the Supervisor instance managed in **Supvisors** and
-    running on addr.
+    Get the status of the Supervisor instance managed in **Supvisors** and running on addr.
 
 ``address_status addr1 addr2``
 
@@ -88,8 +86,7 @@ Status
 
 ``local_status``
 
-    Get the local status (subset of Supervisor status, with extra arguments)
-    of all processes.
+    Get the local status (subset of Supervisor status, with extra arguments) of all processes.
 
 ``local_status proc``
 
@@ -141,8 +138,7 @@ Status
 
 ``conciliate strategy``
 
-    Conciliate the conflicts detected by **Supvisors** if default strategy
-    is ``USER`` and **Supvisors** is in ``CONCILIATION``` state.
+    Conciliate the conflicts detected by **Supvisors** if default strategy is ``USER`` and **Supvisors** is in ``CONCILIATION``` state.
 
 ``sreload``
 
@@ -213,13 +209,11 @@ Process Control
 
 ``start_args proc arg_list``
 
-    Start the process named proc on the local address and with the additional
-    arguments arg_list passed to the command line.
+    Start the process named proc on the local node and with the additional arguments arg_list passed to the command line.
 
 ``start_process_args strategy proc arg_list``
 
-    Start the process named proc with a starting strategy and with the
-    additional arguments arg_list passed to the command line.
+    Start the process named proc with a starting strategy and with the additional arguments arg_list passed to the command line.
 
 ``stop_process``
 
diff --git a/docs/xml_rpc.rst b/docs/xml_rpc.rst
index b37752ed..c48417f2 100644
--- a/docs/xml_rpc.rst
+++ b/docs/xml_rpc.rst
@@ -7,11 +7,9 @@ The **Supvisors** XML-RPC API is an extension of the Supervisor XML-RPC API.
 Detailed information can be found in the `Supervisor XML-RPC API Documentation
 <http://supervisord.org/api.html#xml-rpc-api-documentation>`_.
 
-The ``supvisors`` namespace has been added to the :command:`supervisord`
-XML-RPC interface.
+The ``supvisors`` namespace has been added to the :command:`supervisord` XML-RPC interface.
 
-The XML-RPC ``system.listMethods`` now provides the list of methods supported
-for both Supervisor and **Supvisors**.
+The XML-RPC ``system.listMethods`` now provides the list of methods supported for both Supervisor and **Supvisors**.
 An example is provided below.
 
 .. code-block:: python
@@ -20,10 +18,8 @@ An example is provided below.
 
 .. note::
 
-    In the following, the namespec refers to the full name of the process,
-    including the application name.
-    For example: ``X11:xclock``, where ``X11`` is the name of a Supervisor
-    group and ``xclock`` is the name
+    In the following, the namespec refers to the full name of the process, including the application name.
+    For example: ``X11:xclock``, where ``X11`` is the name of a Supervisor group and ``xclock`` is the name
     of a Supervisor program that is referenced in the group.
     In some cases, it can also refer to all the programs of the group.
     For example: ``X11:*``.
@@ -66,12 +62,12 @@ Status
             ================== ========= ===========
             Key                Type      Description
             ================== ========= ===========
-            'address_name'     ``str``   The address of the **Supvisors** instance.
-            'statecode'	       ``int``   The state of the **Supvisors** instance, in [0;5].
-            'statename'	       ``str``   The string state of the **Supvisors** instance, in [``'UNKNOWN'``, ``'CHECKING'``, ``'RUNNING'``, ``'SILENT'``, ``'ISOLATING'``, ``'ISOLATED'``].
+            'address_name'     ``str``   The **Supvisors** instance node.
+            'statecode'	       ``int``   The **Supvisors** instance state, in [0;5].
+            'statename'	       ``str``   The **Supvisors** instance state as string, in [``'UNKNOWN'``, ``'CHECKING'``, ``'RUNNING'``, ``'SILENT'``, ``'ISOLATING'``, ``'ISOLATED'``].
             'remote_time'      ``int``   The date, in ms, of the last heartbeat received from the **Supvisors** instance, in the remote reference time.
             'local_time'       ``int``   The date, in ms, of the last heartbeat received from the **Supvisors** instance, in the local reference time.
-            'loading'          ``int``   The sum of the expected loading of the processes running on the address, in [0;100]%.
+            'loading'          ``int``   The sum of the expected loading of the processes running on the node, in [0;100]%.
             ================== ========= ===========
 
         .. automethod:: get_all_addresses_info()
@@ -81,9 +77,9 @@ Status
             ================== ========= ===========
             Key                Type      Description
             ================== ========= ===========
-            'application_name' ``str``   The name of the application.
-            'statecode'        ``int``   The state of the application, in [0;4].
-            'statename'        ``str``   The string state of the application, in [``'UNKNOWN'``, ``'STOPPED'``, ``'STARTING'``, ``'STOPPING'``, ``'RUNNING'``].
+            'application_name' ``str``   The Application name.
+            'statecode'        ``int``   The Application state, in [0;4].
+            'statename'        ``str``   The Application state as string, in [``'UNKNOWN'``, ``'STOPPED'``, ``'STARTING'``, ``'STOPPING'``, ``'RUNNING'``].
             'major_failure'    ``bool``  ``True`` if at least one required process is not started.
             'minor_failure'    ``bool``  ``True`` if at least one optional process could not be started.
             ================== ========= ===========
@@ -95,11 +91,11 @@ Status
             ================== =============== ===========
             Key                Type            Description
             ================== =============== ===========
-            'application_name' ``str``         The name of the process' application.
-            'process_name'     ``str``         The name of the process.
-            'statecode'        ``int``         The state of the process, in {0, 10, 20, 30, 40, 100, 200, 1000}.
-            'statename'        ``str``         The string state of the process, in [``'STOPPED'``, ``'STARTING'``, ``'RUNNING'``, ``'BACKOFF'``, ``'STOPPING'``, ``'EXITED'``, ``'FATAL'``, ``'UNKNOWN'``].
-            'addresses'        ``list(str)``   The list of all addresses where the process is running.
+            'application_name' ``str``         The Application name the process belongs to.
+            'process_name'     ``str``         The Process name.
+            'statecode'        ``int``         The Process state, in {0, 10, 20, 30, 40, 100, 200, 1000}.
+            'statename'        ``str``         The Process state as string, in [``'STOPPED'``, ``'STARTING'``, ``'RUNNING'``, ``'BACKOFF'``, ``'STOPPING'``, ``'EXITED'``, ``'FATAL'``, ``'UNKNOWN'``].
+            'addresses'        ``list(str)``   The list of all nodes where the process is running.
             'extra_args'       ``str``         The extra arguments used in the command line of the process.
             ================== =============== ===========
 
@@ -115,11 +111,11 @@ Status
             ================== =============== ===========
             Key                Type            Description
             ================== =============== ===========
-            'group'            ``str``         The name of the process' application.
-            'name'             ``str``         The name of the process.
-            'state'            ``int``         The state of the process, in {0, 10, 20, 30, 40, 100, 200, 1000}.
-            'start'            ``int``         The start date of the process.
-            'now'              ``int``         The current date of the process.
+            'group'            ``str``         The Application name the process belongs to.
+            'name'             ``str``         The Process name.
+            'state'            ``int``         The Process state, in {0, 10, 20, 30, 40, 100, 200, 1000}.
+            'start'            ``int``         The Process start date.
+            'now'              ``int``         The Process current date.
             'pid'              ``int``         The UNIX process identifier.
             'extra_args'       ``str``         The extra arguments used in the command line of the process.
             ================== =============== ===========
@@ -131,9 +127,9 @@ Status
             =========================== =============== ===========
             Key                         Type            Description
             =========================== =============== ===========
-            'application_name'          ``str``         The name of the application.
-            'start_sequence'            ``int``         The starting rank of the application when starting all applications, in [0;127].
-            'stop_sequence'             ``int``         The stopping rank of the application when stopping all applications, in [0;127].
+            'application_name'          ``str``         The Application name.
+            'start_sequence'            ``int``         The Application starting rank when starting all applications, in [0;127].
+            'stop_sequence'             ``int``         The Application stopping rank when stopping all applications, in [0;127].
             'starting_failure_strategy' ``str``         The strategy applied when a process crashes in a starting application, in [``'ABORT'``, ``'STOP'``, ``'CONTINUE'``].
             'running_failure_strategy'  ``str``         The strategy applied when a process crashes in a running application, in [``'CONTINUE'``, ``'RESTART_PROCESS'``, ``'STOP_APPLICATION'``, ``'RESTART_APPLICATION'``].
             =========================== =============== ===========
@@ -143,14 +139,14 @@ Status
             ========================== =============== ===========
             Key                        Type            Description
             ========================== =============== ===========
-            'application_name'         ``str``         The name of the process' application.
-            'process_name'             ``str``         The name of the process.
-            'addresses'                ``list(str)``   The list of all addresses where the process can be started.
-            'start_sequence'           ``int``         The starting rank of the process when starting the related application, in [0;127].
-            'stop_sequence'            ``int``         The stopping rank of the process when stopping the related application, in [0;127].
+            'application_name'         ``str``         The Application name the process belongs to.
+            'process_name'             ``str``         The Process name.
+            'addresses'                ``list(str)``   The list of all nodes where the process can be started.
+            'start_sequence'           ``int``         The Process starting rank when starting the related application, in [0;127].
+            'stop_sequence'            ``int``         The Process stopping rank when stopping the related application, in [0;127].
             'required'                 ``bool``        The importance of the process in the application.
             'wait_exit'                ``bool``        ``True`` if **Supvisors** has to wait for the process to exit before triggering the next starting phase.
-            'loading'                  ``int``         The expected loading of the process when ``RUNNING``, in [0;100]%.
+            'loading'                  ``int``         The Process expected loading when ``RUNNING``, in [0;100]%.
             'running_failure_strategy' ``str``         The strategy applied when a process crashes in a running application, in [``'CONTINUE'``, ``'RESTART_PROCESS'``, ``'STOP_APPLICATION'``, ``'RESTART_APPLICATION'``].
             ========================== =============== ===========
 
@@ -217,17 +213,15 @@ Python Client
 
 There are two possibilities to perform an XML-RPC from a python client.
 Both methods don't require any additional third party.
-However, it is assumed that the environment parameter contains the relevant
-HTTP configuration, as it would be set for a process spawed by Supervisor.
+However, it is assumed that the environment parameter contains the relevant HTTP configuration, as it would be set for a process spawned by Supervisor.
 More particularly, it is expected that the following variables are set:
 
     * ``SUPERVISOR_SERVER_URL``: the url of the Supervisor HTTP server (ex: ``http://localhost:60000``),
     * ``SUPERVISOR_USERNAME``: the user name for the HTTP authentication (may be empty),
     * ``SUPERVISOR_PASSWORD``: the password for the HTTP authentication (may be empty).
 
-The first is to use the ``getRPCInterface`` of the ``supervisor.childutils``
-module.
-This is available in Supervisor but it works only for the local address.
+The first is to use the ``getRPCInterface`` of the ``supervisor.childutils`` module.
+This is available in Supervisor but it works only for the local node.
 
 .. code-block:: python
 
@@ -238,10 +232,8 @@ This is available in Supervisor but it works only for the local address.
     proxy.supervisor.getState()
     proxy.supvisors.get_supvisors_state()
 
-The second possibility is to use the ``getRPCInterface`` of the
-``supvisors.rpcrequests`` module.
-This is available in **Supvisors** and works for all addresses with a
-Supervisor daemon running with the same HTTP configuration as the local one.
+The second possibility is to use the ``getRPCInterface`` of the ``supvisors.rpcrequests`` module.
+This is available in **Supvisors** and works for all nodes with a Supervisor daemon running with the same HTTP configuration as the local one.
 
 .. code-block:: python
 
diff --git a/setup.cfg b/setup.cfg
index 8c282679..b88034e4 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,3 +1,2 @@
 [metadata]
 description-file = README.md
-
diff --git a/setup.py b/setup.py
index e114fe54..73b41d13 100644
--- a/setup.py
+++ b/setup.py
@@ -36,7 +36,7 @@
 
 here = os.path.abspath(os.path.dirname(__file__))
 try:
-    README = open(os.path.join(here, 'README.rst')).read()
+    README = open(os.path.join(here, 'README.md')).read()
     CHANGES = open(os.path.join(here, 'CHANGES.txt')).read()
 except:
     README = """Supvisors is a control system for distributed applications over multiple Supervisor instances. """
@@ -64,13 +64,14 @@
     version=supvisors_version,
     description="A Control System for Distributed Applications",
     long_description=README + '\n\n' + CHANGES,
+    long_description_content_type='text/markdown',
     classifiers=CLASSIFIERS,
     author="Julien Le Cléach",
     author_email="julien.6387.dev@gmail.com",
     url="https://github.com/julien6387/supvisors",
-    download_url='https://github.com/julien6387/supvisors/archive/0.2.tar.gz',
+    download_url='https://github.com/julien6387/supvisors/archive/0.3.tar.gz',
     platforms=[
-        "CentOS 8.0"
+        "CentOS 8.3"
     ],
     packages=find_packages(),
     install_requires=requires,
diff --git a/supvisors/addressmapper.py b/supvisors/addressmapper.py
index abfc4df9..12306b22 100644
--- a/supvisors/addressmapper.py
+++ b/supvisors/addressmapper.py
@@ -48,6 +48,7 @@ def addresses(self):
 
     @addresses.setter
     def addresses(self, addr):
+        """ Determine usage name of local address among the addresses provided in option file. """
         self.logger.info('Expected addresses: {}'.format(addr))
         # store IP list as found in config file
         self._addresses = addr
diff --git a/supvisors/design/css/doc_style.css b/supvisors/design/css/doc_style.css
deleted file mode 100644
index 080683b5..00000000
--- a/supvisors/design/css/doc_style.css
+++ /dev/null
@@ -1,339 +0,0 @@
-/* Additional resources */
-@font-face {
-	font-family: 'kingthings_calligraphica_2Rg';
-	src: url('Kingthings_Calligraphica_2-webfont.eot');
-	src: url('Kingthings_Calligraphica_2-webfont.eot?#iefix') format('embedded-opentype'),
-		url('Kingthings_Calligraphica_2-webfont.woff') format('woff'),
-		url('Kingthings_Calligraphica_2-webfont.ttf') format('truetype'),
-		url('Kingthings_Calligraphica_2-webfont.svg#kingthings_calligraphica_2Rg') format('svg');
-	font-weight: normal;
-	font-style: normal;
-}
-
-
-/*
- * General Layout
- */
-html, body, #body_block {
-    height: 100%;
-    min-height: 700px;
-}
-
-body {
-	margin: auto;
-}
-
-/* fake a background transparency because smoke image is too dark */
-body::after {
-	content: "";
-    background: url(../img/smoke.jpg);
-	top: 0; left: 0; bottom: 0; right: 0;
-	position: absolute;
-	z-index: -1;
-	opacity: 0.5;
-}
-
-#body_block {
-	min-width: 1000px;
-    display: flex;
-}
-
-
-/*
- * Left Side Layout
-*/
-#left_side {
-	min-width: 220px;
-    max-width: 220px;
-    display: flex;
-	flex-direction: column;
-	background: url(../img/texture.jpg);
-	color: #e6e6e6;
-    border-right: 3px #cc7a00 solid;
-}
-
-#left_side header {
-   text-align: center;
-}
-
-#left_side nav {
-	flex: 1;
-    display: flex;
-	flex-direction: column;
-	overflow: auto;
-}
-
-#left_side footer {
-	font-style: italic;
-}
-
-#copyright {
-	font-size: .6em;
-}
-
-
-/*
- * Right Side Layout
-*/
-#right_side {
-	flex: 1;
-    display: flex;
-	flex-direction: column;
-}
-
-#right_side header {
-    min-height: 50px;
-    padding: 0 10px;
-	background: url(../img/texture.jpg);
-	color: #e6e6e6;
-    display: flex;
-	justify-content: space-between;
-    align-items: center;
-}
-
-#doc-contents {
-	flex: 1;
-    display: flex;
-	flex-direction: column;
-	overflow: auto;
-    padding: 10px;
-}
-
-
-/* Resource design */
-
-header, nav, footer {
-	padding: 5px;
-}
-
-header a, footer a {
-    color: #cc7a00;
-	text-decoration: none;
-}
-
-section {
-	color: #111;
-	font-family: Verdana, Arial, sans-serif;
-	text-align: justify;
-}
-
-h1, h2, h3, h4 {
-	font-family: 'kingthings_calligraphica_2Rg', Verdana, sans-serif;
-	text-shadow: 2px 2px 6px #202020;
-    margin: 20px 0 10px 0;
-}
-
-h1 {
-	font-size: 1.6em;
-}
-
-h2 {
-	font-size: 1.4em;
-}
-
-h3 {
-	font-size: 1.2em;
-}
-
-h4 {
-	font-size: 1em;
-	font-style: italic;
-}
-
-nav ul {
-	font-size: .9em;
-}
-
-p {
-	margin-top: 5px;
-	margin-bottom: 5px;
-	font-size: 1em;
-}
-
-mark {
-	background-color: transparent;
-	text-decoration: underline;
-}
-
-/* decrease spacing between a paragraph and the following list */
-p + ul, p + ol {
-	margin-top: -5px;
-}
-
-/* decrease spacing between a cell text and the following list */
-td ul, td ol {
-	margin-top: 0px;
-}
-
-
-/*
- * Link style
- */
-a.intLink {
-	background: url(../img/arrows-green_16.png) no-repeat right;
-	background-color: forestgreen;
-	color: #eee;
-	text-decoration: none;
-	text-shadow: 2px 2px 2px black;
-	font-size: .8em;
-	padding-left: 2px;
-	padding-right: 18px;
-    border: 1px green outset;
-    border-radius: 0px 10px 10px 0px;
-}
-
-a.extLink {
-	background: url(../img/arrows-blue_16.png) no-repeat right;
-	background-color: dodgerblue;
-	color: #eee;
-	text-decoration: none;
-	text-shadow: 2px 2px 2px black;
-	font-size: .8em;
-	padding-left: 2px;
-	padding-right: 18px;
-    border: 1px blue outset;
-    border-radius: 0px 10px 10px 0px;
-}
-
-
-/*
- * Source code style
- */
-
-/* style for source code, including option, className, attributeName */
-code {
-	color: blue;
-}
-
-.option {
-	font-style: italic;
-}
-
-.className {
-	font-weight: bold;
-}
-
-.attributeName {
-	font-style: italic;
-}
-
-/* source code in a pre block is displayed within a box with language set at the top right corner */
-pre code {
-	display: block;
-	width: 75%;
-	margin-left: 10%;
-	background: rgba(100,100,100,.7);
-	padding: 5px;
-	border: 1px solid rgba(0,0,0,.2) inset;
-}
-
-pre code[class]::before {
-	content: attr(class);
-	color: rgba(0,0,0,.7);
-	font-size: 0.8em;
-	float: right;
-	margin-top: -16px;
-}
-
-
-/*
- * Note style
- */
-
-/* notes are displayed within a box with an information icon before text */
-.note {
-	padding: 0 0 1px 0;
-	margin: 20px 25px;
-	background: rgba(100,100,100,.7);
-	border: 1px solid black inset;
-}
-
-.note p:first-child::before {
-	content: url(../img/info_16.png) '\00a0';
-	float: left;
-}
-
-.note p:first-child {
-	background: #804d00;
-	padding: 5px 5px;
-	margin-top: 0;
-	color: #ccc;
-	text-decoration:underline;
-}
-
-.note p {
-	padding: 0 10px;
-}
-
-
-/*
- * Table style
- */
-table {
-	border-collapse: collapse;
-	caption-side: bottom;
-	background: rgba(200,200,200,.7);
-	margin: 1 auto
-}
-
-/* caption style */
-caption {
-	margin-top: 3px;
-	font-weight: bold;
-	font-style: italic;
-}
-
-/* add border for all cells */
-th, td {
-	border: 1px solid black;
-}
-
-/* style for a title in a table */
-th {
-	background-color: #555;
-}
-
-/* titles of a model table are centered */
-.modelTable th {
-	text-align:center;
-}
-
-/* title of a state table is centered, second axis has a different color */
-.stateTable th {
-	text-align:center;
-}
-
-.stateTable tr+tr th {
-	background-color: #A0A0A0;
-}
-
-/* style for added, modified, removed entries in a table */
-.added-entry {
-	background-color: green;
-	font-style: italic;
-}
-
-.removed-entry {
-	background-color: grey;
-	font-style: italic;
-	text-decoration: line-through;
-}
-
-/*
- * Figure style
- */
-figure img {
-	display: block;
-	margin: auto;
-    border: 1px solid black outset;
-    border-radius: 6px;
-    box-shadow: 4px 4px 6px black;
-}
-
-figcaption {
-	margin-top: 5px;
-	font-weight: bold;
-	font-style: italic;
-	text-align: center;
-}
-
diff --git a/supvisors/design/css/menu.css b/supvisors/design/css/menu.css
deleted file mode 100644
index 742d7a9d..00000000
--- a/supvisors/design/css/menu.css
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Nav style
- */
-nav ul {
-	margin: 0;
-	padding: 0;
-	list-style: none;
-}
-
-nav li {
-    background-image: linear-gradient(165deg, #1a1a1a, #1a1a1a 60%, orange);
-	margin-bottom: 2px;
-    border: 1px #111 solid;
-    border-radius: 0px 6px 0 6px;
-}
-
-nav li li {
-    border-radius: 0;
-    background: #333;
-    border: none;
-    margin: 0;
-	padding: 0 0 0 5px;
-}
-
-nav li li li {
-    background: #222;
-}
-
-nav li a {
-	display: block;
-	text-decoration: none;
-	color: #e6e6e6;
-	padding: 7px 0 7px 4px;
-}
-
-nav li li:last-child {
-    border-radius: 0 0 0 6px;
-}
-
-nav .active {
-    background-image: linear-gradient(165deg, orange, #1a1a1a 40%, #1a1a1a);
-    font-weight: bold;
-}
-
-nav li:hover {
-    background: #4d4d4d;
-}
-
-nav li li:hover {
-	background: url(../img/arrow-orange_12.png) no-repeat;
-	background-position: left 10px;
-	padding-left: 15px;
-}
-
diff --git a/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.eot b/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.eot
deleted file mode 100644
index 5b5966fe..00000000
Binary files a/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.eot and /dev/null differ
diff --git a/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.svg b/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.svg
deleted file mode 100644
index 5f4d3bc5..00000000
--- a/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.svg
+++ /dev/null
@@ -1,247 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata></metadata>
-<defs>
-<font id="kingthings_calligraphica_2Rg" horiz-adv-x="775" >
-<font-face units-per-em="2048" ascent="1638" descent="-410" />
-<missing-glyph horiz-adv-x="372" />
-<glyph horiz-adv-x="2048" />
-<glyph horiz-adv-x="2048" />
-<glyph unicode="&#xd;" horiz-adv-x="390" />
-<glyph unicode=" "  horiz-adv-x="372" />
-<glyph unicode="&#x09;" horiz-adv-x="372" />
-<glyph unicode="&#xa0;" horiz-adv-x="372" />
-<glyph unicode="!" horiz-adv-x="320" d="M65 1204v-978l205 146l1 968zM75 125l1 -236l195 108v240z" />
-<glyph unicode="&#x22;" horiz-adv-x="535" d="M528 1094q-73 63 -70.5 128t48.5 101l-27 27q-124 -90 -159.5 -138.5t-35.5 -112.5t32 -100t71 -39zM268 1094q-73 63 -70.5 128t48.5 101l-27 27q-124 -90 -159.5 -138.5t-35.5 -112.5t32 -100t71 -39z" />
-<glyph unicode="#" horiz-adv-x="846" d="M71 677l-51 -116h184l-66 -284l119 48l56 236h145l-66 -284l122 52l53 232h128l47 116h-149l37 181h134l47 116h-155l60 277l-118 -48l-50 -229l-146 -1l59 278l-123 -47l-45 -231h-153l-51 -115h178l-37 -181h-159zM521 858l-37 -181h-145l36 181h146z" />
-<glyph unicode="$" horiz-adv-x="700" d="M280 214l-4 2q-69 35 -105 77t-1 97l-12 16l-135 -134q-18 -52 35.5 -123.5t127.5 -107.5q44 -22 94 -33l-1 -340l125 -69v403q55 9 95 45q59 51 122 150.5t60 169.5t-55 131q-51 59 -223 100v168l6 -2q84 -37 21 -125l16 -3l151 158q-34 64 -98 95q-45 22 -96 20v406 l-120 76l-1 -513q-31 -13 -61 -32q-66 -42 -103 -83.5t-47.5 -127.5t46.5 -147q46 -50 164 -87zM281 634q-78 31 -88 71q-17 61 58 79q15 3 31 4zM404 368q111 -33 139 -64q35 -40 24.5 -79t-43 -52.5t-106.5 -2.5l-14 2v196z" />
-<glyph unicode="%" horiz-adv-x="899" d="M554.5 361.5q-63.5 -63.5 -75 -163.5t57 -180.5t119.5 -87t90 29.5t90 123.5t42 165.5t-64 132t-96.5 63t-70.5 -5t-92.5 -77.5zM713.5 300q62.5 -62 77.5 -129.5t-9.5 -97.5t-79 -19t-100.5 92.5t-46 130t47.5 67t110 -43.5zM114.5 891.5q-63.5 -63.5 -75 -163.5 t57 -180.5t119.5 -87t90 29.5t90 123.5t42 165.5t-64 132t-96.5 63t-70.5 -5t-92.5 -77.5zM273.5 830q62.5 -62 77.5 -129.5t-9.5 -97.5t-79 -19t-100.5 92.5t-46 130t47.5 67t110 -43.5zM151 -217l124 63l489 1276l-125 -80z" />
-<glyph unicode="&#x26;" horiz-adv-x="1262" d="M295 1240q-135 -81 -154 -215t30 -207.5t81 -109.5q-315 -299 -181.5 -497.5t299.5 -215.5t336 223q203 -187 326 -231q131 90 237 347l-31 20q-28 -61 -75 -90q-145 40 -295 164l337 441l-29 35l-315 1l-184 -263l39 -30l65 86h233l-191 -227q-346 325 -461.5 474.5 t-53.5 226t142 18t106.5 -171t-63.5 -166.5l36 -20q110 56 177.5 164t14 212.5t-172 108.5t-253.5 -77zM669 256q-38 -58 -130.5 -69.5t-246 142.5t-11.5 345q189 -248 388 -418z" />
-<glyph unicode="'" horiz-adv-x="246" d="M1 1217q73 -63 70.5 -128t-48.5 -101l27 -27q124 90 159.5 138.5t35.5 112.5t-32 100t-71 39z" />
-<glyph unicode="(" horiz-adv-x="427" d="M124.5 1201q-74.5 -248 -94 -487.5t37 -539.5t190.5 -537l175 118q-432 815 -107 1872l-22 20q-105 -198 -179.5 -446z" />
-<glyph unicode=")" horiz-adv-x="413" d="M245 78.5q86 244.5 117 483t-11 540.5t-165 545l-180 -109q392 -835 17 -1875l21 -21q115 192 201 436.5z" />
-<glyph unicode="*" horiz-adv-x="504" d="M150 1340h-104l115 -123h-91l-68 -73h168l-125 -133h104l68 72v-164l73 68v93l63 -67h106l-124 131h104l65 73h-160l114 121h-106l-62 -66v169l-73 -65v-107z" />
-<glyph unicode="+" horiz-adv-x="795" d="M314 768v-171h-160l-126 -179l278 2v-344l171 172v172h165l142 180h-311l1 316z" />
-<glyph unicode="," horiz-adv-x="298" d="M16 153q78 -67 75 -136.5t-52 -107.5l29 -29q132 96 170 147.5t38 120t-34 107t-76 41.5z" />
-<glyph unicode="-" d="M571 640h-333q-158 -13 -222 -231l16 -13q49 76 143 72h396q113 21 186 247l-9 16q-81 -94 -177 -91z" />
-<glyph unicode="." horiz-adv-x="326" d="M17 131q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="/" horiz-adv-x="446" d="M-98 -412l124 83l504 1985l-138 -97z" />
-<glyph unicode="0" horiz-adv-x="837" d="M187.5 748q-122.5 -112 -145 -288.5t103 -318t225 -152.5t181 52t179.5 217.5t80.5 291.5t-123 232.5t-186.5 111t-136.5 -9t-178 -136.5zM544 673.5q116 -99.5 131 -274t-55 -231.5t-178.5 -18t-201 185t-75.5 278t140 146t239 -85.5z" />
-<glyph unicode="1" horiz-adv-x="494" d="M45 669l19 -35l101 65v-399q11 -139 -142 -285l14 -19h273l159 116l-16 23q-127 0 -244 -1q129 58 140 155v593l-14 18z" />
-<glyph unicode="2" horiz-adv-x="688" d="M325 871.5q-145 -40.5 -225.5 -127.5t-71.5 -179.5t71 -146.5l202 182l-13 15q-57 -25 -81 41.5t-1 108t95 36.5t116 -163.5t-53 -264.5l-312 -348l23 -25h488l118 201l-29 9l-36 -54h-357q274 275 340.5 410.5t-31.5 240.5t-243 64.5z" />
-<glyph unicode="3" horiz-adv-x="692" d="M181 895l-165 -241l19 -24q65 80 121 60l275 7l-294 -275l33 -38q165 155 270 -51t-54 -435l-229 -262l47 -22q311 309 405 466t51 332.5t-245 200.5l248 258l-31 24h-451z" />
-<glyph unicode="4" horiz-adv-x="930" d="M18 62l400 2q36 -388 -64 -420l19 -36q183 128 222 214l2 247h166q58 65 163 241l-48 22q-30 -83 -137 -79l-148 -1l1 337l-173 -119v-213h-197q206 263 264 675l-240 -191q54 -199 -230 -679z" />
-<glyph unicode="5" horiz-adv-x="698" d="M26 325l21 -26q55 79 203 69t209.5 -135t-44.5 -326l-208 -287l32 -30q310 337 361 430t63.5 203t-57 200.5t-149.5 113.5t-149 21t-165 -53l56 198h345l119 172l-9 19h-447z" />
-<glyph unicode="6" horiz-adv-x="838" d="M167.5 904.5q-68.5 -109.5 -111 -245t-14 -291t160.5 -280.5t260 -81.5t247.5 199t96.5 313t-138.5 243.5t-231 57.5t-244.5 -235.5q-9 193 72 325t165.5 178.5t183.5 12.5l108 206q-264 -84 -375 -188t-179.5 -213.5zM580 514q67 -119 57 -238t-97 -120 q-258 45 -333 359q71 142 188.5 130t184.5 -131z" />
-<glyph unicode="7" horiz-adv-x="677" d="M24 637l35 -6q55 68 121 67l338 -2l-206 -456q-120 -220 -116.5 -330t41.5 -180.5t119 -134.5l144 250q-174 82 -110 355l273 672l-20 25l-476 -1z" />
-<glyph unicode="8" horiz-adv-x="711" d="M227 853.5q-62 -42.5 -96 -85t-48 -129t41 -148.5t220 -104t198.5 -81.5t21.5 -79t-45 -53t-106.5 -2.5t-148 45.5t-105 86t48.5 118.5l-35 18q-172 -130 -138 -238t135 -159t179.5 -49t139.5 54t128 152t66.5 170.5t-50.5 132t-230.5 103.5t-194.5 104t61 79.5 t173.5 -37t-1.5 -148.5l42 -10q128 78 133 151t-76.5 127.5t-166 39.5t-146.5 -57.5z" />
-<glyph unicode="9" horiz-adv-x="855" d="M682.5 7.5q68.5 109.5 111 245t14 291t-160.5 280.5t-260 81.5t-247.5 -199t-96.5 -313t138.5 -243.5t231 -57.5t244.5 235.5q9 -193 -72 -325t-165.5 -178.5t-183.5 -12.5l-108 -206q264 84 375 188t179.5 213.5zM270 398q-67 119 -57 238t97 120q258 -45 333 -359 q-71 -142 -188.5 -130t-184.5 131z" />
-<glyph unicode=":" horiz-adv-x="352" d="M26 471q109 -19 115 -160l187 149q6 132 -120 178zM26 131q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode=";" horiz-adv-x="315" d="M4 471q109 -19 115 -160l187 149q6 132 -120 178zM52 153q78 -67 75 -136.5t-52 -107.5l29 -29q132 96 170 147.5t38 120t-34 107t-76 41.5z" />
-<glyph unicode="&#x3c;" horiz-adv-x="654" d="M586 229q-112 222 -385 304l433 260l-28 38l-579 -347l-1 -35q306 -111 452 -362z" />
-<glyph unicode="=" horiz-adv-x="819" d="M613 700h-348q-165 -13 -232 -231l16 -13q52 76 150 72h413q118 21 195 247l-10 16q-85 -94 -184 -91zM613 490h-348q-165 -13 -232 -231l16 -13q52 76 150 72h413q118 21 195 247l-10 16q-85 -94 -184 -91z" />
-<glyph unicode="&#x3e;" horiz-adv-x="644" d="M74 689q112 -222 385 -304l-433 -260l28 -38l579 347l1 35q-306 111 -452 362z" />
-<glyph unicode="?" horiz-adv-x="840" d="M326 83l1 -236l195 148v233zM518 604q269 193 291 410.5t-162 314t-438 -47.5t-129 -479l209 100q-75 173 -31.5 271.5t160 62.5t159 -183t11.5 -253.5t-257 -231.5l-1 -381l188 119v298z" />
-<glyph unicode="@" horiz-adv-x="1274" d="M403.5 1041q-108.5 -85 -213.5 -226t-133.5 -282.5t21 -282t187 -255t293.5 -99t348 244.5l-46 26q-146 -202 -349.5 -74t-261.5 328t25 349.5t219 209.5t267 38.5t198 -92t98 -240.5t-41.5 -247.5t-123 0.5t-42.5 480l-271 3q-213 -168 -241.5 -332t65 -271.5t162.5 -76 t151 124.5q35 -127 173 -122q317 172 354.5 364.5t-42 339.5t-235 201.5t-304.5 15t-257.5 -124.5zM677 760q-13 -273 17 -330q-156 -41 -196 96.5t24 233.5h155z" />
-<glyph unicode="A" horiz-adv-x="1308" d="M545.5 1293.5q-13.5 -90.5 35.5 -168.5q-48 -46 -70 -110l-150 -353h-151l-124 -209l39 -27l40 55h130q-63 -169 -285 -482l299 1l155 232l-232 6q111 43 180 243h233l128 146l197 -485q61 -136 185 -148l162 283l-41 27l-70 -106q-60 7 -87 74l-406 1055q-38 83 48 190 l-14 27q-188 -160 -201.5 -250.5zM765 657h-296l154 375z" />
-<glyph unicode="B" horiz-adv-x="1052" d="M159 1327l-167 -220l35 -21l55 51l205 1l-72 -42q16 -897 -31 -939l-103 -134l16 -24l538 -1q88 69 247 247q180 153 162.5 298t-121.5 203.5t-239 46.5q180 118 181 308.5t-261 224.5zM700 1028q27 -152 -81 -222l-211 3l-2 344q267 27 294 -125zM822 543.5 q66 -65.5 32.5 -185t-97.5 -146.5h-488l135 94v302l228 -1q124 2 190 -63.5z" />
-<glyph unicode="C" horiz-adv-x="994" d="M372 1206q-132 -117 -191 -199t-112 -198.5t-26 -287.5t217.5 -359.5t413.5 -173.5l228 269l-30 23l-78 -82q-170 -25 -309 70.5t-226 267.5t-23 405q58 210 256 200q317 -25 260 -230l17 -8q192 175 197 225t-69.5 124t-149 83.5t-159 -1.5t-216.5 -128z" />
-<glyph unicode="D" horiz-adv-x="1124" d="M3 1054l34 -14l60 74l245 4q-133 -134 -139 -225l-2 -585q8 -72 -185 -290l9 -23l519 -10q113 28 171 78.5t125.5 119.5t178.5 211t85.5 368t-208 402t-455.5 161l-264 -2zM693.5 1015.5q141.5 -110.5 214 -293.5t12.5 -327t-134 -184l-562 -2q127 150 140 251l4 560 q-21 96 58 104q126 2 267.5 -108.5z" />
-<glyph unicode="E" horiz-adv-x="931" d="M1 1048l34 -14q60 73 132 73l173 -1q-129 -52 -139 -162l-1 -142l-141 -202l15 -22l127 67l-2 -338q8 -72 -147 -312l670 1l205 293l-50 3q-63 -82 -146 -81l-484 1q76 22 135 165l1 257h117l173 174l-16 26h-268v277h323l180 190l-6 20l-711 -2z" />
-<glyph unicode="F" horiz-adv-x="886" d="M14 1051l34 -14q32 70 102 73l203 -1l-139 -162l-1 -142l-141 -203l15 -22q87 67 126 52l2 -341q8 -86 -178 -303l28 -15q43 43 323 23l165 185l-290 2q70 43 133 114v339h117l173 175l-16 24l-268 1v278l393 2l180 189l-6 20l-781 -2z" />
-<glyph unicode="G" horiz-adv-x="1109" d="M398.5 1210q-137.5 -117 -198.5 -199t-116.5 -199t-32.5 -283.5t185 -351t404 -189.5l151 119l1 -115l30 -12l158 164q-21 425 28 468l86 139l-17 25l-362 1l-201 -242l13 -16q79 60 142 69l241 2q-100 -27 -115 -206v-198q-186 30 -320 115t-193.5 247.5t-24.5 395.5 q61 211 267 202q278 -26 218 -232l18 -7q200 176 205 226t-72.5 124t-144.5 83.5t-139.5 -2t-210 -128.5z" />
-<glyph unicode="H" horiz-adv-x="1168" d="M40 1054l34 -14q32 71 102 74l183 -1q-99 -71 -120 -113v-223l-47 -2l-184 -253l15 -22q110 108 216 93l-1 -301q8 -86 -175 -325l25 -4q54 40 323 34l165 187h-300q90 43 123 106l3 307h337l81 108l1 -413q8 -86 -178 -325l28 -4q54 40 323 34l165 187h-300 q90 43 142 116v820l170 189l-6 20l-371 -2l-174 -273l34 -14q32 71 102 74l183 -1q-100 -72 -124 -108l-1 -207h-406v320l3 2l180 189l-6 20l-371 -2z" />
-<glyph unicode="I" horiz-adv-x="555" d="M13 1052l34 -14q32 70 102 73l183 -1q-145 -101 -150 -203l-1 -555l1 -124q-27 -108 -166 -261l25 -4q54 40 323 34l165 194l-24 19q-49 -36 -276 -27q70 23 153 124l9 808l3 2l150 189l-6 20l-351 -2z" />
-<glyph unicode="J" horiz-adv-x="1049" d="M117 1061l41 -19l62 87h488l-90 -65v-593q1 -244 -35.5 -287.5t-186.5 1.5q-295 175 -151 422l-14 18l-109 -104q-111 -98 -87 -255q82 -153 219 -236q178 -103 305 30q191 138 253 401v674l138 2l166 185h-812z" />
-<glyph unicode="K" horiz-adv-x="1141" d="M6 1054l34 -14q32 71 102 74l183 -1q-99 -71 -130 -133l-1 -627l1 -125q-27 -108 -176 -261l35 -4q14 40 323 34l165 195l-24 18q-49 -36 -276 -26q116 42 131 116l1 313q17 29 53 30t103 -54t113 -155.5t120.5 -242t187.5 -207.5l206 188l-25 25q-54 -56 -89 -23 q-61 65 -101 145.5t-94 195.5t-118 183t-189 97l506 512l4 20h-344l-188 -232l15 -17q73 44 128 45l142 1l-428 -420l1 416l180 189l-6 20l-371 -2z" />
-<glyph unicode="L" horiz-adv-x="917" d="M1 1048l34 -14q32 70 102 73l183 -1q-99 -70 -130 -182l-1 -573l-9 -124q-27 -108 -166 -260l25 -4q54 40 713 33l165 235l-24 18q-46 -68 -166 -66l-500 -1q70 74 133 226l9 703l3 2l180 188l-6 20l-371 -2z" />
-<glyph unicode="M" horiz-adv-x="1513" d="M1393 1122l161 156q-61 40 -106 54t-119.5 -7.5t-179.5 -131.5l-384 -423q-411 584 -480.5 567.5t-275.5 -239.5l31 -22q136 118 258 -3q-129 -74 -123 -123v-727q-19 -106 -154 -256l25 -4q53 40 322 33l161 191l-25 18q-48 -35 -275 -26q118 73 137 112l2 708l318 -469 q76 -77 12 -183l22 -26l118 144q80 112 -32 235l314 363l1 -840q-33 -106 -168 -256l25 -4q53 40 322 33l161 191l-25 18q-48 -35 -275 -26q78 63 148 102v913q-5 86 84 -72z" />
-<glyph unicode="N" horiz-adv-x="1190" d="M277.5 1341q-69.5 -16 -276.5 -238l32 -21q135 117 218 -3q-90 -113 -84 -162l1 -682q-33 -106 -169 -254l25 -4q53 40 314 23l161 190l-24 17q-48 -35 -258 -16q81 33 121 111l-2 664l492 -802q-32 -73 -154 -188l26 -4q52 41 291 24l161 194l-24 18q-48 -36 -214 -13 q67 41 87 112l2 823l3 2l176 188l-7 20l-371 -2l-168 -271l34 -15q31 70 102 73h182q-99 -42 -107 -101v-533q-500 866 -569.5 850z" />
-<glyph unicode="O" horiz-adv-x="1046" d="M226.5 1118.5q-154.5 -167.5 -183 -431.5t130 -475.5t284.5 -228t228.5 77.5t226.5 325.5t102 436.5t-155.5 347.5t-235.5 166t-172.5 -13.5t-225 -204.5zM677 1007.5q146 -149.5 165 -410.5t-69 -346.5t-225.5 -27.5t-254 277t-95 417t177 219t301.5 -128.5zM356 689 q109 -20 115 -165l187 153q6 136 -120 183z" />
-<glyph unicode="P" horiz-adv-x="946" d="M378 273v166q238 -50 384 136.5t160 362.5t-119 292.5t-281 96.5h-346l-110 -173l-59 -74l30 -34l80 94l215 -1q-124 -73 -130 -129l-1 -725q-38 -187 -202 -288l14 -30q71 39 359 28l148 199q-59 -29 -279 -22q111 51 137 101zM374 638l-4 504q187 13 280 -53.5 t133.5 -227.5t-76 -231.5t-293.5 62.5z" />
-<glyph unicode="Q" horiz-adv-x="1073" d="M827 336q30 95 18 258q-19 261 -165 410t-301.5 128t-177 -218.5t95 -416t253.5 -276.5q63 -26 115 -23q-56 94 -91 102q-42 11 -95 -25l-11 29q185 164 252 140q50 -19 107 -108zM724 89q-14 -17 -28 -30q-95 -94 -233.5 -82t-291.5 228t-124.5 479.5t183 430.5t225 204 t172.5 13.5t235.5 -165.5t155.5 -347t-102 -436q-30 -55 -58 -102l10 -20q81 -156 142 -272t103.5 -159.5t96.5 16.5l29 -37q-178 -158 -235 -141t-146 177q-71 127 -134 243z" />
-<glyph unicode="R" horiz-adv-x="1105" d="M-4 1052l34 -14q32 70 102 77h223q-129 -35 -160 -117l-1 -646l1 -124q-27 -108 -152 -234l11 -31q84 40 353 34l165 194l-24 19q-49 -36 -276 -27q96 72 131 146l1 322q85 2 130.5 -28.5t80 -91.5t66.5 -148t95 -207t160 -198l241 194l-25 24q-54 -56 -89 -22 q-61 64 -96 144.5t-75 174.5t-105.5 157t-166.5 47q148 27 226.5 142.5t30.5 284t-217 192.5l-107 8h-383zM614 1085q70 -44 81 -143t-33 -160.5t-260 -59.5v395q142 12 212 -32z" />
-<glyph unicode="S" horiz-adv-x="949" d="M228 1175.5q-80 -102.5 -95 -216.5t64.5 -197t308.5 -188.5t270.5 -179.5t-12 -143t-157.5 -57.5t-209.5 77t-159 135t-7.5 178.5l-15 17l-177 -207q-25 -79 49.5 -187t171 -165t212 -61.5t222 89t176 212t54.5 245t-80.5 177t-323 172t-252.5 212.5t129 101t194 -65 t-4 -170l27 -24l202 244q-49 96 -138 143t-229.5 4t-220.5 -145.5z" />
-<glyph unicode="T" horiz-adv-x="1119" d="M-9 1050l34 -14q32 70 102 73l443 -1q-119 -70 -150 -222l-1 -534l1 -125q-57 -107 -196 -260l25 -4q31 53 353 34l165 194l-24 18q-49 -35 -276 -26q70 74 163 226l-1 698l342 1l191 196l-16 18h-981z" />
-<glyph unicode="U" horiz-adv-x="1178" d="M838 240q49 -191 163 -242l196 373l-27 31q-126 -154 -134 98v626l45 1l140 177l-6 20l-371 -2l-164 -247l34 -15q28 69 92 69l175 -1q-91 -39 -145 -113v-652q-75 -195 -144 -166q-134 50 -238 176.5t-154 257.5t-50.5 232.5t148.5 278.5l154 183h-308l-8 -16l-177 -243 l24 -14q48 63 129 65l120 1q-335 -346 -191 -693q121 -275 381 -425q111 -22 218.5 106t97.5 134z" />
-<glyph unicode="V" horiz-adv-x="1159" d="M201 1273l-212 -310l32 -28q89 130 132 27l369 -909q69 -98 171 -38q411 521 435 725.5t-101.5 404t-251 185.5t-226 -125.5t-163.5 -191.5l-103 264q-35 101 -82 -4zM875 944.5q96 -201.5 71.5 -385.5t-183.5 -344q-77 -23 -356 747q99 129 235.5 156.5t232.5 -174z" />
-<glyph unicode="W" horiz-adv-x="1548" d="M1108.5 1143.5q94.5 -25.5 165 -200.5t59 -372t-162.5 -329q-100 44 -332 725l-20 51l-102 267q-29 92 -95 -16l-228 -272l-105 288q-35 100 -86 -5l-202 -311l31 -30q84 132 125 28l319 -852q78 -220 232 -38l138 144l-26 60l-79 -80q-80 -16 -328 738q135 132 176 28 l341 -884q85 -175 209 -6q359 462 381.5 667.5t-97 406t-239.5 186.5t-309 -289l22 -44q118 165 212.5 139.5z" />
-<glyph unicode="X" horiz-adv-x="1070" d="M14 1044l26 -41q141 217 279 -146l79 -152q-298 -290 -313 -430t63 -217t179 -63l232 320l-18 26q-162 -157 -253.5 -43t158.5 310l269 -481q93 -132 198 -132l161 252l-26 33q-70 -220 -430 485l410 519l-20 45h-322l-190 -226l20 -26q88 66 275 43l-212 -257l-216 413 q-62 146 -237 -91z" />
-<glyph unicode="Y" horiz-adv-x="971" d="M521 1117l18 -21q59 54 261 35l-196 -311l-286 422q-79 155 -183 18l-133 -136l29 -28q69 65 102 40l304 -472l1 -366q-7 -95 -205 -301l401 2l186 211l-32 23q-34 -81 -339 -55q185 126 199 266l-1 323l371 552l-16 7l-297 -2z" />
-<glyph unicode="Z" horiz-adv-x="927" d="M282 1322l-186 -277l42 -17q50 72 152 106h464l-749 -1106l30 -33q141 200 411.5 84t330 -60.5t109 146t104.5 171.5l-31 24q-48 -102 -111 -127.5t-260 50.5t-287 51l653 954l-17 33z" />
-<glyph unicode="[" horiz-adv-x="515" d="M74 1346l-1 -1725l387 -1l110 162l-340 1v1703l229 1l120 155h-249z" />
-<glyph unicode="\" horiz-adv-x="472" d="M516 -253l-80 -146l-476 1938l80 110z" />
-<glyph unicode="]" horiz-adv-x="570" d="M503 -219l-178 -161h-335l100 158l240 -2v1706l-329 1l100 157h402v-1859z" />
-<glyph unicode="^" horiz-adv-x="518" d="M400 1018q-139 6 -183 153l-150 -121l-35 39l271 239q76 -160 208 -178z" />
-<glyph unicode="_" horiz-adv-x="976" d="M730 -269h-438q-208 -8 -292 -137l21 -8q65 45 188 43h521q149 12 245 146l-12 10q-106 -56 -233 -54z" />
-<glyph unicode="`" horiz-adv-x="415" d="M256 1026l152 140q-127 -10 -273 181l-129 -109q162 -214 250 -212z" />
-<glyph unicode="a" horiz-adv-x="852" d="M161 674q-111 -153 -119 -261t106 -257t176 -157q113 94 183 153q27 -107 157 -160l197 239l-33 23l-43 -47q-51 -23 -83 17t-29 99v481q3 73 54 97l-334 -1q-121 -73 -232 -226zM520 742l-35 -68v-37v-429q-88 -69 -216 118t8 416h243z" />
-<glyph unicode="b" horiz-adv-x="721" d="M296 1401q-124 -78 -185 -167t-72 -224l4 -669q13 -114 44.5 -179t79.5 -108t124.5 -61.5t291.5 289.5q143 219 106 382t-166.5 226.5t-289.5 -176.5l2 402q-10 168 83 274zM491 532.5q44 -154.5 -18 -320.5q-73 -43 -149.5 14t-88.5 188l-2 228q41 57 127.5 51 t130.5 -160.5z" />
-<glyph unicode="c" horiz-adv-x="708" d="M209 753q-232 -222 -165 -408.5t162 -275t170 -70.5q151 116 292 301l-25 22q-84 -96 -169 -124q-99 18 -182 149t-80 249t59.5 134t121.5 -22t79 -148l165 143q17 96 -57 150t-165 45q-93 -38 -206 -145z" />
-<glyph unicode="d" horiz-adv-x="839" d="M506 1113v-215h-208q-238 -348 -256 -442t10 -175t132 -198.5t156 -73.5l170 153q45 -163 148 -162l140 175l49 55l-30 34l-70 -75q-55 16 -54 243v672q-10 222 87 284l-28 17q-231 -95 -246 -292zM510 797v-575q-109 -37 -204 98.5t-103 227t41 138.5h184z" />
-<glyph unicode="e" horiz-adv-x="708" d="M224 753q-232 -222 -165 -408.5t177.5 -290.5t195.5 -32q130 93 271 278l-25 22q-84 -96 -154 -139q-95 -20 -192.5 127.5t-113 277.5t66 150t123 -34.5t24 -109t-88.5 -105.5l-73 -56l29 -42l251 201l82 71q17 136 -57 190t-165 45q-93 -38 -186 -145z" />
-<glyph unicode="f" horiz-adv-x="591" d="M255 1220q-73 -42 -64 -335l-79 -8l-125 -199l19 -16q79 46 202 43l2 -729q7 -183 -54 -215t-190 84l-138 -212q314 -15 441.5 158.5t135.5 373.5l-13 549h87l155 189l-247 2q-11 313 17 365q153 13 137 -143l143 120q46 55 16 121.5t-181 105.5z" />
-<glyph unicode="g" horiz-adv-x="796" d="M162 674q-113 -153 -126.5 -261t103 -262t179.5 -162q125 104 186 163q18 -332 5 -379q-65 -24 -167 27.5t-165 135.5l-145 -183q122 -125 216 -143.5t160 7t193.5 173t113.5 311t-10.5 449t75.5 329.5l-11 22l-370 -1q-124 -73 -237 -226zM571 711q-69 -68 -70 -149 v-350q-86 -61 -204 99.5t-55 400.5z" />
-<glyph unicode="h" horiz-adv-x="792" d="M50 1070l1 -492v-410q3 -148 119 -168l189 186l-20 20l-58 -49q-40 17 -36 150v375l74 62q172 5 174 -205l-1 -367q-1 -146 112 -168l190 184l-20 26l-58 -54q-35 5 -34 118l1 397q-3 135 -86.5 191t-171.5 41l-189 -178v396q-7 214 73 274l-16 19q-245 -127 -243 -348z " />
-<glyph unicode="i" horiz-adv-x="497" d="M94 1131q109 -19 115 -160l187 149q6 132 -120 178zM45 710l20 -37l60 44q53 1 41 -151v-406q12 -147 124 -166l197 192l-23 23l-56 -50q-55 3 -48 154l-1 423q-2 157 -68 176z" />
-<glyph unicode="j" horiz-adv-x="409" d="M55 1131q109 -19 125 -160l177 149q6 132 -120 178zM26 710l24 -39q98 88 97 -105v-406q7 -314 -115 -467l15 -31q281 171 285 486l-2 588q-2 157 -78 176z" />
-<glyph unicode="k" horiz-adv-x="874" d="M64 968v-785q9 -135 125 -189l222 191l-26 27q-148 -135 -115 213q38 32 87.5 0t150.5 -233t174 -201l194 220l-30 26q-85 -123 -176.5 86.5t-200.5 220.5q61 33 151.5 123.5t49.5 232.5l-225 -144q42 -127 -23.5 -173t-164.5 -88v590q2 252 86 313l-29 17 q-263 -171 -250 -447z" />
-<glyph unicode="l" horiz-adv-x="405" d="M55 1066v-856q14 -158 164 -216l197 192l-15 20q-102 -64 -153 32v478v391q-5 197 75 273l-18 22q-258 -172 -250 -336z" />
-<glyph unicode="m" horiz-adv-x="1329" d="M7 713l24 -30l59 53q80 -4 72 -164v-410q3 -148 119 -168l189 186l-20 20l-58 -49q-40 17 -36 150v375l74 62q172 5 174 -205l-1 -367q-1 -146 112 -168l190 184l-20 26l-58 -54q-35 5 -34 118v395l72 71q158 -12 171 -205l-1 -367q-1 -146 113 -168l189 184l-25 20 l-44 -41q-46 5 -41 117v347q-2 247 -249 273l-198 -175q-47 162 -244 178l-189 -178q-21 160 -152 178z" />
-<glyph unicode="n" horiz-adv-x="902" d="M6 713l24 -30l59 53q80 -4 72 -164v-410q3 -148 119 -168l189 186l-20 20l-58 -49q-40 17 -36 150v375l74 62q172 5 174 -205l-1 -367q-1 -146 112 -168l190 184l-20 26l-58 -54q-35 5 -34 118l1 397q-3 135 -86.5 191t-171.5 41l-189 -178q-21 160 -152 178z" />
-<glyph unicode="o" horiz-adv-x="760" d="M161 750.5q-112 -112.5 -132.5 -289t100 -319t211 -153.5t159.5 52t158.5 218t73.5 293t-112.5 233.5t-170 111.5t-124.5 -9t-163 -137.5zM474.5 640q103.5 -107 116.5 -227t-36.5 -181t-147 -49.5t-178.5 163.5t-65.5 261t111.5 124.5t199.5 -91.5z" />
-<glyph unicode="p" horiz-adv-x="875" d="M341 -101v185q109 -67 200.5 -2t199 213t103 290t-144.5 252t-192 66l-170 -153q-39 141 -148 162l-140 -175l-49 -55l30 -34l70 75q59 -2 65 -243l-1 -492q-3 -171 -142 -311l14 -15q71 24 146.5 -34t168.5 -46l153 191l-27 8q-109 -64 -284 54q82 1 148 64zM337 285 v391l74 62q66 18 152 -65.5t113 -243.5t-83 -190t-216 101z" />
-<glyph unicode="q" horiz-adv-x="820" d="M154 674q-106 -153 -114 -261t101.5 -262t168.5 -162q168 104 183 151l2 -487l379 288l-32 33l-147 -101l2 887q-6 86 57 111l-19 30h-299q-176 -74 -282 -227zM496 208q-67 -100 -196.5 82t-79.5 392h329q-61 -24 -51 -99z" />
-<glyph unicode="r" horiz-adv-x="647" d="M-3 655l27 -20q64 85 102 66.5t32 -130.5v-406q20 -144 124 -166l197 192l-15 20q-102 -64 -104 32v392q7 116 59 121t109 -103l169 131q-65 100 -139 117.5t-125.5 -29.5t-86.5 -122q-17 129 -153 147z" />
-<glyph unicode="s" horiz-adv-x="715" d="M233 859q-66 -43 -103 -85.5t-47.5 -130t46.5 -150.5t224 -105t202 -82.5t24.5 -80t-43 -53.5t-106.5 -2.5t-142.5 47t-104.5 78.5t-1 99l-12 16l-135 -137q-18 -53 35.5 -125.5t127 -110t164 -42t149.5 48t122 154t60 173t-55.5 133.5t-234.5 105t-198.5 105.5t58 80.5 t158.5 -20t21 -127l16 -3l151 161q-34 65 -98 96.5t-138 15.5t-140 -59z" />
-<glyph unicode="t" horiz-adv-x="696" d="M295 1182q-92 -88 -100 -184l2 -95l-47 -2l-143 -245l34 -23q52 104 160 82l-1 -494q30 -158 189 -235l259 228l-35 47q-147 -175 -228 27v234v204h158l140 147l-10 28h-300v20v205q-3 58 72 133l-20 20q-38 -9 -130 -97z" />
-<glyph unicode="u" horiz-adv-x="908" d="M906 183l-24 30l-59 -53q-80 4 -72 164v410q-3 148 -119 168l-189 -186l20 -20l58 49q48 -15 36 -150v-375l-93 -79q-157 12 -155 222l1 367q1 146 -112 168l-190 -184l20 -26l58 54q41 -5 34 -148l-1 -300q0 -150 83.5 -226t180.5 -81l183 186q21 -160 152 -178z" />
-<glyph unicode="v" horiz-adv-x="914" d="M170 855l-165 -208l23 -35q79 94 104 34l297 -587q74 -131 165 1q279 299 297.5 436.5t-80 276.5t-192 134t-166 -98.5t-91.5 -114.5l34 -48q41 75 120 85t148.5 -112.5t60 -247t-102.5 -197.5q-56 9 -362 684q-55 72 -90 -3z" />
-<glyph unicode="w" horiz-adv-x="1310" d="M1018 647q107 -139 103.5 -264t-87.5 -199q-71 17 -263 466l-18 35l-82 179q-58 63 -114 -6l-189 -188l-88 194q-56 72 -114 -3l-169 -210l26 -19q71 88 105 18l265 -549q75 -204 217 -25l130 122l-24 40l-77 -58q-58 -65 -255 452q101 88 135 18l290 -558 q75 -188 181 -23q290 292 309 431t-84 278t-195.5 130t-255.5 -211l18 -37q129 126 236 -13z" />
-<glyph unicode="x" horiz-adv-x="872" d="M9 651l33 -28q68 103 126 35l124 -188q-230 -190 -242 -285t51.5 -147t146.5 -42l190 216l-14 18q-133 -106 -208 -29t104 222l220 -338q76 -89 161 -89l158 170l-21 23q-83 -149 -338 299l332 371l-21 40l-239 -1l-164 -173l16 -17q31 40 235 25l-185 -200l-185 300 q-50 124 -124 10z" />
-<glyph unicode="y" horiz-adv-x="862" d="M550.5 -293q228.5 175 262.5 396v637q-20 146 -124 168l-217 -214l23 -32l64 61q59 5 52 -142v-317q-53 -84 -147 -75t-111 179l1 368q1 146 -117 168l-227 -224l20 -37l62 59q60 30 62 -106v-321q15 -215 231 -287q137 77 235 189v-115q15 -277 -124 -276.5t-245 130.5 l-165 -186q236 -198 464.5 -23z" />
-<glyph unicode="z" horiz-adv-x="592" d="M-5 648l14 -17q56 95 186 87h226q-368 -544 -426 -701l17 -18q49 61 230 17t245 15.5t150 277.5l-23 15q-68 -167 -436 -74l408 624l-15 26h-442z" />
-<glyph unicode="{" horiz-adv-x="379" d="M109 1125v-271q2 -157 -95 -292q97 -153 95 -282q11 -583 125 -660l120 257l-11 27q-67 -85 -87 301v171q-17 149 -115 197q110 70 115 277v330q-3 332 58 434l-14 29q-197 -230 -191 -518z" />
-<glyph unicode="|" horiz-adv-x="410" d="M296 1610l-1 -1707q-34 -163 -229 -316l-35 33q87 68 79 176v1706q12 111 243 336l29 -34q-86 -110 -86 -194z" />
-<glyph unicode="}" horiz-adv-x="378" d="M247 137v271q-2 157 95 292q-97 153 -95 282q-11 583 -125 660l-120 -257l11 -27q67 85 87 -301v-171q17 -149 115 -197q-110 -70 -115 -277v-330q3 -332 -58 -434l14 -29q197 230 191 518z" />
-<glyph unicode="~" horiz-adv-x="896" d="M181 1144l-151 -145l40 -32l85 71q124 60 292.5 -26t251.5 15l172 166l-35 32l-71 -67q-103 -55 -277 35t-307 -49z" />
-<glyph unicode="&#xa1;" horiz-adv-x="385" d="M301 -286v978l-205 -146l-1 -968zM291 793l-1 236l-195 -108v-240z" />
-<glyph unicode="&#xa2;" horiz-adv-x="687" d="M311 -332l125 -69v429q131 93 232 272l-25 22q-84 -96 -169 -124q-20 -11 -38 -16l-1 486q28 -40 37 -108l165 143q17 96 -57 150q-66 48 -145 46v416l-120 76l-1 -551q-50 -35 -105 -87q-232 -222 -165 -408.5t162 -274.5q56 -53 106 -68zM312 228q-23 26 -44 65 q-87 161 -70 291t74 146q20 6 41 5z" />
-<glyph unicode="&#xa3;" horiz-adv-x="894" d="M241 413l-108 -2l-127 -154l31 -15q14 44 151 34h11l-92 -276l41 -9q104 57 276 22t309 -9l147 199l-31 7q-76 -82 -265.5 -47.5t-313.5 -2.5l37 120h155l173 152l-30 6q-31 -33 -254 -27h-4l23 73l170 1l174 151l-30 6q-31 -33 -273 -26q24 219 161 216.5t92 -129.5 l28 -8l128 141q-16 86 -75.5 109.5t-125 23t-147.5 -51t-126 -140.5l-36 -160l-98 -2l-127 -154l30 -15q15 44 152 34l-22 -67h-4z" />
-<glyph unicode="&#xa5;" horiz-adv-x="835" d="M357 480q-47 0 -100 1l-114 -115l8 -11q17 16 211 20h2v-62h-15q-47 0 -100 1l-114 -115l8 -10q16 15 211 19h10q-9 -68 -164 -211l321 2l149 150l-26 16q-27 -58 -271 -39q67 41 106 83l74 1h110l107 117l-18 7q-14 -16 -199 -20h-21v63h29q52 0 111 -1l106 118l-18 6 q-14 -15 -199 -19h-29v65l296 390l-13 5l-237 -2l-147 -147l14 -15q47 38 208 25l-156 -218l-228 300q-64 111 -147 13l-106 -97l23 -20q55 47 82 29l237 -329h-1z" />
-<glyph unicode="&#xa6;" horiz-adv-x="351" d="M274 1605l-1 -744h-185v636q12 111 243 336l29 -34q-86 -110 -86 -194zM271 695v-797q-34 -163 -229 -316l-35 33q87 68 79 176v902z" />
-<glyph unicode="&#xa8;" horiz-adv-x="710" d="M382 1155q109 -19 115 -160l187 149q6 132 -120 178zM66 1159q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xa9;" horiz-adv-x="745" d="M391 1398q83 0 161.5 -42.5t122.5 -121t44 -164.5q0 -85 -43 -163.5t-121 -121.5t-164 -43q-85 0 -163 43t-121.5 121.5t-43.5 163.5q0 86 44 164.5t123 121t161 42.5zM391 1344q-69 0 -134.5 -35.5t-102.5 -101.5t-37 -137t36.5 -136t101.5 -101.5t136 -36.5t136 36.5 t101.5 101.5t36.5 136t-37 137t-102.5 101.5t-134.5 35.5zM348.5 1248.5q-22.5 -13.5 -47.5 -31.5q-169 -120 -59 -265q32 -35 64 -50.5t76 -15.5t91.5 40t77.5 81l-15 12q-12 -14 -27 -29.5t-68.5 -31.5t-120 47t-43.5 145q44 58 112 51q61 -15 77 -68l76 56 q-1 38 -30.5 59.5t-58.5 27.5t-55.5 -4t-49 -23.5z" />
-<glyph unicode="&#xaa;" horiz-adv-x="677" d="M116.5 1346.5q-55.5 -65.5 -78.5 -131.5t-7.5 -165.5t116.5 -192t162.5 -92.5t192.5 120q50 44 88.5 95.5t56.5 145t-31 208.5q-121 187 -309 165q-135 -87 -190.5 -152.5zM469.5 1246.5q61.5 -116.5 27 -241.5t-151 -82.5t-155.5 151.5t-25 204t128.5 90t176 -121.5z " />
-<glyph unicode="&#xab;" horiz-adv-x="675" d="M391 171l-169 376l176 372l-65 131l-281 -573l209 -473zM631 171l-169 376l176 372l-65 131l-281 -573l209 -473z" />
-<glyph unicode="&#xad;" horiz-adv-x="905" d="M780 615q-52 2 -88 -8h-68h-24h-20q-30 -1 -52 4q-54 -8 -88 -4l-16 4h-16l-8 -4q-28 3 -48 0l-8 4h-12l-100 4q-13 -8 -28 -12q-16 -19 -32 -32q-5 -6 -12 -8q-11 -20 -28 -36l-28 -24q-12 -20 -24 -32l-8 -16l-12 -8v-12l-8 -4l-4 -8l-40 -56l12 -20l32 4q31 49 64 76 h20h16h72h16h16h16h68h32h28h16h20h16h20h52h16h68h12h48l8 12l48 24q12 18 28 24q19 22 36 32l12 12q4 7 8 8l8 12l4 12l8 4l4 12q39 25 60 56v24h-32q-40 -31 -80 -44z" />
-<glyph unicode="&#xae;" horiz-adv-x="710" d="M357 1394q82 0 159.5 -42t121 -120t43.5 -162t-43 -161t-120 -120t-161 -43t-161 43t-120 120t-43 161t43.5 162t121.5 120t159 42zM357 1340q-68 0 -133 -35t-101 -100t-36 -135t36 -134t100 -100t134 -36t134.5 36t100 100t35.5 134t-36 135t-101 100t-133 35z M166 1202l12 -4q11 21 36 23h78q-45 -11 -56 -35v-196v-37q-10 -33 -53 -71l3 -9q30 12 124 10l58 59l-8 6q-17 -11 -97 -9q34 22 46 45v97q30 0 46 -9t28 -27.5t23.5 -44.5t33.5 -62.5t56 -59.5l85 58l-9 7q-19 -17 -31 -6q-21 19 -33.5 43.5t-26.5 52.5t-37 47t-59 15 q52 8 79.5 43t11 85.5t-76.5 58.5l-37 2h-135zM383.5 1212q24.5 -13 28 -43t-11.5 -48.5t-91 -18.5v119q50 4 74.5 -9z" />
-<glyph unicode="&#xaf;" horiz-adv-x="1326" d="M-2 1557l10 -15q33 34 1142 22l129 162l-21 9q-27 -35 -1121 -20z" />
-<glyph unicode="&#xb0;" horiz-adv-x="519" d="M131.5 1250.5q-67.5 -61.5 -79.5 -157.5t60 -173.5t127 -83.5t96.5 28.5t95 119t44 159t-67 127t-102 61.5t-75.5 -5t-98.5 -75.5zM308 1186.5q58 -55.5 67 -122t-18 -96.5t-80.5 -24t-98 80.5t-36 129t58 71.5t107.5 -38.5z" />
-<glyph unicode="&#xb1;" horiz-adv-x="801" d="M317 918v-171h-160l-126 -179l278 2v-344l171 172v172h165l142 180h-311l1 316zM562 191h-333q-158 -13 -222 -231l16 -13q49 76 143 72h396q113 21 186 247l-9 16q-81 -94 -177 -91z" />
-<glyph unicode="&#xb2;" horiz-adv-x="376" d="M182 1326q-82 -23 -127.5 -72.5t-40 -102t40.5 -83.5l114 103l-8 9q-32 -14 -45.5 24t-0.5 61.5t49 20t74 -91.5t-6 -135l-204 -215l13 -14h275l67 113l-16 5l-21 -30l-201 1q154 156 192 233.5t-17.5 137t-137.5 36.5z" />
-<glyph unicode="&#xb3;" horiz-adv-x="396" d="M116 1321l-114 -139l13 -14q45 47 84 35l169 2l-189 -237l15 -22q73 87 151 -2t-4 -201l-135 -152l19 -13q187 184 233.5 252.5t42.5 147t-167 137.5l146 193l-9 12z" />
-<glyph unicode="&#xb4;" horiz-adv-x="410" d="M28 979l18 -25l259 159q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xb6;" horiz-adv-x="1274" d="M1269 1286l-27 30l-610 -2q-188 5 -247 0.5t-141.5 -34.5t-148.5 -115.5t-75 -204t65.5 -213.5t197.5 -106t244 110q-34 -1172 82 -1245l162 142q-98 56 -42 1466l172 1l-1 -1583l59 63l7 1520l121 2z" />
-<glyph unicode="&#xb7;" horiz-adv-x="465" d="M78 708q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xb8;" horiz-adv-x="363" d="M33 -157l61 -10q43 35 78.5 27.5t53.5 -40.5t-19 -84t-98 -108l15 -9q130 93 165 130.5t42 75.5t-19.5 70.5t-65.5 43t-70.5 4t-55.5 -23.5l26 68l-52 5z" />
-<glyph unicode="&#xb9;" horiz-adv-x="292" d="M27 1205l12 -20l61 36v-223q7 -78 -86 -159l9 -11h165l97 65l-10 13q-77 0 -148 -1q78 33 85 87v332l-8 10z" />
-<glyph unicode="&#xba;" horiz-adv-x="734" d="M154 1298q-89 -122 -95.5 -208.5t85 -205.5t140.5 -125q90 75 146 122q22 -86 126 -128l157 191l-26 18l-35 -37q-40 -19 -66 13t-23 79v385q2 58 43 77l-267 -1q-96 -58 -185 -180zM441 1352l-28 -54v-30v-342q-71 -56 -173 93.5t7 332.5h194z" />
-<glyph unicode="&#xbb;" horiz-adv-x="659" d="M29 883l169 -376l-176 -372l65 -131l281 573l-209 473zM289 883l169 -376l-176 -372l65 -131l281 573l-209 473z" />
-<glyph unicode="&#xbc;" horiz-adv-x="826" d="M65 795l12 -20l61 36v-223q7 -78 -86 -159l9 -11h165l97 65l-10 13q-77 0 -148 -1q78 33 85 87v332l-8 10zM383 4l230 1q20 -223 -37 -241l11 -21q105 73 127 123l1 142h95q34 37 94 138l-28 13q-17 -48 -78 -46h-85l1 193l-100 -68v-122h-113q118 151 152 387l-138 -110 q31 -114 -132 -389zM111 -217l124 63l489 1276l-125 -80z" />
-<glyph unicode="&#xbd;" horiz-adv-x="808" d="M71 -217l124 63l489 1276l-125 -80zM56 895l12 -20l61 36v-223q7 -78 -86 -159l9 -11h165l97 65l-10 13q-77 0 -148 -1q78 33 85 87v332l-8 10zM586 426q-82 -23 -127.5 -72.5t-40 -102t40.5 -83.5l114 103l-8 9q-32 -14 -45.5 24t-0.5 61.5t49 20t74 -91.5t-6 -135 l-204 -215l13 -14h275l67 113l-16 5l-21 -30l-201 1q154 156 192 233.5t-17.5 137t-137.5 36.5z" />
-<glyph unicode="&#xbe;" horiz-adv-x="954" d="M443 4l230 1q20 -223 -37 -241l11 -21q105 73 127 123l1 142h95q34 37 94 138l-28 13q-17 -48 -78 -46h-85l1 193l-100 -68v-122h-113q118 151 152 387l-138 -110q31 -114 -132 -389zM115 895l-93 -131l11 -13q36 43 68 32l155 4l-166 -150l19 -20q93 84 152 -28 t-31 -237l-129 -143l27 -12q175 168 228 253.5t28.5 181.5t-137.5 109l139 141l-17 13h-254zM181 -217l124 63l489 1276l-125 -80z" />
-<glyph unicode="&#xbf;" horiz-adv-x="823" d="M512 871l-1 236l-195 -148v-233zM320 350q-269 -173 -291 -390.5t162 -324t438 47.5t129 489l-209 -100q75 -173 31.5 -281.5t-158.5 -71.5t-159 193t-13 252.5t257 221.5l1 381l-188 -119v-298z" />
-<glyph unicode="&#xc0;" horiz-adv-x="1261" d="M660 1442l137 154q-126 -22 -290 153l-117 -121q182 -197 270 -186zM555.5 1268.5q-23.5 -65.5 25.5 -143.5q-48 -46 -70 -110l-150 -353h-151l-124 -209l39 -27l40 55h130q-63 -169 -285 -482l299 1l155 232l-232 6q111 43 180 243h233l128 146l197 -485 q61 -136 185 -148l162 283l-41 27l-70 -106q-60 7 -87 74l-386 1005q-38 83 48 190l-14 27q-188 -160 -211.5 -225.5zM765 657h-296l154 375z" />
-<glyph unicode="&#xc1;" horiz-adv-x="1288" d="M545.5 1293.5q-13.5 -90.5 35.5 -168.5q-48 -46 -70 -110l-150 -353h-151l-124 -209l39 -27l40 55h130q-63 -169 -285 -482l299 1l155 232l-232 6q111 43 180 243h233l128 146l197 -485q61 -136 185 -148l162 283l-41 27l-70 -106q-60 7 -87 74l-406 1055q-38 83 48 190 l-14 27q-188 -160 -201.5 -250.5zM765 657h-296l154 375zM428 1419l18 -25l259 159q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xc2;" horiz-adv-x="1205" d="M450 1233q-13 -86 35 -161q-47 -43 -68 -104l-107 -337h-146l-120 -199l37 -26l39 52h126q-61 -161 -276 -459l290 1l150 221l-225 6q108 41 175 231h226l95 140l220 -463q59 -130 179 -141l157 270l-40 26l-48 -82q-58 6 -85 70l-422 1016q-37 79 29 155l-25 23 q-183 -153 -196 -239zM673 626h-258l110 358zM678 1508q-139 6 -183 153l-150 -121l-35 39l271 239q76 -160 208 -178z" />
-<glyph unicode="&#xc3;" horiz-adv-x="1304" d="M448 1644l-94 -145l25 -32l53 71q77 60 182 -26t157 15l107 166l-22 32l-44 -67q-64 -55 -172.5 35t-191.5 -49zM545.5 1263.5q-23.5 -60.5 25.5 -138.5q-48 -46 -70 -110l-150 -353h-151l-124 -209l39 -27l40 55h130q-63 -169 -285 -482l299 1l155 232l-232 6 q111 43 180 243h233l128 146l197 -485q61 -136 185 -148l162 283l-41 27l-70 -106q-60 7 -87 74l-386 995q-38 83 48 190l-14 27q-188 -160 -211.5 -220.5zM755 657h-296l154 375z" />
-<glyph unicode="&#xc4;" horiz-adv-x="1250" d="M346 1563q109 -19 115 -160l187 149q6 132 -120 178zM722 1559q109 -19 115 -160l187 149q6 132 -120 178zM535.5 1293.5q-13.5 -90.5 35.5 -168.5q-48 -46 -70 -110l-150 -353h-151l-124 -209l39 -27l40 55h130q-63 -169 -285 -482l299 1l155 232l-232 6q111 43 180 243 h233l128 146l197 -485q61 -136 185 -148l162 283l-41 27l-70 -106q-60 7 -87 74l-406 1055q-38 83 18 160l-14 27q-158 -130 -171.5 -220.5zM755 657h-296l154 375z" />
-<glyph unicode="&#xc5;" horiz-adv-x="1276" d="M490.5 1700q-62.5 -40 -87 -96.5t5.5 -118t91.5 -81t101 2.5t96.5 66.5t60.5 99t-20 95.5t-75 60.5t-81 15.5t-92 -44zM617.5 1610q42.5 -61 42 -97.5t-34.5 -40t-66.5 30.5t-55.5 77t-11 69t47.5 24t78 -63zM535.5 1263.5q-13.5 -60.5 35.5 -138.5q-48 -46 -70 -110 l-150 -353h-151l-124 -209l39 -27l40 55h130q-63 -169 -285 -482l299 1l155 232l-232 6q111 43 180 243h233l128 146l197 -485q61 -136 185 -148l162 283l-41 27l-70 -106q-60 7 -87 74l-406 995q-38 83 8 140l-14 27q-148 -110 -161.5 -170.5zM755 657h-296l154 375z" />
-<glyph unicode="&#xc6;" horiz-adv-x="1471" d="M750 668h-216l217 375zM652 -5l609 1l206 293l-44 3q-63 -82 -146 -81l-378 1l-73 7q71 33 103 108v307h187l173 174l-16 25l-338 1v297h323l180 168l-6 20l-650 1l-150 -310l-211 -353h-230l-124 -209l38 -27l40 55h203q-116 -169 -338 -481l360 1l224 293l-36 1 q-39 -69 -326 -57q152 43 234 243h160l128 146l-1 -456z" />
-<glyph unicode="&#xc7;" horiz-adv-x="993" d="M681 -23l38 1l223 272l-30 23l-78 -82q-170 -25 -324 70.5t-241 267.5t-23 405q58 210 256 200q317 -25 260 -230l17 -8q192 175 197 225t-69.5 124t-149 83.5t-159 -1.5t-216.5 -128t-191 -199t-112 -198.5t-26 -287.5t233 -360q142 -130 276 -165l-59 -146l61 -9 q43 34 78.5 27t53.5 -40t-19 -84.5t-98 -107.5l15 -10q130 94 167.5 134t44.5 75.5t-25.5 66.5t-76 39t-67 5t-47.5 -20l23 60q34 -4 68 -2z" />
-<glyph unicode="&#xc8;" horiz-adv-x="919" d="M533 1412l137 154q-126 -22 -290 153l-117 -121q182 -197 270 -186zM1 1048l34 -14q60 73 132 73l173 -1q-129 -52 -139 -162l-1 -142l-141 -202l15 -22l127 67l-2 -338q8 -72 -147 -312l670 1l205 293l-50 3q-63 -82 -146 -81l-484 1q76 22 135 165l1 257h117l173 174 l-16 25l-268 1v277l323 2l180 188l-6 20l-711 -2z" />
-<glyph unicode="&#xc9;" horiz-adv-x="925" d="M1 1048l34 -14q60 73 132 73l173 -1q-129 -52 -139 -162l-1 -142l-141 -202l15 -22l127 67l-2 -338q8 -72 -147 -312l670 1l205 293l-50 3q-63 -82 -146 -81l-484 1q76 22 135 165l1 257h117l173 174l-16 25l-268 1v277l323 2l180 188l-6 20l-711 -2zM278 1419l18 -25 l259 159q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xca;" horiz-adv-x="904" d="M618 1427q-139 -13 -202 127l-132 -141l-40 34l236 274q97 -148 230 -148zM1 1048l34 -14q60 73 132 73l173 -1q-129 -52 -139 -162l-1 -142l-141 -202l15 -22l127 67l-2 -338q8 -72 -147 -312l670 1l205 293l-50 3q-63 -82 -146 -81l-484 1q76 22 135 165l1 257h117 l173 174l-16 25l-268 1v277l323 2l180 188l-6 20l-711 -2z" />
-<glyph unicode="&#xcb;" horiz-adv-x="932" d="M465 1505q109 -19 115 -160l187 149q6 132 -120 178zM149 1509q109 -19 115 -160l187 149q6 132 -120 178zM1 1048l34 -14q60 73 132 73l173 -1q-129 -52 -139 -162l-1 -142l-141 -202l15 -22l127 67l-2 -338q8 -72 -147 -312l670 1l205 293l-50 3q-63 -82 -146 -81 l-484 1q76 22 135 165l1 257h117l173 174l-16 25l-268 1v277l323 2l180 188l-6 20l-711 -2z" />
-<glyph unicode="&#xcc;" horiz-adv-x="699" d="M63 1054l34 -14q32 71 102 74l203 -1q-145 -102 -150 -204l-1 -556l1 -125q-27 -108 -166 -261l25 -4q54 40 323 34l165 195l-24 18q-49 -36 -276 -26q70 74 153 226l9 708l3 2l150 189l-6 20l-371 -2zM435 1412l137 154q-126 -22 -290 153l-117 -121q182 -197 270 -186z " />
-<glyph unicode="&#xcd;" horiz-adv-x="701" d="M215 1391l18 -25l259 159q98 83 58 205l-195 -91q13 -120 -140 -248zM93 1052l34 -14q32 70 102 73l183 -1q-145 -101 -150 -203l-1 -555l1 -124q-27 -108 -166 -261l25 -4q54 40 323 34l165 194l-24 19q-49 -36 -276 -27q70 23 153 124l9 808l3 2l150 189l-6 20l-351 -2 z" />
-<glyph unicode="&#xce;" horiz-adv-x="693" d="M66 1048l34 -14q32 70 102 73l203 -1q-145 -101 -150 -202l-1 -553l1 -124q-27 -108 -166 -260l25 -4q54 40 323 33l165 194l-24 19q-49 -36 -276 -27q70 74 153 226l9 703l3 2l150 188l-6 20l-371 -2zM513 1408q-139 6 -183 153l-150 -121l-35 39l271 239 q76 -160 208 -178z" />
-<glyph unicode="&#xcf;" horiz-adv-x="702" d="M75 1048l34 -14q32 70 102 73l203 -1q-145 -101 -150 -202l-1 -553l1 -124q-27 -108 -166 -260l25 -4q54 40 323 33l165 194l-24 19q-49 -36 -276 -27q70 74 153 226l9 703l3 2l150 188l-6 20l-371 -2zM367 1535q109 -19 115 -160l187 149q6 132 -120 178zM51 1539 q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xd0;" horiz-adv-x="1205" d="M219 1329l230 6q321 15 508 -161q184 -177 213 -406q26 -223 -89 -371q-114 -145 -182 -213q-35 -34 -67.5 -64t-61.5 -57q-57 -51 -174 -79l-532 10l-9 24q197 218 187 291l2 305h-64q-96 4 -145 -73l-16 12q63 221 225 238l2 108q6 94 143 227l-252 -4l-61 -73l-35 14z M586 791q98 -5 182 92l8 -17q-73 -231 -190 -252h-174v-151q-17 -103 -144 -252l576 2q76 39 137 184q62 146 -14 330q-74 182 -219 295q-144 113 -273 111q-82 -9 -59 -105l-2 -237h172z" />
-<glyph unicode="&#xd1;" horiz-adv-x="1156" d="M430 1604l-94 -145l25 -32l53 71q77 60 182 -26t157 15l107 166l-22 32l-44 -67q-64 -55 -172.5 35t-191.5 -49zM277.5 1341q-69.5 -16 -276.5 -238l32 -21q135 117 218 -3q-90 -113 -84 -162l1 -682q-33 -106 -169 -254l25 -4q53 40 314 23l161 190l-24 17 q-48 -35 -258 -16q81 33 121 111l-2 664l492 -802q-32 -73 -154 -188l26 -4q52 41 291 24l161 194l-24 18q-48 -36 -214 -13q67 41 87 112l2 823l3 2l176 188l-7 20l-371 -2l-168 -271l34 -15q31 70 102 73h182q-99 -42 -107 -101v-533q-500 866 -569.5 850z" />
-<glyph unicode="&#xd2;" horiz-adv-x="993" d="M226.5 1094q-154.5 -163 -183 -419.5t130 -462.5t284.5 -222t228.5 75.5t226.5 316.5t102 424.5t-155.5 338t-235.5 161.5t-172.5 -13t-225 -199zM677 986q146 -145 165 -399t-69 -337t-225.5 -26.5t-254 269t-95 405t177 213t301.5 -124.5zM356 676q109 -19 115 -160 l187 149q6 132 -120 178zM643 1382l137 154q-126 -22 -290 153l-117 -121q182 -197 270 -186z" />
-<glyph unicode="&#xd3;" horiz-adv-x="1065" d="M236.5 1094q-154.5 -163 -183 -419.5t130 -462.5t284.5 -222t228.5 75.5t226.5 316.5t102 424.5t-155.5 338t-235.5 161.5t-172.5 -13t-225 -199zM687 986q146 -145 165 -399t-69 -337t-225.5 -26.5t-254 269t-95 405t177 213t301.5 -124.5zM366 676q109 -19 115 -160 l187 149q6 132 -120 178zM348 1389l18 -25l259 159q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xd4;" horiz-adv-x="1003" d="M226.5 1094q-154.5 -163 -183 -419.5t130 -462.5t284.5 -222t228.5 75.5t226.5 316.5t102 424.5t-155.5 338t-235.5 161.5t-172.5 -13t-225 -199zM677 986q146 -145 165 -399t-69 -337t-225.5 -26.5t-254 269t-95 405t177 213t301.5 -124.5zM356 676q109 -19 115 -160 l187 149q6 132 -120 178zM678 1378q-139 6 -183 153l-150 -121l-35 39l271 239q76 -160 208 -178z" />
-<glyph unicode="&#xd5;" horiz-adv-x="1072" d="M384 1584l-94 -145l25 -32l53 71q77 60 182 -26t157 15l107 166l-22 32l-44 -67q-64 -55 -172.5 35t-191.5 -49zM236.5 1094q-154.5 -163 -183 -419.5t130 -462.5t284.5 -222t228.5 75.5t226.5 316.5t102 424.5t-155.5 338t-235.5 161.5t-172.5 -13t-225 -199zM687 986 q146 -145 165 -399t-69 -337t-225.5 -26.5t-254 269t-95 405t177 213t301.5 -124.5zM366 676q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xd6;" horiz-adv-x="1030" d="M244.5 1094q-154.5 -163 -183 -419.5t130 -462.5t284.5 -222t228.5 75.5t226.5 316.5t102 424.5t-155.5 338t-235.5 161.5t-172.5 -13t-225 -199zM695 986q146 -145 165 -399t-69 -337t-225.5 -26.5t-254 269t-95 405t177 213t301.5 -124.5zM374 676q109 -19 115 -160 l187 149q6 132 -120 178zM593 1495q109 -19 115 -160l187 149q6 132 -120 178zM217 1499q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xd7;" horiz-adv-x="708" d="M402 602l-195 237l-163 -154l215 -233l-226 -260l48 -46l225 253l210 -247l144 144l-208 255l220 240l-47 45z" />
-<glyph unicode="&#xd8;" horiz-adv-x="1093" d="M578 1100q-89 49 -182 36q-156 -21 -177.5 -219t95.5 -417q46 -87 96 -149zM675 1029l-177 -766q34 -25 70 -40q137 -58 225 27.5t69 346.5t-165 411q-11 11 -22 21zM632 1339l50 220l138 97l-83 -361q66 -43 143 -125q133 -142 155 -347t-102 -436.5t-226.5 -325.5 t-228.5 -77q-21 2 -42 10l-70 -303l-124 -83l100 442q-70 57 -148 162q-159 211 -130.5 475t183 431.5t225.5 204.5q66 35 160 16z" />
-<glyph unicode="&#xd9;" horiz-adv-x="1171" d="M779 235q49 -187 163 -237l196 365l-27 30q-126 -150 -134 96v612l45 1l140 173l-6 20l-371 -2l-164 -242l34 -14q28 67 92 67l175 -1q-121 -106 -145 -257v-491q-75 -191 -144 -162q-134 49 -238 172.5t-154 251.5t-50.5 227.5t148.5 272.5l154 179h-308l-8 -16 l-177 -237l24 -14q48 62 249 65q-335 -339 -191 -678q121 -269 381 -416q111 -22 218.5 103.5t97.5 131.5zM681 1372l137 154q-126 -22 -290 153l-117 -121q182 -197 270 -186z" />
-<glyph unicode="&#xda;" horiz-adv-x="1167" d="M779 240q49 -191 163 -242l196 373l-27 31q-126 -154 -134 98v625l45 1l140 177l-6 20l-371 -2l-164 -247l34 -15q28 69 92 69l175 -1q-121 -108 -145 -263v-501q-75 -195 -144 -166q-134 50 -238 176.5t-154 257t-50.5 232t148.5 278.5l154 183h-308l-8 -16l-177 -242 l24 -15q48 64 249 67q-335 -347 -191 -693q121 -275 381 -425q111 -22 218.5 106t97.5 134zM488 1389l18 -25l259 159q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xdb;" horiz-adv-x="1117" d="M773 235q49 -187 163 -237l196 365l-27 30q-126 -150 -134 96v612l45 1l140 173l-6 20l-371 -2l-164 -242l34 -14q28 67 92 67l175 -1q-121 -106 -145 -257v-491q-75 -191 -144 -162q-134 49 -238 172.5t-154 251.5t-50.5 227.5t148.5 272.5l154 179h-308l-8 -16 l-177 -237l24 -14q48 62 249 65q-335 -339 -191 -678q121 -269 381 -416q111 -22 218.5 103.5t97.5 131.5zM800 1358q-139 6 -183 153l-150 -121l-35 39l271 239q76 -160 208 -178z" />
-<glyph unicode="&#xdc;" horiz-adv-x="1130" d="M729 1520q109 -19 115 -160l187 149q6 132 -120 178zM353 1524q109 -19 115 -160l187 149q6 132 -120 178zM848 235q49 -187 163 -237l196 365l-27 30q-126 -150 -134 96v612l45 1l140 173l-6 20l-371 -2l-164 -242l34 -14q28 67 92 67l175 -1q-121 -106 -145 -257v-491 q-75 -191 -144 -162q-134 49 -238 172.5t-154 251.5t-50.5 227.5t148.5 272.5l154 179h-308l-8 -16l-177 -237l24 -14q48 62 249 65q-335 -339 -191 -678q121 -269 381 -416q111 -22 218.5 103.5t97.5 131.5z" />
-<glyph unicode="&#xdd;" horiz-adv-x="1010" d="M507 1113l17 -21q57 54 253 34l-190 -305l-277 422q-77 155 -178 18l-129 -137l28 -27q67 65 99 40l295 -473l1 -366q-7 -95 -199 -301l389 2l181 211l-31 23q-33 -81 -329 -55q179 127 193 266l-1 324l360 547l-16 7l-288 -2zM348 1389l18 -25l259 159q98 83 58 205 l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xde;" horiz-adv-x="1045" d="M397 283q284 -69 449.5 112.5t164 400.5t-145.5 330t-371 91l-99 -105l-2 170q-3 120 -73 141l-211 -175l15 -24q93 42 92 -82v-853q-38 -187 -202 -288l14 -30q71 39 359 28l148 199q-59 -29 -279 -22q111 51 141 107zM389 492l2 544q185 42 313.5 -32t175.5 -269.5 t-113.5 -278.5t-337.5 90z" />
-<glyph unicode="&#xdf;" horiz-adv-x="955" d="M367 1231q-29 83 -96 108l-205 -183l12 -32q79 33 84 -114v-163h-113l-42 -63h155v-626q2 -126 -140 -176l20 -34l255 112q75 8 89 89l1 999q31 71 112 49.5t102 -148.5t-66 -203l-77 -4l-41 -60q54 2 116 -25.5t119 -128t1 -429.5t-319 -568l24 -26q343 253 453.5 407.5 t123 352t-66.5 319t-273 148.5q201 90 207 261t-103 221t-189.5 16t-142.5 -99z" />
-<glyph unicode="&#xe0;" horiz-adv-x="807" d="M143 674q-111 -153 -119 -261t106 -257t176 -157q113 94 183 153q27 -107 157 -160l197 239l-33 23l-43 -47q-51 -23 -83 17t-29 99v481q3 73 54 97l-334 -1q-121 -73 -232 -226zM502 742l-35 -68v-37v-429q-88 -69 -216 118t8 416h243zM484 1032l137 154 q-126 -22 -290 153l-117 -121q182 -197 270 -186z" />
-<glyph unicode="&#xe1;" horiz-adv-x="843" d="M158 674q-111 -153 -119 -261t106 -257t176 -157q113 94 183 153q27 -107 157 -160l197 239l-33 23l-43 -47q-51 -23 -83 17t-29 99v481q3 73 54 97l-334 -1q-121 -73 -232 -226zM517 742l-35 -68v-37v-429q-88 -69 -216 118t8 416h243zM278 979l18 -25l259 159 q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xe2;" horiz-adv-x="841" d="M146 674q-111 -153 -119 -261t106 -257t176 -157q113 94 183 153q27 -107 157 -160l197 239l-33 23l-43 -47q-51 -23 -83 17t-29 99v481q3 73 54 97l-334 -1q-121 -73 -232 -226zM505 742l-35 -68v-37v-429q-88 -69 -216 118t8 416h243zM562 1018q-139 6 -183 153 l-150 -121l-35 39l271 239q76 -160 208 -178z" />
-<glyph unicode="&#xe3;" horiz-adv-x="830" d="M150 674q-111 -153 -119 -261t106 -257t176 -157q113 94 183 153q27 -107 157 -160l197 239l-33 23l-43 -47q-51 -23 -83 17t-29 99v481q3 73 54 97l-334 -1q-121 -73 -232 -226zM509 742l-35 -68v-37v-429q-88 -69 -216 118t8 416h243zM262 1154l-94 -145l25 -32l53 71 q77 60 182 -26t157 15l107 166l-22 32l-44 -67q-64 -55 -172.5 35t-191.5 -49z" />
-<glyph unicode="&#xe4;" horiz-adv-x="819" d="M141 674q-111 -153 -119 -261t106 -257t176 -157q113 94 183 153q27 -107 157 -160l197 239l-33 23l-43 -47q-51 -23 -83 17t-29 99v481q3 73 54 97l-334 -1q-121 -73 -232 -226zM500 742l-35 -68v-37v-429q-88 -69 -216 118t8 416h243zM392 1155q109 -19 115 -160 l187 149q6 132 -120 178zM76 1159q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xe5;" horiz-adv-x="851" d="M149 674q-111 -153 -119 -261t106 -257t176 -157q113 94 183 153q27 -107 157 -160l197 239l-33 23l-43 -47q-51 -23 -83 17t-29 99v481q3 73 54 97l-334 -1q-121 -73 -232 -226zM508 742l-35 -68v-37v-429q-88 -69 -216 118t8 416h243zM440.5 1250q-62.5 -40 -87 -96.5 t5.5 -118t91.5 -81t101 2.5t96.5 66.5t60.5 99t-20 95.5t-75 60.5t-81 15.5t-92 -44zM567.5 1160q42.5 -61 42 -97.5t-34.5 -40t-66.5 30.5t-55.5 77t-11 69t47.5 24t78 -63z" />
-<glyph unicode="&#xe6;" horiz-adv-x="1168" d="M495 674l45 68h-263q-136 -229 -8 -416q126 -183 280 -101q-39 35 -54 79v370zM598 144q-11 13 -21 28q-140 -79 -253 -173q-62 8 -176 157t-106 257t119 261t232 226l390 -3q-42 -39 -57 -75q54 47 122 76q91 9 165 -45t57 -190l-82 -71l-251 -201l-29 42l73 56 q71 51 88.5 105.5t-24 109t-123 34.5t-66 -150t113 -277.5t192.5 -127.5q70 43 154 139l25 -22q-141 -185 -271 -278q-40 -34 -86 -29v-1q-2 1 -3 2q-50 7 -107 60q-41 39 -76 90z" />
-<glyph unicode="&#xe7;" horiz-adv-x="685" d="M380 1q149 116 289 299l-25 22q-84 -96 -169 -124q-99 18 -182 149t-80 249t59.5 134t121.5 -22t79 -148l165 143q17 96 -57 150t-165 45q-93 -38 -206 -145q-232 -222 -165 -408.5t162 -274.5q53 -49 94 -66l-68 -161l61 -9q43 34 78.5 27t53.5 -40t-19 -84.5 t-98 -107.5l15 -10q130 94 167.5 134t44.5 75.5t-25.5 66.5t-76 39t-67 5t-47.5 -20l32 79z" />
-<glyph unicode="&#xe8;" horiz-adv-x="675" d="M207 753q-232 -222 -165 -408.5t177.5 -290.5t195.5 -32q130 93 271 278l-25 22q-84 -96 -154 -139q-95 -20 -192.5 127.5t-113 277.5t66 150t123 -34.5t24 -109t-88.5 -105.5l-73 -56l29 -42l251 201l82 71q17 136 -57 190t-165 45q-93 -38 -186 -145zM463 1012l137 154 q-126 -22 -290 153l-117 -121q182 -197 270 -186z" />
-<glyph unicode="&#xe9;" horiz-adv-x="692" d="M213 753q-232 -222 -165 -408.5t177.5 -290.5t195.5 -32q130 93 271 278l-25 22q-84 -96 -154 -139q-95 -20 -192.5 127.5t-113 277.5t66 150t123 -34.5t24 -109t-88.5 -105.5l-73 -56l29 -42l251 201l82 71q17 136 -57 190t-165 45q-93 -38 -186 -145zM278 979l18 -25 l259 159q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xea;" horiz-adv-x="685" d="M212 753q-232 -222 -165 -408.5t177.5 -290.5t195.5 -32q130 93 271 278l-25 22q-84 -96 -154 -139q-95 -20 -192.5 127.5t-113 277.5t66 150t123 -34.5t24 -109t-88.5 -105.5l-73 -56l29 -42l251 201l82 71q17 136 -57 190t-165 45q-93 -38 -186 -145zM553 1018 q-139 6 -183 153l-150 -121l-35 39l271 239q76 -160 208 -178z" />
-<glyph unicode="&#xeb;" horiz-adv-x="715" d="M223 753q-232 -222 -165 -408.5t177.5 -290.5t195.5 -32q130 93 271 278l-25 22q-84 -96 -154 -139q-95 -20 -192.5 127.5t-113 277.5t66 150t123 -34.5t24 -109t-88.5 -105.5l-73 -56l29 -42l251 201l82 71q17 136 -57 190t-165 45q-93 -38 -186 -145zM369 1155 q109 -19 115 -160l187 149q6 132 -120 178zM53 1159q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xec;" horiz-adv-x="439" d="M-7 710l20 -37l60 44q53 1 41 -151v-406q12 -147 124 -166l197 192l-23 23l-56 -50q-55 3 -48 154l-1 423q-2 157 -68 176zM260 1032l137 154q-126 -22 -290 153l-117 -121q182 -197 270 -186z" />
-<glyph unicode="&#xed;" horiz-adv-x="431" d="M-2 710l20 -37l60 44q53 1 41 -151v-406q12 -147 124 -166l197 192l-23 23l-56 -50q-55 3 -48 154l-1 423q-2 157 -68 176zM38 979l18 -25l259 159q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xee;" horiz-adv-x="433" d="M-7 710l20 -37l60 44q53 1 41 -151v-406q12 -147 124 -166l197 192l-23 23l-56 -50q-55 3 -48 154l-1 423q-2 157 -68 176zM355 1018q-139 6 -183 153l-150 -121l-35 39l271 239q76 -160 208 -178z" />
-<glyph unicode="&#xef;" horiz-adv-x="505" d="M66 710l20 -37l60 44q53 1 41 -151v-406q12 -147 124 -166l197 192l-23 23l-56 -50q-55 3 -48 154l-1 423q-2 157 -68 176zM203 1155q109 -19 115 -160l187 149q6 132 -120 178zM-33 1159q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xf0;" horiz-adv-x="913" d="M236 681q-67 -68 -15 -240t170.5 -265t227.5 0.5t6 557.5l-176 -134q-73 153 -213 81zM277 1019l199 122q-34 102 -129 219l110 127q123 -107 195 -263q203 93 234 135l25 -12l-35 -102l-185 -99q145 -302 158 -568t-110.5 -399t-271 -169t-268.5 73.5t-145.5 244.5 t8 212.5t105.5 166t136 141.5t131.5 55.5t165.5 -82.5q-48 127 -87 250q-208 -128 -228 -161l-10 11z" />
-<glyph unicode="&#xf1;" horiz-adv-x="896" d="M-4 713l24 -30l59 53q80 -4 72 -164v-410q3 -148 119 -168l189 186l-20 20l-58 -49q-40 17 -36 150v375l74 62q172 5 174 -205l-1 -367q-1 -146 112 -168l190 184l-20 26l-58 -54q-35 5 -34 118l1 397q-3 135 -86.5 191t-171.5 41l-189 -178q-21 160 -152 178zM241 1154 l-94 -145l25 -32l53 71q77 60 182 -26t157 15l107 166l-22 32l-44 -67q-64 -55 -172.5 35t-191.5 -49z" />
-<glyph unicode="&#xf2;" horiz-adv-x="757" d="M167 750.5q-112 -112.5 -132.5 -289t100 -319t211 -153.5t159.5 52t158.5 218t73.5 293t-112.5 233.5t-170 111.5t-124.5 -9t-163 -137.5zM471 672.5q106 -113.5 122.5 -246.5t-33 -194t-147 -49.5t-178.5 163.5t-65.5 261t105.5 144t196 -78.5zM465 1032l137 154 q-126 -22 -290 153l-117 -121q182 -197 270 -186z" />
-<glyph unicode="&#xf3;" horiz-adv-x="795" d="M176 750.5q-112 -112.5 -132.5 -289t100 -319t211 -153.5t159.5 52t158.5 218t73.5 293t-112.5 233.5t-170 111.5t-124.5 -9t-163 -137.5zM480 672.5q106 -113.5 122.5 -246.5t-33 -194t-147 -49.5t-178.5 163.5t-65.5 261t105.5 144t196 -78.5zM308 979l18 -25l259 159 q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xf4;" horiz-adv-x="786" d="M178 750.5q-112 -112.5 -132.5 -289t100 -319t211 -153.5t159.5 52t158.5 218t73.5 293t-112.5 233.5t-170 111.5t-124.5 -9t-163 -137.5zM482 672.5q106 -113.5 122.5 -246.5t-33 -194t-147 -49.5t-178.5 163.5t-65.5 261t105.5 144t196 -78.5zM561 1018 q-139 6 -183 153l-150 -121l-35 39l271 239q76 -160 208 -178z" />
-<glyph unicode="&#xf5;" horiz-adv-x="779" d="M182 750.5q-112 -112.5 -132.5 -289t100 -319t211 -153.5t159.5 52t158.5 218t73.5 293t-112.5 233.5t-170 111.5t-124.5 -9t-163 -137.5zM486 672.5q106 -113.5 122.5 -246.5t-33 -194t-147 -49.5t-178.5 163.5t-65.5 261t105.5 144t196 -78.5zM231 1154l-94 -145 l25 -32l53 71q77 60 182 -26t157 15l107 166l-22 32l-44 -67q-64 -55 -172.5 35t-191.5 -49z" />
-<glyph unicode="&#xf6;" horiz-adv-x="771" d="M171 750.5q-112 -112.5 -132.5 -289t100 -319t211 -153.5t159.5 52t158.5 218t73.5 293t-112.5 233.5t-170 111.5t-124.5 -9t-163 -137.5zM475 672.5q106 -113.5 122.5 -246.5t-33 -194t-147 -49.5t-178.5 163.5t-65.5 261t105.5 144t196 -78.5zM399 1145 q109 -19 115 -160l187 149q6 132 -120 178zM83 1149q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xf7;" horiz-adv-x="892" d="M672 563h-389q-185 -13 -252 -208l11 -16q54 80 167 72h462q132 21 218 227l-11 16q-66 -66 -206 -91zM265 221q109 -19 115 -160l187 149q6 132 -120 178zM275 751q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xf8;" horiz-adv-x="791" d="M401 738q-61 34 -116 13q-90 -35 -105.5 -144t65.5 -261q21 -40 44 -70zM492 660l-115 -463q23 -12 47 -15q97 -11 146.5 50t33.5 194q-16 126 -112 234zM440 901l82 338l138 97l-118 -474q43 -28 92 -76q97 -96 113 -234t-73.5 -293t-158.5 -218t-159 -52q-15 2 -29 7 l-81 -325l-124 -83l112 463q-42 36 -90 91q-120 143 -99.5 319.5t132.5 289t163 137.5q42 21 100 13z" />
-<glyph unicode="&#xf9;" horiz-adv-x="830" d="M864 183l-24 30l-59 -53q-80 4 -72 164v410q-3 148 -119 168l-189 -186l20 -20l58 49q48 -15 36 -150v-375l-93 -79q-157 12 -155 222l1 367q1 146 -112 168l-190 -184l20 -26l58 54q41 -5 34 -148l-1 -300q0 -150 83.5 -226t180.5 -81l183 186q21 -160 152 -178z M483 1032l137 154q-126 -22 -290 153l-117 -121q182 -197 270 -186z" />
-<glyph unicode="&#xfa;" horiz-adv-x="893" d="M897 183l-24 30l-59 -53q-80 4 -72 164v410q-3 148 -119 168l-189 -186l20 -20l58 49q48 -15 36 -150v-375l-93 -79q-157 12 -155 222l1 367q1 146 -112 168l-190 -184l20 -26l58 54q41 -5 34 -148l-1 -300q0 -150 83.5 -226t180.5 -81l183 186q21 -160 152 -178z M308 979l18 -25l259 159q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xfb;" horiz-adv-x="838" d="M869 183l-24 30l-59 -53q-80 4 -72 164v410q-3 148 -119 168l-189 -186l20 -20l58 49q48 -15 36 -150v-375l-93 -79q-157 12 -155 222l1 367q1 146 -112 168l-190 -184l20 -26l58 54q41 -5 34 -148l-1 -300q0 -150 83.5 -226t180.5 -81l183 186q21 -160 152 -178z M553 1018q-139 6 -183 153l-150 -121l-35 39l271 239q76 -160 208 -178z" />
-<glyph unicode="&#xfc;" horiz-adv-x="824" d="M869 183l-24 30l-59 -53q-80 4 -72 164v410q-3 148 -119 168l-189 -186l20 -20l58 49q48 -15 36 -150v-375l-93 -79q-157 12 -155 222l1 367q1 146 -112 168l-190 -184l20 -26l58 54q41 -5 34 -148l-1 -300q0 -150 83.5 -226t180.5 -81l183 186q21 -160 152 -178z M388 1155q109 -19 115 -160l187 149q6 132 -120 178zM72 1159q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#xfd;" horiz-adv-x="869" d="M552.5 -293q228.5 175 262.5 396v637q-20 146 -124 168l-217 -214l23 -32l64 61q59 5 52 -142v-317q-53 -84 -147 -75t-111 179l1 368q1 146 -117 168l-227 -224l20 -37l62 59q60 30 62 -106v-321q15 -215 231 -287q137 77 235 189v-115q15 -277 -124 -276.5t-245 130.5 l-165 -186q236 -198 464.5 -23zM338 979l18 -25l259 159q98 83 58 205l-195 -91q13 -120 -140 -248z" />
-<glyph unicode="&#xfe;" horiz-adv-x="955" d="M317 13q284 -79 449.5 107.5t164 390.5t-145.5 315t-371 91l-99 -105l1 360q-6 120 -76 141l-211 -175l15 -24q93 42 92 -82v-1043q-38 -277 -202 -378l14 -30q71 39 359 28l148 199q-59 -29 -279 -22q111 51 141 124v103zM309 222l2 514q185 42 313.5 -32t175.5 -254.5 t-113.5 -263.5t-337.5 90z" />
-<glyph unicode="&#xff;" horiz-adv-x="851" d="M547.5 -293q228.5 175 262.5 396v637q-20 146 -124 168l-217 -214l23 -32l64 61q59 5 52 -142v-317q-53 -84 -147 -75t-111 179l1 368q1 146 -117 168l-227 -224l20 -37l62 59q60 30 62 -106v-321q15 -215 231 -287q137 77 235 189v-115q15 -277 -124 -276.5t-245 130.5 l-165 -186q236 -198 464.5 -23zM420 1155q109 -19 115 -160l187 149q6 132 -120 178zM104 1159q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#x152;" horiz-adv-x="1544" d="M538 856q126 -47 120 -184l-187 -154q-6 146 -115 166zM611 1064q-115 87 -235 70q-156 -21 -177.5 -220.5t95 -420t254 -279t225.5 27.5q16 16 29 38q2 16 1 27l2 341l-1 143q-42 126 -127 214q-19 19 -66 59zM721 87q-17 -20 -35 -35q-102 -95 -228 -78.5t-284.5 229.5 t-130 479t183 435t225 206t172.5 13q56 -13 121 -62l34 53l711 1l6 -20l-180 -189l-323 -2v-280h268l16 -25l-173 -175h-117v-82l-1 -177q-59 -144 -135 -166l484 -1q83 -1 146 81l50 -3l-205 -294h-657q29 50 52 92z" />
-<glyph unicode="&#x153;" horiz-adv-x="1261" d="M610.5 426q16.5 -133 -33 -194t-147 -49.5t-178.5 163.5t-65.5 261t105.5 144t196 -78.5t122.5 -246.5zM819 54q110 -104 195 -32q130 93 271 278l-25 22q-84 -96 -154 -139q-95 -20 -192.5 127.5t-113 277.5t66 150t123 -34.5t24 -109t-88.5 -105.5l-73 -56l29 -42 l251 201l82 71q17 136 -57 190t-165 45q-93 -38 -186 -145q-47 -45 -81 -88q-29 67 -83 121q-97 95 -170.5 111t-124.5 -9t-163 -137.5t-132.5 -289t100 -319t211 -153.5t159.5 52q68 62 156 214q58 -124 141 -201z" />
-<glyph unicode="&#x178;" horiz-adv-x="981" d="M500 1111l17 -22q57 54 253 35l-190 -305l-277 421q-77 155 -178 18l-129 -136l28 -28q67 65 99 40l295 -471l1 -365q-7 -96 -199 -301l389 2l181 210l-31 24q-33 -82 -329 -55q179 126 193 265l-1 323l360 546l-16 7l-288 -2zM502 1535q109 -19 115 -160l187 149 q6 132 -120 178zM186 1539q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#x2dc;" horiz-adv-x="589" d="M124 1144l-94 -145l25 -32l53 71q77 60 182 -26t157 15l107 166l-22 32l-44 -67q-64 -55 -172.5 35t-191.5 -49z" />
-<glyph unicode="&#x2000;" horiz-adv-x="919" />
-<glyph unicode="&#x2001;" horiz-adv-x="1838" />
-<glyph unicode="&#x2002;" horiz-adv-x="919" />
-<glyph unicode="&#x2003;" horiz-adv-x="1838" />
-<glyph unicode="&#x2004;" horiz-adv-x="612" />
-<glyph unicode="&#x2005;" horiz-adv-x="459" />
-<glyph unicode="&#x2006;" horiz-adv-x="306" />
-<glyph unicode="&#x2007;" horiz-adv-x="306" />
-<glyph unicode="&#x2008;" horiz-adv-x="229" />
-<glyph unicode="&#x2009;" horiz-adv-x="367" />
-<glyph unicode="&#x200a;" horiz-adv-x="102" />
-<glyph unicode="&#x2010;" d="M571 640h-333q-158 -13 -222 -231l16 -13q49 76 143 72h396q113 21 186 247l-9 16q-81 -94 -177 -91z" />
-<glyph unicode="&#x2011;" d="M571 640h-333q-158 -13 -222 -231l16 -13q49 76 143 72h396q113 21 186 247l-9 16q-81 -94 -177 -91z" />
-<glyph unicode="&#x2012;" d="M571 640h-333q-158 -13 -222 -231l16 -13q49 76 143 72h396q113 21 186 247l-9 16q-81 -94 -177 -91z" />
-<glyph unicode="&#x2013;" horiz-adv-x="952" d="M23 572l10 -15q33 34 772 24l129 162l-21 9q-27 -35 -751 -22z" />
-<glyph unicode="&#x2014;" horiz-adv-x="1451" d="M23 562l10 -15q33 34 1272 24l129 162l-21 9q-27 -35 -1251 -22z" />
-<glyph unicode="&#x2018;" horiz-adv-x="278" d="M268 1094q-73 63 -70.5 128t48.5 101l-27 27q-124 -90 -159.5 -138.5t-35.5 -112.5t32 -100t71 -39z" />
-<glyph unicode="&#x2019;" horiz-adv-x="246" d="M1 1217q73 -63 70.5 -128t-48.5 -101l27 -27q124 90 159.5 138.5t35.5 112.5t-32 100t-71 39z" />
-<glyph unicode="&#x201c;" horiz-adv-x="534" d="M531 1094q-73 63 -70.5 128t48.5 101l-27 27q-124 -90 -159.5 -138.5t-35.5 -112.5t32 -100t71 -39zM271 1094q-73 63 -70.5 128t48.5 101l-27 27q-124 -90 -159.5 -138.5t-35.5 -112.5t32 -100t71 -39z" />
-<glyph unicode="&#x201d;" horiz-adv-x="548" d="M309 1216q73 -63 70.5 -128t-48.5 -101l27 -27q124 90 159.5 138.5t35.5 112.5t-32 100t-71 39zM26 1217q73 -63 70.5 -128t-48.5 -101l27 -27q124 90 159.5 138.5t35.5 112.5t-32 100t-71 39z" />
-<glyph unicode="&#x2022;" horiz-adv-x="512" d="M150 660h-104l115 -123h-91l-68 -73h168l-125 -133h104l68 72v-164l73 68v93l63 -67h106l-124 131h104l65 73h-160l114 121h-106l-62 -66v169l-73 -65v-107z" />
-<glyph unicode="&#x2026;" horiz-adv-x="1009" d="M4 131q109 -19 115 -160l187 149q6 132 -120 178zM344 131q109 -19 115 -160l187 149q6 132 -120 178zM684 131q109 -19 115 -160l187 149q6 132 -120 178z" />
-<glyph unicode="&#x202f;" horiz-adv-x="367" />
-<glyph unicode="&#x2039;" horiz-adv-x="366" d="M341 171l-169 376l176 372l-65 131l-281 -573l209 -473z" />
-<glyph unicode="&#x203a;" horiz-adv-x="422" d="M9 883l169 -376l-176 -372l65 -131l281 573l-209 473z" />
-<glyph unicode="&#x205f;" horiz-adv-x="459" />
-<glyph unicode="&#x20ac;" horiz-adv-x="902" d="M131 611l-112 -114l8 -11q13 13 140 18q-4 -19 -5 -38h-31l-112 -114l8 -11q13 12 135 17q7 -45 22 -85q41 -98 111.5 -169.5t172.5 -102.5q48 -13 94 -13q53 0 103 17q96 34 202 159l-34 30q-110 -110 -278 -23q-134 70 -193 191q78 1 174 0l104 117l-16 6 q-17 -19 -299 -20q-5 21 -9 43h220l104 116l-16 6q-17 -20 -314 -20q4 58 26 106q53 115 173 117t157.5 -50.5t9.5 -88.5l25 -12l145 109q19 43 -35 102t-173 62h-14q-110 0 -187 -39q-83 -41 -166 -158q-50 -70 -77 -148q-31 0 -63 1z" />
-<glyph unicode="&#x2122;" horiz-adv-x="1214" d="M42 1289l10 -8q27 21 194 13q-26 -27 -46 -50l1 -405q18 -72 81 -85l83 73l-8 16q-37 -1 -46 72l2 380h103l88 82l-9 10h-384zM471 1260l12 -22q38 31 34 -64q-5 -297 1.5 -343t49.5 -80l107 103v16q-40 -8 -45.5 64.5t0.5 262.5q66 80 111.5 57t44.5 -167 q-2 -207 1.5 -256t44.5 -85l103 105l-3 17q-40 -12 -30 343q62 66 107 43t45 -167q-3 -207 1 -256t45 -85l105 109l-2 16q-27 -11 -35.5 61.5t-2.5 217.5q3 88 -11 141.5t-61 78t-87 -1.5t-66 -55t-43 -53q-25 85 -72 109.5t-87 -1.5t-66 -55t-40 -50q5 85 -35 120z" />
-<glyph unicode="&#xe000;" horiz-adv-x="900" d="M0 900h900v-900h-900v900z" />
-<hkern u1="C" u2="o" k="98" />
-<hkern u1="F" u2="o" k="254" />
-<hkern u1="F" u2="e" k="194" />
-<hkern u1="J" u2="o" k="105" />
-<hkern u1="J" u2="e" k="95" />
-<hkern u1="M" u2="o" k="80" />
-<hkern u1="M" u2="e" k="83" />
-<hkern u1="T" u2="y" k="238" />
-<hkern u1="T" u2="o" k="226" />
-<hkern u1="T" u2="h" k="-12" />
-<hkern u1="T" u2="e" k="199" />
-<hkern u1="T" u2="a" k="200" />
-<hkern u1="f" u2="f" k="145" />
-</font>
-</defs></svg> 
\ No newline at end of file
diff --git a/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.ttf b/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.ttf
deleted file mode 100644
index efff3e38..00000000
Binary files a/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.ttf and /dev/null differ
diff --git a/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.woff b/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.woff
deleted file mode 100644
index 8e0da8bd..00000000
Binary files a/supvisors/design/fonts/Kingthings_Calligraphica_2-webfont.woff and /dev/null differ
diff --git a/supvisors/design/img/arrow-left_30.png b/supvisors/design/img/arrow-left_30.png
deleted file mode 100644
index 4e0aa268..00000000
Binary files a/supvisors/design/img/arrow-left_30.png and /dev/null differ
diff --git a/supvisors/design/img/arrow-orange_12.png b/supvisors/design/img/arrow-orange_12.png
deleted file mode 100644
index deffdb6c..00000000
Binary files a/supvisors/design/img/arrow-orange_12.png and /dev/null differ
diff --git a/supvisors/design/img/arrow-right_30.png b/supvisors/design/img/arrow-right_30.png
deleted file mode 100644
index c35bec79..00000000
Binary files a/supvisors/design/img/arrow-right_30.png and /dev/null differ
diff --git a/supvisors/design/img/arrows-blue_16.png b/supvisors/design/img/arrows-blue_16.png
deleted file mode 100644
index c0c2c1ac..00000000
Binary files a/supvisors/design/img/arrows-blue_16.png and /dev/null differ
diff --git a/supvisors/design/img/arrows-green_16.png b/supvisors/design/img/arrows-green_16.png
deleted file mode 100644
index 4159e542..00000000
Binary files a/supvisors/design/img/arrows-green_16.png and /dev/null differ
diff --git a/supvisors/design/img/info_16.png b/supvisors/design/img/info_16.png
deleted file mode 100644
index bc005519..00000000
Binary files a/supvisors/design/img/info_16.png and /dev/null differ
diff --git a/supvisors/design/img/reload_30.png b/supvisors/design/img/reload_30.png
deleted file mode 100644
index 1856ea39..00000000
Binary files a/supvisors/design/img/reload_30.png and /dev/null differ
diff --git a/supvisors/design/img/smoke.jpg b/supvisors/design/img/smoke.jpg
deleted file mode 100644
index fefb8813..00000000
Binary files a/supvisors/design/img/smoke.jpg and /dev/null differ
diff --git a/supvisors/design/img/texture.jpg b/supvisors/design/img/texture.jpg
deleted file mode 100644
index 4ba4e25d..00000000
Binary files a/supvisors/design/img/texture.jpg and /dev/null differ
diff --git a/supvisors/design/index.html b/supvisors/design/index.html
deleted file mode 100644
index f515c106..00000000
--- a/supvisors/design/index.html
+++ /dev/null
@@ -1,575 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="utf-8">
-    <link rel="stylesheet" href="css/doc_style.css">
-    <link rel="stylesheet" href="css/menu.css">
-    <title>Supvisors: A Control System for Distributed Applications</title>
-</head>
-
-<body>
-	<div id="body_block">
-
-		<div id="left_side">
-			<header>
-				<h1><a href="https://github.com/julien6387/supvisors" target="_blank">Supvisors</a></h1>
-			</header>
-
-			<nav>
-			    <ul>
-                    <li><a href="#design-supervisord">Extending supervisord</a><ul>
-                        <li><a href="#data-model">Data Model</a></li>
-                        <li><a href="#parsing">Parsing Files</a></li>
-                        <li><a href="#logging">Logging</a></li>
-                        <li><a href="#supervisor-events">Supervisor Events</a></li>
-						<li><a href="#inactive-addresses">Inactive Addresses</a></li>
-                        <li><a href="#state-machine">State Machine</a></li>
-                        <li><a href="#deployment">Deployment</a></li>
-                        <li><a href="#failure">Process Failure</a></li>
-                        <li><a href="#conciliation">Conciliation</a></li>
-                        <li><a href="#external-io">External Interfaces</a></li>
-                        <li><a href="#design-web-ext">Replacing the web pages</a></li>
-                    </ul></li>
-                    <li><a href="#design-supervisorctl">Extending supervisorctl</a></li>
-                </ul>
-			</nav>
-
-			<footer>
-				<p>Contact: <a href="mailto:julien.6387.dev@gmail.com">Julien Le Cl&eacute;ach</a></p>
-				<p id="copyright">&copy; Copyright 2016-2017 Julien LE CLEACH</p>
-			</footer>
-		</div>
-
-		<div id="right_side">
-			<header>
-				<h2>Documentation &raquo; Software Design</h2>
-			</header>
-
-			<section id="doc-contents">
-				<h2 id="design-supervisord">Extending supervisord</h2>
-				<p>Supvisors uses the Supervisor's XML-RPC API extension facility to add behaviour into Supervisor.<br />
-				More particularly, Supvisors starts a dedicated thread <mark>inside</mark> the supervisord daemon to perform the additional work.</p>
-
-				<h3 id="data-model">Data Model</h3>
-				<p>This part presents the main structures used in the python source code of Supvisors.</p>
-
-				<h4>ProcessStatus</h4>
-				<p>Each program controlled by Supervisor is represented in a class called <code class="className">ProcessStatus</code>.<br />
-				More particularly, it contains the following information:</p>
-				<table class="modelTable">
-					<tr><th colspan="2"><code class="className">ProcessStatus</code></th></tr>
-					<tr><td><code class="attributeName">application_name</code></td><td>name of the application that the process belongs to, in other words the Supervisor group</td></tr>
-					<tr><td><code class="attributeName">process_name</code></td><td>name of the process, in other words the Supervisor program name</td></tr>
-					<tr><td><code class="attributeName">state</code></td><td>'synthetic' state of the process, as defined in <a href="http://supervisord.org/subprocess.html#process-states" class="extLink">Supervisor</a></td></tr>
-					<tr><td><code class="attributeName">expected_exit</code></td><td>status telling if the process has exited as expected, only makes sense when state is <code>EXITED</code></td></tr>
-					<tr><td><code class="attributeName">last_event_time</code></td><td>date of the last process event received from Supervisor, in remote reference time</td></tr>
-					<tr><td><code class="attributeName">addresses</code></td><td>set of addresses where the process is in a <code>RUNNING</code> state<br />
-						0 or 1 value is expected<br />
-						if more that one value, a split-brain syndrome is happening</td></tr>
-					<tr><td><code class="attributeName">processes</code></td><td>map of process information, key is <code class="attributeName">address</code></td></tr>
-					<tr><td><code class="attributeName">rules</code></td><td>a <code class="className">ProcessRules</code> instance containing the deployment model of the process, as defined in the rules file</td></tr>
-				</table>
-
-				<p>Supervisor defines the following lists of states:</p>
-				<pre><code class="python">STOPPED_STATES = (ProcessStates.STOPPED,
-	ProcessStates.EXITED,
-	ProcessStates.FATAL,
-	ProcessStates.UNKNOWN)
-RUNNING_STATES = (ProcessStates.RUNNING,
-	ProcessStates.BACKOFF,
-	ProcessStates.STARTING)</code></pre>
-
-				<div class="note" id="synthetic-state-note">
-					<p>Note about the state synthesis of a process</p>
-                    <p>The state of the <code class="className">ProcessStatus</code> is a kind of synthesis based on the states declared on all Supervisor instances.<br />
-                    Depending on how the program has been used on different addresses, it may be <code>STOPPED</code> on address A, <code>EXITED</code> on address B,
-                    <code>RUNNING</code> on address C, etc.<br />
-                    So Supvisors uses the following priority to declare the process state:</p>
-                    <ul>
-                        <li>the 'highest' state in <code>RUNNING_STATES</code>, with <code>RUNNING</code> &gt; <code>BACKOFF</code> &gt; <code>STARTING</code>,</li>
-                        <li>the <code>STOPPING</code> state,</li>
-                        <li>the last state received in <code>STOPPED_STATES</code>.</li>
-                    </ul>
-				</div>
-
-				<div class="note">
-					<p>Note about the decision not to use the <code class="className">Subprocess</code> class, available in Supervisor source code</p>
-					<p>First, it may be impossible to point to the <code class="className">Subprocess</code> reference in supervisord config, as it may not exist.
-                    Although it is recommended for the usage of Supvisors, nothing forces the user to configure all the Supervisor instances with exactly the same list of programs.
-                    So when receiving a process event in the Supvisors instance B (i.e. located on address B), coming from the Supvisors instance A,
-                    it may happen that the involved process is unknown to the Supervisor instance hosting B.<br />
-					So, considering that a new instance of a <code class="className">Subprocess</code> could be handled in Supvisors, that raises other problems.
-                    For the same reason given above, it may be impossible to assign a config to this instance. In addition to that, as a different instance of the same program
-                    may be managed by every Supvisors instances, there is no guarantee that the process state transitions will be fully respected. Supvisors has to juggle with that.<br />
-					Finally, <code class="className">Subprocess</code> methods and most of the information held are irrelevant to Supvisors.</p>
-				</div>
-
-				<div class="note">
-					<p>Note about the process information</p>
-					<p>The process information held in Supvisors looks more or less like the dictionary got from
-                    the <code><a href="http://supervisord.org/api.html#supervisor.rpcinterface.SupervisorNamespaceRPCInterface.getProcessInfo" class="extLink">supervisor.getProcessInfo</a></code> XML-RPC.</p>
-					<p>A few entries are removed from this dictionary, because they are useless in Supvisors and in order to improve performance: <code>description</code>, <code>stderr_logfile</code>, <code>stdout_logfile</code>, <code>logfile</code>, <code>exitstatus</code>.<br />
-					A few entries are added to this dictionary: <code>localTime</code>, <code>eventTime</code>, <code>uptime</code>, <code>expected</code>.</p>
-					<p>The dictionary contents are still subject to modifications.</p>
-					<table>
-						<caption>Process Information Dictionary</caption>
-						<tr><th>Key</th><th>Value</th></tr>
-						<tr><td><code>'name'</code></td><td>name of the process</td></tr>
-						<tr><td><code>'group'</code></td><td>name of the group, i.e. name of the application for Supvisors</td></tr>
-						<tr class="removed-entry"><td><code>'description'</code></td><td>description of the process activity</td></tr>
-						<tr><td><code>'start'</code></td><td>start time of the process, in remote reference time</td></tr>
-						<tr><td><code>'stop'</code></td><td>stop time of the process, in remote reference time</td></tr>
-						<tr><td><code>'now'</code></td><td>current time of the process, in remote reference time</td></tr>
-						<tr class="added-entry"><td><code>'local_time'</code></td><td>current time of the process, in local reference time</td></tr>
-						<tr class="added-entry"><td><code>'event_time'</code></td><td>date of the last event received, in local reference time</td></tr>
-						<tr class="added-entry"><td><code>'uptime'</code></td><td>age of the process</td></tr>
-						<tr><td><code>'state'</code></td><td>state of the process</td></tr>
-						<tr><td><code>'statename'</code></td><td>state of the process, as string</td></tr>
-						<tr><td><code>'spawnerr'</code></td><td>error description when process cannot be spawned</td></tr>
-						<tr class="removed-entry"><td><code>'exitstatus'</code></td><td>exit code of the process</td></tr>
-						<tr class="added-entry"><td><code>'expected'</code></td><td>expected exit of the process (true, false)</td></tr>
-						<tr class="removed-entry"><td><code>'logfile'</code></td><td>standard ouput of the process, deprecated</td></tr>
-						<tr class="removed-entry"><td><code>'stdout_logfile'</code></td><td>standard ouput of the process</td></tr>
-						<tr class="removed-entry"><td><code>'stderr_logfile'</code></td><td>error ouput of the process</td></tr>
-						<tr><td><code>'pid'</code></td><td>process identifier</td></tr>
-					</table>
-				</div>
-
-				<h4>ApplicationStatus</h4>
-				<p>A <code class="className">ProcessStatus</code> belongs to an <code class="className">ApplicationStatus</code>.<br />
-				More particularly, it contains the following information:</p>
-				<table class="modelTable">
-					<tr><th colspan="2"><code class="className">ApplicationStatus</code></th></tr>
-					<tr><td><code class="attributeName">application_name</code></td><td>name of the application, in other words the Supervisor group</td></tr>
-					<tr><td><code class="attributeName">state</code></td><td>state of the application, among:<ul>
-							<li><code>UNKNOWN</code>: application state cannot be determined (initial state)</li>
-							<li><code>STOPPED</code>: all processes are in <code>STOPPED_STATES</code></li>
-							<li><code>STARTING</code>: at least one process is <code>STARTING</code> or <code>BACKOFF</code></li>
-							<li><code>STOPPING</code>: at least one process is <code>STOPPING</code> and none is <code>STARTING</code> or <code>BACKOFF</code></li>
-							<li><code>RUNNING</code>: at least one process is <code>RUNNING</code> and none is <code>STARTING</code>, <code>BACKOFF</code> or <code>STOPPING</code></li>
-						</ul></td></tr>
-					<tr><td><code class="attributeName">major_failure</code></td><td>indicates a required process is in <code>FATAL</code> state or is unexpectedly <code>EXITED</code>.<br />
-					In this case, the application is not operational.</td></tr>
-					<tr><td><code class="attributeName">minor_failure</code></td><td>indicates an optional process is in <code>FATAL</code> state or is unexpectedly <code>EXITED</code>.<br />
-					this status should not affect the operational status of the application.</td></tr>
-					<tr><td><code class="attributeName">processes</code></td><td>map of <code class="className">ProcessStatus</code> instances.<br />
-					key is <code class="attributeName">process_name</code>.</td></tr>
-					<tr><td><code class="attributeName">rules</code></td><td>an <code class="className">ApplicationRules</code> instance containing
-                        the deployment model of the application, as defined in the rules file</td></tr>
-				</table>
-
-				<h4>AddressStatus</h4>
-				<p>Each local Supvisors instance has its own perception of other remote Supvisors instance. This perception is stored in a class called <code class="className">AddressStatus</code>.<br />
-				More particularly, it contains the following information:</p>
-				<table class="modelTable">
-					<tr><th colspan="2"><code class="className">AddressStatus</code></th></tr>
-					<tr><td><code class="attributeName">address_name</code></td><td>address of the Supvisors instance</td></tr>
-					<tr><td><code class="attributeName">state</code></td><td>state of the Supvisors instance, among:<ul>
-							<li><code>UNKNOWN</code>: not active yet, no heartbeat received in <code>INITIALIZATION</code> state (default).</li>
-							<li><code>CHECKING</code>: port-knocking in progress.</li>
-							<li><code>RUNNING</code>: active, a heartbeat has been received in the last 10 seconds.</li>
-							<li><code>SILENT</code>: inactive, no heartbeat has been received in the last 10 seconds.</li>
-							<li><code>ISOLATING</code>: inactive Supvisors instance is marked for isolation when auto-fencing is activated.</li>
-							<li><code>ISOLATED</code>: definitely disconnected, no more events expected anymore.</li>
-						</ul></td></tr>
-					<tr><td><code class="attributeName">remote_time</code></td><td>date of the last heartbeart received in remote reference time</td></tr>
-					<tr><td><code class="attributeName">local_time</code></td><td>date of the last heartbeart received in local reference time</td></tr>
-				</table>
-
-				<figure>
-					<img src="violet/AddressStatus.png" alt="AddressStatus statechart">
-					<figcaption>AddressStatus statechart</figcaption>
-				</figure>
-
-				<p>Every time that a Supvisors instance becomes <code>RUNNING</code>, the local Supvisors instance gets and stores all process information from the Supervisor daemon using
-                the <code class="python"><a href="http://supervisord.org/api.html#supervisor.rpcinterface.SupervisorNamespaceRPCInterface.getAllProcessInfo" class="extLink">supervisor.getAllProcessInfo</a></code> XML-RPC.</p>
-
-
-				<h3 id="parsing">Parsing Files</h3>
-				<p>Supvisors uses the python module <code class="python">supervisor.options</code> to determine the location of the configuration file and to parse it.</p>
-				<pre><code class="python">from supervisor.options import Options, UnhosedConfigParser
-# get supervisord.conf file from search paths
-options = Options(True)
-configfile = options.default_configfile()
-# parse file
-parser = UnhosedConfigParser()
-parser.read(configfile)
-parser.mysection = 'supvisors'</code></pre>
-
-				<p>As Supervisor has a dependency with <code class="python">xml.etree.ElementTree</code>, this module has naturally been used
-                to parse the rules file.<br />
-				Unfortunately, this module does not provide any schema validation. So, if the module <code class="python">lxml.etree</code> is available,
-                it is used <em>instead of</em> the ElementTree module to validate and parse the XML deployment.<br />
-				More information about the lxml XML toolkit can be found <a href="http://lxml.de" class="extLink">here</a>.</p>
-				<p>The contents of the XSD can be found in the module <code class="python">supvisors.parser</code>.
-                If pushed to a file, it can be used to validate the XML file with such a shell command:</p>
-				<pre><code class="bash">[bash] > xmllint --noout --schema etc/deployment.xsd etc/deployment.xml</code></pre>
-
-
-				<h3 id="logging">Logging</h3>
-				<p>Supvisors uses the python module <code>supervisor.loggers</code> for logging.</p>
-				<pre><code class="python">from supervisor.loggers import getLogger
-LOGGER_FORMAT = '%(asctime)s %(levelname)s %(message)s\n'
-stdout = supervisord.options.nodaemon
-logger = getLogger(logfile, loglevel, LOGGER_FORMAT, True, logfile_maxbytes, logfile_backups, stdout)</code></pre>
-
-
-				<h3 id="supervisor-events">Supervisor events</h3>
-				<p>As Supvisors runs inside Supervisor, it makes it possible to collect events directly by subscribing to <code>supervisor.events</code> instead of using an event listener program.</p>
-				<pre><code class="python">from supervisor import events
-events.subscribe(events.SupervisorRunningEvent, self.on_running)
-events.subscribe(events.SupervisorStoppingEvent, self.on_stopping)
-events.subscribe(events.ProcessStateEvent, self.on_process)
-events.subscribe(events.Tick5Event, self.on_tick)</code></pre>
-
-				<p>Upon notification of the <code class="python">events.SupervisorRunningEvent</code> event, the main loop thread of the Supvisors instance is started.<br />
-				This thread could not be started before (when extending Supervisor XML-RPC) because it would stop if supervisord daemonizes.</p>
-
-				<p>Upon notification of the <code class="python">events.SupervisorStoppingEvent</code> event, the main loop thread of the Supvisors instance is stopped.</p>
-
-				<p>Supvisors creates a heartbeat message upon notification of the <code class="python">events.Tick5Event</code> events.<br />
-				The date <code class="python">event.when</code> is used to fill this message.</p>
-
-				<p>Upon notification of the <code class="python">events.ProcessStateEvent</code> events, Supvisors creates a message with the following contents:</p>
-				<table>
-					<caption>Process Event Dictionary</caption>
-					<tr><th>Key</th><th>Value</th></tr>
-					<tr><td><code>'processname'</code></td><td>name of the process</td></tr>
-					<tr><td><code>'groupname'</code></td><td>name of the group, i.e. name of the application for Supvisors</td></tr>
-					<tr><td><code>'state'</code></td><td>new state of the process, as a <code class="className">ProcessStates</code> value, obtained from the event type</td></tr>
-					<tr><td><code>'now'</code></td><td>reception time of the process event</td></tr>
-					<tr><td><code>'pid'</code></td><td>UNIX process identifier (only when state is <code>RUNNING</code>, <code>STOPPING</code>,
-                        <code>STOPPED</code> or <code>EXITED</code>)</td></tr>
-					<tr><td><code>'expected'</code></td><td>boolean indicating if the exit status is expected (only when state is <code>EXITED</code>)</td></tr>
-				</table>
-
-				<p>The messages are published using a ZeroMQ PUBLISH socket over a TCP socket bound on the internal_port defined
-                in the Supervisor configuration file. They are sent in two parts:</p>
-				<ul>
-					<li>the header part, consisting in an unicode string identifying the message type,</li>
-					<li>the body part, consisting of a pair <code class="python">(localAddress, payload)</code>, where payload is the event contents,
-                    serialized with <em>pickle</em> (provided by <a href="http://pyzmq.readthedocs.io/en/latest/serialization.html" class="extLink">PyZMQ</a>).</li>
-				</ul>
-				<pre><code class="python"># example of sending Tick event
-self.socket.send_string(u'tick', zmq.SNDMORE)
-self.socket.send_pyobj((addressMapper.localAddress, payload))</code></pre>
-
-				<div class="note">
-					<p>Note about the localAddress</p>
-					<p>When starting, the Supvisors instance has to determine its identity. More particularly, it has to find its own address among the list defined in
-                    the <code class="ini">address_list</code> option of the <code class="ini">[supvisors]</code> section in the Supervisor configuration file.<br />
-					So, the Supvisors instance gets the host name and all known IPv4 addresses of the host where it is running, excluding the loopback address.
-                    It is expected that one element of this list MUST be an element of the <code class="ini">address_list</code></a>.
-                    This element becomes the localAddress.</p>
-				</div>
-
-				<p>In Supvisors' main loop, a ZeroMQ SUBSCRIBE socket is built over a TCP socket connected to all addresses found
-                in <code class="ini">address_list</code> on the <code class="ini">internal_port</code> defined in the Supervisor configuration file.<br />
-				The Supvisors main loop polls the Supvisors events coming from all addresses through this socket with a timeout of one second.<br />
-				Tick events are used to update the status of the <code class="className">AddressStatus</code> instances.<br />
-				ProcessState events are used to update the status of the <code class="className">ProcessStatus</code> instances and consequently
-                the related <code class="className">ApplicationStatus</code> instances.</p>
-
-				<p>The timeout of the ZeroMQ poller in the Supvisors main loop is used to trigger a periodic task (every 5 seconds).
-                This task is used to check the activity of the Supvisors instances and to trigger the Supvisors Machine State.</p>
-
-
-				<h3 id="inactive-addresses">Inactive Addresses</h3>
-				<p>The periodic task performs a verification over all the heartbeat of every Supvisors intances.<br />
-				When the last heartbeat message received is older than 10 seconds, Supvisors set the state of the <code class="className">AddressStatus</code> instance to:</p>
-				<ul>
-					<li><code>SILENT</code> if auto-fencing <strong>is not</strong> activated,</li>
-					<li><code>ISOLATING</code> if auto-fencing <strong>is</strong> activated,</li>
-				</ul>
-				<p>The corresponding address is then removed from all the <code class="attributeName">addresses</code> sets in the <code class="className">ProcessStatus</code> instances,
-                which leads to a temporary inconsistence as the processes may be declared <code>RUNNING</code> nowhere.</p>
-				<p>The next phase consists in restarting the process somewhere else, if possible, using the <a href="#deployment" class="intLink">deployment</a> function of Supvisors.<br />
-				Finally, if the <code class="className">AddressStatus</code> instance was marked <code>ISOLATING</code>,
-                Supvisors diconnects the corresponding url from the ZeroMQ SUBSCRIBE socket and sets the state to <code>ISOLATED</code>.<br />
-				If the state is <code>SILENT</code>, Supvisors will accept the remote Supvisors instance to come back.</p>
-
-
-				<h3 id="state-machine">State Machine</h3>
-				<p>During the periodic task, the context of the Supvisors instance is re-evaluated.
-                The State Machine of the Supvisors instance deals with the following states: <code>INITIALIZATION</code>, <code>DEPLOYMENT</code>,
-                <code>OPERATION</code>, <code>CONCILIATION</code>, <code>RESTARTING</code>, <code>SHUTTING_DOWN</code>, <code>SHUTDOWN</code>.</p>
-
-				<figure>
-					<img src="violet/Supvisors.png" alt="Supvisors statechart">
-					<figcaption>Supvisors statechart</figcaption>
-				</figure>
-
-				<h4>INITIALIZATION state</h4>
-				<p>In the <code>INITIALIZATION</code> state, Supvisors waits for all Supvisors instances to be active.
-                More particularly, heartbeat messages (or Tick events) are expected for every entry in the <code>address_list</code>.</p>
-
-				<table class="stateTable">
-					<tr><th colspan="2"><code>INITIALIZATION</code> state</th></tr>
-					<tr>
-						<th><img src="img/arrow-right_30.png" alt="entry"></th>
-						<td>The state of all <code class="className">AddressStatus</code> instances is reset to <code>UNKNOWN</code>.<br />
-						Exception is made for instances that are in <code>ISOLATED</code> state. Once a <code class="className">AddressStatus</code> instance has been isolated,
-                        it is impossible to come back in any other state, so they remain in this state.</td>
-					</tr>
-					<tr>
-						<th><img src="img/reload_30.png" alt="task"></th>
-						<td>Supvisors waits until <code>synchro_timeout</code> seconds for all Supvisors instances to be active.
-                        As soon as the related <code class="className">AddressStatus</code> instances are all <code>RUNNING</code>, Supvisors transitions to <code>DEPLOYMENT</code> state.<br />
-						If some <code class="className">AddressStatus</code> instances are still in an <code>UNKNOWN</code> state after that delay,
-                        Supvisors declares them <code>SILENT</code> (or <code>ISOLATING</code> if <code>auto_fencing</code> is activated) and transitions to <code>DEPLOYMENT</code> state with a degraded situation.</td>
-					</tr>
-					<tr>
-						<th><img src="img/arrow-left_30.png" alt="exit"></th>
-						<td>A <strong>Master</strong> is elected among the active Supvisors instances. It has been arbitrarily decided to choose the lowest address, from a 'string' point of view.</td>
-					</tr>
-				</table>
-
-				<div class="note">
-					<p>Note about the concept of "Master"</p>
-					<p>It is necessary to choose a Master among the active Supvisors instances because only one of them will be in charge of:</p>
-					<ul>
-						<li>the automatic deployment of the applications,</li>
-						<li>the warm restart of the lost processes, more particularly when a Supvisors instance becomes inactive,</li>
-						<li>the automatic conciliation in case of conflict,</li>
-						<li>the start / stop requests performed through the XML-RPC API.</li>
-					</ul>
-				</div>
-
-				<h4>DEPLOYMENT state</h4>
-				<p>In the <code>DEPLOYMENT</code> state, Supvisors performs an automatic deployment of the applications in accordance with the rules
-                defined in the rules file and with the resources available, i.e. the set of addresses having an active Supvisors intance.</p>
-
-				<table class="stateTable">
-					<tr><th colspan="2"><code>DEPLOYMENT</code> state</th></tr>
-					<tr>
-						<th><img src="img/arrow-right_30.png" alt="entry"></th>
-						<td>Supvisors plans the sequencing of the deployment, at the application level, in accordance with the process information loaded from
-                        the remote Supersivor and the sequencing defined in the rules file.
-                        As told before, nothing forces the user to configure Supervisor with the same list of programs on every addresses.
-                        The sequencing has thus to take into account the actual list of programs that has been loaded from the active Supvisors instances.<br />
-						The deployment starts. The principles of the function are detailed <a href="#deployment" class="intLink">hereafter</a>.</td>
-					</tr>
-					<tr>
-						<th><img src="img/reload_30.png" alt="task"></th>
-						<td>The deployment progress is checked and the next phase is triggered if any.<br />
-						When the job is done, Supvisors transitions to the <code>OPERATION</code> state, unless a conflict is detected.
-                        In this case, Supvisors transitions to the <code>CONCILIATION</code> state.</td>
-					</tr>
-					<tr>
-						<th><img src="img/arrow-left_30.png" alt="exit"></th>
-						<td><em>no action</em></td>
-					</tr>
-				</table>
-
-				<div class="note">
-					<p>Note about the unicity of the processes</p>
-					<p>Although the same program definition may be loaded into the different Supervisor instances, Supvisors ensures that a single process
-                    may be running among them at the same time. Of course, as the Supervisor functions are still available (through supervisorctl or ini file definitions),
-                    it is easy to trick Supvisors so that multiple processes are running on several addresses.<br />
-					Supvisors considers this situation, that is typically a case of <em>split-brain</em>, as a <strong>conflict</strong> and handles it
-                    in the <code>CONCILIATION</code> state.<br />
-					When the user really needs several instances of the same program to be running on different addresses, the solution is to set
-                    the Supervisor <code class="ini">numprocs</code> option accordingly in the program definition.</p>
-				</div>
-
-				<h4>OPERATION state</h4>
-				<p>In the <code>OPERATION</code> state, Supvisors checks the activity of the Supvisors instances and detects the eventual conflicts.</p>
-
-				<table class="stateTable">
-					<tr><th colspan="2"><code>OPERATION</code> state</th></tr>
-					<tr>
-						<th><img src="img/arrow-right_30.png" alt="entry"></th>
-						<td><em>no action</em></td>
-					</tr>
-					<tr>
-						<th><img src="img/reload_30.png" alt="task"></th>
-						<td>If the Master becomes inactive, Supvisors needs a new Master to be elected and transitions to the <code>INITIALIZATION</code> state.<br />
-						When a conflict is detected, Supvisors transitions to the <code>CONCILIATION</code> state.</td>
-					</tr>
-					<tr>
-						<th><img src="img/arrow-left_30.png" alt="exit"></th>
-						<td><em>no action</em></td>
-					</tr>
-				</table>
-
-				<h4>CONCILIATION state</h4>
-				<p>In the <code>CONCILIATION</code> state, Supvisors applies a strategy to solve the detected conflicts and waits until they are done.<br />
-				In this state, the Supvisors XML-RPC dealing about starting applications or processes are ineffective but it has no impact on the Supervisor XML-RPC, that are still available.</p>
-
-				<table class="stateTable">
-					<tr><th colspan="2"><code>CONCILIATION</code> state</th></tr>
-					<tr>
-						<th><img src="img/arrow-right_30.png" alt="entry"></th>
-						<td>The conciliation strategy set through the <code>conciliation_strategy</code> option is applied.<br />
-						The principles of the function are detailed <a href="#conciliation" class="intLink">hereafter</a>.</td>
-					</tr>
-					<tr>
-						<th><img src="img/reload_30.png" alt="task"></th>
-						<td>If the Master becomes inactive, Supvisors needs a new Master to be elected and transitions to the <code>INITIALIZATION</code> state.<br />
-						When a conflict is solved, Supvisors transitions back to the <code>OPERATION</code> state.</td>
-					</tr>
-					<tr>
-						<th><img src="img/arrow-left_30.png" alt="exit"></th>
-						<td>no action</td>
-					</tr>
-				</table>
-
-				<h4>RESTARTING state</h4>
-				<p>The <code>RESTARTING</code> state can be reached from <code>DEPLOYMENT</code>, <code>OPERATION</code> and <code>CONCILIATION</code> states, using a XML_RPC request.
-                In this state, Supvisors performs an automatic stop of all applications in accordance with the rules defined
-                in the rules file before a full restart.</p>
-
-				<table class="stateTable">
-					<tr><th colspan="2"><code>RESTARTING</code> state</th></tr>
-					<tr>
-						<th><img src="img/arrow-right_30.png" alt="entry"></th>
-						<td>Supvisors plans the stopping of the applications, in accordance with the sequencing defined in
-                            the rules file and starts to stop the running processes.</td>
-					</tr>
-					<tr>
-						<th><img src="img/reload_30.png" alt="task"></th>
-						<td>The stopping progress is checked and the next phase is triggered if any.<br />
-						When the job is done, Supvisors transitions to the <code>SHUTDOWN</code> state.</td>
-					</tr>
-					<tr>
-						<th><img src="img/arrow-left_30.png" alt="exit"></th>
-						<td>Supvisors triggers its full restart through the restart of all Supervisor instances.</td>
-					</tr>
-				</table>
-
-				<h4>SHUTTING_DOWN state</h4>
-				<p>The <code>SHUTTING_DOWN</code> state can be reached from <code>DEPLOYMENT</code>, <code>OPERATION</code> and <code>CONCILIATION</code> states, using a XML_RPC request.
-                In this state, Supvisors performs an automatic stop of all applications in accordance with the rules defined
-                in the rules file before a full shutdown.</p>
-
-				<table class="stateTable">
-					<tr><th colspan="2"><code>SHUTTING_DOWN</code> state</th></tr>
-					<tr>
-						<th><img src="img/arrow-right_30.png" alt="entry"></th>
-						<td>Supvisors plans the stopping of the applications, in accordance with the sequencing defined in
-                            the rules file and starts to stop the running processes.</td>
-					</tr>
-					<tr>
-						<th><img src="img/reload_30.png" alt="task"></th>
-						<td>The stopping progress is checked and the next phase is triggered if any.<br />
-						When the job is done, Supvisors transitions to the <code>SHUTDOWN</code> state.</td>
-					</tr>
-					<tr>
-						<th><img src="img/arrow-left_30.png" alt="exit"></th>
-						<td>Supvisors triggers its full shutdown through the shutdown of all Supervisor instances.</td>
-					</tr>
-				</table>
-
-				<h4>SHUTDOWN state</h4>
-				<p>The <code>SHUTDOWN</code> state is the final state. No action is performed.</p>
-
-                
-				<h3 id="deployment">Deployment</h3>
-				<p>Once that Supvisors is ready to work, the starting and stopping sequences are established.<br />
-                Starting and stopping applications follow the same principle.</p>
-
-                <p>To start applications, Supvisors creates a job list and performs the following loop until there is nothing left to do:</p>
-				<ul>
-					<li>pop the head group of the applications from the starting sequence</li>
-					<li>for all applications in this group:<ul>
-                        <li>pop the head group of the processes</li>
-                        <li>for all processes in this group:<ul>
-                            <li>find an address, in accordance with the <code>deployment_strategy</code> option</li>
-                            <li>send a <code class="python">supvisors.start_args</code> XML-RPC to the Supervisor located on that address</li>
-                        </ul></li>
-                        <li>wait for the processes to be <code>RUNNING</code></li>
-					</ul></li>
-				</ul>
-
-				<p>Whatever the strategy applied, there are common rules to choose an address to start a process:</p>
-				<ul>
-					<li>the address chosen shall be one of the <code>address_list</code> defined in the Supvisors section of the Supervisor configuration file,</li>
-					<li>the address chosen shall be one of the <code>addresses</code> defined in the program section of the rules file,</li>
-					<li>the <code class="className">AddressStatus</code> representing this address shall be in <code>RUNNING</code>state,</li>
-					<li>the sum of the <code>loading</code> values associated to the program considered and to all processes that are currently running on the address considered shall not exceed 100%.</li>
-				</ul>
-
-				<p>When applying the <code>CONFIG</code> strategy, Supvisors chooses the first address in the <code>addresses</code> list that respects the common rules.</p>
-				<p>When applying the <code>LESS_LOADED</code> strategy, with respect of the common rules, Supvisors chooses the address in the <code>addresses</code> list having the lowest loading sum.<br />
-				The aim is to distribute the process loading among the available hosts.</p>
-				<p>When applying the <code>MOST_LOADED</code> strategy, with respect of the common rules, Supvisors chooses the address in the <code>addresses</code> list having the greatest loading sum.<br />
-				The aim is to maximize the load of a host before starting to load another host. This strategy is more interesting when the resources are limited.</p>
-
-                <p>To stop applications, Supvisors creates a job list and performs the following loop until there is nothing left to do:</p>
-				<ul>
-					<li>pop the head group of the applications from the stopping sequence</li>
-					<li>for all applications in this group:<ul>
-                        <li>pop the head group of the processes</li>
-                        <li>for all processes in this group, send a <code class="python">supervisor.stopProcess</code> XML-RPC to the Supervisor located on that address</li>
-                        <li>wait for the processes to be <code>STOPPED</code></li>
-					</ul></li>
-				</ul>
-
-
-				<h3 id="failure">Process Failure</h3>
-				<p>When Supervisor fails to start a process upon request, due to a problem of configuration, the process remains in <code>STOPPED</code> state.<br />
-				In Supvisors, it is considered as a major failure. So, the Supervisor internal <code class="className">Subprocess</code> instance is tricked, so that an event is fired by Supervisor and the process becomes <code>FATAL</code> with an adequate <code class="attributeName">spawnerr</code> description.</p>
-				<pre><code class="python">subProcess = supervisord.process_groups[applicationName].processes[processName]
-# need to force BACKOFF state to go through assertion
-from supervisor.states import ProcessStates
-subProcess.state = ProcessStates.BACKOFF
-subProcess.spawnerr = reason
-subProcess.give_up()</code></pre>
-				<p>The same principle has been used to set a major failure to the process if Supvisors fails to find an address where it could be started, due to a lack of resources.</p>
-
-
-				<h3 id="conciliation">Conciliation</h3>
-				<p>When more than one instance of the same program are running in different Supervisor daemons, it is considered as a conflict in Supvisors</p>
-				<p>When applying the <code>SENICIDE</code> strategy, Supvisors keeps the <em>youngest</em> process, i.e. tha process that has been started the most recently, and stops all the others.</p>
-				<p>When applying the <code>INFANTICIDE</code> strategy, Supvisors keeps the <em>oldest</em> process and stops all the others.</p>
-				<p>When applying the <code>USER</code> strategy, Supvisors just waits that a user aplication solves the conflicts using <code class="bash">supervisorctl</code>, XML-RPC, process signal, or any other solution.</p>
-				<p>When applying the <code>STOP</code> strategy, Supvisors stops all conflicting processes.</p>
-				<p>When applying the <code>RESTART</code> strategy, Supvisors stops all conflicting processes and restarts a new one.</p>
-
-
-				<h3 id="external-io">External Interfaces</h3>
-				<h4>Event Interface</h4>
-				<p>The process events received in the main loop are re-published using a ZeroMQ PUBLISH socket over a TCP socket <strong>locally</strong> bound on the <code>event_port</code> defined in the Supervisor configuration file. The body is serialized with <em>json</em> instead of <em>pickle</em> (also provided by <a href="http://pyzmq.readthedocs.io/en/latest/serialization.html" class="extLink">PyZMQ</a>).</p>
-				<div class="note">
-					<p>Note about the Supvisors Event Interface</p>
-					<p>This is a local publication (bound on localhost). An applicative process can only subscribe to its co-located Supvisors instance.<br />
-					It has been considered to use a <code class="python">supervisor.sendProcessStdin</code> XML-RPC to send events to applicative program but it would have too much impact on the user applicative design.</p>
-				</div>
-
-				<h4>XML-RPC</h4>
-				<p>The extension point provided in Supervisor configuration file adds a plugin to the existing supervisord XML-RPC API.<br />
-				The <code class="className">RPCInterface</code> class in the module <code class="python">supvisors.rpcinterface</code> follows the same principles as the <code class="className">SupervisorNamespaceRPCInterface</code> class in the module <code class="python">supervisor.rpcinterface</code>.<br />
-				<p>In order to benefit from the Supervisor handling in case of exception, the <code class="className">Faults</code> class of the <code class="python">supervisor.xmlrpc</code> module is dynamically extended with the following <code class="className">SupvisorsFaults</code> values:</p>
-				<pre><code class="python">SUPVISORS_CONF_ERROR=100,
-BAD_SUPVISORS_STATE=101,
-BAD_ADDRESS=102,
-BAD_STRATEGY=103</code></pre>
-
-
-				<h3 id="design-web">Replacing the web pages</h2>
-                <p>Supvisors uses the HTTP server created by Supervisor but replaces the main page. This is done by modifying dynamically the contents of the <code class="python">VIEWS</code> dictionary in the module <code class="python">supervisor.web</code>.</p>
-				<pre><code class="python">from supervisor.web import VIEWS
-here = path.abspath(path.dirname(__file__))
-# set main page
-VIEWS['index.html'] =  { 'template': path.join(here, 'ui/index.html'), 'view': SupvisorsView }
-# set address page
-VIEWS['address.html'] =  { 'template': path.join(here, 'ui/address.html'), 'view': AddressView }
-# set application page
-VIEWS['application.html'] =  { 'template': path.join(here, 'ui/application.html'), 'view': ApplicationView }
-# set fake page to export images
-VIEWS['process_stats.png'] =  { 'template': path.join(here, 'ui/empty.html'), 'view': ProcessImageView }
-VIEWS['address_stats.png'] =  { 'template': path.join(here, 'ui/empty.html'), 'view': AddressImageView }</code></pre>
-                <p>The last two 'pages' are used to publish the contents of an image generated by <a href="http://matplotlib.org" class="extLink">matplotlib</a> through the HTTP server, and without writing anything on disk.</p>
-
-
-				<h2 id="design-supervisorctl">Extending supervisorctl</h2>
-				<p>The extension point provided in Supervisor configuration file adds a plugin to the existing supervisorctl.<br />
-				The <code class="className">ControllerPlugin</code> class in the module <code class="python">supvisors.supervisorctl</code> was inspired by the <code class="className">DefaultControllerPlugin</code> class in the module <code class="python">supervisor.supervisorctl</code>.</p>
-
-			</section>
-
-		</div>
-	</div>
-</body>
-</html>
-
diff --git a/supvisors/design/violet/AddressStatus.png b/supvisors/design/violet/AddressStatus.png
deleted file mode 100644
index 98ba3d0e..00000000
Binary files a/supvisors/design/violet/AddressStatus.png and /dev/null differ
diff --git a/supvisors/design/violet/AddressStatus.state.violet.html b/supvisors/design/violet/AddressStatus.state.violet.html
deleted file mode 100644
index 15494edc..00000000
--- a/supvisors/design/violet/AddressStatus.state.violet.html
+++ /dev/null
@@ -1,444 +0,0 @@
-<HTML>
-<HEAD>
-<META name="description"
-	content="Violet UML Editor cross format document" />
-<META name="keywords" content="Violet, UML" />
-<META charset="UTF-8" />
-<SCRIPT type="text/javascript">
-	function switchVisibility() {
-		var obj = document.getElementById("content");
-		obj.style.display = (obj.style.display == "block") ? "none" : "block";
-	}
-</SCRIPT>
-</HEAD>
-<BODY>
-	This file was generated with Violet UML Editor 2.1.0.
-	&nbsp;&nbsp;(&nbsp;<A href=# onclick="switchVisibility()">View Source</A>&nbsp;/&nbsp;<A href="http://sourceforge.net/projects/violet/files/violetumleditor/" target="_blank">Download Violet</A>&nbsp;)
-	<BR />
-	<BR />
-	<SCRIPT id="content" type="text/xml"><![CDATA[<StateDiagramGraph id="1">
-  <nodes id="2">
-    <StateNode id="3">
-      <children id="4"/>
-      <location class="Point2D.Double" id="5" x="130.0" y="50.0"/>
-      <id id="6" value="1f06e39e-cd22-4b76-86cf-2243fe0496e8"/>
-      <revision>1</revision>
-      <backgroundColor id="7">
-        <red>255</red>
-        <green>255</green>
-        <blue>255</blue>
-        <alpha>255</alpha>
-      </backgroundColor>
-      <borderColor id="8">
-        <red>0</red>
-        <green>0</green>
-        <blue>0</blue>
-        <alpha>255</alpha>
-      </borderColor>
-      <textColor reference="8"/>
-      <name id="9" justification="1" size="4" underlined="false">
-        <text>UNKNOWN</text>
-      </name>
-    </StateNode>
-    <StateNode id="10">
-      <children id="11"/>
-      <location class="Point2D.Double" id="12" x="300.0" y="170.0"/>
-      <id id="13" value="be54278c-6461-433e-a447-96ab0745ea84"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-      <name id="14" justification="1" size="4" underlined="false">
-        <text>RUNNING</text>
-      </name>
-    </StateNode>
-    <StateNode id="15">
-      <children id="16"/>
-      <location class="Point2D.Double" id="17" x="480.0" y="110.0"/>
-      <id id="18" value="ca81c3ff-2be2-4a53-9bb0-45152378bcc8"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-      <name id="19" justification="1" size="4" underlined="false">
-        <text>SILENT</text>
-      </name>
-    </StateNode>
-    <StateNode id="20">
-      <children id="21"/>
-      <location class="Point2D.Double" id="22" x="130.0" y="170.0"/>
-      <id id="23" value="10f97b62-3aa4-47fa-b230-172727d3f3cd"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-      <name id="24" justification="1" size="4" underlined="false">
-        <text>ISOLATING</text>
-      </name>
-    </StateNode>
-    <StateNode id="25">
-      <children id="26"/>
-      <location class="Point2D.Double" id="27" x="130.0" y="280.0"/>
-      <id id="28" value="3dce6d44-29c3-4591-8533-edef69adae3f"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-      <name id="29" justification="1" size="4" underlined="false">
-        <text>ISOLATED</text>
-      </name>
-    </StateNode>
-    <CircularFinalStateNode id="30">
-      <children id="31"/>
-      <location class="Point2D.Double" id="32" x="40.0" y="300.0"/>
-      <id id="33" value="43af0285-33c2-43a9-9987-76722ade22e9"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-    </CircularFinalStateNode>
-    <CircularInitialStateNode id="34">
-      <children id="35"/>
-      <location class="Point2D.Double" id="36" x="40.0" y="60.0"/>
-      <id id="37" value="a2b81861-5f20-460c-9efc-1b8adb547da7"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-    </CircularInitialStateNode>
-    <StateNode id="38">
-      <children id="39"/>
-      <location class="Point2D.Double" id="40" x="300.0" y="50.0"/>
-      <id id="41" value="75dd7ce3-02a1-48af-b4f3-47ca79e5fb6d"/>
-      <revision>1</revision>
-      <backgroundColor id="42">
-        <red>255</red>
-        <green>255</green>
-        <blue>255</blue>
-        <alpha>255</alpha>
-      </backgroundColor>
-      <borderColor id="43">
-        <red>0</red>
-        <green>0</green>
-        <blue>0</blue>
-        <alpha>255</alpha>
-      </borderColor>
-      <textColor reference="43"/>
-      <name id="44" justification="1" size="4" underlined="false">
-        <text>CHECKING</text>
-      </name>
-    </StateNode>
-  </nodes>
-  <edges id="45">
-    <StateTransitionEdge id="46">
-      <start class="StateNode" reference="3"/>
-      <end class="StateNode" reference="20"/>
-      <startLocation class="Point2D.Double" id="47" x="40.0" y="50.0"/>
-      <endLocation class="Point2D.Double" id="48" x="30.0" y="10.0"/>
-      <transitionPoints id="49"/>
-      <id id="50" value="1758c395-8562-4990-9a3c-faf0e6f557c8"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="51">
-      <start class="StateNode" reference="25"/>
-      <end class="CircularFinalStateNode" reference="30"/>
-      <startLocation class="Point2D.Double" id="52" x="60.0" y="30.0"/>
-      <endLocation class="Point2D.Double" id="53" x="10.0" y="10.0"/>
-      <transitionPoints id="54"/>
-      <id id="55" value="7ef2ffcf-939b-4307-9170-383b5e3d3bfb"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="56">
-      <start class="StateNode" reference="20"/>
-      <end class="StateNode" reference="25"/>
-      <startLocation class="Point2D.Double" id="57" x="40.0" y="40.0"/>
-      <endLocation class="Point2D.Double" id="58" x="40.0" y="10.0"/>
-      <transitionPoints id="59"/>
-      <id id="60" value="3989fbf0-5892-467c-a4a0-d0e7306ecce9"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="61">
-      <start class="StateNode" reference="10"/>
-      <end class="StateNode" reference="15"/>
-      <startLocation class="Point2D.Double" id="62" x="60.0" y="20.0"/>
-      <endLocation class="Point2D.Double" id="63" x="20.0" y="20.0"/>
-      <transitionPoints id="64"/>
-      <id id="65" value="6bb8bfff-af0c-4995-aa03-151cf34b7afc"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="66">
-      <start class="StateNode" reference="10"/>
-      <end class="StateNode" reference="20"/>
-      <startLocation class="Point2D.Double" id="67" x="40.0" y="40.0"/>
-      <endLocation class="Point2D.Double" id="68" x="70.0" y="10.0"/>
-      <transitionPoints id="69"/>
-      <id id="70" value="387fb965-06a7-4bba-8013-f2c3b6eb394b"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="71">
-      <start class="CircularInitialStateNode" reference="34"/>
-      <end class="StateNode" reference="3"/>
-      <startLocation class="Point2D.Double" id="72" x="10.0" y="10.0"/>
-      <endLocation class="Point2D.Double" id="73" x="40.0" y="20.0"/>
-      <transitionPoints id="74"/>
-      <id id="75" value="b91d9fa4-16ab-4a46-b0a2-8e928d9395c4"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="76">
-      <start class="StateNode" reference="3"/>
-      <end class="StateNode" reference="38"/>
-      <startLocation class="Point2D.Double" id="77" x="60.0" y="30.0"/>
-      <endLocation class="Point2D.Double" id="78" x="10.0" y="30.0"/>
-      <transitionPoints id="79"/>
-      <id id="80" value="6bdfa539-48e9-4138-8331-14f3937465a3"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="81">
-      <start class="StateNode" reference="38"/>
-      <end class="StateNode" reference="10"/>
-      <startLocation class="Point2D.Double" id="82" x="40.0" y="40.0"/>
-      <endLocation class="Point2D.Double" id="83" x="40.0" y="10.0"/>
-      <transitionPoints id="84"/>
-      <id id="85" value="610aa962-a371-4547-a515-d1f4b0fa4f49"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="86">
-      <start class="StateNode" reference="15"/>
-      <end class="StateNode" reference="38"/>
-      <startLocation class="Point2D.Double" id="87" x="40.0" y="20.0"/>
-      <endLocation class="Point2D.Double" id="88" x="70.0" y="30.0"/>
-      <transitionPoints id="89"/>
-      <id id="90" value="60a75254-37ab-4e76-956d-470cd6449431"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-  </edges>
-</StateDiagramGraph>]]></SCRIPT>
-	<BR />
-	<BR />
-	<IMG alt="embedded diagram image" src="data:image/png;base64,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
-AAAAAElFTkSuQmCC" />
-</BODY>
-</HTML>
\ No newline at end of file
diff --git a/supvisors/design/violet/Supvisors.png b/supvisors/design/violet/Supvisors.png
deleted file mode 100644
index 319cefe3..00000000
Binary files a/supvisors/design/violet/Supvisors.png and /dev/null differ
diff --git a/supvisors/design/violet/Supvisors.state.violet.html b/supvisors/design/violet/Supvisors.state.violet.html
deleted file mode 100644
index c9196db8..00000000
--- a/supvisors/design/violet/Supvisors.state.violet.html
+++ /dev/null
@@ -1,762 +0,0 @@
-<HTML>
-<HEAD>
-<META name="description"
-	content="Violet UML Editor cross format document" />
-<META name="keywords" content="Violet, UML" />
-<META charset="UTF-8" />
-<SCRIPT type="text/javascript">
-	function switchVisibility() {
-		var obj = document.getElementById("content");
-		obj.style.display = (obj.style.display == "block") ? "none" : "block";
-	}
-</SCRIPT>
-</HEAD>
-<BODY>
-	This file was generated with Violet UML Editor 2.1.0.
-	&nbsp;&nbsp;(&nbsp;<A href=# onclick="switchVisibility()">View Source</A>&nbsp;/&nbsp;<A href="http://sourceforge.net/projects/violet/files/violetumleditor/" target="_blank">Download Violet</A>&nbsp;)
-	<BR />
-	<BR />
-	<SCRIPT id="content" type="text/xml"><![CDATA[<StateDiagramGraph id="1">
-  <nodes id="2">
-    <StateNode id="3">
-      <children id="4"/>
-      <location class="Point2D.Double" id="5" x="290.0" y="30.0"/>
-      <id id="6" value="1f06e39e-cd22-4b76-86cf-2243fe0496e8"/>
-      <revision>1</revision>
-      <backgroundColor id="7">
-        <red>255</red>
-        <green>255</green>
-        <blue>255</blue>
-        <alpha>255</alpha>
-      </backgroundColor>
-      <borderColor id="8">
-        <red>0</red>
-        <green>0</green>
-        <blue>0</blue>
-        <alpha>255</alpha>
-      </borderColor>
-      <textColor reference="8"/>
-      <name id="9" justification="1" size="4" underlined="false">
-        <text>INITIALIZATION</text>
-      </name>
-    </StateNode>
-    <StateNode id="10">
-      <children id="11"/>
-      <location class="Point2D.Double" id="12" x="290.0" y="160.0"/>
-      <id id="13" value="be54278c-6461-433e-a447-96ab0745ea84"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-      <name id="14" justification="1" size="4" underlined="false">
-        <text>DEPLOYMENT</text>
-      </name>
-    </StateNode>
-    <StateNode id="15">
-      <children id="16"/>
-      <location class="Point2D.Double" id="17" x="460.0" y="260.0"/>
-      <id id="18" value="ca81c3ff-2be2-4a53-9bb0-45152378bcc8"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-      <name id="19" justification="1" size="4" underlined="false">
-        <text>OPERATION</text>
-      </name>
-    </StateNode>
-    <StateNode id="20">
-      <children id="21"/>
-      <location class="Point2D.Double" id="22" x="130.0" y="260.0"/>
-      <id id="23" value="10f97b62-3aa4-47fa-b230-172727d3f3cd"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-      <name id="24" justification="1" size="4" underlined="false">
-        <text>CONCILIATION</text>
-      </name>
-    </StateNode>
-    <CircularInitialStateNode id="25">
-      <children id="26"/>
-      <location class="Point2D.Double" id="27" x="180.0" y="50.0"/>
-      <id id="28" value="a2b81861-5f20-460c-9efc-1b8adb547da7"/>
-      <revision>1</revision>
-      <backgroundColor reference="7"/>
-      <borderColor reference="8"/>
-      <textColor reference="8"/>
-    </CircularInitialStateNode>
-    <StateNode id="29">
-      <children id="30"/>
-      <location class="Point2D.Double" id="31" x="410.0" y="380.0"/>
-      <id id="32" value="261c4a7c-8ae2-4579-af0a-9cd310c5a199"/>
-      <revision>1</revision>
-      <backgroundColor id="33">
-        <red>255</red>
-        <green>255</green>
-        <blue>255</blue>
-        <alpha>255</alpha>
-      </backgroundColor>
-      <borderColor id="34">
-        <red>0</red>
-        <green>0</green>
-        <blue>0</blue>
-        <alpha>255</alpha>
-      </borderColor>
-      <textColor reference="34"/>
-      <name id="35" justification="1" size="4" underlined="false">
-        <text>RESTARTING</text>
-      </name>
-    </StateNode>
-    <StateNode id="36">
-      <children id="37"/>
-      <location class="Point2D.Double" id="38" x="170.0" y="380.0"/>
-      <id id="39" value="7f2dfd3b-46bc-42cd-a8dc-5d2c6ef490a1"/>
-      <revision>1</revision>
-      <backgroundColor reference="33"/>
-      <borderColor reference="34"/>
-      <textColor reference="34"/>
-      <name id="40" justification="1" size="4" underlined="false">
-        <text>SHUTTING_DOWN</text>
-      </name>
-    </StateNode>
-    <CircularFinalStateNode id="41">
-      <children id="42"/>
-      <location class="Point2D.Double" id="43" x="330.0" y="610.0"/>
-      <id id="44" value="47455cd9-5ea9-4b77-bb82-3e2e4977585c"/>
-      <revision>1</revision>
-      <backgroundColor reference="33"/>
-      <borderColor reference="34"/>
-      <textColor reference="34"/>
-    </CircularFinalStateNode>
-    <StateNode id="45">
-      <children id="46"/>
-      <location class="Point2D.Double" id="47" x="300.0" y="500.0"/>
-      <id id="48" value="a2833099-5d63-4eeb-b327-c920afaafc61"/>
-      <revision>1</revision>
-      <backgroundColor reference="33"/>
-      <borderColor reference="34"/>
-      <textColor reference="34"/>
-      <name id="49" justification="1" size="4" underlined="false">
-        <text>SHUTDOWN</text>
-      </name>
-    </StateNode>
-  </nodes>
-  <edges id="50">
-    <StateTransitionEdge id="51">
-      <start class="StateNode" reference="3"/>
-      <end class="StateNode" reference="10"/>
-      <startLocation class="Point2D.Double" id="52" x="60.0" y="30.0"/>
-      <endLocation class="Point2D.Double" id="53" x="30.0" y="10.0"/>
-      <transitionPoints id="54"/>
-      <id id="55" value="a5603d02-1e83-4369-ac79-ef9c0e0f429a"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="56">
-      <start class="StateNode" reference="10"/>
-      <end class="StateNode" reference="15"/>
-      <startLocation class="Point2D.Double" id="57" x="60.0" y="20.0"/>
-      <endLocation class="Point2D.Double" id="58" x="20.0" y="20.0"/>
-      <transitionPoints id="59"/>
-      <id id="60" value="6bb8bfff-af0c-4995-aa03-151cf34b7afc"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="61">
-      <start class="StateNode" reference="10"/>
-      <end class="StateNode" reference="20"/>
-      <startLocation class="Point2D.Double" id="62" x="40.0" y="40.0"/>
-      <endLocation class="Point2D.Double" id="63" x="70.0" y="10.0"/>
-      <transitionPoints id="64"/>
-      <id id="65" value="387fb965-06a7-4bba-8013-f2c3b6eb394b"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="66">
-      <start class="CircularInitialStateNode" reference="25"/>
-      <end class="StateNode" reference="3"/>
-      <startLocation class="Point2D.Double" id="67" x="10.0" y="10.0"/>
-      <endLocation class="Point2D.Double" id="68" x="40.0" y="20.0"/>
-      <transitionPoints id="69"/>
-      <id id="70" value="b91d9fa4-16ab-4a46-b0a2-8e928d9395c4"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="71">
-      <start class="StateNode" reference="20"/>
-      <end class="StateNode" reference="3"/>
-      <startLocation class="Point2D.Double" id="72" x="50.0" y="20.0"/>
-      <endLocation class="Point2D.Double" id="73" x="40.0" y="40.0"/>
-      <transitionPoints id="74"/>
-      <id id="75" value="a4467e40-4317-455e-b83f-7494bc3aab5b"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="76">
-      <start class="StateNode" reference="15"/>
-      <end class="StateNode" reference="20"/>
-      <startLocation class="Point2D.Double" id="77" x="60.0" y="50.0"/>
-      <endLocation class="Point2D.Double" id="78" x="80.0" y="40.0"/>
-      <transitionPoints id="79"/>
-      <id id="80" value="41652ec7-af74-41ba-884c-a0c745b6bd8b"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="81">
-      <start class="StateNode" reference="20"/>
-      <end class="StateNode" reference="15"/>
-      <startLocation class="Point2D.Double" id="82" x="40.0" y="50.0"/>
-      <endLocation class="Point2D.Double" id="83" x="40.0" y="50.0"/>
-      <transitionPoints id="84"/>
-      <id id="85" value="c54d4ee7-5271-443e-a086-6c44310b3dc2"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="86">
-      <start class="StateNode" reference="15"/>
-      <end class="StateNode" reference="3"/>
-      <startLocation class="Point2D.Double" id="87" x="50.0" y="20.0"/>
-      <endLocation class="Point2D.Double" id="88" x="80.0" y="40.0"/>
-      <transitionPoints id="89"/>
-      <id id="90" value="85b74ec4-8be1-4a61-bf37-fc733d785132"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="91">
-      <start class="StateNode" reference="29"/>
-      <end class="StateNode" reference="45"/>
-      <startLocation class="Point2D.Double" id="92" x="60.0" y="30.0"/>
-      <endLocation class="Point2D.Double" id="93" x="30.0" y="30.0"/>
-      <transitionPoints id="94"/>
-      <id id="95" value="85e916a1-d739-4de5-a57a-d737bd1fc9e0"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="96">
-      <start class="StateNode" reference="45"/>
-      <end class="CircularFinalStateNode" reference="41"/>
-      <startLocation class="Point2D.Double" id="97" x="70.0" y="30.0"/>
-      <endLocation class="Point2D.Double" id="98" x="10.0" y="10.0"/>
-      <transitionPoints id="99"/>
-      <id id="100" value="8dd18d3a-4e64-41bf-aa54-e044fb7cb5a3"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="101">
-      <start class="StateNode" reference="15"/>
-      <end class="StateNode" reference="29"/>
-      <startLocation class="Point2D.Double" id="102" x="60.0" y="30.0"/>
-      <endLocation class="Point2D.Double" id="103" x="40.0" y="30.0"/>
-      <transitionPoints id="104"/>
-      <id id="105" value="f89c17b7-d5b5-4717-8e10-3c48cc1c5a77"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="106">
-      <start class="StateNode" reference="20"/>
-      <end class="StateNode" reference="36"/>
-      <startLocation class="Point2D.Double" id="107" x="60.0" y="40.0"/>
-      <endLocation class="Point2D.Double" id="108" x="60.0" y="30.0"/>
-      <transitionPoints id="109"/>
-      <id id="110" value="a57dd574-4659-4ad3-9028-9ccba9427589"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="111">
-      <start class="StateNode" reference="36"/>
-      <end class="StateNode" reference="45"/>
-      <startLocation class="Point2D.Double" id="112" x="40.0" y="40.0"/>
-      <endLocation class="Point2D.Double" id="113" x="10.0" y="40.0"/>
-      <transitionPoints id="114"/>
-      <id id="115" value="8dd0beb2-3a1f-482e-b631-b218156b56ef"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="116">
-      <start class="StateNode" reference="10"/>
-      <end class="StateNode" reference="36"/>
-      <startLocation class="Point2D.Double" id="117" x="50.0" y="40.0"/>
-      <endLocation class="Point2D.Double" id="118" x="90.0" y="10.0"/>
-      <transitionPoints id="119"/>
-      <id id="120" value="6e976dd7-07c1-4b37-8770-232f6f0ef0c4"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="121">
-      <start class="StateNode" reference="10"/>
-      <end class="StateNode" reference="29"/>
-      <startLocation class="Point2D.Double" id="122" x="60.0" y="40.0"/>
-      <endLocation class="Point2D.Double" id="123" x="30.0" y="20.0"/>
-      <transitionPoints id="124"/>
-      <id id="125" value="ec652e9b-12c5-4969-a340-a8f6f05c678e"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="126">
-      <start class="StateNode" reference="15"/>
-      <end class="StateNode" reference="36"/>
-      <startLocation class="Point2D.Double" id="127" x="30.0" y="50.0"/>
-      <endLocation class="Point2D.Double" id="128" x="70.0" y="20.0"/>
-      <transitionPoints id="129"/>
-      <id id="130" value="95fddf91-f056-4214-9300-280b7d75cc5a"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-    <StateTransitionEdge id="131">
-      <start class="StateNode" reference="20"/>
-      <end class="StateNode" reference="29"/>
-      <startLocation class="Point2D.Double" id="132" x="80.0" y="40.0"/>
-      <endLocation class="Point2D.Double" id="133" x="20.0" y="30.0"/>
-      <transitionPoints id="134"/>
-      <id id="135" value="c07d371d-6e9c-428a-b8a9-c7dab3321d6a"/>
-      <revision>1</revision>
-      <angle>10.0</angle>
-      <labelText></labelText>
-    </StateTransitionEdge>
-  </edges>
-</StateDiagramGraph>]]></SCRIPT>
-	<BR />
-	<BR />
-	<IMG alt="embedded diagram image" src="data:image/png;base64,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
-" />
-</BODY>
-</HTML>
\ No newline at end of file
diff --git a/supvisors/infosource.py b/supvisors/infosource.py
index 49e2be37..dc4c4887 100644
--- a/supvisors/infosource.py
+++ b/supvisors/infosource.py
@@ -185,8 +185,7 @@ def replace_default_handler(self):
             users = {self.username: self.password}
             defaulthandler = supervisor_auth_handler(users, defaulthandler)
         else:
-            self.supervisord.supvisors.logger.warn(
-                'Server running without any HTTP authentication checking')
+            self.supervisord.supvisors.logger.warn('Server running without any HTTP authentication checking')
         # replace Supervisor default handler at the end of the list
         self.httpserver.handlers.pop()
         self.httpserver.install_handler(defaulthandler, True)
diff --git a/supvisors/initializer.py b/supvisors/initializer.py
index 3649d500..a36734b9 100644
--- a/supvisors/initializer.py
+++ b/supvisors/initializer.py
@@ -18,6 +18,7 @@
 # ======================================================================
 
 from supervisor import loggers
+from supervisor.datatypes import Automatic
 from supervisor.xmlrpc import Faults, RPCError
 
 from supvisors.addressmapper import AddressMapper
@@ -47,17 +48,7 @@ def __init__(self, supervisord):
         server_options.realize()
         self.options = server_options.supvisors_options
         # create logger
-        nodaemon = supervisord.options.nodaemon
-        silent = supervisord.options.silent
-        self.logger = loggers.getLogger(self.options.loglevel)
-        if nodaemon and not silent:
-            loggers.handle_stdout(self.logger, Supvisors.LOGGER_FORMAT)
-        loggers.handle_file(self.logger,
-                            self.options.logfile,
-                            Supvisors.LOGGER_FORMAT,
-                            rotating=not not self.options.logfile_maxbytes,
-                            maxbytes=self.options.logfile_maxbytes,
-                            backups=self.options.logfile_backups)
+        self.logger = self.create_logger(supervisord)
         # configure supervisor info source
         self.info_source = SupervisordSource(supervisord)
         # set addresses and check local address
@@ -65,7 +56,7 @@ def __init__(self, supervisord):
         self.address_mapper.addresses = self.options.address_list
         if not self.address_mapper.local_address:
             raise RPCError(Faults.SUPVISORS_CONF_ERROR,
-                           'local host unexpected in address list: {}'
+                           'local host is expected in address list: {}'
                            .format(self.options.address_list))
         # create context data
         self.context = Context(self)
@@ -86,3 +77,25 @@ def __init__(self, supervisord):
             self.parser = None
         # create event subscriber
         self.listener = SupervisorListener(self)
+
+    def create_logger(self, supervisord):
+        """ Create the logger that will be used in Supvisors.
+        If logfile is not set or set to AUTO, Supvisors will use Supervisor logger.
+        Else Supvisors will log in the file defined in option.
+        """
+        if self.options.logfile is Automatic:
+            # get Supervisord logger
+            return supervisord.options.logger
+        # create own Logger using Supervisor functions
+        nodaemon = supervisord.options.nodaemon
+        silent = supervisord.options.silent
+        logger = loggers.getLogger(self.options.loglevel)
+        if nodaemon and not silent:
+            loggers.handle_stdout(logger, Supvisors.LOGGER_FORMAT)
+        loggers.handle_file(logger,
+                            self.options.logfile,
+                            Supvisors.LOGGER_FORMAT,
+                            rotating=not not self.options.logfile_maxbytes,
+                            maxbytes=self.options.logfile_maxbytes,
+                            backups=self.options.logfile_backups)
+        return logger
diff --git a/supvisors/listener.py b/supvisors/listener.py
index 783ecd9b..3587c963 100644
--- a/supvisors/listener.py
+++ b/supvisors/listener.py
@@ -118,7 +118,8 @@ def on_process(self, event):
                    'extra_args': event.process.config.extra_args,
                    'now': int(time.time()),
                    'pid': event.process.pid,
-                   'expected': event.expected}
+                   'expected': event.expected,
+                   'spawnerr': event.process.spawnerr}
         self.logger.debug('payload={}'.format(payload))
         self.publisher.send_process_event(payload)
 
diff --git a/supvisors/options.py b/supvisors/options.py
index c17f0012..facb8bb3 100644
--- a/supvisors/options.py
+++ b/supvisors/options.py
@@ -20,11 +20,10 @@
 from collections import OrderedDict
 from socket import gethostname
 
-from supervisor.datatypes import (boolean,
-                                  integer,
-                                  existing_dirpath,
-                                  byte_size,
+from supervisor.datatypes import (Automatic, logfile_name,
+                                  boolean, integer, byte_size,
                                   logging_level,
+                                  existing_dirpath,
                                   list_of_strings)
 from supervisor.options import ServerOptions
 
@@ -37,30 +36,21 @@ class SupvisorsOptions(object):
 
     Attributes are:
 
-        - address_list: list of host names or IP addresses where supvisors
-        will be running,
+        - address_list: list of host names or IP addresses where supvisors will be running,
         - rules_file: absolute or relative path to the XML rules file,
-        - internal_port: port number used to publish local events to remote
-        Supvisors instances,
+        - internal_port: port number used to publish local events to remote Supvisors instances,
         - event_port: port number used to publish all Supvisors events,
-        - auto_fence: when True, Supvisors won't try to reconnect to a
-        Supvisors instance that has been inactive,
-        - synchro_timeout: time in seconds that Supvisors waits for all
-        expected Supvisors instances to publish,
-        - conciliation_strategy: strategy used to solve conflicts when
-        Supvisors has detected that multiple instances of the same program
-        are running,
+        - auto_fence: when True, Supvisors won't try to reconnect to a Supvisors instance that has been inactive,
+        - synchro_timeout: time in seconds that Supvisors waits for all expected Supvisors instances to publish,
+        - conciliation_strategy: strategy used to solve conflicts when Supvisors has detected multiple running instances of the same program,
         - starting_strategy: strategy used to start processes on addresses,
-        - stats_periods: list of periods for which the statistics will be
-        provided in the Supvisors web page,
+        - stats_periods: list of periods for which the statistics will be provided in the Supvisors web page,
         - stats_histo: depth of statistics history,
         - logfile: absolute or relative path of the Supvisors log file,
         - logfile_maxbytes: maximum size of the Supvisors log file,
         - logfile_backups: number of Supvisors backup log files,
         - loglevel: logging level,
-
-        - procnumbers: a dictionary giving the number of the program in a
-        homogeneous group.
+        - procnumbers: a dictionary giving the number of the program in a homogeneous group.
     """
 
     _Options = ['address_list', 'rules_file', 'internal_port', 'event_port',
@@ -98,8 +88,7 @@ class SupvisorsServerOptions(ServerOptions):
     Attributes are:
 
         - supvisors_options: the instance holding all Supvisors options,
-        - _Section: constant for the name of the Supvisors section in the
-        Supervisor configuration file.
+        - _Section: constant for the name of the Supvisors section in the Supervisor configuration file.
     """
 
     _Section = 'supvisors'
@@ -110,15 +99,15 @@ def __init__(self):
         self.supvisors_options = SupvisorsOptions()
 
     def _processes_from_section(self, parser, section, group_name, klass=None):
-        """ This method is overriden to:
+        """ This method is overridden to:
             - add attributes to prepare the extra args functionality
             - store the program number of a homogeneous program.
-        This is originally used in Supervisor to set the real program name
-        from the format defined in the ini file. However, Supervisor does not
-        keep this information in its internal structure. """
+
+        This is originally used in Supervisor to set the real program name from the format defined in the ini file.
+        However, Supervisor does not keep this information in its internal structure.
+        """
         # call super behaviour
-        programs = ServerOptions._processes_from_section(
-            self, parser, section, group_name, klass)
+        programs = ServerOptions._processes_from_section(self, parser, section, group_name, klass)
         # store the number of each program
         for idx, program in enumerate(programs):
             self.supvisors_options.procnumbers[program.name] = idx
@@ -126,55 +115,39 @@ def _processes_from_section(self, parser, section, group_name, klass=None):
         return programs
 
     def server_configs_from_parser(self, parser):
-        """ The following has nothing to deal with Supervisor's server
-        configurations.
+        """ The following has nothing to deal with Supervisor's server configurations.
         It gets Supvisors configuration.
         Supervisor's ServerOptions has not been designed to be specialized.
-        This method is overriden just to have an access point to the Supervisor
-        parser. """
+        This method is overridden just to have an access point to the Supervisor parser.
+        """
         configs = ServerOptions.server_configs_from_parser(self, parser)
         # set section
         if not parser.has_section(SupvisorsServerOptions._Section):
             raise ValueError('.ini file ({}) does not include a [{}] section'
-                             .format(self.configfile, self._Section))
-        temp, parser.mysection = parser.mysection, self._Section
+                             .format(self.configfile, SupvisorsServerOptions._Section))
+        temp, parser.mysection = parser.mysection, SupvisorsServerOptions._Section
         # get values
         opt = self.supvisors_options
         opt.address_list = list(OrderedDict.fromkeys(filter(
-            None, list_of_strings(parser.getdefault('address_list',
-                                                    gethostname())))))
+            None, list_of_strings(parser.getdefault('address_list', gethostname())))))
         opt.rules_file = parser.getdefault('rules_file', None)
         if opt.rules_file:
             opt.rules_file = existing_dirpath(opt.rules_file)
-        opt.internal_port = self.to_port_num(
-            parser.getdefault('internal_port', '65001'))
-        opt.event_port = self.to_port_num(
-            parser.getdefault('event_port', '65002'))
-        opt.auto_fence = boolean(
-            parser.getdefault('auto_fence', 'false'))
-        opt.synchro_timeout = self.to_timeout(
-            parser.getdefault('synchro_timeout', '15'))
-        opt.conciliation_strategy = self.to_conciliation_strategy(
-            parser.getdefault('conciliation_strategy', 'USER'))
-        opt.starting_strategy = self.to_starting_strategy(
-            parser.getdefault('starting_strategy', 'CONFIG'))
+        opt.internal_port = self.to_port_num(parser.getdefault('internal_port', '65001'))
+        opt.event_port = self.to_port_num(parser.getdefault('event_port', '65002'))
+        opt.auto_fence = boolean(parser.getdefault('auto_fence', 'false'))
+        opt.synchro_timeout = self.to_timeout(parser.getdefault('synchro_timeout', '15'))
+        opt.conciliation_strategy = self.to_conciliation_strategy(parser.getdefault('conciliation_strategy', 'USER'))
+        opt.starting_strategy = self.to_starting_strategy(parser.getdefault('starting_strategy', 'CONFIG'))
         # configure statistics
-        opt.stats_periods = self.to_periods(list_of_strings(
-            parser.getdefault('stats_periods', '10')))
-        opt.stats_histo = self.to_histo(
-            parser.getdefault('stats_histo', 200))
-        opt.stats_irix_mode = boolean(
-            parser.getdefault('stats_irix_mode', 'false'))
+        opt.stats_periods = self.to_periods(list_of_strings(parser.getdefault('stats_periods', '10')))
+        opt.stats_histo = self.to_histo(parser.getdefault('stats_histo', 200))
+        opt.stats_irix_mode = boolean(parser.getdefault('stats_irix_mode', 'false'))
         # configure logger
-        opt.logfile = existing_dirpath(
-            parser.getdefault('logfile', '{}.log'
-                              .format(SupvisorsServerOptions._Section)))
-        opt.logfile_maxbytes = byte_size(
-            parser.getdefault('logfile_maxbytes', '50MB'))
-        opt.logfile_backups = integer(
-            parser.getdefault('logfile_backups', 10))
-        opt.loglevel = logging_level(
-            parser.getdefault('loglevel', 'info'))
+        opt.logfile = logfile_name(parser.getdefault('logfile', Automatic))
+        opt.logfile_maxbytes = byte_size(parser.getdefault('logfile_maxbytes', '50MB'))
+        opt.logfile_backups = integer(parser.getdefault('logfile_backups', 10))
+        opt.loglevel = logging_level(parser.getdefault('loglevel', 'info'))
         # reset mysection and return original result
         parser.mysection = temp
         return configs
@@ -186,8 +159,7 @@ def to_port_num(value):
         value = integer(value)
         if 0 < value <= 65535:
             return value
-        raise ValueError('invalid value for port: %d. '
-                         'expected in [1;65535]' % value)
+        raise ValueError('invalid value for port: %d. expected in [1;65535]' % value)
 
     @staticmethod
     def to_timeout(value):
@@ -195,8 +167,7 @@ def to_timeout(value):
         value = integer(value)
         if 0 < value <= 1000:
             return value
-        raise ValueError('invalid value for synchro_timeout: %d. '
-                         'expected in [1;1000] (seconds)' % value)
+        raise ValueError('invalid value for synchro_timeout: %d. expected in [1;1000] (seconds)' % value)
 
     @staticmethod
     def to_conciliation_strategy(value):
@@ -222,20 +193,16 @@ def to_starting_strategy(value):
     def to_periods(value):
         """ Convert a string into a list of period values. """
         if len(value) == 0:
-            raise ValueError('unexpected number of stats_periods: {}. '
-                             'minimum is 1'.format(value))
+            raise ValueError('unexpected number of stats_periods: {}. minimum is 1'.format(value))
         if len(value) > 3:
-            raise ValueError('unexpected number of stats_periods: {}. '
-                             'maximum is 3'.format(value))
+            raise ValueError('unexpected number of stats_periods: {}. maximum is 3'.format(value))
         periods = []
         for val in value:
             period = integer(val)
             if 5 > period or period > 3600:
-                raise ValueError('invalid value for stats_periods: {}. '
-                                 'expected in [5;3600] (seconds)'.format(val))
+                raise ValueError('invalid value for stats_periods: {}. expected in [5;3600] (seconds)'.format(val))
             if period % 5 != 0:
-                raise ValueError('invalid value for stats_periods: %d. '
-                                 'expected multiple of 5' % period)
+                raise ValueError('invalid value for stats_periods: %d. expected multiple of 5' % period)
             periods.append(period)
         return sorted(filter(None, periods))
 
@@ -245,5 +212,4 @@ def to_histo(value):
         histo = integer(value)
         if 10 <= histo <= 1500:
             return histo
-        raise ValueError('invalid value for stats_histo: {}. '
-                         'expected in [10;1500] (seconds)'.format(value))
+        raise ValueError('invalid value for stats_histo: {}. expected in [10;1500] (seconds)'.format(value))
diff --git a/supvisors/plugin.py b/supvisors/plugin.py
index 7ff87b63..87a321d3 100644
--- a/supvisors/plugin.py
+++ b/supvisors/plugin.py
@@ -97,6 +97,10 @@ def cleanup_fds(self):
     clean-up is disabled in Supvisors. """
 
 
+def get_spawnerr(self):
+    return [('spawnerr', self.process.spawnerr)]
+
+
 def make_supvisors_rpcinterface(supervisord, **config):
     """ Supervisor entry point. """
     # update Supervisor Fault definition
diff --git a/supvisors/process.py b/supvisors/process.py
index 870c3502..0dec8f45 100644
--- a/supvisors/process.py
+++ b/supvisors/process.py
@@ -30,21 +30,13 @@ class ProcessRules(object):
 
     Attributes are:
 
-        - addresses: the addresses where the process can be started
-            (all by default),
+        - addresses: the addresses where the process can be started (all by default),
         - start_sequence: the order in the starting sequence of the application,
         - stop_sequence: the order in the stopping sequence of the application,
-        - required: a status telling if the process is required within the
-            application,
-        - wait_exit: a status telling if Supvisors has to wait for the process
-            to exit before triggering the next phase in the starting sequence
-            of the application,
-        - expected_loading: the expected loading of the process on the
-            considered hardware (can be anything at the user discretion: CPU,
-            RAM, etc),
-        - running_failure_strategy: supersedes the application rule and defines
-            the strategy to apply when the process crashes when the application
-            is running.
+        - required: a status telling if the process is required within the application,
+        - wait_exit: a status telling if Supvisors has to wait for the process to exit before triggering the next phase in the starting sequence of the application,
+        - expected_loading: the expected loading of the process on the considered hardware (can be anything at the user discretion: CPU, RAM, etc),
+        - running_failure_strategy: supersedes the application rule and defines the strategy to apply when the process crashes when the application is running.
     """
 
     def __init__(self, supvisors):
@@ -67,17 +59,15 @@ def __init__(self, supvisors):
     def check_dependencies(self, namespec):
         """ Update rules after they have been read from the rules file.
 
-        A required process that is not in the starting sequence is forced to
-        optional.
+        A required process that is not in the starting sequence is forced to optional.
         If addresses are not defined, all addresses are applicable.
-        Supervisor autorestart is not compatible with RunningFailureStrategy
-        STOP / RESTART.
+        Supervisor autorestart is not compatible with RunningFailureStrategy STOP / RESTART.
         """
         # required MUST have start_sequence, so force to optional if
         # start_sequence is not set
         if self.required and self.start_sequence == 0:
-            self.logger.warn('{} - required forced to False because'
-                             ' no start_sequence defined'.format(namespec))
+            self.logger.warn('{} - required forced to False because no start_sequence defined'
+                             .format(namespec))
             self.required = False
         # if no addresses, consider all addresses
         if not self.addresses:
@@ -110,8 +100,7 @@ def serial(self):
                 'required': self.required,
                 'wait_exit': self.wait_exit,
                 'expected_loading': self.expected_loading,
-                'running_failure_strategy':
-                    RunningFailureStrategies.to_string(self.running_failure_strategy)}
+                'running_failure_strategy': RunningFailureStrategies.to_string(self.running_failure_strategy)}
 
 
 class ProcessStatus(object):
@@ -119,11 +108,9 @@ class ProcessStatus(object):
 
     Attributes are:
 
-        - application_name: the application name, or group name from a
-            Supervisor point of view,
+        - application_name: the application name, or group name from a Supervisor point of view,
         - process_name: the process name,
-        - state: the synthetic state of the process, same enumeration as
-            Supervisor,
+        - state: the synthetic state of the process, same enumeration as Supervisor,
         - expected_exit: a status telling if the process has exited expectantly,
         - last_event_time: the local date of the last information received,
         - extra_args: the additional arguments passed to the command line,
@@ -136,8 +123,7 @@ def __init__(self, application_name, process_name, supvisors):
         """ Initialization of the attributes. """
         # keep a reference of the Supvisors data
         self.supvisors = supvisors
-        supvisors_shortcuts(self, ['address_mapper', 'info_source',
-                                   'logger', 'options'])
+        supvisors_shortcuts(self, ['address_mapper', 'info_source', 'logger', 'options'])
         # copy Supervisor method to self
         ProcessStatus.update_description = SupervisorNamespaceRPCInterface._interpretProcessInfo
         # attributes
@@ -210,14 +196,12 @@ def running_on(self, address):
 
     def pid_running_on(self, address):
         """ Return True if process is RUNNING on address.
-        Different from running_on as it considers only the RUNNING state and
-        not STARTING or BACKOFF.
+        Different from running_on as it considers only the RUNNING state and not STARTING or BACKOFF.
         This is used by the statistics module that requires an existing PID. """
         return self.state == ProcessStates.RUNNING and address in self.addresses
 
     def conflicting(self):
-        """ Return True if the process is in a conflicting state (more than one
-        instance running). """
+        """ Return True if the process is in a conflicting state (more than one instance running). """
         return len(self.addresses) > 1
 
     # methods
@@ -245,8 +229,7 @@ def add_info(self, address, process_info):
         self.update_status(address, info['state'], info['expected'])
         # fix address rule
         if self.rules.addresses == ['#']:
-            if self.address_mapper.addresses.index(address) == \
-                    self.options.procnumbers[self.process_name]:
+            if self.address_mapper.addresses.index(address) == self.options.procnumbers[self.process_name]:
                 self.rules.addresses = [address]
 
     def update_info(self, address, payload):
@@ -276,8 +259,8 @@ def update_info(self, address, payload):
             self.update_status(address, new_state, info['expected'])
             self.logger.debug('new process info: {}'.format(info))
         else:
-            self.logger.warn('ProcessEvent rejected for {}.'
-                             ' wait for tick from {}'.format(self.process_name, address))
+            self.logger.warn('ProcessEvent rejected for {}. wait for tick from {}'
+                             .format(self.process_name, address))
 
     def update_times(self, address, remote_time):
         """ Update the internal process information when
@@ -298,8 +281,7 @@ def update_uptime(info):
 
     def invalidate_address(self, address, is_master):
         """ Update status of a process that was running on a lost address. """
-        self.logger.debug('{} invalidateAddress {} / {}'.format(
-            self.namespec(), self.addresses, address))
+        self.logger.debug('{} invalidateAddress {} / {}'.format(self.namespec(), self.addresses, address))
         # reassign the difference between current set and parameter
         if address in self.addresses:
             self.addresses.remove(address)
@@ -316,8 +298,7 @@ def invalidate_address(self, address, is_master):
             elif self.running():
                 # addresses is empty for a running process
                 # action expected to fix the inconsistency
-                self.logger.warn('no more address for running process {}'
-                                 .format(self.namespec()))
+                self.logger.warn('no more address for running process {}'.format(self.namespec()))
                 self.state = ProcessStates.FATAL
                 # notify the failure to dedicated handler, only if local
                 # address is master
@@ -346,8 +327,7 @@ def update_status(self, address, new_state, expected):
         if not self.evaluate_conflict():
             # if zero element, state is the state of the program addressed
             if self.addresses:
-                self.state = next(self.infos[address]['state']
-                                  for address in self.addresses)
+                self.state = next(self.infos[address]['state'] for address in self.addresses)
                 self.expected_exit = True
             else:
                 self.state = new_state
diff --git a/supvisors/rpcinterface.py b/supvisors/rpcinterface.py
index 442812ba..07a6b377 100644
--- a/supvisors/rpcinterface.py
+++ b/supvisors/rpcinterface.py
@@ -449,8 +449,7 @@ def start_args(self, namespec, extra_args='', wait=True):
         return cb
 
     def start_process(self, strategy, namespec, extra_args='', wait=True):
-        """ Start a process named namespec iaw the strategy and some of the
-        rules file.
+        """ Start a process named namespec iaw the strategy and some of the rules file.
         WARN: the 'wait_exit' rule is not considered here.
 
         *@param* ``StartingStrategies strategy``: the strategy used to choose addresses.
@@ -486,8 +485,7 @@ def start_process(self, strategy, namespec, extra_args='', wait=True):
         done = True
         for process in processes:
             done &= self.starter.start_process(strategy, process, extra_args)
-        self.logger.debug('startProcess {} done={}'
-                          .format(process.namespec(), done))
+        self.logger.debug('startProcess {} done={}'.format(process.namespec(), done))
         # wait until application fully RUNNING or (failed)
         if wait and not done:
             def onwait():
diff --git a/supvisors/rsc_ref/arrow-orange_640.png b/supvisors/rsc_ref/arrow-orange_640.png
deleted file mode 100644
index b57d4700..00000000
Binary files a/supvisors/rsc_ref/arrow-orange_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/arrow-right_640.png b/supvisors/rsc_ref/arrow-right_640.png
deleted file mode 100644
index aee62f65..00000000
Binary files a/supvisors/rsc_ref/arrow-right_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/arrows-blue_640.png b/supvisors/rsc_ref/arrows-blue_640.png
deleted file mode 100644
index 7ecbaee2..00000000
Binary files a/supvisors/rsc_ref/arrows-blue_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/arrows-green_640.png b/supvisors/rsc_ref/arrows-green_640.png
deleted file mode 100644
index 5d0a9b75..00000000
Binary files a/supvisors/rsc_ref/arrows-green_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/arrows-red_640.png b/supvisors/rsc_ref/arrows-red_640.png
deleted file mode 100644
index aefe9f14..00000000
Binary files a/supvisors/rsc_ref/arrows-red_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/erro_640.png b/supvisors/rsc_ref/erro_640.png
deleted file mode 100644
index 5ba17464..00000000
Binary files a/supvisors/rsc_ref/erro_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/info_640.png b/supvisors/rsc_ref/info_640.png
deleted file mode 100644
index bae59222..00000000
Binary files a/supvisors/rsc_ref/info_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/led_green_640_png b/supvisors/rsc_ref/led_green_640_png
deleted file mode 100644
index d65ff950..00000000
Binary files a/supvisors/rsc_ref/led_green_640_png and /dev/null differ
diff --git a/supvisors/rsc_ref/led_red_640_png b/supvisors/rsc_ref/led_red_640_png
deleted file mode 100644
index 0835891d..00000000
Binary files a/supvisors/rsc_ref/led_red_640_png and /dev/null differ
diff --git a/supvisors/rsc_ref/led_yellow_640_png b/supvisors/rsc_ref/led_yellow_640_png
deleted file mode 100644
index 1d3768ac..00000000
Binary files a/supvisors/rsc_ref/led_yellow_640_png and /dev/null differ
diff --git a/supvisors/rsc_ref/reload_640.png b/supvisors/rsc_ref/reload_640.png
deleted file mode 100644
index addec2ad..00000000
Binary files a/supvisors/rsc_ref/reload_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/restart_640.png b/supvisors/rsc_ref/restart_640.png
deleted file mode 100644
index 7284cdb5..00000000
Binary files a/supvisors/rsc_ref/restart_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/shutdown_640.png b/supvisors/rsc_ref/shutdown_640.png
deleted file mode 100644
index cb8e2da8..00000000
Binary files a/supvisors/rsc_ref/shutdown_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/start_640.png b/supvisors/rsc_ref/start_640.png
deleted file mode 100644
index f69f453e..00000000
Binary files a/supvisors/rsc_ref/start_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/stop_640.png b/supvisors/rsc_ref/stop_640.png
deleted file mode 100644
index 2abd48d7..00000000
Binary files a/supvisors/rsc_ref/stop_640.png and /dev/null differ
diff --git a/supvisors/rsc_ref/warn_640.png b/supvisors/rsc_ref/warn_640.png
deleted file mode 100644
index bdb1aea4..00000000
Binary files a/supvisors/rsc_ref/warn_640.png and /dev/null differ
diff --git a/supvisors/ui/hostaddress.html b/supvisors/ui/hostaddress.html
index c0c2daa2..e5f10e54 100644
--- a/supvisors/ui/hostaddress.html
+++ b/supvisors/ui/hostaddress.html
@@ -49,7 +49,7 @@ <h3><code meld:id="state_mid" class="classState">RemoteStates</code> at <span me
                     <table class="optionBox">
                         <tr><th>Statistics View</th></tr>
                         <tr><td><ul class="linear">
-                            <li><a href="#" meld:id="proc_a_mid" class="button on ">Processes</a></li>
+                            <li><a href="#" meld:id="view_a_mid" class="button on ">Processes</a></li>
                             <li><a href="#" class="button off active">Host</a></li>
                         </ul></td></tr>
                     </table>
diff --git a/supvisors/ui/procaddress.html b/supvisors/ui/procaddress.html
index 2fd30b18..1659bc44 100644
--- a/supvisors/ui/procaddress.html
+++ b/supvisors/ui/procaddress.html
@@ -50,7 +50,7 @@ <h3><code meld:id="state_mid" class="classState">RemoteStates</code> at <span me
                         <tr><th>Statistics View</th></tr>
                         <tr><td><ul class="linear">
                             <li><a href="#" class="button off active">Processes</a></li>
-                            <li><a href="#" meld:id="host_a_mid" class="button on">Host</a></li>
+                            <li><a href="#" meld:id="view_a_mid" class="button on">Host</a></li>
                         </ul></td></tr>
                     </table>
                 </div>
diff --git a/supvisors/utils.py b/supvisors/utils.py
index 4f363554..5bfc3d35 100644
--- a/supvisors/utils.py
+++ b/supvisors/utils.py
@@ -104,8 +104,7 @@ def simple_gmtime(now=None):
 
 
 # Keys of information kept from Supervisor
-__Payload_Keys = ('name', 'group', 'state', 'start', 'stop', 'now', 'pid',
-                  'description', 'spawnerr')
+__Payload_Keys = ('name', 'group', 'state', 'start', 'stop', 'now', 'pid', 'description', 'spawnerr')
 
 
 def extract_process_info(info):
diff --git a/supvisors/version.txt b/supvisors/version.txt
index 61d057d2..5971fc4c 100644
--- a/supvisors/version.txt
+++ b/supvisors/version.txt
@@ -1,1 +1,1 @@
-version=0.2
+version=0.3
diff --git a/supvisors/viewapplication.py b/supvisors/viewapplication.py
index df7a2405..0d34db58 100644
--- a/supvisors/viewapplication.py
+++ b/supvisors/viewapplication.py
@@ -174,10 +174,7 @@ def write_process_table(self, root, data):
                 # print process name and running addresses
                 self.write_process(tr_elt, info)
                 # set line background and invert
-                if shaded_tr:
-                    tr_elt.attrib['class'] = 'shaded'
-                else:
-                    tr_elt.attrib['class'] = 'brightened'
+                apply_shade(tr_elt, shaded_tr)
                 shaded_tr = not shaded_tr
         else:
             table = root.findmeld('table_mid')
diff --git a/supvisors/viewhandler.py b/supvisors/viewhandler.py
index 66257100..829473c5 100644
--- a/supvisors/viewhandler.py
+++ b/supvisors/viewhandler.py
@@ -31,12 +31,14 @@
 
 
 # test matplotlib availability
+# calling get_backend is useless excepted for unit tests
 def test_matplotlib_import():
     try:
-        import matplotlib
-        return True
+        from matplotlib import get_backend
+        get_backend()
     except ImportError:
         return False
+    return True
 
 
 # keep matplotlib availability information at once
diff --git a/supvisors/viewhostaddress.py b/supvisors/viewhostaddress.py
index 7b608029..6e361579 100644
--- a/supvisors/viewhostaddress.py
+++ b/supvisors/viewhostaddress.py
@@ -17,23 +17,19 @@
 # limitations under the License.
 # ======================================================================
 
-from supervisor.web import StatusView
-
-from supvisors.utils import (get_stats,
-                             simple_localtime,
-                             supvisors_shortcuts)
+from supvisors.utils import get_stats
 from supvisors.viewcontext import *
-from supvisors.viewhandler import HAS_PLOT, ViewHandler
+from supvisors.viewhandler import HAS_PLOT
 from supvisors.viewimage import (address_cpu_img,
                                  address_mem_img,
                                  address_io_img)
+from supvisors.viewsupstatus import SupvisorsAddressView
 from supvisors.webutils import *
 
 
-class HostAddressView(StatusView):
+class HostAddressView(SupvisorsAddressView):
     """ View renderer of the Host section of the Supvisors Address page.
-    Inheritance is made from supervisor.web.StatusView to benefit from
-    the action methods.
+    Inheritance is made from supervisor.web.StatusView to benefit from the action methods.
     Note that the inheritance of StatusView has been patched dynamically
     in supvisors.plugin.make_supvisors_rpcinterface so that StatusView
     inherits from ViewHandler instead of MeldView.
@@ -41,55 +37,7 @@ class HostAddressView(StatusView):
 
     def __init__(self, context):
         """ Call of the superclass constructors. """
-        StatusView.__init__(self, context)
-        self.page_name = HOST_ADDRESS_PAGE
-
-    def render(self):
-        """ Catch render to force the use of ViewHandler's method. """
-        return ViewHandler.render(self)
-
-    def write_navigation(self, root):
-        """ Rendering of the navigation menu with selection of the current
-        address. """
-        self.write_nav(root, address=self.address)
-
-    def write_header(self, root):
-        """ Rendering of the header part of the Supvisors Address page. """
-        # set address name
-        elt = root.findmeld('address_mid')
-        if self.supvisors.context.master:
-            elt.attrib['class'] = 'master'
-        elt.content(self.address)
-        # set address state
-        status = self.supvisors.context.addresses[self.address]
-        elt = root.findmeld('state_mid')
-        elt.content(status.state_string())
-        # set loading
-        elt = root.findmeld('percent_mid')
-        elt.content('{}%'.format(status.loading()))
-        # set last tick date: remote_time and local_time should be identical
-        # since self is running on the 'remote' address
-        elt = root.findmeld('date_mid')
-        elt.content(simple_localtime(status.remote_time))
-        # write periods of statistics
-        self.write_periods(root)
-        # write actions related to address
-        self.write_address_actions(root)
-
-    def write_address_actions(self, root):
-        """ Write actions related to the address. """
-        # configure host address button
-        elt = root.findmeld('proc_a_mid')
-        url = self.view_ctx.format_url('', PROC_ADDRESS_PAGE)
-        elt.attributes(href=url)
-        # configure refresh button
-        elt = root.findmeld('refresh_a_mid')
-        url = self.view_ctx.format_url('', self.page_name, **{ACTION: 'refresh'})
-        elt.attributes(href=url)
-        # configure stop all button
-        elt = root.findmeld('stopall_a_mid')
-        url = self.view_ctx.format_url('', self.page_name, **{ACTION: 'stopall'})
-        elt.attributes(href=url)
+        SupvisorsAddressView.__init__(self, context, HOST_ADDRESS_PAGE)
 
     def write_contents(self, root):
         """ Rendering of tables and figures for address statistics. """
@@ -104,72 +52,72 @@ def write_contents(self, root):
             self._write_mem_image(stats_instance.mem)
             self._write_io_image(stats_instance.io)
 
+    def _write_processor_single_title(self, tr_elt, selected_cpu_id, cpu_id):
+        """ Rendering of the title of a single core. """
+        elt = tr_elt.findmeld('cpunum_a_mid')
+        if selected_cpu_id == cpu_id:
+            elt.attrib['class'] = 'button off active'
+        else:
+            url = self.view_ctx.format_url('', self.page_name, **{CPU: cpu_id})
+            elt.attributes(href=url)
+        cpu_id_string = self.view_ctx.cpu_id_to_string(cpu_id)
+        elt.content('cpu#%s' % cpu_id_string)
+
+    def _write_processor_single_statistics(self, tr_elt, single_cpu_stats):
+        """ Rendering of the processor statistics for a single core. """
+        self._write_common_statistics(tr_elt, single_cpu_stats,
+                                      'cpuval_td_mid', 'cpuavg_td_mid',
+                                      'cpuslope_td_mid', 'cpudev_td_mid')
+
     def write_processor_statistics(self, root, cpu_stats):
         """ Rendering of the processor statistics. """
         selected_cpu_id = self.view_ctx.parameters[CPU]
         iterator = root.findmeld('cpu_tr_mid').repeat(cpu_stats)
         shaded_tr = False
         for cpu_id, (tr_elt, single_cpu_stats) in enumerate(iterator):
-            # set CPU id
-            elt = tr_elt.findmeld('cpunum_a_mid')
-            if selected_cpu_id == cpu_id:
-                elt.attrib['class'] = 'button off active'
-            else:
-                url = self.view_ctx.format_url('', self.page_name, **{CPU: cpu_id})
-                elt.attributes(href=url)
-            cpu_id_string = self.view_ctx.cpu_id_to_string(cpu_id)
-            elt.content('cpu#%s' % cpu_id_string)
-            # set statistics
-            if len(single_cpu_stats) > 0:
-                avg, rate, (a, b), dev = get_stats(single_cpu_stats)
-                # set last value with instant slope
-                elt = tr_elt.findmeld('cpuval_td_mid')
-                if rate is not None:
-                    self.set_slope_class(elt, rate)
-                elt.content('{:.2f}'.format(single_cpu_stats[-1]))
-                # set mean value
-                elt = tr_elt.findmeld('cpuavg_td_mid')
-                elt.content('{:.2f}'.format(avg))
-                if a is not None:
-                    # set slope of linear regression
-                    elt = tr_elt.findmeld('cpuslope_td_mid')
-                    elt.content('{:.2f}'.format(a))
-                if dev is not None:
-                    # set standard deviation
-                    elt = tr_elt.findmeld('cpudev_td_mid')
-                    elt.content('{:.2f}'.format(dev))
-            # set row background
-            if shaded_tr:
-                tr_elt.attrib['class'] = 'shaded'
-            else:
-                tr_elt.attrib['class'] = 'brightened'
+            self._write_processor_single_title(tr_elt, selected_cpu_id, cpu_id)
+            self._write_processor_single_statistics(tr_elt, single_cpu_stats)
+            # set row background and invert
+            apply_shade(tr_elt, shaded_tr)
             shaded_tr = not shaded_tr
 
     def write_memory_statistics(self, root, mem_stats):
         """ Rendering of the memory statistics. """
-        if len(mem_stats) > 0:
-            # get additional statistics
-            avg, rate, (a, b), dev = get_stats(mem_stats)
-            # set last value
-            elt = root.findmeld('memval_td_mid')
-            if rate is not None:
-                self.set_slope_class(elt, rate)
-            elt.content('{:.2f}'.format(mem_stats[-1]))
-            # set mean value
-            elt = root.findmeld('memavg_td_mid')
-            elt.content('{:.2f}'.format(avg))
-            if a is not None:
-                # set slope of linear regression
-                elt = root.findmeld('memslope_td_mid')
-                elt.content('{:.2f}'.format(a))
-            if dev is not None:
-                # set standard deviation
-                elt = root.findmeld('memdev_td_mid')
-                elt.content('{:.2f}'.format(dev))
+        self._write_common_statistics(root, mem_stats,
+                                      'memval_td_mid', 'memavg_td_mid',
+                                      'memslope_td_mid', 'memdev_td_mid')
+
+    def _write_network_single_title(self, tr_elt, selected_intf, intf, rowspan, shaded_tr):
+        """ Rendering of the title column of the network statistics. """
+        # set interface cell rowspan
+        elt = tr_elt.findmeld('intf_td_mid')
+        if rowspan:
+            elt.attrib['rowspan'] = '2'
+            # apply shade logic to td element too for background-image to work
+            apply_shade(elt, shaded_tr)
+            # set interface name on a/href elt
+            elt = elt.findmeld('intf_a_mid')
+            elt.content(intf)
+            if selected_intf == intf:
+                elt.attrib['class'] = 'button off active'
+            else:
+                url = self.view_ctx.format_url('', self.page_name, **{INTF: intf})
+                elt.attributes(href=url)
+        else:
+            elt.replace('')
+
+    def _write_network_single_statistics(self, tr_elt, single_io_stats, rowspan):
+        """ Rendering of the statistics columns of the network statistics. """
+        elt = tr_elt.findmeld('intfrxtx_td_mid')
+        elt.content('Rx' if rowspan else 'Tx')
+        # calculate and write statistics
+        self._write_common_statistics(tr_elt, single_io_stats,
+                                      'intfval_td_mid', 'intfavg_td_mid',
+                                      'intfslope_td_mid', 'intfdev_td_mid')
 
     def write_network_statistics(self, root, io_stats):
         """ Rendering of the network statistics. """
-        intf_name = self.view_ctx.parameters[INTF]
+        selected_intf = self.view_ctx.parameters[INTF]
         # display io statistics
         flatten_io_stats = [(intf, lst)
                             for intf, lsts in io_stats.items()
@@ -178,54 +126,37 @@ def write_network_statistics(self, root, io_stats):
         rowspan, shaded_tr = True, False
         for tr_elt, (intf, single_io_stats) in iterator:
             # set row background
-            if shaded_tr:
-                tr_elt.attrib['class'] = 'shaded'
-            else:
-                tr_elt.attrib['class'] = 'brightened'
+            apply_shade(tr_elt, shaded_tr)
             # set interface cell rowspan
-            elt = tr_elt.findmeld('intf_td_mid')
-            if rowspan:
-                elt.attrib['rowspan'] = "2"
-                # apply shaded / brightened to td element too for background-image to work
-                if shaded_tr:
-                    elt.attrib['class'] = 'shaded'
-                else:
-                    elt.attrib['class'] = 'brightened'
-                # set interface name on a/href elt
-                elt = elt.findmeld('intf_a_mid')
-                elt.content(intf)
-                if intf_name == intf:
-                    elt.attrib['class'] = 'button off active'
-                else:
-                    url = self.view_ctx.format_url('', self.page_name, **{INTF: intf})
-                    elt.attributes(href=url)
-            else:
-                elt.replace('')
+            self._write_network_single_title(tr_elt, selected_intf, intf, rowspan, shaded_tr)
             # set interface direction
-            elt = tr_elt.findmeld('intfrxtx_td_mid')
-            elt.content('Rx' if rowspan else 'Tx')
-            if len(single_io_stats) > 0:
-                avg, rate, (a, b), dev = get_stats(single_io_stats)
-                # set last value
-                elt = tr_elt.findmeld('intfval_td_mid')
-                if rate is not None:
-                    self.set_slope_class(elt, rate)
-                elt.content('{:.2f}'.format(single_io_stats[-1]))
-                # set mean value
-                elt = tr_elt.findmeld('intfavg_td_mid')
-                elt.content('{:.2f}'.format(avg))
-                if a is not None:
-                    # set slope of linear regression
-                    elt = tr_elt.findmeld('intfslope_td_mid')
-                    elt.content('{:.2f}'.format(a))
-                if dev is not None:
-                    # set standard deviation
-                    elt = tr_elt.findmeld('intfdev_td_mid')
-                    elt.content('{:.2f}'.format(dev))
+            self._write_network_single_statistics(tr_elt, single_io_stats, rowspan)
             if not rowspan:
                 shaded_tr = not shaded_tr
             rowspan = not rowspan
 
+    def _write_common_statistics(self, root, stats, val_mid, avg_mid, slope_mid, dev_mid):
+        """ Rendering of the memory statistics. """
+        if len(stats) > 0:
+            # get additional statistics
+            avg, rate, (a, b), dev = get_stats(stats)
+            # set last value
+            elt = root.findmeld(val_mid)
+            if rate is not None:
+                self.set_slope_class(elt, rate)
+            elt.content('{:.2f}'.format(stats[-1]))
+            # set mean value
+            elt = root.findmeld(avg_mid)
+            elt.content('{:.2f}'.format(avg))
+            if a is not None:
+                # set slope of linear regression
+                elt = root.findmeld(slope_mid)
+                elt.content('{:.2f}'.format(a))
+            if dev is not None:
+                # set standard deviation
+                elt = root.findmeld(dev_mid)
+                elt.content('{:.2f}'.format(dev))
+
     def _write_cpu_image(self, cpu_stats):
         """ Write CPU data into the dedicated buffer. """
         # get CPU data
@@ -259,24 +190,3 @@ def _write_io_image(self, io_stats):
             plt.add_plot('{} recv'.format(intf_name), 'kbits/s', recv_data)
             plt.add_plot('{} sent'.format(intf_name), 'kbits/s', sent_data)
             plt.export_image(address_io_img)
-
-    def make_callback(self, namespec, action):
-        """ Triggers the action requested. """
-        if action == 'restartsup':
-            return self.restart_sup_action()
-        if action == 'shutdownsup':
-            return self.shutdown_sup_action()
-        return StatusView.make_callback(self, namespec, action)
-
-    def restart_sup_action(self):
-        """ Restart the local supervisor. """
-        self.supvisors.zmq.pusher.send_restart(self.address)
-        # cannot defer result as restart address is self address
-        # message is sent but it will be likely not displayed
-        return delayed_warn('Supervisor restart requested')
-
-    def shutdown_sup_action(self):
-        """ Shut down the local supervisor. """
-        self.supvisors.zmq.pusher.send_shutdown(self.address)
-        # cannot defer result if shutdown address is self address
-        return delayed_warn('Supervisor shutdown requested')
diff --git a/supvisors/viewprocaddress.py b/supvisors/viewprocaddress.py
index 4b2e99a3..ade04b08 100644
--- a/supvisors/viewprocaddress.py
+++ b/supvisors/viewprocaddress.py
@@ -18,18 +18,14 @@
 # ======================================================================
 
 from supervisor.options import make_namespec
-from supervisor.web import StatusView
 from supervisor.xmlrpc import RPCError
 
-from supvisors.utils import simple_localtime
 from supvisors.viewcontext import *
-from supvisors.viewhandler import ViewHandler
+from supvisors.viewsupstatus import SupvisorsAddressView
 from supvisors.webutils import *
 
-from urllib.parse import quote
 
-
-class ProcAddressView(StatusView):
+class ProcAddressView(SupvisorsAddressView):
     """ View renderer of the Process section of the Supvisors Address page.
     Inheritance is made from supervisor.web.StatusView to benefit from
     the action methods.
@@ -40,58 +36,7 @@ class ProcAddressView(StatusView):
 
     def __init__(self, context):
         """ Call of the superclass constructors. """
-        StatusView.__init__(self, context)
-        self.page_name = PROC_ADDRESS_PAGE
-
-    def render(self):
-        """ Catch render to force the use of ViewHandler's method. """
-        return ViewHandler.render(self)
-
-    def write_navigation(self, root):
-        """ Rendering of the navigation menu with selection of the current
-        address """
-        self.write_nav(root, address=self.address)
-
-    # RIGHT SIDE / HEADER part
-    def write_header(self, root):
-        """ Rendering of the header part of the Supvisors Address page """
-        # set address name
-        elt = root.findmeld('address_mid')
-        if self.sup_ctx.master:
-            elt.attrib['class'] = 'master'
-        elt.content(self.address)
-        # set address state
-        status = self.sup_ctx.addresses[self.address]
-        elt = root.findmeld('state_mid')
-        elt.content(status.state_string())
-        # set loading
-        elt = root.findmeld('percent_mid')
-        elt.content('{}%'.format(status.loading()))
-        # set last tick date: remote_time and local_time should be identical
-        # since self is running on the 'remote' address
-        elt = root.findmeld('date_mid')
-        elt.content(simple_localtime(status.remote_time))
-        # write periods of statistics
-        self.write_periods(root)
-        # write actions related to address
-        self.write_address_actions(root)
-
-    def write_address_actions(self, root):
-        """ Write actions related to the address. """
-        # configure host address button
-        elt = root.findmeld('host_a_mid')
-        url = self.view_ctx.format_url('', HOST_ADDRESS_PAGE)
-        elt.attributes(href=url)
-        # configure refresh button
-        elt = root.findmeld('refresh_a_mid')
-        url = self.view_ctx.format_url('', self.page_name,
-                                       **{ACTION: 'refresh'})
-        elt.attributes(href=url)
-        # configure stop all button
-        elt = root.findmeld('stopall_a_mid')
-        url = self.view_ctx.format_url('', self.page_name,
-                                       **{ACTION: 'stopall'})
-        elt.attributes(href=url)
+        SupvisorsAddressView.__init__(self, context, PROC_ADDRESS_PAGE)
 
     # RIGHT SIDE / BODY part
     def write_contents(self, root):
@@ -114,32 +59,32 @@ def write_contents(self, root):
     def get_process_data(self):
         """ Collect sorted data on processes. """
         # use Supervisor to get local information on all processes
+        data = []
         rpc_intf = self.info_source.supervisor_rpc_interface
         try:
             all_info = rpc_intf.getAllProcessInfo()
         except RPCError as e:
             self.logger.warn('failed to get all process info from {}: {}'
                              .format(self.address, e.text))
-        else:
-            # extract what is useful to display
-            data = []
-            for info in all_info:
-                namespec = make_namespec(info['group'], info['name'])
-                status = self.view_ctx.get_process_status(namespec)
-                loading = status.rules.expected_loading if status else '?'
-                nb_cores, proc_stats = self.view_ctx.get_process_stats(namespec)
-                data.append({'application_name': info['group'],
-                             'process_name': info['name'],
-                             'namespec': namespec,
-                             'address': self.view_ctx.local_address,
-                             'statename': info['statename'],
-                             'statecode': info['state'],
-                             'description': info['description'],
-                             'loading': loading,
-                             'nb_cores': nb_cores,
-                             'proc_stats': proc_stats})
-            # re-arrange data
-            return self.sort_processes_by_config(data)
+            return data
+        # extract what is useful to display
+        for info in all_info:
+            namespec = make_namespec(info['group'], info['name'])
+            status = self.view_ctx.get_process_status(namespec)
+            loading = status.rules.expected_loading if status else '?'
+            nb_cores, proc_stats = self.view_ctx.get_process_stats(namespec)
+            data.append({'application_name': info['group'],
+                         'process_name': info['name'],
+                         'namespec': namespec,
+                         'address': self.view_ctx.local_address,
+                         'statename': info['statename'],
+                         'statecode': info['state'],
+                         'description': info['description'],
+                         'loading': loading,
+                         'nb_cores': nb_cores,
+                         'proc_stats': proc_stats})
+        # re-arrange data
+        return self.sort_processes_by_config(data)
 
     def write_process_table(self, root, data):
         """ Rendering of the processes managed through Supervisor """
@@ -151,40 +96,20 @@ def write_process_table(self, root, data):
                 # write common status
                 # (shared between this process view and application view)
                 self.write_common_process_status(tr_elt, info)
-                # print process name (as namespec)
-                namespec = info['namespec']
-                elt = tr_elt.findmeld('name_a_mid')
-                url = self.view_ctx.format_url(self.address, TAIL_PAGE, **{PROCESS: namespec})
-                elt.attributes(href=url)
-                elt.content(namespec)
+                # print process name
+                self.write_process(tr_elt, info)
                 # set line background and invert
-                if shaded_tr:
-                    tr_elt.attrib['class'] = 'shaded'
-                else:
-                    tr_elt.attrib['class'] = 'brightened'
+                apply_shade(tr_elt, shaded_tr)
                 shaded_tr = not shaded_tr
         else:
             table = root.findmeld('table_mid')
             table.replace('No programs to manage')
 
-    # ACTION part
-    def make_callback(self, namespec, action):
-        """ Triggers processing iaw action requested """
-        if action == 'restartsup':
-            return self.restart_sup_action()
-        if action == 'shutdownsup':
-            return self.shutdown_sup_action()
-        return StatusView.make_callback(self, namespec, action)
-
-    def restart_sup_action(self):
-        """ Restart the local supervisor. """
-        self.supvisors.zmq.pusher.send_restart(self.address)
-        # cannot defer result as restart address is self address
-        # message is sent but it will be likely not displayed
-        return delayed_warn('Supervisor restart requested')
-
-    def shutdown_sup_action(self):
-        """ Shut down the local supervisor. """
-        self.supvisors.zmq.pusher.send_shutdown(self.address)
-        # cannot defer result if shutdown address is self address
-        return delayed_warn('Supervisor shutdown requested')
+    def write_process(self, tr_elt, info):
+        """ Rendering of the cell corresponding to the process name. """
+        # print process name (as namespec)
+        namespec = info['namespec']
+        elt = tr_elt.findmeld('name_a_mid')
+        elt.content(namespec)
+        url = self.view_ctx.format_url(self.address, TAIL_PAGE, **{PROCESS: namespec})
+        elt.attributes(href=url)
diff --git a/supvisors/viewsupstatus.py b/supvisors/viewsupstatus.py
new file mode 100644
index 00000000..0f7ac563
--- /dev/null
+++ b/supvisors/viewsupstatus.py
@@ -0,0 +1,110 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# ======================================================================
+# Copyright 2020 Julien LE CLEACH
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ======================================================================
+
+from supervisor.web import StatusView
+
+from supvisors.utils import simple_localtime
+from supvisors.viewcontext import *
+from supvisors.viewhandler import ViewHandler
+from supvisors.webutils import *
+
+
+class SupvisorsAddressView(StatusView):
+    """ Common methods for the view renderer of the Supvisors Address page.
+    Inheritance is made from supervisor.web.StatusView to benefit from the action methods.
+    Note that the inheritance of StatusView has been patched dynamically
+    in supvisors.plugin.make_supvisors_rpcinterface so that StatusView
+    inherits from ViewHandler instead of MeldView.
+    """
+
+    def __init__(self, context, page_name):
+        """ Call of the superclass constructors. """
+        StatusView.__init__(self, context)
+        self.page_name = page_name
+
+    def render(self):
+        """ Catch render to force the use of ViewHandler's method. """
+        return ViewHandler.render(self)
+
+    # LEFT SIDE / NAVIGATION part
+    def write_navigation(self, root):
+        """ Rendering of the navigation menu with selection of the current address. """
+        self.write_nav(root, address=self.address)
+
+    # RIGHT SIDE / HEADER part
+    def write_header(self, root):
+        """ Rendering of the header part of the Supvisors Address page. """
+        # set address name
+        elt = root.findmeld('address_mid')
+        if self.sup_ctx.master:
+            elt.attrib['class'] = 'master'
+        elt.content(self.address)
+        # set address state
+        status = self.sup_ctx.addresses[self.address]
+        elt = root.findmeld('state_mid')
+        elt.content(status.state_string())
+        # set loading
+        elt = root.findmeld('percent_mid')
+        elt.content('{}%'.format(status.loading()))
+        # set last tick date: remote_time and local_time should be identical
+        # since self is running on the 'remote' address
+        elt = root.findmeld('date_mid')
+        elt.content(simple_localtime(status.remote_time))
+        # write periods of statistics
+        self.write_periods(root)
+        # write actions related to address
+        self.write_address_actions(root)
+
+    def write_address_actions(self, root):
+        """ Write actions related to the address. """
+        # configure host address button / switch page
+        elt = root.findmeld('view_a_mid')
+        target = PROC_ADDRESS_PAGE if self.page_name == HOST_ADDRESS_PAGE else HOST_ADDRESS_PAGE
+        url = self.view_ctx.format_url('', target)
+        elt.attributes(href=url)
+        # configure refresh button
+        elt = root.findmeld('refresh_a_mid')
+        url = self.view_ctx.format_url('', self.page_name, **{ACTION: 'refresh'})
+        elt.attributes(href=url)
+        # configure stop all button
+        elt = root.findmeld('stopall_a_mid')
+        url = self.view_ctx.format_url('', self.page_name, **{ACTION: 'stopall'})
+        elt.attributes(href=url)
+
+    # ACTION part
+    def make_callback(self, namespec, action):
+        """ Triggers processing iaw action requested """
+        if action == 'restartsup':
+            return self.restart_sup_action()
+        if action == 'shutdownsup':
+            return self.shutdown_sup_action()
+        return StatusView.make_callback(self, namespec, action)
+
+    def restart_sup_action(self):
+        """ Restart the local supervisor. """
+        self.supvisors.zmq.pusher.send_restart(self.address)
+        # cannot defer result as restart address is self address
+        # message is sent but it will be likely not displayed
+        return delayed_warn('Supervisor restart requested')
+
+    def shutdown_sup_action(self):
+        """ Shut down the local supervisor. """
+        self.supvisors.zmq.pusher.send_shutdown(self.address)
+        # cannot defer result if shutdown address is self address
+        return delayed_warn('Supervisor shutdown requested')
diff --git a/supvisors/viewsupvisors.py b/supvisors/viewsupvisors.py
index 509bd056..07e4f456 100644
--- a/supvisors/viewsupvisors.py
+++ b/supvisors/viewsupvisors.py
@@ -37,8 +37,7 @@ class SupvisorsView(ViewHandler):
         * the state of Supvisors,
         * actions on Supvisors,
         * a synoptic of the processes running on the different addresses,
-        * in CONCILIATION state only, the synoptic is replaced by a table of
-        conflicts with tools to solve them.
+        * in CONCILIATION state only, the synoptic is replaced by a table of conflicts with tools to solve them.
     """
 
     def __init__(self, context):
@@ -64,7 +63,8 @@ def write_navigation(self, root):
     def write_header(self, root):
         """ Rendering of the header part of the Supvisors main page. """
         # set Supvisors state
-        root.findmeld('state_mid').content(self.fsm.state_string())
+        elt = root.findmeld('state_mid')
+        elt.content(self.fsm.state_string())
 
     def write_contents(self, root):
         """ Rendering of the contents of the Supvisors main page.
@@ -92,8 +92,7 @@ def write_address_boxes(self, root):
             # set address
             elt = div_elt.findmeld('address_tda_mid')
             if status.state == AddressStates.RUNNING:
-                # go to web page located on address, so as to reuse
-                # Supervisor StatusView
+                # go to web page located on address, so as to reuse Supervisor StatusView
                 url = self.view_ctx.format_url(address, PROC_ADDRESS_PAGE)
                 elt.attributes(href=url)
                 elt.attrib['class'] = 'on'
@@ -123,90 +122,106 @@ def write_conciliation_strategies(self, root):
             elt.attributes(href=url)
             elt.content(item.title())
 
-    def write_conciliation_table(self, root):
-        """ Rendering of the conflicts table. """
-        div_elt = root.findmeld('conflicts_div_mid')
-        # get data for table
-        data = [{'namespec': process.namespec(),
+    def get_conciliation_data(self):
+        """ Get information about all conflicting processes. """
+        return [{'namespec': process.namespec(),
                  'rowspan': len(process.addresses) if idx == 0 else 0,
                  'address': address,
                  'uptime': process.infos[address]['uptime']}
                 for process in self.sup_ctx.conflicts()
                 for idx, address in enumerate(process.addresses)]
-        tr_mid = div_elt.findmeld('tr_mid')
+
+    def write_conciliation_table(self, root):
+        """ Rendering of the conflicts table. """
+        # get data for table
+        data = self.get_conciliation_data()
+        # get meld elements
+        div_elt = root.findmeld('conflicts_div_mid')
         shaded_tr = True
-        for tr_elt, item in tr_mid.repeat(data):
-            # first get the rowspan
+        for tr_elt, item in div_elt.findmeld('tr_mid').repeat(data):
+            # first get the rowspan and change shade when rowspan is 0 (first line of conflict)
             rowspan = item['rowspan']
             if rowspan:
                 shaded_tr = not shaded_tr
             # set row background
-            if shaded_tr:
-                tr_elt.attrib['class'] = 'shaded'
-            else:
-                tr_elt.attrib['class'] = 'brightened'
-            # set process name
-            elt = tr_elt.findmeld('name_td_mid')
-            if rowspan > 0:
-                namespec = item['namespec']
-                elt.attrib['rowspan'] = str(rowspan)
-                elt.content(namespec)
-                # apply shaded / brightened to td element too for background-image to work
-                if shaded_tr:
-                    elt.attrib['class'] = 'shaded'
-                else:
-                    elt.attrib['class'] = 'brightened'
-            else:
-                elt.replace('')
-            # set address
-            address = item['address']
-            elt = tr_elt.findmeld('caddress_a_mid')
-            url = self.view_ctx.format_url(address, PROC_ADDRESS_PAGE)
+            apply_shade(tr_elt, shaded_tr)
+            # write information and actions
+            self._write_conflict_name(tr_elt, item, shaded_tr)
+            self._write_conflict_address(tr_elt, item)
+            self._write_conflict_uptime(tr_elt, item)
+            self._write_conflict_process_actions(tr_elt, item)
+            self._write_conflict_strategies(tr_elt, item, shaded_tr)
+
+    def _write_conflict_name(self, tr_elt, info, shaded_tr):
+        """ In a conflicts table, write the process name in conflict. """
+        elt = tr_elt.findmeld('name_td_mid')
+        rowspan = info['rowspan']
+        if rowspan > 0:
+            namespec = info['namespec']
+            elt.attrib['rowspan'] = str(rowspan)
+            elt.content(namespec)
+            # apply shade logic to td element too for background-image to work
+            apply_shade(elt, shaded_tr)
+        else:
+            elt.replace('')
+
+    def _write_conflict_address(self, tr_elt, info):
+        """ In a conflicts table, write the address where runs the process in conflict. """
+        address = info['address']
+        elt = tr_elt.findmeld('caddress_a_mid')
+        url = self.view_ctx.format_url(address, PROC_ADDRESS_PAGE)
+        elt.attributes(href=url)
+        elt.content(address)
+
+    def _write_conflict_uptime(self, tr_elt, info):
+        """ In a conflicts table, write the uptime of the process in conflict. """
+        elt = tr_elt.findmeld('uptime_td_mid')
+        elt.content(simple_gmtime(info['uptime']))
+
+    def _write_conflict_process_actions(self, tr_elt, info):
+        """ In a conflicts table, write the actions that can be requested on the process in conflict. """
+        namespec = info['namespec']
+        address = info['address']
+        for action in self.process_methods.keys():
+            elt = tr_elt.findmeld(action + '_a_mid')
+            parameters = {NAMESPEC: namespec, ADDRESS: address, ACTION: action}
+            url = self.view_ctx.format_url('', SUPVISORS_PAGE, **parameters)
             elt.attributes(href=url)
-            elt.content(address)
-            # set uptime
-            elt = tr_elt.findmeld('uptime_td_mid')
-            elt.content(simple_gmtime(item['uptime']))
-            # set detailed process action links
-            for action in self.process_methods.keys():
-                elt = tr_elt.findmeld(action + '_a_mid')
-                parameters = {NAMESPEC: namespec,
-                              ADDRESS: address,
-                              ACTION: action}
-                url = self.view_ctx.format_url('', SUPVISORS_PAGE, **parameters)
+
+    def _write_conflict_strategies(self, tr_elt, info, shaded_tr):
+        """ In a conflicts table, write the strategies that can be requested on the process in conflict. """
+        # extract info
+        namespec = info['namespec']
+        rowspan = info['rowspan']
+        # update element structure
+        td_elt = tr_elt.findmeld('strategy_td_mid')
+        if rowspan > 0:
+            # apply shade logic to td element too for background-image to work
+            apply_shade(td_elt, shaded_tr)
+            # fill the strategies
+            td_elt.attrib['rowspan'] = str(rowspan)
+            strategy_iterator = td_elt.findmeld('local_strategy_li_mid').repeat(self.strategies)
+            for li_elt, st_item in strategy_iterator:
+                elt = li_elt.findmeld('local_strategy_a_mid')
+                # conciliation requests MUST be sent to MASTER
+                master = self.sup_ctx.master_address
+                parameters = {NAMESPEC: namespec, ACTION: st_item}
+                url = self.view_ctx.format_url(master, SUPVISORS_PAGE, **parameters)
                 elt.attributes(href=url)
-            # set process action links
-            td_elt = tr_elt.findmeld('strategy_td_mid')
-            if rowspan > 0:
-                # apply shaded / brightened to td element too for background-image to work
-                if shaded_tr:
-                    td_elt.attrib['class'] = 'shaded'
-                else:
-                    td_elt.attrib['class'] = 'brightened'
-                # fill the strategies
-                td_elt.attrib['rowspan'] = str(rowspan)
-                strategy_iterator = td_elt.findmeld('local_strategy_li_mid').repeat(self.strategies)
-                for li_elt, st_item in strategy_iterator:
-                    elt = li_elt.findmeld('local_strategy_a_mid')
-                    # conciliation requests MUST be sent to MASTER
-                    master = self.sup_ctx.master_address
-                    parameters = {NAMESPEC: namespec, ACTION: st_item}
-                    url = self.view_ctx.format_url(master, SUPVISORS_PAGE, **parameters)
-                    elt.attributes(href=url)
-                    elt.content(st_item.title())
-            else:
-                td_elt.replace('')
+                elt.content(st_item.title())
+        else:
+            td_elt.replace('')
 
     def make_callback(self, namespec, action):
         """ Triggers processing iaw action requested. """
         # global actions (no parameter)
-        if action in self.global_methods.keys():
+        if action in self.global_methods:
             return self.global_methods[action]()
         # strategy actions
         if action in self.strategies:
             return self.conciliation_action(namespec, action.upper())
         # process actions
-        if action in self.process_methods.keys():
+        if action in self.process_methods:
             address = self.view_ctx.get_address()
             return self.process_methods[action](namespec, address)
 
@@ -264,27 +279,24 @@ def stop_action(self, namespec, address):
         def on_wait():
             if address in addresses:
                 return NOT_DONE_YET
-            return info_message('process {} stopped on {}'
-                                .format(namespec, address))
+            return info_message('process {} stopped on {}'.format(namespec, address))
 
         on_wait.delay = 0.1
         return on_wait
 
-    def keep_action(self, namespec, address):
-        """ Stop the conflicting processes excepted the one running
-        on address. """
+    def keep_action(self, namespec, kept_address):
+        """ Stop the conflicting processes excepted the one running on address. """
         # get running addresses of process
         addresses = self.sup_ctx.processes[namespec].addresses
         running_addresses = addresses.copy()
-        running_addresses.remove(address)
+        running_addresses.remove(kept_address)
         for address in running_addresses:
             self.supvisors.zmq.pusher.send_stop_process(address, namespec)
 
         def on_wait():
             if len(addresses) > 1:
                 return NOT_DONE_YET
-            return info_message('processes {} stopped but on {}'
-                                .format(namespec, address))
+            return info_message('processes {} stopped but on {}'.format(namespec, kept_address))
 
         on_wait.delay = 0.1
         return on_wait
diff --git a/supvisors/webutils.py b/supvisors/webutils.py
index c3858b2f..70b7f575 100644
--- a/supvisors/webutils.py
+++ b/supvisors/webutils.py
@@ -34,7 +34,6 @@
 Warn = 'warn'
 Error = 'erro'
 
-
 def format_gravity_message(message):
     """ Add a gravity to a message if not present."""
     if not isinstance(message, tuple):
@@ -105,3 +104,12 @@ def on_wait():
 
     on_wait.delay = 0.05
     return on_wait
+
+
+# common shade attribute
+def apply_shade(elt, shaded):
+    if shaded:
+        elt.attrib['class'] = 'shaded'
+    else:
+        elt.attrib['class'] = 'brightened'
+
diff --git a/tox.ini b/tox.ini
index 490bb162..98386c84 100644
--- a/tox.ini
+++ b/tox.ini
@@ -28,8 +28,6 @@ deps =
     Sphinx
     readme
     sphinx_rtd_theme
-    setuptools >= 18.5
 whitelist_externals = make
 commands =
     make -C docs html BUILDDIR={envtmpdir} "SPHINXOPTS=-W -E"
-    python setup.py check -m -r -s


Test patch:
diff --git a/supvisors/test/etc/supervisord.conf b/supvisors/test/etc/supervisord.conf
index 8bb62cee..c052a9d4 100644
--- a/supvisors/test/etc/supervisord.conf
+++ b/supvisors/test/etc/supervisord.conf
@@ -23,7 +23,7 @@ files = */*.ini
 
 # Added by Julien Le Cléach
 [supvisors]
-address_list=cliche81,cliche82,cliche83,cliche84
+address_list=cliche81,cliche83,cliche82,cliche84
 rules_file=./etc/my_movies.xml
 auto_fence=false
 internal_port=60001
@@ -34,9 +34,10 @@ conciliation_strategy=USER
 stats_periods=5,60,600
 stats_histo=100
 stats_irix_mode=false
-logfile=./log/supvisors.log
-logfile_maxbytes=50MB
-logfile_backups=10
+logfile=AUTO
+;logfile=./log/supvisors.log
+;logfile_maxbytes=50MB
+;logfile_backups=10
 
 [rpcinterface:supvisors]
 supervisor.rpcinterface_factory = supvisors.plugin:make_supvisors_rpcinterface
diff --git a/supvisors/test/etc/test/program_check_running_strategy.ini b/supvisors/test/etc/test/program_check_running_strategy.ini
index 95f2c084..bb642d3a 100644
--- a/supvisors/test/etc/test/program_check_running_strategy.ini
+++ b/supvisors/test/etc/test/program_check_running_strategy.ini
@@ -1,5 +1,5 @@
 [program:check_running_strategy]
-command=python ./scripts/check_running_strategy.py
+command=python -m unittest scripts.check_running_strategy
 autostart=false
 autorestart=false
 startsecs=0
diff --git a/supvisors/test/etc/test/program_check_starting_strategy.ini b/supvisors/test/etc/test/program_check_starting_strategy.ini
index b930db7b..5c8d317e 100644
--- a/supvisors/test/etc/test/program_check_starting_strategy.ini
+++ b/supvisors/test/etc/test/program_check_starting_strategy.ini
@@ -1,5 +1,5 @@
 [program:check_starting_strategy]
-command=python ./scripts/check_starting_strategy.py
+command=python -m unittest scripts.check_starting_strategy
 autostart=false
 autorestart=false
 startsecs=0
diff --git a/supvisors/test/scripts/check_running_strategy.py b/supvisors/test/scripts/check_running_strategy.py
index 1cf37cc1..63c4f323 100644
--- a/supvisors/test/scripts/check_running_strategy.py
+++ b/supvisors/test/scripts/check_running_strategy.py
@@ -35,8 +35,7 @@ def setUp(self):
         """ Used to swallow process events related to this process. """
         # call parent
         RunningAddressesTest.setUp(self)
-        # as this process has just been started, STARTING / RUNNING events
-        # might be received
+        # as this process has just been started, STARTING / RUNNING events might be received
         # other events may be triggered from tearDown too
         has_events = True
         while has_events:
@@ -56,20 +55,17 @@ def tearDown(self):
         """ The tearDown restarts the processes that may have been stopped,
         in accordance with initial configuration. """
         try:
-            self.local_supvisors.start_process(StartingStrategies.CONFIG,
-                                               'database:movie_server_01')
+            self.local_supvisors.start_process(StartingStrategies.CONFIG, 'database:movie_server_01')
         except:
             # exception is expected if process already running
             pass
         try:
-            self.local_supvisors.start_process(StartingStrategies.CONFIG,
-                                               'web_movies:web_browser')
+            self.local_supvisors.start_process(StartingStrategies.CONFIG, 'web_movies:web_browser')
         except:
             # exception is expected if process already running
             pass
         try:
-            self.local_supvisors.start_application(StartingStrategies.CONFIG,
-                                                   'my_movies')
+            self.local_supvisors.start_application(StartingStrategies.CONFIG, 'my_movies')
         except:
             # exception is expected if application already running
             pass
@@ -80,8 +76,7 @@ def test_continue(self):
         """ Test the CONTINUE running failure strategy. """
         print('### Testing CONTINUE running failure strategy')
         # force the movie_server_01 to exit with a fake segmentation fault
-        self.local_supervisor.signalProcess('database:movie_server_01',
-                                            'SEGV')
+        self.local_supervisor.signalProcess('database:movie_server_01', 'SEGV')
         # an EXIT event is expected for this process
         event = self._get_next_process_event()
         self.assertDictContainsSubset({'name': 'movie_server_01',
@@ -104,8 +99,7 @@ def test_restart_process(self):
         """ Test the RESTART_PROCESS running failure strategy. """
         print('### Testing RESTART_PROCESS running failure strategy')
         # force the web_browser to exit with a fake segmentation fault
-        self.local_supervisor.signalProcess('web_movies:web_browser',
-                                            'SEGV')
+        self.local_supervisor.signalProcess('web_movies:web_browser', 'SEGV')
         # an EXIT event is expected for this process
         event = self._get_next_process_event()
         self.assertDictContainsSubset({'name': 'web_browser',
@@ -119,8 +113,7 @@ def test_restart_process(self):
                                        'statename': 'STOPPED'}, event)
         # STARTING / RUNNING events are expected for this process
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'web_browser',
-                                       'state': 10}, event)
+        self.assertDictContainsSubset({'name': 'web_browser', 'state': 10}, event)
         # application should be starting
         event = self._get_next_application_status()
         self.assertDictContainsSubset({'application_name': 'web_movies',
@@ -128,8 +121,7 @@ def test_restart_process(self):
                                        'minor_failure': False,
                                        'statename': 'STARTING'}, event)
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'web_browser',
-                                       'state': 20}, event)
+        self.assertDictContainsSubset({'name': 'web_browser', 'state': 20}, event)
         # application should be running
         event = self._get_next_application_status()
         self.assertDictContainsSubset({'application_name': 'web_movies',
@@ -169,8 +161,7 @@ def test_stop_application(self):
                                        'statename': 'RUNNING'}, event)
         # STOPPING / STOPPED events are expected for the manager
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'manager',
-                                       'state': 40}, event)
+        self.assertDictContainsSubset({'name': 'manager', 'state': 40}, event)
         # application should be stopping
         event = self._get_next_application_status()
         self.assertDictContainsSubset({'application_name': 'my_movies',
@@ -178,8 +169,7 @@ def test_stop_application(self):
                                        'minor_failure': False,
                                        'statename': 'STOPPING'}, event)
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'manager',
-                                       'state': 0}, event)
+        self.assertDictContainsSubset({'name': 'manager', 'state': 0}, event)
         # application should be stopped
         event = self._get_next_application_status()
         self.assertDictContainsSubset({'application_name': 'my_movies',
@@ -211,6 +201,8 @@ def test_restart_application(self):
                                        'state': 100}, event)
         # application should be still running with hmi but with major failure
         # because of required manager and web_server that are not running
+        # WARN: if minor_failure is detected True, check if check_starting_strategy has been run before
+        # converter_09 may be FATAL, leading to minor failure
         event = self._get_next_application_status()
         self.assertDictContainsSubset({'application_name': 'my_movies',
                                        'major_failure': True,
@@ -218,8 +210,7 @@ def test_restart_application(self):
                                        'statename': 'RUNNING'}, event)
         # STOPPING / STOPPED events are expected for the hmi
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'hmi',
-                                       'state': 40}, event)
+        self.assertDictContainsSubset({'name': 'hmi', 'state': 40}, event)
         # application should be stopping
         event = self._get_next_application_status()
         self.assertDictContainsSubset({'application_name': 'my_movies',
@@ -227,8 +218,7 @@ def test_restart_application(self):
                                        'minor_failure': False,
                                        'statename': 'STOPPING'}, event)
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'hmi',
-                                       'state': 0}, event)
+        self.assertDictContainsSubset({'name': 'hmi', 'state': 0}, event)
         # application should be stopped
         event = self._get_next_application_status()
         self.assertDictContainsSubset({'application_name': 'my_movies',
@@ -237,8 +227,7 @@ def test_restart_application(self):
                                        'statename': 'STOPPED'}, event)
         # STARTING / RUNNING events are expected for the manager
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'manager',
-                                       'state': 10}, event)
+        self.assertDictContainsSubset({'name': 'manager', 'state': 10}, event)
         # application should be starting, with major failure because of
         # required web_server that is not started yet
         event = self._get_next_application_status()
@@ -247,8 +236,7 @@ def test_restart_application(self):
                                        'minor_failure': False,
                                        'statename': 'STARTING'}, event)
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'manager',
-                                       'state': 20}, event)
+        self.assertDictContainsSubset({'name': 'manager', 'state': 20}, event)
         # application should be running, with major failure because of
         # required web_server that is not started yet
         event = self._get_next_application_status()
@@ -258,8 +246,7 @@ def test_restart_application(self):
                                        'statename': 'RUNNING'}, event)
         # FATAL event is expected for the web_server
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'web_server',
-                                       'state': 200}, event)
+        self.assertDictContainsSubset({'name': 'web_server', 'state': 200}, event)
         # application should be still running, with major failure because of
         # web_server that cannot be started
         event = self._get_next_application_status()
@@ -269,8 +256,7 @@ def test_restart_application(self):
                                        'statename': 'RUNNING'}, event)
         # STARTING / RUNNING events are expected for the hmi
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'hmi',
-                                       'state': 10}, event)
+        self.assertDictContainsSubset({'name': 'hmi', 'state': 10}, event)
         # application should be starting, with major failure because of
         # web_server that cannot be started
         event = self._get_next_application_status()
@@ -279,8 +265,7 @@ def test_restart_application(self):
                                        'minor_failure': False,
                                        'statename': 'STARTING'}, event)
         event = self._get_next_process_event()
-        self.assertDictContainsSubset({'name': 'hmi',
-                                       'state': 20}, event)
+        self.assertDictContainsSubset({'name': 'hmi', 'state': 20}, event)
         # application should be running, with major failure because of
         # web_server that cannot be started
         event = self._get_next_application_status()
@@ -303,10 +288,8 @@ def test_suite():
     # get arguments
     import argparse
 
-    parser = argparse.ArgumentParser(
-        description='Check the Supvisors running failure strategies.')
-    parser.add_argument('-p', '--port', type=int, default=60002,
-                        help="the event port of Supvisors")
+    parser = argparse.ArgumentParser(description='Check the Supvisors running failure strategies.')
+    parser.add_argument('-p', '--port', type=int, default=60002, help="the event port of Supvisors")
     args = parser.parse_args()
     SupvisorsEventQueues.PORT = args.port
     # start unittest
diff --git a/supvisors/test/scripts/check_start_sequence.py b/supvisors/test/scripts/check_start_sequence.py
index 58821a20..cdf579b8 100644
--- a/supvisors/test/scripts/check_start_sequence.py
+++ b/supvisors/test/scripts/check_start_sequence.py
@@ -46,8 +46,7 @@ def test_sequencing(self):
         self.assertFalse(self.context.has_events())
 
     def check_self_starting(self):
-        """ Test the events received that corresponds to the starting of
-        this process. """
+        """ Test the events received that corresponds to the starting of this process. """
         # define 'test' application
         application = Application('test')
         self.context.add_application(application)
diff --git a/supvisors/test/scripts/check_starting_strategy.py b/supvisors/test/scripts/check_starting_strategy.py
index 19dae6d0..af94a6d2 100644
--- a/supvisors/test/scripts/check_starting_strategy.py
+++ b/supvisors/test/scripts/check_starting_strategy.py
@@ -73,13 +73,13 @@ def _refresh_loading(self):
 
     def _start_converter(self, idx):
         """ Get the current loading status. """
-        self.local_supvisors.start_process(self.strategy,
-                                           'my_movies:converter_0%d' % idx)
-        # wait for events
+        self.local_supvisors.start_process(self.strategy, 'my_movies:converter_0%d' % idx)
+        # wait for event STARTING
         event = self._get_next_process_event()
         self.assertDictContainsSubset({'group': 'my_movies',
                                        'name': 'converter_0%d' % idx,
                                        'state': 10}, event)
+        # wait for event RUNNING
         event = self._get_next_process_event()
         self.assertDictContainsSubset({'group': 'my_movies',
                                        'name': 'converter_0%d' % idx,
@@ -87,6 +87,17 @@ def _start_converter(self, idx):
         # refresh the address loadings
         self._refresh_loading()
 
+    def _start_converter_failed(self, idx):
+        """ Get the current loading status. """
+        self.local_supvisors.start_process(self.strategy, 'my_movies:converter_0%d' % idx)
+        # wait for event FATAL
+        event = self._get_next_process_event()
+        self.assertDictContainsSubset({'group': 'my_movies',
+                                       'name': 'converter_0%d' % idx,
+                                       'state': 200}, event)
+        # refresh the address loadings
+        self._refresh_loading()
+
     def test_config(self):
         """ Test the CONFIG starting strategy.
         Start converters and check they have been started on the first address
@@ -95,46 +106,43 @@ def test_config(self):
         self.strategy = StartingStrategies.CONFIG
         # no address config for almost all converters (excepted 04 and 07)
         # so applicable order is the one defined in the supvisors section,
-        # i.e. cliche01, cliche03, cliche02, cliche04 (not running)
+        # i.e. cliche81, cliche83, cliche82, cliche84 (not running)
         # cliche01 is one at 15% initially
         self._start_converter(0)
         self.assertItemsEqual([40, 15, 5], self.loading.values())
         # continue with cliche01
         self._start_converter(1)
         self.assertItemsEqual([65, 15, 5], self.loading.values())
-        # there is still place on cliche01
+        # there is still place on cliche81
         # try with converter_04 to check the alt config
         self._start_converter(4)
         self.assertItemsEqual([65, 15, 30], self.loading.values())
-        # there is still place on cliche01
+        # there is still place on cliche81
         self._start_converter(2)
         self.assertItemsEqual([90, 15, 30], self.loading.values())
-        # cliche01 is full. cliche03 will be used now
+        # cliche81 is full. cliche83 will be used now
         self._start_converter(3)
         self.assertItemsEqual([90, 15, 55], self.loading.values())
-        # there is still place on cliche03
+        # there is still place on cliche83
         # try with converter_07 to check the alt config
-        # cliche01 is full, so second address in config will be used (cliche02)
+        # cliche81 is full, so second address in config will be used (cliche82)
         self._start_converter(7)
         self.assertItemsEqual([90, 40, 55], self.loading.values())
-        # there is still place on cliche03
+        # there is still place on cliche83
         self._start_converter(5)
         self.assertItemsEqual([90, 40, 80], self.loading.values())
-        # cliche01 is full. cliche02 will be used now
+        # cliche81 is full. cliche82 will be used now
         self._start_converter(6)
         self.assertItemsEqual([90, 65, 80], self.loading.values())
         self._start_converter(8)
         self.assertItemsEqual([90, 90, 80], self.loading.values())
         # last converter cannot be started: no resource left
-        with self.assertRaises(xmlrpclib.Fault) as exc:
-            self._start_converter(9)
-        self.assertEqual(Faults.ABNORMAL_TERMINATION, exc.exception.faultCode)
+        self._start_converter_failed(9)
         self.assertItemsEqual([90, 90, 80], self.loading.values())
 
     def test_less_loaded(self):
         """ Test the LESS_LOADED starting strategy.
-        Start converters and check they have been started on the address
-        having the lowest loading. """
+        Start converters and check they have been started on the address having the lowest loading. """
         print('### Testing LESS_LOADED starting strategy')
         self.strategy = StartingStrategies.LESS_LOADED
         self._start_converter(0)
@@ -156,15 +164,12 @@ def test_less_loaded(self):
         self._start_converter(8)
         self.assertItemsEqual([90, 90, 80], self.loading.values())
         # last converter cannot be started: no resource left
-        with self.assertRaises(xmlrpclib.Fault) as exc:
-            self._start_converter(9)
-        self.assertEqual(Faults.ABNORMAL_TERMINATION, exc.exception.faultCode)
+        self._start_converter_failed(9)
         self.assertItemsEqual([90, 90, 80], self.loading.values())
 
     def test_most_loaded(self):
         """ Test the MOST_LOADED starting strategy.
-        Start converters and check they have been started on the address
-        having the highest loading. """
+        Start converters and check they have been started on the address having the highest loading. """
         print('### Testing MOST_LOADED starting strategy')
         self.strategy = StartingStrategies.MOST_LOADED
         self._start_converter(0)
@@ -186,9 +191,7 @@ def test_most_loaded(self):
         self._start_converter(8)
         self.assertItemsEqual([90, 90, 80], self.loading.values())
         # last converter cannot be started: no resource left
-        with self.assertRaises(xmlrpclib.Fault) as exc:
-            self._start_converter(9)
-        self.assertEqual(Faults.ABNORMAL_TERMINATION, exc.exception.faultCode)
+        self._start_converter_failed(9)
         self.assertItemsEqual([90, 90, 80], self.loading.values())
 
 
@@ -200,10 +203,8 @@ def test_suite():
     # get arguments
     import argparse
 
-    parser = argparse.ArgumentParser(
-        description='Check the Supvisors starting strategies.')
-    parser.add_argument('-p', '--port', type=int, default=60002,
-                        help="the event port of Supvisors")
+    parser = argparse.ArgumentParser(description='Check the Supvisors starting strategies.')
+    parser.add_argument('-p', '--port', type=int, default=60002, help="the event port of Supvisors")
     args = parser.parse_args()
     SupvisorsEventQueues.PORT = args.port
     # start unittest
diff --git a/supvisors/test/scripts/running_addresses.py b/supvisors/test/scripts/running_addresses.py
index b4239320..fe25d415 100644
--- a/supvisors/test/scripts/running_addresses.py
+++ b/supvisors/test/scripts/running_addresses.py
@@ -18,7 +18,6 @@
 # ======================================================================
 
 import os
-import unittest
 import zmq
 
 from queue import Empty
@@ -28,11 +27,12 @@
 from supvisors import rpcrequests
 from supvisors.ttypes import AddressStates
 from supvisors.client.subscriber import create_logger
+from supvisors.tests.base import CompatTestCase
 
 from scripts.event_queues import SupvisorsEventQueues
 
 
-class RunningAddressesTest(unittest.TestCase):
+class RunningAddressesTest(CompatTestCase):
     """ Intermediate layer for the check of initial conditions:
     - 3 running addresses.
 
@@ -53,8 +53,7 @@ def setUp(self):
                                   if info['statecode'] == AddressStates.RUNNING]
         self.assertEqual(3, len(self.running_addresses))
         # assumption is made that this test is run on Supvisors Master address
-        self.assertEqual(gethostname(),
-                         self.local_supvisors.get_master_address())
+        self.assertEqual(gethostname(), self.local_supvisors.get_master_address())
         # keep a reference to all RPC proxies
         self.proxies = {address: rpcrequests.getRPCInterface(address, os.environ)
                         for address in self.running_addresses}
diff --git a/supvisors/test/scripts/start_all.sh b/supvisors/test/scripts/start_all.sh
index 0eef62c3..b4ac830e 100755
--- a/supvisors/test/scripts/start_all.sh
+++ b/supvisors/test/scripts/start_all.sh
@@ -5,11 +5,11 @@ SCRIPTS_DIR=`dirname $(readlink -e $0)`
 TEST_DIR=`readlink -e $SCRIPTS_DIR/..`
 
 # start all instances
-for host in cliche01 cliche02 cliche03
+for host in cliche81 cliche82 cliche83
 do
     echo "start Supervisor on host" $host
     ping -c 1 $host && ssh -X $host "cd $TEST_DIR ; export DISPLAY=:0 ; rm -rf log/* ; supervisord"
 done
 
-# tail on supervisor logs
-tail -f log/supervisord.log ./log/supvisors.log
+# tail on supervisor & supvisors logs
+tail -f log/sup*visor..log
diff --git a/supvisors/test/scripts/stop_all.sh b/supvisors/test/scripts/stop_all.sh
index 35145ba2..a1c230aa 100755
--- a/supvisors/test/scripts/stop_all.sh
+++ b/supvisors/test/scripts/stop_all.sh
@@ -9,7 +9,7 @@ pushd .
 cd $TEST_DIR
 
 # stop all instances
-for host in cliche01 cliche02
+for host in cliche81 cliche82 cliche83
 do
 	echo "stop Supervisor on host" $host
         ping -c 1 $host && ssh $host "cd $TEST_DIR ; supervisorctl shutdown"
diff --git a/supvisors/tests/__init__.py b/supvisors/tests/__init__.py
index 8b137891..e69de29b 100644
--- a/supvisors/tests/__init__.py
+++ b/supvisors/tests/__init__.py
@@ -1,1 +0,0 @@
-
diff --git a/supvisors/tests/base.py b/supvisors/tests/base.py
index a2be30ea..49047458 100644
--- a/supvisors/tests/base.py
+++ b/supvisors/tests/base.py
@@ -21,9 +21,11 @@
 import random
 import unittest
 
+from socket import gethostname
 from unittest.mock import patch, Mock
 
-from supervisor.loggers import Logger
+from supervisor.datatypes import Automatic
+from supervisor.loggers import LevelsByName, Logger
 from supervisor.rpcinterface import SupervisorNamespaceRPCInterface
 from supervisor.states import RUNNING_STATES, STOPPED_STATES
 
@@ -49,7 +51,8 @@ class DummyOptions:
     """ Simple options with dummy attributes. """
 
     def __init__(self):
-        # configuration options
+        """ Configuration options. """
+        self.address_list = [gethostname()]
         self.internal_port = 65100
         self.event_port = 65200
         self.synchro_timeout = 10
@@ -59,6 +62,11 @@ def __init__(self):
         self.conciliation_strategy = 0
         self.stats_periods = 5, 15, 60
         self.stats_histo = 10
+        # logger options
+        self.logfile = Automatic
+        self.logfile_maxbytes = 10000
+        self.logfile_backups = 12
+        self.loglevel = LevelsByName.BLAT
         # additional process configuration
         self.procnumbers = {'xclock': 2}
 
@@ -67,7 +75,7 @@ class MockedSupvisors:
     """ Simple supvisors with all dummies. """
 
     def __init__(self):
-        # use a dummy address mapper and options
+        """ Use a dummy address mapper and options. """
         self.address_mapper = DummyAddressMapper()
         self.options = DummyOptions()
         # mock the context
@@ -86,10 +94,9 @@ def __init__(self):
         # mock the supervisord source
         from supvisors.infosource import SupervisordSource
         self.info_source = Mock(spec=SupervisordSource)
-        self.info_source.get_env.return_value = {
-            'SUPERVISOR_SERVER_URL': 'http://127.0.0.1:65000',
-            'SUPERVISOR_USERNAME': '',
-            'SUPERVISOR_PASSWORD': ''}
+        self.info_source.get_env.return_value = {'SUPERVISOR_SERVER_URL': 'http://127.0.0.1:65000',
+                                                 'SUPERVISOR_USERNAME': '',
+                                                 'SUPERVISOR_PASSWORD': ''}
         # mock by spec
         from supvisors.listener import SupervisorListener
         self.listener = Mock(spec=SupervisorListener)
@@ -156,6 +163,7 @@ def __init__(self):
         self.mood = 'mood'
         self.nodaemon = True
         self.silent = False
+        self.logger = Mock(spec=Logger)
         # build a fake http config
         self.httpservers = [[None, DummyHttpServer()]]
         self.httpserver = self.httpservers[0][1]
@@ -302,7 +310,7 @@ def process_info_by_name(name):
     """ Return a copy of a process named 'name' in database. """
     info = next((info.copy() for info in ProcessInfoDatabase
                  if info['name'] == name), None)
-    return extract_process_info(info)
+    return extract_process_info(info) if info else {}
 
 
 class CompatTestCase(unittest.TestCase):
diff --git a/supvisors/tests/test_initializer.py b/supvisors/tests/test_initializer.py
index f309c9c0..4978cfc5 100644
--- a/supvisors/tests/test_initializer.py
+++ b/supvisors/tests/test_initializer.py
@@ -20,15 +20,26 @@
 import sys
 import unittest
 
-from unittest.mock import patch
+from unittest.mock import patch, Mock
+
+from supervisor.datatypes import Automatic
 from supervisor.xmlrpc import Faults, RPCError
 
-from supvisors.tests.base import DummySupervisor
+from supvisors.tests.base import DummySupervisor, DummyOptions
 
 
 class InitializerTest(unittest.TestCase):
     """ Test case for the initializer module. """
 
+    def setUp(self):
+        """ Close logger if any. """
+        self.logger = None
+
+    def tearDown(self):
+        """ Close logger if any. """
+        if self.logger:
+            self.logger.close()
+
     @patch('supvisors.initializer.Parser')
     @patch('supvisors.initializer.AddressMapper')
     @patch('supvisors.initializer.loggers')
@@ -61,6 +72,28 @@ def test_creation(self, *args, **kwargs):
         self.assertIsNotNone(supvisors.parser)
         self.assertIsNotNone(supvisors.listener)
 
+    def test_create_logger(self):
+        """ Test the create_logger method. """
+        from supvisors.initializer import Supvisors
+        # create mocked supvisors options
+        mocked_options = Mock(supvisors_options=DummyOptions())
+        with patch('supvisors.initializer.SupvisorsServerOptions',
+                   return_value=mocked_options):
+            # create Supvisors instance
+            supervisord = DummySupervisor()
+            supvisors = Supvisors(supervisord)
+            # test AUTO logfile
+            mocked_options.supvisors_options.logfile = Automatic
+            self.assertIs(supervisord.options.logger, supvisors.create_logger(supervisord))
+            # for the following, supervisord must be silent because of logger
+            # for unknown reason test_initalizer got this exception
+            # ValueError: I/O operation on closed file
+            supervisord.options.silent = True
+            # test defined logfile
+            mocked_options.supvisors_options.logfile = '/tmp/dummy.log'
+            self.logger = supvisors.create_logger(supervisord)
+            self.assertIsNot(supervisord.options.logger, self.logger)
+
     @patch('supvisors.initializer.loggers')
     @patch('supvisors.initializer.SupvisorsServerOptions')
     def test_address_exception(self, *args, **kwargs):
@@ -88,6 +121,15 @@ def test_parser_exception(self, *args, **kwargs):
         self.assertIsNone(supvisors.parser)
 
 
+class ModuleInitTest(unittest.TestCase):
+    """ Test case for the supvisors package. """
+
+    def test_init(self):
+        """ Just import supvisors to test __init__.py file. """
+        import supvisors
+        self.assertEqual('supvisors', supvisors.__name__)
+
+
 def test_suite():
     return unittest.findTestCases(sys.modules[__name__])
 
diff --git a/supvisors/tests/test_listener.py b/supvisors/tests/test_listener.py
index af5a9b54..b0c1e276 100644
--- a/supvisors/tests/test_listener.py
+++ b/supvisors/tests/test_listener.py
@@ -114,9 +114,10 @@ def test_on_process(self, mocked_time):
         with self.assertRaises(AttributeError):
             listener.on_process(Tick60Event(0, None))
         # test process event
-        process = Mock(pid=1234, **{'config.name': 'dummy_process',
-                                    'config.extra_args': '-s test',
-                                    'group.config.name': 'dummy_group'})
+        process = Mock(pid=1234, spawnerr='resource not available',
+                       **{'config.name': 'dummy_process',
+                          'config.extra_args': '-s test',
+                          'group.config.name': 'dummy_group'})
         event = ProcessStateFatalEvent(process, '')
         listener.on_process(event)
         self.assertEqual([call({'name': 'dummy_process',
@@ -125,7 +126,8 @@ def test_on_process(self, mocked_time):
                                 'extra_args': '-s test',
                                 'now': 77,
                                 'pid': 1234,
-                                'expected': True})],
+                                'expected': True,
+                                'spawnerr': 'resource not available'})],
                          listener.publisher.send_process_event.call_args_list)
 
     @patch.dict('sys.modules',
diff --git a/supvisors/tests/test_options.py b/supvisors/tests/test_options.py
index 43a1c2fd..80d1d7e3 100644
--- a/supvisors/tests/test_options.py
+++ b/supvisors/tests/test_options.py
@@ -65,8 +65,7 @@ def test_str(self):
 
 
 class SupvisorsServerOptionsTest(unittest.TestCase):
-    """ Test case for the SupvisorsServerOptionsTest class
-    of the options module. """
+    """ Test case for the SupvisorsServerOptionsTest class of the options module. """
 
     common_error_message = 'invalid value for {}'
 
@@ -192,6 +191,7 @@ def test_program_numbers(self):
 
     def test_default_options(self):
         """ Test the default values of options with empty Supvisors configuration. """
+        from supervisor.datatypes import Automatic
         from supvisors.ttypes import ConciliationStrategies, StartingStrategies
         server = self.create_server(DefaultOptionConfiguration)
         opt = server.supvisors_options
@@ -206,7 +206,7 @@ def test_default_options(self):
         self.assertListEqual([10], opt.stats_periods)
         self.assertEqual(200, opt.stats_histo)
         self.assertFalse(opt.stats_irix_mode)
-        self.assertEqual('supvisors.log', opt.logfile)
+        self.assertEqual(Automatic, opt.logfile)
         self.assertEqual(50 * 1024 * 1024, opt.logfile_maxbytes)
         self.assertEqual(10, opt.logfile_backups)
         self.assertEqual(20, opt.loglevel)
diff --git a/supvisors/tests/test_sparser.py b/supvisors/tests/test_sparser.py
index d0f0e698..ff72c11f 100644
--- a/supvisors/tests/test_sparser.py
+++ b/supvisors/tests/test_sparser.py
@@ -174,8 +174,7 @@ def check_valid(self, parser):
 
     def assert_default_application_rules(self, rules):
         """ Check that rules contains default values. """
-        from supvisors.ttypes import (RunningFailureStrategies,
-                                      StartingFailureStrategies)
+        from supvisors.ttypes import RunningFailureStrategies, StartingFailureStrategies
         self.assert_application_rules(rules, 0, 0,
                                       StartingFailureStrategies.ABORT,
                                       RunningFailureStrategies.CONTINUE)
diff --git a/supvisors/tests/test_viewapplication.py b/supvisors/tests/test_viewapplication.py
index e53e1017..e3080769 100644
--- a/supvisors/tests/test_viewapplication.py
+++ b/supvisors/tests/test_viewapplication.py
@@ -33,54 +33,50 @@ class ViewApplicationTest(unittest.TestCase):
     module. """
 
     def setUp(self):
-        """ Create a common context. """
-        self.http_context = DummyHttpContext('ui/application.html')
+        """ Create the instance to be tested. """
+        from supvisors.viewapplication import ApplicationView
+        self.view = ApplicationView(DummyHttpContext('ui/application.html'))
+        # unit test feature to print all discrepancies
         self.maxDiff = None
 
     def test_init(self):
         """ Test the values set at construction. """
-        from supvisors.viewapplication import ApplicationView
         from supvisors.viewhandler import ViewHandler
         # create instance
-        view = ApplicationView(self.http_context)
-        self.assertIsInstance(view, ViewHandler)
-        self.assertIsInstance(view, MeldView)
-        self.assertEqual('', view.application_name)
-        self.assertIsNone(view.application)
+        self.assertIsInstance(self.view, ViewHandler)
+        self.assertIsInstance(self.view, MeldView)
+        self.assertEqual('', self.view.application_name)
+        self.assertIsNone(self.view.application)
 
     @patch('supvisors.viewapplication.error_message', return_value='an error')
     @patch('supvisors.viewhandler.ViewHandler.handle_parameters')
-    def test_handle_parameters(self, mocked_handle, _):
+    def test_handle_parameters(self, mocked_handle, mocked_message):
         """ Test the handle_parameters method. """
-        from supvisors.viewapplication import ApplicationView
         from supvisors.viewcontext import APPLI
-        view = ApplicationView(self.http_context)
         # patch context
-        view.view_ctx = Mock(parameters={APPLI: None})
+        self.view.view_ctx = Mock(parameters={APPLI: None})
         # test with no application selected
-        view.handle_parameters()
-        self.assertEqual([call(view)], mocked_handle.call_args_list)
-        self.assertIsNone(view.application)
+        self.view.handle_parameters()
+        self.assertEqual([call(self.view)], mocked_handle.call_args_list)
+        self.assertIsNone(self.view.application)
         self.assertEqual([call('an error')],
-                         view.view_ctx.message.call_args_list)
+                         self.view.view_ctx.message.call_args_list)
         mocked_handle.reset_mock()
-        view.view_ctx.message.reset_mock()
+        self.view.view_ctx.message.reset_mock()
         # test with application selected
-        view.view_ctx = Mock(parameters={APPLI: 'dummy_appli'})
-        view.sup_ctx.applications['dummy_appli'] = 'dummy_appli'
-        view.handle_parameters()
-        self.assertEqual([call(view)], mocked_handle.call_args_list)
-        self.assertEqual('dummy_appli', view.application)
-        self.assertEqual([], view.view_ctx.message.call_args_list)
+        self.view.view_ctx = Mock(parameters={APPLI: 'dummy_appli'})
+        self.view.sup_ctx.applications['dummy_appli'] = 'dummy_appli'
+        self.view.handle_parameters()
+        self.assertEqual([call(self.view)], mocked_handle.call_args_list)
+        self.assertEqual('dummy_appli', self.view.application)
+        self.assertEqual([], self.view.view_ctx.message.call_args_list)
 
     @patch('supvisors.viewhandler.ViewHandler.write_nav')
     def test_write_navigation(self, mocked_handle):
         """ Test the write_navigation method. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
-        view.application_name = 'dummy_appli'
+        self.view.application_name = 'dummy_appli'
         # test with no application selected
-        view.write_navigation('root')
+        self.view.write_navigation('root')
         self.assertEqual([call('root', appli='dummy_appli')],
                          mocked_handle.call_args_list)
 
@@ -89,11 +85,9 @@ def test_write_navigation(self, mocked_handle):
     @patch('supvisors.viewapplication.ApplicationView.write_starting_strategy')
     def test_write_header(self, mocked_strategy, mocked_period, mocked_action):
         """ Test the write_header method. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
-        view.application_name = 'dummy_appli'
-        view.application = Mock(**{'state_string.return_value': 'stopped',
-                                   'running.return_value': False})
+        self.view.application_name = 'dummy_appli'
+        self.view.application = Mock(**{'state_string.return_value': 'stopped',
+                                        'running.return_value': False})
         # patch the meld elements
         led_mid = Mock(attrib={'class': ''})
         state_mid = Mock()
@@ -102,7 +96,7 @@ def test_write_header(self, mocked_strategy, mocked_period, mocked_action):
                                                        state_mid,
                                                        led_mid] * 4})
         # test call with stopped application
-        view.write_header(mocked_root)
+        self.view.write_header(mocked_root)
         self.assertEqual([call('dummy_appli')],
                          application_mid.content.call_args_list)
         self.assertEqual([call('stopped')],
@@ -117,11 +111,11 @@ def test_write_header(self, mocked_strategy, mocked_period, mocked_action):
         mocked_period.reset_mock()
         mocked_action.reset_mock()
         # test call with running application and no failure
-        view.application = Mock(major_failure=False,
-                                minor_failure=False,
-                                **{'state_string.return_value': 'starting',
-                                   'running.return_value': True})
-        view.write_header(mocked_root)
+        self.view.application = Mock(major_failure=False,
+                                     minor_failure=False,
+                                     **{'state_string.return_value': 'starting',
+                                        'running.return_value': True})
+        self.view.write_header(mocked_root)
         self.assertEqual([call('dummy_appli')],
                          application_mid.content.call_args_list)
         self.assertEqual([call('starting')],
@@ -136,8 +130,8 @@ def test_write_header(self, mocked_strategy, mocked_period, mocked_action):
         mocked_period.reset_mock()
         mocked_action.reset_mock()
         # test call with running application and minor failure
-        view.application.minor_failure = True
-        view.write_header(mocked_root)
+        self.view.application.minor_failure = True
+        self.view.write_header(mocked_root)
         self.assertEqual([call('dummy_appli')],
                          application_mid.content.call_args_list)
         self.assertEqual([call('starting')],
@@ -152,8 +146,8 @@ def test_write_header(self, mocked_strategy, mocked_period, mocked_action):
         mocked_period.reset_mock()
         mocked_action.reset_mock()
         # test call with running application and major failure
-        view.application.major_failure = True
-        view.write_header(mocked_root)
+        self.view.application.major_failure = True
+        self.view.write_header(mocked_root)
         self.assertEqual([call('dummy_appli')],
                          application_mid.content.call_args_list)
         self.assertEqual([call('starting')],
@@ -166,10 +160,8 @@ def test_write_header(self, mocked_strategy, mocked_period, mocked_action):
     def test_write_starting_strategy(self):
         """ Test the write_starting_strategy method. """
         from supvisors.ttypes import StartingStrategies
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
         # patch the view context
-        view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
         # patch the meld elements
         config_mid = Mock(attrib={'class': ''})
         most_mid = Mock(attrib={'class': ''})
@@ -178,8 +170,8 @@ def test_write_starting_strategy(self):
                                                        most_mid,
                                                        less_mid] * 3})
         # test call with CONFIG strategy
-        view.supvisors.starter.strategy = StartingStrategies.CONFIG
-        view.write_starting_strategy(mocked_root)
+        self.view.supvisors.starter.strategy = StartingStrategies.CONFIG
+        self.view.write_starting_strategy(mocked_root)
         self.assertEqual('button off active', config_mid.attrib['class'])
         self.assertEqual([], config_mid.attributes.call_args_list)
         self.assertEqual('', most_mid.attrib['class'])
@@ -192,8 +184,8 @@ def test_write_starting_strategy(self):
         most_mid.attributes.reset_mock()
         less_mid.attributes.reset_mock()
         # test call with MOST_LOADED strategy
-        view.supvisors.starter.strategy = StartingStrategies.MOST_LOADED
-        view.write_starting_strategy(mocked_root)
+        self.view.supvisors.starter.strategy = StartingStrategies.MOST_LOADED
+        self.view.write_starting_strategy(mocked_root)
         self.assertEqual('', config_mid.attrib['class'])
         self.assertEqual([call(href='an url')],
                          config_mid.attributes.call_args_list)
@@ -206,8 +198,8 @@ def test_write_starting_strategy(self):
         config_mid.attributes.reset_mock()
         less_mid.attributes.reset_mock()
         # test call with LESS_LOADED strategy
-        view.supvisors.starter.strategy = StartingStrategies.LESS_LOADED
-        view.write_starting_strategy(mocked_root)
+        self.view.supvisors.starter.strategy = StartingStrategies.LESS_LOADED
+        self.view.write_starting_strategy(mocked_root)
         self.assertEqual('', config_mid.attrib['class'])
         self.assertEqual([call(href='an url')],
                          config_mid.attributes.call_args_list)
@@ -219,22 +211,20 @@ def test_write_starting_strategy(self):
 
     def test_write_application_actions(self):
         """ Test the write_application_actions method. """
-        from supvisors.viewapplication import ApplicationView
         from supvisors.webutils import APPLICATION_PAGE
-        view = ApplicationView(self.http_context)
         # patch the view context
-        view.view_ctx = Mock(**{'format_url.side_effect': ['a refresh url', 'a start url',
+        self.view.view_ctx = Mock(**{'format_url.side_effect': ['a refresh url', 'a start url',
                                                            'a stop url', 'a restart url']})
         # patch the meld elements
         actions_mid = (Mock(), Mock(), Mock(), Mock())
         mocked_root = Mock(**{'findmeld.side_effect': actions_mid})
         # test call
-        view.write_application_actions(mocked_root)
+        self.view.write_application_actions(mocked_root)
         self.assertEqual([call('', APPLICATION_PAGE, action='refresh'),
                           call('', APPLICATION_PAGE, action='startapp'),
                           call('', APPLICATION_PAGE, action='stopapp'),
                           call('', APPLICATION_PAGE, action='restartapp')],
-                         view.view_ctx.format_url.call_args_list)
+                         self.view.view_ctx.format_url.call_args_list)
         self.assertEqual([call(href='a refresh url')],
                          actions_mid[0].attributes.call_args_list)
         self.assertEqual([call(href='a start url')],
@@ -251,17 +241,15 @@ def test_write_application_actions(self):
                         [{'namespec': 'dummy_proc'}], [{'namespec': 'dummy_proc'}]))
     def test_write_contents(self, mocked_data, mocked_table, mocked_stats):
         """ Test the write_contents method. """
-        from supvisors.viewapplication import ApplicationView
         from supvisors.viewcontext import PROCESS
-        view = ApplicationView(self.http_context)
-        view.application_name = 'dummy_appli'
+        self.view.application_name = 'dummy_appli'
         # patch context
-        view.view_ctx = Mock(parameters={PROCESS: None},
-                             **{'get_process_status.return_value': None})
+        self.view.view_ctx = Mock(parameters={PROCESS: None},
+                                  **{'get_process_status.return_value': None})
         # patch the meld elements
         mocked_root = Mock()
         # test call with no process selected
-        view.write_contents(mocked_root)
+        self.view.write_contents(mocked_root)
         self.assertEqual([call()], mocked_data.call_args_list)
         self.assertEqual([call(mocked_root, [{'namespec': 'dummy'}])], mocked_table.call_args_list)
         self.assertEqual([call(mocked_root, {})], mocked_stats.call_args_list)
@@ -269,54 +257,52 @@ def test_write_contents(self, mocked_data, mocked_table, mocked_stats):
         mocked_table.reset_mock()
         mocked_stats.reset_mock()
         # test call with process selected and no corresponding status
-        view.view_ctx.parameters[PROCESS] = 'dummy_proc'
-        view.write_contents(mocked_root)
+        self.view.view_ctx.parameters[PROCESS] = 'dummy_proc'
+        self.view.write_contents(mocked_root)
         self.assertEqual([call()], mocked_data.call_args_list)
         self.assertEqual([call(mocked_root, [{'namespec': 'dummy'}])], mocked_table.call_args_list)
-        self.assertEqual('', view.view_ctx.parameters[PROCESS])
+        self.assertEqual('', self.view.view_ctx.parameters[PROCESS])
         self.assertEqual([call(mocked_root, {})], mocked_stats.call_args_list)
         mocked_data.reset_mock()
         mocked_table.reset_mock()
         mocked_stats.reset_mock()
         # test call with process selected but belonging to another application
-        view.view_ctx.parameters[PROCESS] = 'dummy_proc'
-        view.view_ctx.get_process_status.return_value = Mock(application_name='dumb_appli')
-        view.write_contents(mocked_root)
+        self.view.view_ctx.parameters[PROCESS] = 'dummy_proc'
+        self.view.view_ctx.get_process_status.return_value = Mock(application_name='dumb_appli')
+        self.view.write_contents(mocked_root)
         self.assertEqual([call()], mocked_data.call_args_list)
         self.assertEqual([call(mocked_root, [{'namespec': 'dummy'}])], mocked_table.call_args_list)
-        self.assertEqual('', view.view_ctx.parameters[PROCESS])
+        self.assertEqual('', self.view.view_ctx.parameters[PROCESS])
         self.assertEqual([call(mocked_root, {})], mocked_stats.call_args_list)
         mocked_data.reset_mock()
         mocked_table.reset_mock()
         mocked_stats.reset_mock()
         # test call with process selected and belonging to the application but stopped
-        view.view_ctx.parameters[PROCESS] = 'dummy_proc'
-        view.view_ctx.get_process_status.return_value = Mock(application_name='dummy_appli',
-                                                             **{'stopped.return_value': True})
-        view.write_contents(mocked_root)
+        self.view.view_ctx.parameters[PROCESS] = 'dummy_proc'
+        self.view.view_ctx.get_process_status.return_value = Mock(application_name='dummy_appli',
+                                                                  **{'stopped.return_value': True})
+        self.view.write_contents(mocked_root)
         self.assertEqual([call()], mocked_data.call_args_list)
         self.assertEqual([call(mocked_root, [{'namespec': 'dummy_proc'}])], mocked_table.call_args_list)
-        self.assertEqual('', view.view_ctx.parameters[PROCESS])
+        self.assertEqual('', self.view.view_ctx.parameters[PROCESS])
         self.assertEqual([call(mocked_root, {})], mocked_stats.call_args_list)
         mocked_data.reset_mock()
         mocked_table.reset_mock()
         mocked_stats.reset_mock()
         # test call with process selected and belonging to the application and running
-        view.view_ctx.parameters[PROCESS] = 'dummy_proc'
-        view.view_ctx.get_process_status.return_value = Mock(application_name='dummy_appli',
-                                                             **{'stopped.return_value': False})
-        view.write_contents(mocked_root)
+        self.view.view_ctx.parameters[PROCESS] = 'dummy_proc'
+        self.view.view_ctx.get_process_status.return_value = Mock(application_name='dummy_appli',
+                                                                  **{'stopped.return_value': False})
+        self.view.write_contents(mocked_root)
         self.assertEqual([call()], mocked_data.call_args_list)
         self.assertEqual([call(mocked_root, [{'namespec': 'dummy_proc'}])], mocked_table.call_args_list)
-        self.assertEqual('dummy_proc', view.view_ctx.parameters[PROCESS])
+        self.assertEqual('dummy_proc', self.view.view_ctx.parameters[PROCESS])
         self.assertEqual([call(mocked_root, {'namespec': 'dummy_proc'})], mocked_stats.call_args_list)
 
     @patch('supvisors.viewhandler.ViewHandler.sort_processes_by_config',
            return_value=['process_2', 'process_1'])
     def test_get_process_data(self, mocked_sort):
         """ Test the get_process_data method. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
         # patch the selected application
         process_1 = Mock(application_name='appli_1',
                          process_name='process_1',
@@ -332,14 +318,14 @@ def test_get_process_data(self, mocked_sort):
                          rules=Mock(expected_loading=1),
                          **{'namespec.return_value': 'namespec_2',
                             'state_string.return_value': 'running'})
-        view.application = Mock(processes={process_1.process_name: process_1,
-                                           process_2.process_name: process_2})
+        self.view.application = Mock(processes={process_1.process_name: process_1,
+                                                process_2.process_name: process_2})
         # patch context
         mocked_stats = Mock()
-        view.view_ctx = Mock(**{'get_process_stats.return_value': (4, mocked_stats),
-                                'get_process_last_desc.return_value': ('10.0.0.1', 'something')})
+        self.view.view_ctx = Mock(**{'get_process_stats.return_value': (4, mocked_stats),
+                                     'get_process_last_desc.return_value': ('10.0.0.1', 'something')})
         # test call
-        self.assertEqual(view.get_process_data(), ['process_2', 'process_1'])
+        self.assertEqual(self.view.get_process_data(), ['process_2', 'process_1'])
         data1 = {'application_name': 'appli_1',
                  'process_name': 'process_1',
                  'namespec': 'namespec_1',
@@ -371,16 +357,14 @@ def test_get_process_data(self, mocked_sort):
 
     def test_write_process(self):
         """ Test the write_process method. """
-        from supvisors.viewapplication import ApplicationView
         from supvisors.webutils import PROC_ADDRESS_PAGE, TAIL_PAGE
-        view = ApplicationView(self.http_context)
         # create a process-like dict
         info = {'process_name': 'proc1',
                 'namespec': 'dummy_appli:dummy_proc',
                 'running_list': [],
                 'address': '10.0.0.2'}
         # patch the view context
-        view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
         # patch the meld elements
         name_mid = Mock()
         running_ul_mid = Mock()
@@ -389,30 +373,30 @@ def test_write_process(self):
         running_li_mid = Mock(**{'repeat.return_value': [(running_li_elt, '10.0.0.1')]})
         tr_elt = Mock(**{'findmeld.side_effect': [name_mid, running_ul_mid, name_mid, running_li_mid]})
         # test call with stopped process
-        view.write_process(tr_elt, info)
+        self.view.write_process(tr_elt, info)
         self.assertEqual([call('name_a_mid'), call('running_ul_mid')], tr_elt.findmeld.call_args_list)
         self.assertEqual([call('proc1')], name_mid.content.call_args_list)
         self.assertEqual([call(href='an url')], name_mid.attributes.call_args_list)
         self.assertEqual([call('10.0.0.2', TAIL_PAGE, processname=info['namespec'])],
-                         view.view_ctx.format_url.call_args_list)
+                         self.view.view_ctx.format_url.call_args_list)
         self.assertEqual([call('')], running_ul_mid.replace.call_args_list)
         self.assertEqual([], running_a_mid.attributes.call_args_list)
         self.assertEqual([], running_a_mid.content.call_args_list)
         # reset mock elements
         name_mid.reset_mock()
-        view.view_ctx.format_url.reset_mock()
+        self.view.view_ctx.format_url.reset_mock()
         running_ul_mid.replace.reset_mock()
         # test call with running process
         info['running_list'] = {'10.0.0.1'}
         info['address'] = '10.0.0.1'
-        view.write_process(tr_elt, info)
+        self.view.write_process(tr_elt, info)
         self.assertEqual([call('name_a_mid'), call('running_ul_mid'), call('name_a_mid'), call('running_li_mid')],
                          tr_elt.findmeld.call_args_list)
         self.assertEqual([call('proc1')], name_mid.content.call_args_list)
         self.assertEqual([call(href='an url')], name_mid.attributes.call_args_list)
         self.assertEqual([call('10.0.0.1', TAIL_PAGE, processname=info['namespec']),
                           call('10.0.0.1', PROC_ADDRESS_PAGE)],
-                         view.view_ctx.format_url.call_args_list)
+                         self.view.view_ctx.format_url.call_args_list)
         self.assertEqual([call(href='an url')], name_mid.attributes.call_args_list)
         self.assertEqual([call('proc1')], name_mid.content.call_args_list)
         self.assertEqual([], running_ul_mid.replace.call_args_list)
@@ -424,8 +408,6 @@ def test_write_process(self):
            side_effect=[True, False, False])
     def test_write_process_table(self, mocked_common, mocked_process):
         """ Test the write_process_table method. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
         # patch the meld elements
         table_mid = Mock()
         tr_elt_1 = Mock(attrib={'class': ''})
@@ -436,7 +418,7 @@ def test_write_process_table(self, mocked_common, mocked_process):
                                                  (tr_elt_3, 'info_3')]})
         mocked_root = Mock(**{'findmeld.side_effect': [table_mid, tr_mid]})
         # test call with no data
-        view.write_process_table(mocked_root, {})
+        self.view.write_process_table(mocked_root, {})
         self.assertEqual([call('No programs to manage')], table_mid.replace.call_args_list)
         self.assertEqual([], mocked_common.replace.call_args_list)
         self.assertEqual([], mocked_process.replace.call_args_list)
@@ -445,7 +427,7 @@ def test_write_process_table(self, mocked_common, mocked_process):
         self.assertEqual('', tr_elt_3.attrib['class'])
         table_mid.replace.reset_mock()
         # test call with data and line selected
-        view.write_process_table(mocked_root, True)
+        self.view.write_process_table(mocked_root, True)
         self.assertEqual([], table_mid.replace.call_args_list)
         self.assertEqual([call(tr_elt_1, 'info_1'), call(tr_elt_2, 'info_2'), call(tr_elt_3, 'info_3')],
                          mocked_common.call_args_list)
@@ -480,61 +462,53 @@ def test_make_callback(self, mocked_refresh, mocked_strategy,
                            mocked_stop_proc, mocked_restart_proc,
                            mocked_clear_proc, mocked_delayed):
         """ Test the make_callback method. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
         # patch view context
-        view.supvisors.starter.strategy = 'starter strategy'
-        view.view_ctx = Mock(**{'get_process_status.return_value': None})
+        self.view.supvisors.starter.strategy = 'starter strategy'
+        self.view.view_ctx = Mock(**{'get_process_status.return_value': None})
         # test calls for different actions
-        self.assertEqual('Refresh', view.make_callback('', 'refresh'))
-        self.assertEqual('Config', view.make_callback('', 'config'))
-        self.assertEqual('Most', view.make_callback('', 'most'))
-        self.assertEqual('Less', view.make_callback('', 'less'))
+        self.assertEqual('Refresh', self.view.make_callback('', 'refresh'))
+        self.assertEqual('Config', self.view.make_callback('', 'config'))
+        self.assertEqual('Most', self.view.make_callback('', 'most'))
+        self.assertEqual('Less', self.view.make_callback('', 'less'))
         self.assertEqual('Start application',
-                         view.make_callback('', 'startapp'))
+                         self.view.make_callback('', 'startapp'))
         self.assertEqual([call('starter strategy')],
                          mocked_start_app.call_args_list)
         self.assertEqual('Stop application',
-                         view.make_callback('', 'stopapp'))
+                         self.view.make_callback('', 'stopapp'))
         self.assertEqual([call()],
                          mocked_stop_app.call_args_list)
         self.assertEqual('Restart application',
-                         view.make_callback('', 'restartapp'))
+                         self.view.make_callback('', 'restartapp'))
         self.assertEqual([call('starter strategy')],
                          mocked_restart_app.call_args_list)
-        self.assertEqual('Delayed', view.make_callback('dummy', 'anything'))
+        self.assertEqual('Delayed', self.view.make_callback('dummy', 'anything'))
         # change view context for the remaining actions
-        view.view_ctx.get_process_status.return_value = 'None'
+        self.view.view_ctx.get_process_status.return_value = 'None'
         # test start process
-        self.assertEqual('Start process', view.make_callback('dummy', 'start'))
+        self.assertEqual('Start process', self.view.make_callback('dummy', 'start'))
         self.assertEqual([call('starter strategy', 'dummy')], mocked_start_proc.call_args_list)
         # test stop process
-        self.assertEqual('Stop process', view.make_callback('dummy', 'stop'))
+        self.assertEqual('Stop process', self.view.make_callback('dummy', 'stop'))
         self.assertEqual([call('dummy')], mocked_stop_proc.call_args_list)
         # test restart process
-        self.assertEqual('Restart process', view.make_callback('dummy', 'restart'))
+        self.assertEqual('Restart process', self.view.make_callback('dummy', 'restart'))
         self.assertEqual([call('starter strategy', 'dummy')], mocked_restart_proc.call_args_list)
         # test clear logs process
-        self.assertEqual('Clear process logs', view.make_callback('dummy', 'clearlog'))
+        self.assertEqual('Clear process logs', self.view.make_callback('dummy', 'clearlog'))
         self.assertEqual([call('dummy')], mocked_clear_proc.call_args_list)
 
     @patch('supvisors.viewapplication.delayed_info', return_value='Delayed')
     def test_refresh_action(self, mocked_delayed):
         """ Test the refresh_action method. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
-        # test call
-        self.assertEqual('Delayed', view.refresh_action())
+        self.assertEqual('Delayed', self.view.refresh_action())
         self.assertEqual([call('Page refreshed')],
                          mocked_delayed.call_args_list)
 
     @patch('supvisors.viewapplication.delayed_info', return_value='Delayed')
     def test_set_starting_strategy(self, mocked_delayed):
         """ Test the set_starting_strategy method. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
-        # test call
-        self.assertEqual('Delayed', view.set_starting_strategy(1))
+        self.assertEqual('Delayed', self.view.set_starting_strategy(1))
         self.assertEqual([call('Starting strategy set to LESS_LOADED')],
                          mocked_delayed.call_args_list)
 
@@ -545,7 +519,8 @@ class ViewApplicationActionTest(unittest.TestCase):
 
     def setUp(self):
         """ Create a common context and apply common patches. """
-        self.http_context = DummyHttpContext('ui/application.html')
+        from supvisors.viewapplication import ApplicationView
+        self.view = ApplicationView(DummyHttpContext('ui/application.html'))
         # add the common patches
         self.patches = [patch('supvisors.viewapplication.delayed_error',
                               return_value='Delay err'),
@@ -593,11 +568,9 @@ def test_restart_process_action(self):
 
     def check_start_action(self, rpc_name, action_name, *args):
         """ Test the method named action_name. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
         # get methods involved
-        rpc_call = getattr(view.info_source.supvisors_rpc_interface, rpc_name)
-        action = getattr(view, action_name)
+        rpc_call = getattr(self.view.info_source.supvisors_rpc_interface, rpc_name)
+        action = getattr(self.view, action_name)
         # test call with error on main RPC call
         rpc_call.side_effect = RPCError('failed RPC')
         self.assertEqual('Delay err', action('strategy', *args))
@@ -631,11 +604,9 @@ def check_start_action(self, rpc_name, action_name, *args):
 
     def check_stop_action(self, rpc_name, action_name, *args):
         """ Test the stop-like method named action_name. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
         # get methods involved
-        rpc_call = getattr(view.info_source.supvisors_rpc_interface, rpc_name)
-        action = getattr(view, action_name)
+        rpc_call = getattr(self.view.info_source.supvisors_rpc_interface, rpc_name)
+        action = getattr(self.view, action_name)
         # test call with error on main RPC call
         rpc_call.side_effect = RPCError('failed RPC')
         self.assertEqual('Delay err', action(*args))
@@ -664,16 +635,14 @@ def check_stop_action(self, rpc_name, action_name, *args):
 
     def test_clearlog_process_action(self):
         """ Test the clearlog_process_action method. """
-        from supvisors.viewapplication import ApplicationView
-        view = ApplicationView(self.http_context)
         # get rpc involved (mock)
-        rpc_call = view.info_source.supervisor_rpc_interface.clearProcessLogs
+        rpc_call = self.view.info_source.supervisor_rpc_interface.clearProcessLogs
         # test call with error on main RPC call
         rpc_call.side_effect = RPCError(777, 'failed RPC')
-        self.assertEqual('Delay err', view.clearlog_process_action('namespec'))
+        self.assertEqual('Delay err', self.view.clearlog_process_action('namespec'))
         # test call with direct result (application started)
         rpc_call.side_effect = None
-        self.assertEqual('Delay info', view.clearlog_process_action('namespec'))
+        self.assertEqual('Delay info', self.view.clearlog_process_action('namespec'))
 
 
 def test_suite():
diff --git a/supvisors/tests/test_viewhandler.py b/supvisors/tests/test_viewhandler.py
index ce62a234..5f97a1e5 100644
--- a/supvisors/tests/test_viewhandler.py
+++ b/supvisors/tests/test_viewhandler.py
@@ -61,7 +61,7 @@ def test_init(self):
     @patch('supvisors.viewhandler.MeldView.__call__',
            side_effect=(NOT_DONE_YET, {'body': u'html_body'}))
     def test_call(self, mocked_call):
-        """ Test the values set at construction. """
+        """ Test the call method. """
         from supvisors.viewhandler import ViewHandler
         handler = ViewHandler(self.http_context)
         # first call to MeldView returns NOT_DONE_YET
@@ -782,11 +782,13 @@ def test_test_matplotlib_import(self):
         # test correct behaviour depending on environment
         try:
             import matplotlib
-            matplotlib.__name__
         except ImportError:
             self.assertFalse(test_matplotlib_import())
         else:
             self.assertTrue(test_matplotlib_import())
+            # force import error
+            with patch('matplotlib.get_backend', side_effect=ImportError):
+                self.assertFalse(test_matplotlib_import())
 
     def test_write_process_plots_no_plot(self):
         """ Test the write_process_plots method in the event of matplotlib import error. """
@@ -960,24 +962,15 @@ def create_mock(proc_name):
                                   create_mock('yeux_01')])]
         # test ordering
         self.assertEqual(handler.sort_processes_by_config(processes),
-                         [{'application_name': 'crash',
-                           'process_name': 'segv'},
-                          {'application_name': 'crash',
-                           'process_name': 'late_segv'},
-                          {'application_name': 'firefox',
-                           'process_name': 'firefox'},
-                          {'application_name': 'sample_test_1',
-                           'process_name': 'xclock'},
-                          {'application_name': 'sample_test_1',
-                           'process_name': 'xlogo'},
-                          {'application_name': 'sample_test_1',
-                           'process_name': 'xfontsel'},
-                          {'application_name': 'sample_test_2',
-                           'process_name': 'yeux_00'},
-                          {'application_name': 'sample_test_2',
-                           'process_name': 'yeux_01'},
-                          {'application_name': 'sample_test_2',
-                           'process_name': 'sleep'}])
+                         [{'application_name': 'crash', 'process_name': 'segv'},
+                          {'application_name': 'crash', 'process_name': 'late_segv'},
+                          {'application_name': 'firefox', 'process_name': 'firefox'},
+                          {'application_name': 'sample_test_1', 'process_name': 'xclock'},
+                          {'application_name': 'sample_test_1', 'process_name': 'xlogo'},
+                          {'application_name': 'sample_test_1', 'process_name': 'xfontsel'},
+                          {'application_name': 'sample_test_2', 'process_name': 'yeux_00'},
+                          {'application_name': 'sample_test_2', 'process_name': 'yeux_01'},
+                          {'application_name': 'sample_test_2', 'process_name': 'sleep'}])
 
 
 def test_suite():
diff --git a/supvisors/tests/test_viewhostaddress.py b/supvisors/tests/test_viewhostaddress.py
new file mode 100644
index 00000000..553a3df9
--- /dev/null
+++ b/supvisors/tests/test_viewhostaddress.py
@@ -0,0 +1,340 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# ======================================================================
+# Copyright 2020 Julien LE CLEACH
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ======================================================================
+
+import sys
+import unittest
+
+from unittest.mock import call, patch, Mock
+
+from supvisors.tests.base import DummyHttpContext
+
+
+class ViewHostAddressTest(unittest.TestCase):
+    """ Test case for the viewhostaddress module. """
+
+    def setUp(self):
+        """ Create a logger that stores log traces. """
+        # apply the forced inheritance done in supvisors.plugin
+        from supvisors.viewhandler import ViewHandler
+        from supervisor.web import StatusView
+        StatusView.__bases__ = (ViewHandler,)
+        # create the instance to be tested
+        from supvisors.viewhostaddress import HostAddressView
+        self.view = HostAddressView(DummyHttpContext('ui/hostaddress.html'))
+
+    def test_init(self):
+        """ Test the values set at construction. """
+        from supvisors.webutils import HOST_ADDRESS_PAGE
+        self.assertEqual(HOST_ADDRESS_PAGE, self.view.page_name)
+
+    @patch('supvisors.viewhostaddress.HostAddressView._write_io_image')
+    @patch('supvisors.viewhostaddress.HostAddressView._write_mem_image')
+    @patch('supvisors.viewhostaddress.HostAddressView._write_cpu_image')
+    @patch('supvisors.viewhostaddress.HostAddressView.write_network_statistics')
+    @patch('supvisors.viewhostaddress.HostAddressView.write_memory_statistics')
+    @patch('supvisors.viewhostaddress.HostAddressView.write_processor_statistics')
+    def test_write_contents(self, mocked_processor, mocked_memory, mocked_network,
+                            mocked_cpu, mocked_mem, mocked_io):
+        """ Test the write_contents method. """
+        from supvisors import viewhostaddress
+        # set context (meant to be set through render)
+        dummy_stats = Mock(cpu='cpu', mem='mem', io='io')
+        self.view.view_ctx = Mock(**{'get_address_stats.return_value': dummy_stats})        # replace root structure
+        mocked_root = Mock()
+        # in first test, HAS_PLOT is False
+        viewhostaddress.HAS_PLOT = False
+        self.view.write_contents(mocked_root)
+        self.assertEqual([call(mocked_root, 'cpu')], mocked_processor.call_args_list)
+        self.assertEqual([call(mocked_root, 'mem')], mocked_memory.call_args_list)
+        self.assertEqual([call(mocked_root, 'io')], mocked_network.call_args_list)
+        self.assertFalse(mocked_cpu.called)
+        self.assertFalse(mocked_mem.called)
+        self.assertFalse(mocked_io.called)
+        # reset mocks
+        mocked_processor.reset_mock()
+        mocked_memory.reset_mock()
+        mocked_network.reset_mock()
+        # in second test, HAS_PLOT is True
+        viewhostaddress.HAS_PLOT = True
+        self.view.write_contents(mocked_root)
+        self.assertEqual([call(mocked_root, 'cpu')], mocked_processor.call_args_list)
+        self.assertEqual([call(mocked_root, 'mem')], mocked_memory.call_args_list)
+        self.assertEqual([call(mocked_root, 'io')], mocked_network.call_args_list)
+        self.assertEqual([call('cpu')], mocked_cpu.call_args_list)
+        self.assertEqual([call('mem')], mocked_mem.call_args_list)
+        self.assertEqual([call('io')], mocked_io.call_args_list)
+
+    def test_write_processor_single_title(self):
+        """ Test the _write_processor_single_title method. """
+        # set context (meant to be set through render)
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'http://addr:port/index.html',
+                                     'cpu_id_to_string.return_value': '1'})        # replace root structure
+        mocked_title_mid = Mock(attrib={})
+        mocked_tr = Mock(**{'findmeld.return_value': mocked_title_mid})
+        # in first call, elt is not the selected element
+        self.view._write_processor_single_title(mocked_tr, 1, 0)
+        self.assertEqual([call('cpunum_a_mid')], mocked_tr.findmeld.call_args_list)
+        self.assertDictEqual({}, mocked_title_mid.attrib)
+        self.assertEqual([call(href='http://addr:port/index.html')], mocked_title_mid.attributes.call_args_list)
+        self.assertEqual([call('cpu#1')], mocked_title_mid.content.call_args_list)
+        mocked_tr.findmeld.reset_mock()
+        mocked_title_mid.attributes.reset_mock()
+        # in first call, elt is the selected element
+        self.view._write_processor_single_title(mocked_tr, 1, 1)
+        self.assertEqual([call('cpunum_a_mid')], mocked_tr.findmeld.call_args_list)
+        self.assertDictEqual({'class': 'button off active'}, mocked_title_mid.attrib)
+        self.assertFalse(mocked_title_mid.attributes.called)
+        self.assertEqual([call('cpu#1')], mocked_title_mid.content.call_args_list)
+
+    @patch('supvisors.viewhostaddress.HostAddressView._write_common_statistics')
+    def test_write_processor_single_statistics(self, mocked_common):
+        """ Test the _write_processor_single_statistics method. """
+        # replace root element
+        mocked_root = Mock()
+        # test method call
+        self.view._write_processor_single_statistics(mocked_root, [1.523, 2.456])
+        self.assertEqual([call(mocked_root, [1.523, 2.456], 'cpuval_td_mid', 'cpuavg_td_mid',
+                               'cpuslope_td_mid', 'cpudev_td_mid')],
+                         mocked_common.call_args_list)
+
+    @patch('supvisors.viewhostaddress.HostAddressView._write_processor_single_statistics')
+    @patch('supvisors.viewhostaddress.HostAddressView._write_processor_single_title')
+    def test_write_processor_statistics(self, mocked_title, mocked_stats):
+        """ Test the write_processor_statistics method. """
+        from supvisors.viewcontext import CPU
+        # set context (meant to be set through render)
+        self.view.view_ctx = Mock(parameters={CPU: 1})
+        # build root structure
+        mocked_trs = [Mock(attrib={}) for _ in range(2)]
+        mocked_mid = Mock(**{'repeat.return_value': [(mocked_trs[0], 'cpu stats 0'),
+                                                     (mocked_trs[1], 'cpu stats 1')]})
+        mocked_root = Mock(**{'findmeld.return_value': mocked_mid})
+        # test call
+        self.view.write_processor_statistics(mocked_root, [])
+        self.assertEqual([call(mocked_trs[0], 1, 0), call(mocked_trs[1], 1, 1)],
+                         mocked_title.call_args_list)
+        self.assertEqual([call(mocked_trs[0], 'cpu stats 0'), call(mocked_trs[1], 'cpu stats 1')],
+                         mocked_stats.call_args_list)
+        self.assertDictEqual({'class': 'brightened'}, mocked_trs[0].attrib)
+        self.assertDictEqual({'class': 'shaded'}, mocked_trs[1].attrib)
+
+    @patch('supvisors.viewhostaddress.HostAddressView._write_common_statistics')
+    def test_write_memory_statistics(self, mocked_common):
+        """ Test the write_memory_statistics method. """
+        # replace root element
+        mocked_root = Mock()
+        # test method call
+        self.view.write_memory_statistics(mocked_root, [1.523, 2.456])
+        self.assertEqual([call(mocked_root, [1.523, 2.456], 'memval_td_mid', 'memavg_td_mid',
+                               'memslope_td_mid', 'memdev_td_mid')],
+                         mocked_common.call_args_list)
+
+    def test_write_network_single_title(self):
+        """ Test the _write_network_single_title method. """
+        # set context (meant to be set through render)
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'http://addr:port/index.html'})
+        # replace root structure
+        mocked_href_mid = Mock(attrib={})
+        mocked_title_mid = Mock(attrib={}, **{'findmeld.return_value': mocked_href_mid})
+        mocked_tr = Mock(**{'findmeld.return_value': mocked_title_mid})
+        # in first call, elt is not the first line (rowspan False)
+        self.view._write_network_single_title(mocked_tr, 'eth0', 'lo', False, True)
+        self.assertEqual([call('intf_td_mid')], mocked_tr.findmeld.call_args_list)
+        self.assertDictEqual({}, mocked_title_mid.attrib)
+        self.assertFalse(mocked_title_mid.findmeld.called)
+        self.assertDictEqual({}, mocked_href_mid.attrib)
+        self.assertEqual([call('')], mocked_title_mid.replace.call_args_list)
+        mocked_tr.findmeld.reset_mock()
+        mocked_title_mid.replace.reset_mock()
+        # in second call, elt is the first line (rowspan True), shaded and is not the selected interface
+        self.view._write_network_single_title(mocked_tr, 'eth0', 'lo', True, True)
+        self.assertEqual([call('intf_td_mid')], mocked_tr.findmeld.call_args_list)
+        self.assertDictEqual({'class': 'shaded', 'rowspan': '2'}, mocked_title_mid.attrib)
+        self.assertEqual([call('intf_a_mid')], mocked_title_mid.findmeld.call_args_list)
+        self.assertDictEqual({}, mocked_href_mid.attrib)
+        self.assertEqual([call(href='http://addr:port/index.html')], mocked_href_mid.attributes.call_args_list)
+        self.assertFalse(mocked_title_mid.replace.called)
+        mocked_tr.findmeld.reset_mock()
+        mocked_title_mid.findmeld.reset_mock()
+        mocked_href_mid.attributes.reset_mock()
+        # in third call, elt is the first line (rowspan True), not shaded and is the selected interface
+        self.view._write_network_single_title(mocked_tr, 'lo', 'lo', True, False)
+        self.assertEqual([call('intf_td_mid')], mocked_tr.findmeld.call_args_list)
+        self.assertDictEqual({'class': 'brightened', 'rowspan': '2'}, mocked_title_mid.attrib)
+        self.assertEqual([call('intf_a_mid')], mocked_title_mid.findmeld.call_args_list)
+        self.assertDictEqual({'class': 'button off active'}, mocked_href_mid.attrib)
+        self.assertFalse(mocked_href_mid.attributes.called)
+        self.assertFalse(mocked_title_mid.replace.called)
+
+    @patch('supvisors.viewhostaddress.HostAddressView._write_common_statistics')
+    def test_write_network_single_statistics(self, mocked_common):
+        """ Test the _write_network_single_statistics method. """
+        # replace root structure
+        mocked_title_mid = Mock()
+        mocked_tr = Mock(**{'findmeld.return_value': mocked_title_mid})
+        # in first call, test no rate, slope and standard deviation
+        self.view._write_network_single_statistics(mocked_tr, [1.523, 2.456], False)
+        self.assertEqual([call('intfrxtx_td_mid')], mocked_tr.findmeld.call_args_list)
+        self.assertEqual([call('Tx')], mocked_title_mid.content.call_args_list)
+        self.assertEqual([call(mocked_tr, [1.523, 2.456], 'intfval_td_mid', 'intfavg_td_mid',
+                               'intfslope_td_mid', 'intfdev_td_mid')],
+                         mocked_common.call_args_list)
+        mocked_tr.reset_mock()
+        mocked_title_mid.content.reset_mock()
+        mocked_common.reset_mock()
+        # in second call, test no rate, slope and standard deviation
+        self.view._write_network_single_statistics(mocked_tr, [1.523, 2.456], True)
+        self.assertEqual([call('intfrxtx_td_mid')], mocked_tr.findmeld.call_args_list)
+        self.assertEqual([call('Rx')], mocked_title_mid.content.call_args_list)
+        self.assertEqual([call(mocked_tr, [1.523, 2.456], 'intfval_td_mid', 'intfavg_td_mid',
+                               'intfslope_td_mid', 'intfdev_td_mid')],
+                         mocked_common.call_args_list)
+
+    @patch('supvisors.viewhostaddress.HostAddressView._write_network_single_statistics')
+    @patch('supvisors.viewhostaddress.HostAddressView._write_network_single_title')
+    def test_write_network_statistics(self, mocked_title, mocked_stats):
+        """ Test the write_network_statistics method. """
+        from supvisors.viewcontext import INTF
+        # set context (meant to be set through render)
+        self.view.view_ctx = Mock(parameters={INTF: 'eth0'})
+        # build root structure
+        mocked_trs = [Mock(attrib={}) for _ in range(4)]
+        mocked_mid = Mock(**{'repeat.return_value': [(mocked_trs[0], ('lo', 'lo recv')),
+                                                     (mocked_trs[1], ('lo', 'lo sent')),
+                                                     (mocked_trs[2], ('eth0', 'eth0 recv')),
+                                                     (mocked_trs[3], ('eth0', 'eth0 sent'))]})
+        mocked_root = Mock(**{'findmeld.return_value': mocked_mid})
+        # test method with dummy stats
+        dummy_stats = {'lo': ['lo recv', 'lo sent'], 'eth0': ['eth0 recv', 'eth0 sent']}
+        self.view.write_network_statistics(mocked_root, dummy_stats)
+        # check calls
+        self.assertEqual([call('intf_tr_mid')], mocked_root.findmeld.call_args_list)
+        self.assertEqual([call([('lo', 'lo recv'), ('lo', 'lo sent'),
+                                ('eth0', 'eth0 recv'), ('eth0', 'eth0 sent')])],
+                         mocked_mid.repeat.call_args_list)
+        self.assertEqual('brightened', mocked_trs[0].attrib['class'])
+        self.assertEqual('brightened', mocked_trs[1].attrib['class'])
+        self.assertEqual('shaded', mocked_trs[2].attrib['class'])
+        self.assertEqual('shaded', mocked_trs[3].attrib['class'])
+        self.assertEqual([call(mocked_trs[0], 'eth0', 'lo', True, False),
+                          call(mocked_trs[1], 'eth0', 'lo', False, False),
+                          call(mocked_trs[2], 'eth0', 'eth0', True, True),
+                          call(mocked_trs[3], 'eth0', 'eth0', False, True)],
+                         mocked_title.call_args_list)
+        self.assertEqual([call(mocked_trs[0], 'lo recv', True),
+                          call(mocked_trs[1], 'lo sent', False),
+                          call(mocked_trs[2], 'eth0 recv', True),
+                          call(mocked_trs[3], 'eth0 sent', False)],
+                         mocked_stats.call_args_list)
+
+    @patch('supvisors.viewhostaddress.get_stats', side_effect=[(10.231, None, (None, 2), None),
+                                                               (8.999, 2, (-1.1, 4), 5.72)])
+    @patch('supvisors.viewhostaddress.HostAddressView.set_slope_class')
+    def test_write_common_statistics(self, mocked_class, mocked_stats):
+        """ Test the _write_common_statistics method. """
+        # replace root structure
+        mocked_val_mid = Mock()
+        mocked_avg_mid = Mock()
+        mocked_slope_mid = Mock()
+        mocked_dev_mid = Mock()
+        mocked_tr = Mock(**{'findmeld.side_effect': [mocked_val_mid, mocked_avg_mid,
+                                                     mocked_val_mid, mocked_avg_mid,
+                                                     mocked_slope_mid, mocked_dev_mid]})
+        # in first call, test empty stats
+        self.view._write_common_statistics(mocked_tr, [], 'val_mid', 'avg_mid', 'slope_mid', 'dev_mid')
+        self.assertFalse(mocked_tr.findmeld.called)
+        self.assertFalse(mocked_stats.called)
+        self.assertFalse(mocked_class.called)
+        self.assertFalse(mocked_val_mid.called)
+        self.assertFalse(mocked_avg_mid.called)
+        self.assertFalse(mocked_slope_mid.called)
+        self.assertFalse(mocked_dev_mid.called)
+        # in second call, test no rate, slope and standard deviation
+        self.view._write_common_statistics(mocked_tr, [1.523, 2.456], 'val_mid', 'avg_mid', 'slope_mid', 'dev_mid')
+        self.assertEqual([call('val_mid'), call('avg_mid')], mocked_tr.findmeld.call_args_list)
+        self.assertEqual([call([1.523, 2.456])], mocked_stats.call_args_list)
+        self.assertFalse(mocked_class.called)
+        self.assertEqual([call('2.46')], mocked_val_mid.content.call_args_list)
+        self.assertEqual([call('10.23')], mocked_avg_mid.content.call_args_list)
+        self.assertFalse(mocked_slope_mid.called)
+        self.assertFalse(mocked_dev_mid.called)
+        mocked_stats.reset_mock()
+        mocked_val_mid.content.reset_mock()
+        mocked_avg_mid.content.reset_mock()
+        # in third call, test no rate, slope and standard deviation
+        self.view._write_common_statistics(mocked_tr, [1.523, 2.456], 'val_mid', 'avg_mid', 'slope_mid', 'dev_mid')
+        self.assertEqual([call([1.523, 2.456])], mocked_stats.call_args_list)
+        self.assertEqual([call(mocked_val_mid, 2)], mocked_class.call_args_list)
+        self.assertEqual([call('val_mid'), call('avg_mid'),
+                          call('val_mid'), call('avg_mid'), call('slope_mid'), call('dev_mid')],
+                         mocked_tr.findmeld.call_args_list)
+        self.assertEqual([call('2.46')], mocked_val_mid.content.call_args_list)
+        self.assertEqual([call('9.00')], mocked_avg_mid.content.call_args_list)
+        self.assertEqual([call('-1.10')], mocked_slope_mid.content.call_args_list)
+        self.assertEqual([call('5.72')], mocked_dev_mid.content.call_args_list)
+
+    @patch('supvisors.plot.StatisticsPlot.export_image')
+    @patch('supvisors.plot.StatisticsPlot.add_plot')
+    def test_write_cpu_image(self, mocked_add, mocked_export):
+        """ Test the _write_cpu_image method. """
+        from supvisors.viewcontext import ViewContext, CPU
+        from supvisors.viewimage import address_cpu_img
+        # set context (meant to be set through render)
+        self.view.view_ctx = Mock(parameters={CPU: 0},
+                             **{'cpu_id_to_string.return_value': ViewContext.cpu_id_to_string(0)})
+        # just test calls to StatisticsPlot
+        dummy_stats = ['#all stats', '#0 stats', '#1 stats']
+        self.view._write_cpu_image(dummy_stats)
+        self.assertEqual([call('CPU #all', '%', '#all stats')], mocked_add.call_args_list)
+        self.assertEqual([call(address_cpu_img)], mocked_export.call_args_list)
+
+    @patch('supvisors.plot.StatisticsPlot.export_image')
+    @patch('supvisors.plot.StatisticsPlot.add_plot')
+    def test_write_mem_image(self, mocked_add, mocked_export):
+        """ Test the _write_mem_image method. """
+        from supvisors.viewimage import address_mem_img
+        # just test calls to StatisticsPlot
+        dummy_stats = ['mem 1', 'mem 2']
+        self.view._write_mem_image(dummy_stats)
+        self.assertEqual([call('MEM', '%', dummy_stats)], mocked_add.call_args_list)
+        self.assertEqual([call(address_mem_img)], mocked_export.call_args_list)
+
+    @patch('supvisors.plot.StatisticsPlot.export_image')
+    @patch('supvisors.plot.StatisticsPlot.add_plot')
+    def test_write_io_image(self, mocked_add, mocked_export):
+        """ Test the _write_io_image method. """
+        from supvisors.viewcontext import INTF
+        from supvisors.viewimage import address_io_img
+        # set context (meant to be set through render)
+        self.view.view_ctx = Mock(parameters={INTF: 'eth0'})
+        # just test calls to StatisticsPlot
+        dummy_stats = {'lo': ['lo recv', 'lo sent'], 'eth0': ['eth0 recv', 'eth0 sent']}
+        self.view._write_io_image(dummy_stats)
+        self.assertEqual([call('eth0 recv', 'kbits/s', 'eth0 recv'),
+                          call('eth0 sent', 'kbits/s', 'eth0 sent')],
+                         mocked_add.call_args_list)
+        self.assertEqual([call(address_io_img)], mocked_export.call_args_list)
+
+
+def test_suite():
+    return unittest.findTestCases(sys.modules[__name__])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
diff --git a/supvisors/tests/test_viewprocaddress.py b/supvisors/tests/test_viewprocaddress.py
new file mode 100644
index 00000000..7d95710c
--- /dev/null
+++ b/supvisors/tests/test_viewprocaddress.py
@@ -0,0 +1,216 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# ======================================================================
+# Copyright 2020 Julien LE CLEACH
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ======================================================================
+
+import sys
+import unittest
+
+from supervisor.web import MeldView, StatusView
+from supervisor.xmlrpc import RPCError
+
+from unittest.mock import call, patch, Mock
+
+from supvisors.tests.base import ProcessInfoDatabase
+
+
+class ViewProcAddressTest(unittest.TestCase):
+    """ Test case for the viewprocaddress module. """
+
+    def setUp(self):
+        """ Create a logger that stores log traces. """
+        # apply the forced inheritance done in supvisors.plugin
+        from supvisors.tests.base import DummyHttpContext
+        from supvisors.viewhandler import ViewHandler
+        from supervisor.web import StatusView
+        StatusView.__bases__ = (ViewHandler,)
+        # create the instance to be tested
+        from supvisors.viewprocaddress import ProcAddressView
+        self.view = ProcAddressView(DummyHttpContext('ui/procaddress.html'))
+
+    def test_init(self):
+        """ Test the values set at construction. """
+        # test instance inheritance
+        from supvisors.viewhandler import ViewHandler
+        from supvisors.viewsupstatus import SupvisorsAddressView
+        from supvisors.webutils import PROC_ADDRESS_PAGE
+        for klass in [SupvisorsAddressView, StatusView, ViewHandler, MeldView]:
+            self.assertIsInstance(self.view, klass)
+        # test default page name
+        self.assertEqual(PROC_ADDRESS_PAGE, self.view.page_name)
+
+    @patch('supvisors.viewhandler.ViewHandler.write_process_statistics')
+    @patch('supvisors.viewprocaddress.ProcAddressView.write_process_table')
+    @patch('supvisors.viewprocaddress.ProcAddressView.get_process_data',
+           side_effect=([{'namespec': 'dummy'}], [{'namespec': 'dummy'}],
+                        [{'namespec': 'dummy_proc'}], [{'namespec': 'dummy_proc'}]))
+    def test_write_contents(self, mocked_data, mocked_table, mocked_stats):
+        """ Test the write_contents method. """
+        from supvisors.viewcontext import PROCESS
+        # patch context
+        self.view.view_ctx = Mock(parameters={PROCESS: None}, local_address='10.0.0.1',
+                                  **{'get_process_status.return_value': None})
+        # patch the meld elements
+        mocked_root = Mock()
+        # test call with no process selected
+        self.view.write_contents(mocked_root)
+        self.assertEqual([call()], mocked_data.call_args_list)
+        self.assertEqual([call(mocked_root, [{'namespec': 'dummy'}])], mocked_table.call_args_list)
+        self.assertEqual([call(mocked_root, {})], mocked_stats.call_args_list)
+        mocked_data.reset_mock()
+        mocked_table.reset_mock()
+        mocked_stats.reset_mock()
+        # test call with process selected and no corresponding status
+        self.view.view_ctx.parameters[PROCESS] = 'dummy_proc'
+        self.view.write_contents(mocked_root)
+        self.assertEqual([call()], mocked_data.call_args_list)
+        self.assertEqual([call(mocked_root, [{'namespec': 'dummy'}])], mocked_table.call_args_list)
+        self.assertEqual('', self.view.view_ctx.parameters[PROCESS])
+        self.assertEqual([call(mocked_root, {})], mocked_stats.call_args_list)
+        mocked_data.reset_mock()
+        mocked_table.reset_mock()
+        mocked_stats.reset_mock()
+        # test call with process selected but not running on considered address
+        self.view.view_ctx.parameters[PROCESS] = 'dummy_proc'
+        self.view.view_ctx.get_process_status.return_value = Mock(addresses={'10.0.0.2'})
+        self.view.write_contents(mocked_root)
+        self.assertEqual([call()], mocked_data.call_args_list)
+        self.assertEqual([call(mocked_root, [{'namespec': 'dummy_proc'}])], mocked_table.call_args_list)
+        self.assertEqual('', self.view.view_ctx.parameters[PROCESS])
+        self.assertEqual([call(mocked_root, {})], mocked_stats.call_args_list)
+        mocked_data.reset_mock()
+        mocked_table.reset_mock()
+        mocked_stats.reset_mock()
+        # test call with process selected and running
+        self.view.view_ctx.parameters[PROCESS] = 'dummy_proc'
+        self.view.view_ctx.get_process_status.return_value = Mock(addresses={'10.0.0.1'})
+        self.view.write_contents(mocked_root)
+        self.assertEqual([call()], mocked_data.call_args_list)
+        self.assertEqual([call(mocked_root, [{'namespec': 'dummy_proc'}])], mocked_table.call_args_list)
+        self.assertEqual('dummy_proc', self.view.view_ctx.parameters[PROCESS])
+        self.assertEqual([call(mocked_root, {'namespec': 'dummy_proc'})], mocked_stats.call_args_list)
+
+    @patch('supvisors.viewhandler.ViewHandler.sort_processes_by_config',
+           return_value=['process_2', 'process_1'])
+    def test_get_process_data(self, mocked_sort):
+        """ Test the get_process_data method. """
+        # patch context
+        process_status = Mock(rules=Mock(expected_loading=17))
+        self.view.view_ctx = Mock(local_address='10.0.0.1',
+                                  **{'get_process_status.side_effect': [None, process_status],
+                                     'get_process_stats.side_effect': [(2, 'stats #1'), (8, 'stats #2')]})
+        # test RPC Error
+        with patch.object(self.view.info_source.supervisor_rpc_interface, 'getAllProcessInfo',
+                          side_effect=RPCError('failed RPC')):
+            self.assertEqual([], self.view.get_process_data())
+
+        # test using base process info
+        def process_info_by_name(name):
+            return next((info.copy() for info in ProcessInfoDatabase
+                         if info['name'] == name), {})
+
+        with patch.object(self.view.info_source.supervisor_rpc_interface, 'getAllProcessInfo',
+                          return_value=[process_info_by_name('xfontsel'),
+                                        process_info_by_name('segv')]):
+            self.assertEqual(['process_2', 'process_1'], self.view.get_process_data())
+            # test intermediate list
+            data1 = {'application_name': 'sample_test_1',
+                     'process_name': 'xfontsel',
+                     'namespec': 'sample_test_1:xfontsel',
+                     'address': '10.0.0.1',
+                     'statename': 'RUNNING',
+                     'statecode': 20,
+                     'description': 'pid 80879, uptime 0:01:19',
+                     'loading': '?',
+                     'nb_cores': 2,
+                     'proc_stats': 'stats #1'}
+            data2 = {'application_name': 'crash',
+                     'process_name': 'segv',
+                     'namespec': 'crash:segv',
+                     'address': '10.0.0.1',
+                     'statename': 'BACKOFF',
+                     'statecode': 30,
+                     'description': 'Exited too quickly (process log may have details)',
+                     'loading': 17,
+                     'nb_cores': 8,
+                     'proc_stats': 'stats #2'}
+            self.assertEqual(1, mocked_sort.call_count)
+            self.assertEqual(2, len(mocked_sort.call_args_list[0]))
+            # access to internal call data
+            call_data = mocked_sort.call_args_list[0][0][0]
+            self.assertDictEqual(data1, call_data[0])
+            self.assertDictEqual(data2, call_data[1])
+
+    @patch('supvisors.viewprocaddress.ProcAddressView.write_process')
+    @patch('supvisors.viewhandler.ViewHandler.write_common_process_status',
+           side_effect=[True, False, False])
+    def test_write_process_table(self, mocked_common, mocked_process):
+        """ Test the write_process_table method. """
+        # patch the meld elements
+        table_mid = Mock()
+        tr_elt_1 = Mock(attrib={'class': ''})
+        tr_elt_2 = Mock(attrib={'class': ''})
+        tr_elt_3 = Mock(attrib={'class': ''})
+        tr_mid = Mock(**{'repeat.return_value': [(tr_elt_1, 'info_1'),
+                                                 (tr_elt_2, 'info_2'),
+                                                 (tr_elt_3, 'info_3')]})
+        mocked_root = Mock(**{'findmeld.side_effect': [table_mid, tr_mid]})
+        # test call with no data
+        self.view.write_process_table(mocked_root, {})
+        self.assertEqual([call('No programs to manage')], table_mid.replace.call_args_list)
+        self.assertEqual([], mocked_common.replace.call_args_list)
+        self.assertEqual([], mocked_process.replace.call_args_list)
+        self.assertEqual('', tr_elt_1.attrib['class'])
+        self.assertEqual('', tr_elt_2.attrib['class'])
+        self.assertEqual('', tr_elt_3.attrib['class'])
+        table_mid.replace.reset_mock()
+        # test call with data and line selected
+        self.view.write_process_table(mocked_root, True)
+        self.assertEqual([], table_mid.replace.call_args_list)
+        self.assertEqual([call(tr_elt_1, 'info_1'), call(tr_elt_2, 'info_2'), call(tr_elt_3, 'info_3')],
+                         mocked_common.call_args_list)
+        self.assertEqual([call(tr_elt_1, 'info_1'), call(tr_elt_2, 'info_2'), call(tr_elt_3, 'info_3')],
+                         mocked_process.call_args_list)
+        self.assertEqual('brightened', tr_elt_1.attrib['class'])
+        self.assertEqual('shaded', tr_elt_2.attrib['class'])
+        self.assertEqual('brightened', tr_elt_3.attrib['class'])
+
+    def test_write_process(self):
+        """ Test the write_process method. """
+        from supvisors.webutils import PROC_ADDRESS_PAGE, TAIL_PAGE
+        # create a process-like dict
+        info = {'namespec': 'dummy_appli:dummy_proc'}
+        # patch the view context
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
+        # patch the meld elements
+        name_mid = Mock()
+        tr_elt = Mock(**{'findmeld.return_value': name_mid})
+        # test call with stopped process
+        self.view.write_process(tr_elt, info)
+        self.assertEqual([call('name_a_mid')], tr_elt.findmeld.call_args_list)
+        self.assertEqual([call('dummy_appli:dummy_proc')], name_mid.content.call_args_list)
+        self.assertEqual([call(href='an url')], name_mid.attributes.call_args_list)
+        self.assertEqual([call('127.0.0.1', TAIL_PAGE, processname=info['namespec'])],
+                         self.view.view_ctx.format_url.call_args_list)
+
+
+def test_suite():
+    return unittest.findTestCases(sys.modules[__name__])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
diff --git a/supvisors/tests/test_viewsupstatus.py b/supvisors/tests/test_viewsupstatus.py
new file mode 100644
index 00000000..212e5db5
--- /dev/null
+++ b/supvisors/tests/test_viewsupstatus.py
@@ -0,0 +1,181 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# ======================================================================
+# Copyright 2020 Julien LE CLEACH
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ======================================================================
+
+import sys
+import unittest
+
+from supervisor.web import MeldView, StatusView
+from unittest.mock import call, patch, Mock
+
+
+class ViewSupvisorsStatusTest(unittest.TestCase):
+    """ Test case for the viewsupstatus module. """
+
+    def setUp(self):
+        """ Create the instance to be tested. """
+        # apply the forced inheritance done in supvisors.plugin
+        from supvisors.viewhandler import ViewHandler
+        StatusView.__bases__ = (ViewHandler,)
+        # create the instance to be tested
+        from supvisors.tests.base import DummyHttpContext
+        from supvisors.viewsupstatus import SupvisorsAddressView
+        from supvisors.webutils import HOST_ADDRESS_PAGE
+        self.view = SupvisorsAddressView(DummyHttpContext('ui/hostaddress.html'), HOST_ADDRESS_PAGE)
+
+    def test_init(self):
+        """ Test the values set at construction. """
+        # test instance inheritance
+        from supvisors.viewhandler import ViewHandler
+        for klass in [StatusView, ViewHandler, MeldView]:
+            self.assertIsInstance(self.view, klass)
+        # test parameter page name
+        from supvisors.webutils import HOST_ADDRESS_PAGE
+        self.assertEqual(HOST_ADDRESS_PAGE, self.view.page_name)
+
+    def test_render(self):
+        """ Test the render method. """
+        with patch('supvisors.viewhandler.ViewHandler.render', return_value='default') as mocked_render:
+            self.assertEqual('default', self.view.render())
+            self.assertEqual([call(self.view)], mocked_render.call_args_list)
+
+    def test_write_navigation(self):
+        """ Test the write_navigation method. """
+        with patch.object(self.view, 'write_nav') as mocked_nav:
+            mocked_root = Mock()
+            self.view.write_navigation(mocked_root)
+            self.assertEqual([call(mocked_root, address='127.0.0.1')], mocked_nav.call_args_list)
+
+    @patch('supvisors.viewsupstatus.simple_localtime', return_value='07:05:30')
+    @patch('supvisors.viewsupstatus.SupvisorsAddressView.write_address_actions')
+    @patch('supvisors.viewsupstatus.SupvisorsAddressView.write_periods')
+    def test_write_header(self, mocked_periods, mocked_actions, mocked_time):
+        """ Test the write_header method. """
+        # set context (meant to be set through render)
+        # build root structure
+        mocked_mids = [Mock(attrib={}) for _ in range(4)]
+        mocked_root = Mock(**{'findmeld.side_effect': mocked_mids * 2})
+        # first call tests with not master
+        mocked_status = Mock(remote_time=3600,
+                             **{'state_string.return_value': 'running',
+                                'loading.return_value': 12})
+        self.view.supvisors.context.master = False
+        self.view.supvisors.context.addresses['127.0.0.1'] = mocked_status
+        self.view.write_header(mocked_root)
+        self.assertEqual([call('address_mid'), call('state_mid'), call('percent_mid'), call('date_mid')],
+                         mocked_root.findmeld.call_args_list)
+        self.assertDictEqual({}, mocked_mids[0].attrib)
+        self.assertEqual([call('127.0.0.1')], mocked_mids[0].content.call_args_list)
+        self.assertEqual([call('running')], mocked_mids[1].content.call_args_list)
+        self.assertEqual([call('12%')], mocked_mids[2].content.call_args_list)
+        self.assertEqual([call('07:05:30')], mocked_mids[3].content.call_args_list)
+        self.assertEqual([call(mocked_root)], mocked_periods.call_args_list)
+        self.assertEqual([call(mocked_root)], mocked_actions.call_args_list)
+        # reset mocks
+        mocked_root.findmeld.reset_mock()
+        mocked_periods.reset_mock()
+        mocked_actions.reset_mock()
+        for mocked_mid in mocked_mids:
+            mocked_mid.content.reset_mock()
+        # second call tests with master
+        self.view.supvisors.context.master = True
+        self.view.write_header(mocked_root)
+        self.assertEqual([call('address_mid'), call('state_mid'), call('percent_mid'), call('date_mid')],
+                         mocked_root.findmeld.call_args_list)
+        self.assertDictEqual({'class': 'master'}, mocked_mids[0].attrib)
+        self.assertEqual([call('127.0.0.1')], mocked_mids[0].content.call_args_list)
+        self.assertEqual([call('running')], mocked_mids[1].content.call_args_list)
+        self.assertEqual([call('12%')], mocked_mids[2].content.call_args_list)
+        self.assertEqual([call('07:05:30')], mocked_mids[3].content.call_args_list)
+        self.assertEqual([call(mocked_root)], mocked_periods.call_args_list)
+        self.assertEqual([call(mocked_root)], mocked_actions.call_args_list)
+
+    def test_write_address_actions(self):
+        """ Test the write_address_actions method. """
+        from supvisors.viewcontext import ACTION
+        from supvisors.webutils import PROC_ADDRESS_PAGE, HOST_ADDRESS_PAGE
+        # set context (meant to be set through render)
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'http://addr:port/index.html?action'})
+        # build root structure
+        mocked_mids = [Mock(attrib={}) for _ in range(3)]
+        mocked_root = Mock(**{'findmeld.side_effect': mocked_mids * 2})
+        # test call
+        self.view.write_address_actions(mocked_root)
+        self.assertEqual([call('view_a_mid'), call('refresh_a_mid'), call('stopall_a_mid')],
+                         mocked_root.findmeld.call_args_list)
+        self.assertEqual([call('', PROC_ADDRESS_PAGE),
+                          call('', HOST_ADDRESS_PAGE, **{ACTION: 'refresh'}),
+                          call('', HOST_ADDRESS_PAGE, **{ACTION: 'stopall'})],
+                         self.view.view_ctx.format_url.call_args_list)
+        for mocked_mid in mocked_mids:
+            self.assertEqual([call(href='http://addr:port/index.html?action')],
+                             mocked_mid.attributes.call_args_list)
+        # reset mocks
+        mocked_root.findmeld.reset_mock()
+        self.view.view_ctx.format_url.reset_mock()
+        for mocked_mid in mocked_mids:
+            mocked_mid.attributes.reset_mock()
+        # test call with PROC_ADDRESS_PAGE as self.page_name
+        self.view.page_name = PROC_ADDRESS_PAGE
+        self.view.write_address_actions(mocked_root)
+        self.assertEqual([call('view_a_mid'), call('refresh_a_mid'), call('stopall_a_mid')],
+                         mocked_root.findmeld.call_args_list)
+        self.assertEqual([call('', HOST_ADDRESS_PAGE),
+                          call('', PROC_ADDRESS_PAGE, **{ACTION: 'refresh'}),
+                          call('', PROC_ADDRESS_PAGE, **{ACTION: 'stopall'})],
+                         self.view.view_ctx.format_url.call_args_list)
+        for mocked_mid in mocked_mids:
+            self.assertEqual([call(href='http://addr:port/index.html?action')],
+                             mocked_mid.attributes.call_args_list)
+
+    def test_make_callback(self):
+        """ Test the make_callback method. """
+        # test restart
+        with patch.object(self.view, 'restart_sup_action', return_value='restart') as mocked_action:
+            self.assertEqual('restart', self.view.make_callback('namespec', 'restartsup'))
+            self.assertEqual([call()], mocked_action.call_args_list)
+        # test shutdown
+        with patch.object(self.view, 'shutdown_sup_action', return_value='shutdown') as mocked_action:
+            self.assertEqual('shutdown', self.view.make_callback('namespec', 'shutdownsup'))
+            self.assertEqual([call()], mocked_action.call_args_list)
+        # test restart
+        with patch('supervisor.web.StatusView.make_callback', return_value='default') as mocked_action:
+            self.assertEqual('default', self.view.make_callback('namespec', 'other'))
+            self.assertEqual([call(self.view, 'namespec', 'other')], mocked_action.call_args_list)
+
+    @patch('supvisors.viewsupstatus.delayed_warn', return_value='delayed warn')
+    def test_restart_sup_action(self, mocked_warn):
+        """ Test the restart_sup_action method. """
+        with patch.object(self.view.supvisors.zmq.pusher, 'send_restart') as mocked_pusher:
+            self.assertEqual('delayed warn', self.view.restart_sup_action())
+            self.assertEqual([call('127.0.0.1')], mocked_pusher.call_args_list)
+
+    @patch('supvisors.viewsupstatus.delayed_warn', return_value='delayed warn')
+    def test_shutdown_sup_action(self, mocked_warn):
+        """ Test the shutdown_sup_action method. """
+        with patch.object(self.view.supvisors.zmq.pusher, 'send_shutdown') as mocked_pusher:
+            self.assertEqual('delayed warn', self.view.shutdown_sup_action())
+            self.assertEqual([call('127.0.0.1')], mocked_pusher.call_args_list)
+
+
+def test_suite():
+    return unittest.findTestCases(sys.modules[__name__])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
diff --git a/supvisors/tests/test_viewsupvisors.py b/supvisors/tests/test_viewsupvisors.py
new file mode 100644
index 00000000..5454e1f2
--- /dev/null
+++ b/supvisors/tests/test_viewsupvisors.py
@@ -0,0 +1,588 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+
+# ======================================================================
+# Copyright 2020 Julien LE CLEACH
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ======================================================================
+
+import sys
+import unittest
+
+from supervisor.web import MeldView
+from unittest.mock import call, patch, Mock
+
+from supvisors.tests.base import CompatTestCase
+
+class ViewSupvisorsTest(CompatTestCase):
+    """ Test case for the viewsupvisors module. """
+
+    def setUp(self):
+        """ Create the instance to be tested. """
+        from supvisors.tests.base import DummyHttpContext
+        from supvisors.viewsupvisors import SupvisorsView
+        self.view = SupvisorsView(DummyHttpContext('ui/hostaddress.html'))
+
+    def test_init(self):
+        """ Test the values set at construction. """
+        # test instance inheritance
+        from supvisors.viewhandler import ViewHandler
+        for klass in [ViewHandler, MeldView]:
+            self.assertIsInstance(self.view, klass)
+        # test parameter page name
+        from supvisors.webutils import SUPVISORS_PAGE
+        self.assertEqual(SUPVISORS_PAGE, self.view.page_name)
+        # test strategy names
+        from supvisors.ttypes import ConciliationStrategies
+        for strategy in self.view.strategies:
+            self.assertIn(strategy.upper(), ConciliationStrategies.strings())
+        self.assertNotIn('user', self.view.strategies)
+        # test action methods storage
+        self.assertTrue(all(callable(cb)) for cb in self.view.global_methods.values())
+        self.assertTrue(all(callable(cb)) for cb in self.view.process_methods.values())
+
+    @patch('supvisors.viewsupvisors.SupvisorsView.write_nav')
+    def test_write_navigation(self, mocked_nav):
+        """ Test the write_navigation method. """
+        mocked_root = Mock()
+        self.view.write_navigation(mocked_root)
+        self.assertEqual([call(mocked_root)], mocked_nav.call_args_list)
+
+    def test_write_header(self):
+        """ Test the write_header method. """
+        # patch context
+        self.view.fsm.state_string.return_value = 'Running'
+        # build root structure
+        mocked_mid = Mock()
+        mocked_root = Mock(**{'findmeld.return_value': mocked_mid})
+        # test call
+        self.view.write_header(mocked_root)
+        self.assertEqual([call('Running')], mocked_mid.content.call_args_list)
+
+    @patch('supvisors.viewsupvisors.SupvisorsView.write_address_boxes')
+    @patch('supvisors.viewsupvisors.SupvisorsView.write_conciliation_table')
+    @patch('supvisors.viewsupvisors.SupvisorsView.write_conciliation_strategies')
+    def test_write_contents(self, mocked_strategies, mocked_conflicts, mocked_boxes):
+        """ Test the write_contents method. """
+        from supvisors.ttypes import SupvisorsStates
+        # patch context
+        self.view.fsm.state = SupvisorsStates.OPERATION
+        self.view.sup_ctx.conflicts.return_value = True
+        # build root structure
+        mocked_box_mid = Mock()
+        mocked_conflict_mid = Mock()
+        mocked_root = Mock(**{'findmeld.side_effect': [mocked_conflict_mid, mocked_box_mid]})
+        # test call in normal state (no conciliation)
+        self.view.write_contents(mocked_root)
+        self.assertEqual([call(mocked_root)], mocked_boxes.call_args_list)
+        self.assertFalse(mocked_strategies.called)
+        self.assertFalse(mocked_conflicts.called)
+        self.assertEqual([call('')], mocked_conflict_mid.replace.call_args_list)
+        self.assertFalse(mocked_box_mid.replace.called)
+        # reset mocks
+        mocked_boxes.reset_mock()
+        mocked_conflict_mid.replace.reset_mock()
+        # test call in conciliation state
+        self.view.fsm.state = SupvisorsStates.CONCILIATION
+        self.view.write_contents(mocked_root)
+        self.assertEqual([call(mocked_root)], mocked_strategies.call_args_list)
+        self.assertEqual([call(mocked_root)], mocked_conflicts.call_args_list)
+        self.assertFalse(mocked_boxes.called)
+        self.assertEqual([call('')], mocked_box_mid.replace.call_args_list)
+        self.assertFalse(mocked_conflict_mid.replace.called)
+
+    def test_write_address_boxes(self):
+        """ Test the write_address_boxes method. """
+        from supvisors.ttypes import AddressStates
+        # patch context
+        self.view.sup_ctx.addresses = {'10.0.0.1': Mock(state=AddressStates.RUNNING,
+                                                        **{'state_string.return_value': 'running',
+                                                           'loading.return_value': 17})}
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
+        mocked_process = Mock(**{'namespec.return_value': 'dummy_proc'})
+        # build root structure with one single element
+        mocked_address_mid = Mock(attrib={})
+        mocked_state_mid = Mock(attrib={})
+        mocked_percent_mid = Mock(attrib={})
+        mocked_process_mid = Mock()
+        mocked_process_template = Mock(**{'repeat.return_value': [(mocked_process_mid, mocked_process)]})
+        mocked_box_mid = Mock(**{'findmeld.side_effect': [mocked_address_mid, mocked_state_mid,
+                                                          mocked_percent_mid, mocked_process_template] * 2})
+        mocked_address_template = Mock(**{'repeat.return_value': [(mocked_box_mid, '10.0.0.1')]})
+        mocked_root = Mock(**{'findmeld.return_value': mocked_address_template})
+        # test call in RUNNING state
+        self.view.write_address_boxes(mocked_root)
+        # test address element
+        self.assertEqual('on', mocked_address_mid.attrib['class'])
+        self.assertEqual([call(href='an url')], mocked_address_mid.attributes.call_args_list)
+        self.assertEqual([call('10.0.0.1')], mocked_address_mid.content.call_args_list)
+        # test state element
+        self.assertEqual('running state', mocked_state_mid.attrib['class'])
+        self.assertEqual([call('running')], mocked_state_mid.content.call_args_list)
+        # test loading element
+        self.assertEqual([call('17%')], mocked_percent_mid.content.call_args_list)
+        # test process element
+        self.assertEqual([call('dummy_proc')], mocked_process_mid.content.call_args_list)
+        # reset mocks ans attributes
+        mocked_address_mid.reset_mock()
+        mocked_state_mid.reset_mock()
+        mocked_percent_mid.reset_mock()
+        mocked_process_mid.content.reset_mock()
+        mocked_address_mid.attrib['class'] = ''
+        mocked_state_mid.attrib['class'] = ''
+        # test call in SILENT state
+        self.view.sup_ctx.addresses = {'10.0.0.1': Mock(state=AddressStates.SILENT,
+                                                        **{'state_string.return_value': 'silent',
+                                                           'loading.return_value': 0})}
+        self.view.write_address_boxes(mocked_root)
+        # test address element
+        self.assertEqual('', mocked_address_mid.attrib['class'])
+        self.assertFalse(mocked_address_mid.attributes.called)
+        self.assertEqual([call('10.0.0.1')], mocked_address_mid.content.call_args_list)
+        # test state element
+        self.assertEqual('silent state', mocked_state_mid.attrib['class'])
+        self.assertEqual([call('silent')], mocked_state_mid.content.call_args_list)
+        # test loading element
+        self.assertEqual([call('0%')], mocked_percent_mid.content.call_args_list)
+        # test process element
+        self.assertEqual([call('dummy_proc')], mocked_process_mid.content.call_args_list)
+
+    def test_write_conciliation_strategies(self):
+        """ Test the write_conciliation_strategies method. """
+        # patch context
+        self.view.sup_ctx.master_address = {'10.0.0.1'}
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
+        # build root structure with one single element
+        mocked_strategy_mid = Mock()
+        mocked_strategy_li = Mock(**{'findmeld.return_value': mocked_strategy_mid})
+        mocked_strategy_template = Mock(**{'repeat.return_value': [(mocked_strategy_li, 'infanticide')]})
+        mocked_conflicts_mid = Mock(**{'findmeld.return_value': mocked_strategy_template})
+        mocked_root = Mock(**{'findmeld.return_value': mocked_conflicts_mid})
+        # test call
+        self.view.write_conciliation_strategies(mocked_root)
+        self.assertEqual([call(href='an url')], mocked_strategy_mid.attributes.call_args_list)
+        self.assertEqual([call('Infanticide')], mocked_strategy_mid.content.call_args_list)
+
+    @patch('supvisors.viewsupvisors.SupvisorsView._write_conflict_strategies')
+    @patch('supvisors.viewsupvisors.SupvisorsView._write_conflict_process_actions')
+    @patch('supvisors.viewsupvisors.SupvisorsView._write_conflict_uptime')
+    @patch('supvisors.viewsupvisors.SupvisorsView._write_conflict_address')
+    @patch('supvisors.viewsupvisors.SupvisorsView._write_conflict_name')
+    @patch('supvisors.viewsupvisors.SupvisorsView.get_conciliation_data')
+    def test_write_conciliation_table(self, mocked_data, *args):
+        """ Test the write_conciliation_table method. """
+        # sample data
+        data = [{'namespec': 'proc_1', 'rowspan': 2}, {'namespec': 'proc_1', 'rowspan': 0},
+                {'namespec': 'proc_2', 'rowspan': 2}, {'namespec': 'proc_2', 'rowspan': 0}]
+        # build simple root structure
+        mocked_tr_elt = [Mock(attrib={}) for _ in range(4)]
+        mocked_tr_mid = Mock(**{'repeat.return_value': zip(mocked_tr_elt, data)})
+        mocked_div_elt = Mock(**{'findmeld.return_value': mocked_tr_mid})
+        mocked_root = Mock(**{'findmeld.return_value': mocked_div_elt})
+        # test call
+        self.view.write_conciliation_table(mocked_root)
+        self.assertEqual([call()], mocked_data.call_args_list)
+        # check elements background
+        self.assertEqual('brightened', mocked_tr_elt[0].attrib['class'])
+        self.assertEqual('brightened', mocked_tr_elt[1].attrib['class'])
+        self.assertEqual('shaded', mocked_tr_elt[2].attrib['class'])
+        self.assertEqual('shaded', mocked_tr_elt[3].attrib['class'])
+        self.assertEqual([call(mocked_tr_elt[0], data[0], False), call(mocked_tr_elt[1], data[1], False),
+                          call(mocked_tr_elt[2], data[2], True), call(mocked_tr_elt[3], data[3], True)],
+                         args[0].call_args_list)
+        self.assertEqual([call(mocked_tr_elt[0], data[0]), call(mocked_tr_elt[1], data[1]),
+                          call(mocked_tr_elt[2], data[2]), call(mocked_tr_elt[3], data[3])],
+                         args[1].call_args_list)
+        self.assertEqual([call(mocked_tr_elt[0], data[0]), call(mocked_tr_elt[1], data[1]),
+                          call(mocked_tr_elt[2], data[2]), call(mocked_tr_elt[3], data[3])],
+                         args[2].call_args_list)
+        self.assertEqual([call(mocked_tr_elt[0], data[0]), call(mocked_tr_elt[1], data[1]),
+                          call(mocked_tr_elt[2], data[2]), call(mocked_tr_elt[3], data[3])],
+                         args[3].call_args_list)
+        self.assertEqual([call(mocked_tr_elt[0], data[0], False), call(mocked_tr_elt[1], data[1], False),
+                          call(mocked_tr_elt[2], data[2], True), call(mocked_tr_elt[3], data[3], True)],
+                         args[4].call_args_list)
+
+    def test_write_conflict_name(self):
+        """ Test the _write_conflict_name method. """
+        # build root structure with one single element
+        mocked_name_mid = Mock(attrib={})
+        mocked_root = Mock(**{'findmeld.return_value': mocked_name_mid})
+        # test call with different values of rowspan and shade
+        # first line, shaded
+        info = {'namespec': 'dummy_proc', 'rowspan': 2}
+        self.view._write_conflict_name(mocked_root, info, True)
+        self.assertEqual([call('name_td_mid')], mocked_root.findmeld.call_args_list)
+        self.assertEqual('2', mocked_name_mid.attrib['rowspan'])
+        self.assertEqual('shaded', mocked_name_mid.attrib['class'])
+        self.assertEqual([call('dummy_proc')], mocked_name_mid.content.call_args_list)
+        # reset mocks
+        mocked_root.findmeld.reset_mock()
+        mocked_name_mid.content.reset_mock()
+        mocked_name_mid.attrib = {}
+        # first line, non shaded
+        self.view._write_conflict_name(mocked_root, info, False)
+        self.assertEqual([call('name_td_mid')], mocked_root.findmeld.call_args_list)
+        self.assertEqual('2', mocked_name_mid.attrib['rowspan'])
+        self.assertEqual('brightened', mocked_name_mid.attrib['class'])
+        self.assertEqual([call('dummy_proc')], mocked_name_mid.content.call_args_list)
+        self.assertFalse(mocked_name_mid.replace.called)
+        # reset mocks
+        mocked_root.findmeld.reset_mock()
+        mocked_name_mid.content.reset_mock()
+        mocked_name_mid.attrib = {}
+        # not first line, shaded
+        info['rowspan'] = 0
+        self.view._write_conflict_name(mocked_root, info, True)
+        self.assertEqual([call('name_td_mid')], mocked_root.findmeld.call_args_list)
+        self.assertNotIn('rowspan', mocked_name_mid.attrib)
+        self.assertNotIn('class', mocked_name_mid.attrib)
+        self.assertFalse(mocked_name_mid.content.called)
+        self.assertEqual([call('')], mocked_name_mid.replace.call_args_list)
+        # reset mocks
+        mocked_root.findmeld.reset_mock()
+        mocked_name_mid.replace.reset_mock()
+        # not first line, non shaded
+        self.view._write_conflict_name(mocked_root, info, False)
+        self.assertEqual([call('name_td_mid')], mocked_root.findmeld.call_args_list)
+        self.assertNotIn('rowspan', mocked_name_mid.attrib)
+        self.assertNotIn('class', mocked_name_mid.attrib)
+        self.assertFalse(mocked_name_mid.content.called)
+        self.assertEqual([call('')], mocked_name_mid.replace.call_args_list)
+
+    def test_write_conflict_address(self):
+        """ Test the _write_conflict_address method. """
+        from supvisors.webutils import PROC_ADDRESS_PAGE
+        # patch context
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
+        # build root structure with one single element
+        mocked_addr_mid = Mock()
+        mocked_root = Mock(**{'findmeld.return_value': mocked_addr_mid})
+        # test call
+        self.view._write_conflict_address(mocked_root, {'address': '10.0.0.1'})
+        self.assertEqual([call('caddress_a_mid')], mocked_root.findmeld.call_args_list)
+        self.assertEqual([call(href='an url')], mocked_addr_mid.attributes.call_args_list)
+        self.assertEqual([call('10.0.0.1')], mocked_addr_mid.content.call_args_list)
+        self.assertEqual([call('10.0.0.1', PROC_ADDRESS_PAGE)], self.view.view_ctx.format_url.call_args_list)
+
+    def test_write_conflict_uptime(self):
+        """ Test the _write_conflict_uptime method. """
+        # patch context
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
+        # build root structure with one single element
+        mocked_uptime_mid = Mock()
+        mocked_root = Mock(**{'findmeld.return_value': mocked_uptime_mid})
+        # test call
+        self.view._write_conflict_uptime(mocked_root, {'uptime': 1234})
+        self.assertEqual([call('uptime_td_mid')], mocked_root.findmeld.call_args_list)
+        self.assertEqual([call('00:20:34')], mocked_uptime_mid.content.call_args_list)
+
+    def test_write_conflict_process_actions(self):
+        """ Test the _write_conflict_process_actions method. """
+        from supvisors.webutils import SUPVISORS_PAGE
+        # patch context
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
+        # build root structure with one single element
+        mocked_stop_mid = Mock()
+        mocked_keep_mid = Mock()
+        mocked_root = Mock(**{'findmeld.side_effect': [mocked_stop_mid, mocked_keep_mid]})
+        # test call
+        info = {'namespec': 'dummy_proc', 'address': '10.0.0.1'}
+        self.view._write_conflict_process_actions(mocked_root, info)
+        self.assertEqual([call('pstop_a_mid'), call('pkeep_a_mid')], mocked_root.findmeld.call_args_list)
+        self.assertEqual([call(href='an url')], mocked_stop_mid.attributes.call_args_list)
+        self.assertEqual([call(href='an url')], mocked_keep_mid.attributes.call_args_list)
+        self.assertEqual([call('', SUPVISORS_PAGE, action='pstop', address='10.0.0.1', namespec='dummy_proc'),
+                          call('', SUPVISORS_PAGE, action='pkeep', address='10.0.0.1', namespec='dummy_proc')],
+                         self.view.view_ctx.format_url.call_args_list)
+
+    def test_write_conflict_strategies(self):
+        """ Test the _write_conflict_strategies method. """
+        from supvisors.webutils import SUPVISORS_PAGE
+        # patch context
+        self.view.sup_ctx.master_address = '10.0.0.1'
+        self.view.view_ctx = Mock(**{'format_url.return_value': 'an url'})
+        # build root structure with one single element
+        mocked_a_mid = Mock()
+        mocked_li_mid = Mock(**{'findmeld.return_value': mocked_a_mid})
+        mocked_li_template = Mock(**{'repeat.return_value': [(mocked_li_mid, 'senicide')]})
+        mocked_td_mid = Mock(attrib={}, **{'findmeld.return_value': mocked_li_template})
+        mocked_root = Mock(**{'findmeld.return_value': mocked_td_mid})
+        # test call with different values of rowspan and shade
+        # first line, shaded
+        info = {'namespec': 'dummy_proc', 'rowspan': 2}
+        self.view._write_conflict_strategies(mocked_root, info, True)
+        self.assertEqual('2', mocked_td_mid.attrib['rowspan'])
+        self.assertEqual('shaded', mocked_td_mid.attrib['class'])
+        self.assertEqual([call(href='an url')], mocked_a_mid.attributes.call_args_list)
+        self.assertEqual([call('Senicide')], mocked_a_mid.content.call_args_list)
+        self.assertEqual([call('10.0.0.1', SUPVISORS_PAGE, action='senicide', namespec='dummy_proc')],
+                         self.view.view_ctx.format_url.call_args_list)
+        # reset mocks
+        self.view.view_ctx.format_url.reset_mock()
+        mocked_a_mid.attributes.reset_mock()
+        mocked_a_mid.content.reset_mock()
+        mocked_td_mid.attrib = {}
+        # first line, not shaded
+        info = {'namespec': 'dummy_proc', 'rowspan': 2}
+        self.view._write_conflict_strategies(mocked_root, info, False)
+        self.assertEqual('2', mocked_td_mid.attrib['rowspan'])
+        self.assertEqual('brightened', mocked_td_mid.attrib['class'])
+        self.assertEqual([call(href='an url')], mocked_a_mid.attributes.call_args_list)
+        self.assertEqual([call('Senicide')], mocked_a_mid.content.call_args_list)
+        self.assertEqual([call('10.0.0.1', SUPVISORS_PAGE, action='senicide', namespec='dummy_proc')],
+                         self.view.view_ctx.format_url.call_args_list)
+        # reset mocks
+        self.view.view_ctx.format_url.reset_mock()
+        mocked_a_mid.attributes.reset_mock()
+        mocked_a_mid.content.reset_mock()
+        mocked_td_mid.attrib = {}
+        # not first line, shaded
+        info = {'namespec': 'dummy_proc', 'rowspan': 0}
+        self.view._write_conflict_strategies(mocked_root, info, True)
+        self.assertNotIn('rowspan', mocked_td_mid.attrib)
+        self.assertFalse(mocked_a_mid.attributes.called)
+        self.assertFalse(mocked_a_mid.content.called)
+        self.assertFalse(mocked_a_mid.content.called)
+        self.assertFalse(self.view.view_ctx.format_url.called)
+        self.assertEqual([call('')], mocked_td_mid.replace.call_args_list)
+        # reset mocks
+        mocked_td_mid.replace.reset_mock()
+        # not first line, not shaded
+        info = {'namespec': 'dummy_proc', 'rowspan': 0}
+        self.view._write_conflict_strategies(mocked_root, info, False)
+        self.assertNotIn('rowspan', mocked_td_mid.attrib)
+        self.assertFalse(mocked_a_mid.attributes.called)
+        self.assertFalse(mocked_a_mid.content.called)
+        self.assertFalse(mocked_a_mid.content.called)
+        self.assertFalse(self.view.view_ctx.format_url.called)
+        self.assertEqual([call('')], mocked_td_mid.replace.call_args_list)
+
+    def test_get_conciliation_data(self):
+        """ Test the get_conciliation_data method. """
+        # patch context
+        process_1 = Mock(addresses={'10.0.0.1', '10.0.0.2'},
+                         infos={'10.0.0.1': {'uptime': 12}, '10.0.0.2': {'uptime': 11}},
+                         **{'namespec.return_value': 'proc_1'})
+        process_2 = Mock(addresses={'10.0.0.3', '10.0.0.2'},
+                         infos={'10.0.0.3': {'uptime': 10}, '10.0.0.2': {'uptime': 11}},
+                         **{'namespec.return_value': 'proc_2'})
+        self.view.sup_ctx.conflicts.return_value = [process_1, process_2]
+        # test call
+        # no direct method in unittests to compare 2 lists of dicts so put all tuples in flat list
+        # and use CompatTestCase.assertItemsEqual to compare
+        expected = [{'namespec': 'proc_1', 'rowspan': 2, 'address': '10.0.0.1', 'uptime': 12},
+                    {'namespec': 'proc_1', 'rowspan': 0, 'address': '10.0.0.2', 'uptime': 11},
+                    {'namespec': 'proc_2', 'rowspan': 2, 'address': '10.0.0.3', 'uptime': 10},
+                    {'namespec': 'proc_2', 'rowspan': 0, 'address': '10.0.0.2', 'uptime': 11}]
+        flat_expected = [item for dico in expected for item in dico.items()]
+        actual = self.view.get_conciliation_data()
+        flat_actual = [item for dico in actual for item in dico.items()]
+        self.assertItemsEqual(flat_expected, flat_actual)
+
+    @patch('supvisors.viewsupvisors.delayed_info', return_value='delayed info')
+    def test_refresh_action(self, mocked_info):
+        """ Test the refresh_action method. """
+        self.assertEqual('delayed info', self.view.refresh_action())
+        self.assertEqual([call('Page refreshed')], mocked_info.call_args_list)
+
+    @patch('supvisors.viewsupvisors.info_message', return_value='info')
+    @patch('supvisors.viewsupvisors.error_message', return_value='error')
+    @patch('supvisors.viewsupvisors.delayed_info', return_value='delayed info')
+    @patch('supvisors.viewsupvisors.delayed_error', return_value='delayed error')
+    def test_sup_restart_action(self, *args):
+        """ Test the sup_shutdown_action method. """
+        self._check_sup_action(self.view.sup_restart_action, 'restart', *args)
+
+    @patch('supvisors.viewsupvisors.info_message', return_value='info')
+    @patch('supvisors.viewsupvisors.error_message', return_value='error')
+    @patch('supvisors.viewsupvisors.delayed_info', return_value='delayed info')
+    @patch('supvisors.viewsupvisors.delayed_error', return_value='delayed error')
+    def test_sup_shutdown_action(self, *args):
+        """ Test the sup_shutdown_action method. """
+        self._check_sup_action(self.view.sup_shutdown_action, 'shutdown', *args)
+
+    def _check_sup_action(self, method_cb, rpc_name, mocked_derror, mocked_dinfo, mocked_error, mocked_info):
+        """ Test the sup_restart_action & sup_shutdown_action methods. """
+        from supervisor.http import NOT_DONE_YET
+        from supervisor.xmlrpc import RPCError
+        # test RPC error
+        with patch.object(self.view.info_source.supvisors_rpc_interface, rpc_name,
+                          side_effect=RPCError('failed RPC')) as mocked_rpc:
+            self.assertEqual('delayed error', method_cb())
+        self.assertTrue(mocked_derror.called)
+        self.assertFalse(mocked_dinfo.called)
+        self.assertFalse(mocked_error.called)
+        self.assertFalse(mocked_info.called)
+        # reset mocks
+        mocked_derror.reset_mock()
+        # test direct result
+        with patch.object(self.view.info_source.supvisors_rpc_interface, rpc_name,
+                          return_value='not callable object') as mocked_rpc:
+            self.assertEqual('delayed info', method_cb())
+        self.assertFalse(mocked_derror.called)
+        self.assertTrue(mocked_dinfo.called)
+        self.assertFalse(mocked_error.called)
+        self.assertFalse(mocked_info.called)
+        # reset mocks
+        mocked_dinfo.reset_mock()
+        # test delayed result with RPC error
+        mocked_onwait = Mock(side_effect=RPCError('failed RPC'))
+        with patch.object(self.view.info_source.supvisors_rpc_interface, rpc_name,
+                          return_value=mocked_onwait) as mocked_rpc:
+            cb = method_cb()
+        self.assertTrue(callable(cb))
+        self.assertEqual('error', cb())
+        self.assertFalse(mocked_derror.called)
+        self.assertFalse(mocked_dinfo.called)
+        self.assertTrue(mocked_error.called)
+        self.assertFalse(mocked_info.called)
+        # reset mocks
+        mocked_error.reset_mock()
+        # test delayed / uncompleted result
+        mocked_onwait = Mock(return_value=NOT_DONE_YET)
+        with patch.object(self.view.info_source.supvisors_rpc_interface, rpc_name,
+                          return_value=mocked_onwait) as mocked_rpc:
+            cb = method_cb()
+        self.assertTrue(callable(cb))
+        self.assertIs(NOT_DONE_YET, cb())
+        self.assertFalse(mocked_derror.called)
+        self.assertFalse(mocked_dinfo.called)
+        self.assertFalse(mocked_error.called)
+        self.assertFalse(mocked_info.called)
+        # test delayed / completed result
+        mocked_onwait = Mock(return_value='done')
+        with patch.object(self.view.info_source.supvisors_rpc_interface, 'shutdown',
+                          return_value=mocked_onwait) as mocked_rpc:
+            cb = method_cb()
+        self.assertTrue(callable(cb))
+        self.assertIs('info', cb())
+        self.assertFalse(mocked_derror.called)
+        self.assertFalse(mocked_dinfo.called)
+        self.assertFalse(mocked_error.called)
+        self.assertTrue(mocked_info.called)
+
+    @patch('supvisors.viewsupvisors.info_message', return_value='done')
+    def test_stop_action(self, mocked_info):
+        """ Test the stop_action method. """
+        from supervisor.http import NOT_DONE_YET
+        # patch context
+        self.view.sup_ctx.processes['dummy_proc'] = Mock(addresses=['10.0.0.1', '10.0.0.2', '10.0.0.3'])
+        # test call
+        with patch.object(self.view.supvisors.zmq.pusher, 'send_stop_process') as mocked_rpc:
+            cb = self.view.stop_action('dummy_proc', '10.0.0.2')
+        self.assertTrue(callable(cb))
+        self.assertEqual([call('10.0.0.2', 'dummy_proc')], mocked_rpc.call_args_list)
+        # at this stage, there should be still 3 elements in addresses
+        self.assertIs(NOT_DONE_YET, cb())
+        self.assertFalse(mocked_info.called)
+        # remove one address from list
+        self.view.sup_ctx.processes['dummy_proc'].addresses.remove('10.0.0.2')
+        self.assertEqual('done', cb())
+        self.assertEqual([call('process dummy_proc stopped on 10.0.0.2')], mocked_info.call_args_list)
+
+    @patch('supvisors.viewsupvisors.info_message', return_value='done')
+    def test_keep_action(self, mocked_info):
+        """ Test the keep_action method. """
+        from supervisor.http import NOT_DONE_YET
+        # patch context
+        self.view.sup_ctx.processes['dummy_proc'] = Mock(addresses=['10.0.0.1', '10.0.0.2', '10.0.0.3'])
+        # test call
+        with patch.object(self.view.supvisors.zmq.pusher, 'send_stop_process') as mocked_rpc:
+            cb = self.view.keep_action('dummy_proc', '10.0.0.2')
+        self.assertTrue(callable(cb))
+        self.assertEqual([call('10.0.0.1', 'dummy_proc'), call('10.0.0.3', 'dummy_proc')],
+                         mocked_rpc.call_args_list)
+        # at this stage, there should be still 3 elements in addresses
+        self.assertIs(NOT_DONE_YET, cb())
+        self.assertFalse(mocked_info.called)
+        # remove one address from list
+        self.view.sup_ctx.processes['dummy_proc'].addresses.remove('10.0.0.1')
+        self.assertIs(NOT_DONE_YET, cb())
+        self.assertFalse(mocked_info.called)
+        # remove one address from list
+        self.view.sup_ctx.processes['dummy_proc'].addresses.remove('10.0.0.3')
+        self.assertEqual('done', cb())
+        self.assertEqual([call('processes dummy_proc stopped but on 10.0.0.2')], mocked_info.call_args_list)
+
+    @patch('supvisors.viewsupvisors.conciliate_conflicts')
+    @patch('supvisors.viewsupvisors.delayed_info', return_value='delayed info')
+    def test_conciliation_action(self, mocked_info, mocked_conciliate):
+        """ Test the conciliation_action method. """
+        from supvisors.ttypes import ConciliationStrategies
+        # patch context
+        self.view.sup_ctx.processes['proc_conflict'] = 'a process status'
+        self.view.sup_ctx.conflicts.return_value = 'all conflicting process status'
+        # test with no namespec
+        self.assertEqual('delayed info', self.view.conciliation_action(None, 'INFANTICIDE'))
+        self.assertEqual([call(self.view.supvisors, ConciliationStrategies.INFANTICIDE,
+                               'all conflicting process status')],
+                         mocked_conciliate.call_args_list)
+        self.assertEqual([call('INFANTICIDE in progress for all conflicts')], mocked_info.call_args_list)
+        # reset mocks
+        mocked_conciliate.reset_mock()
+        mocked_info.reset_mock()
+        # test with namespec
+        self.assertEqual('delayed info', self.view.conciliation_action('proc_conflict', 'STOP'))
+        self.assertEqual([call(self.view.supvisors, ConciliationStrategies.STOP, ['a process status'])],
+                         mocked_conciliate.call_args_list)
+        self.assertEqual([call('STOP in progress for proc_conflict')], mocked_info.call_args_list)
+
+
+class ViewSupvisorsActionTest(unittest.TestCase):
+    """ Test case for the viewsupvisors module.
+    In this class, no default instance is set so that it is possible to patch methods
+    before they are stored in instance attributes. """
+
+    @patch('supvisors.viewsupvisors.SupvisorsView.keep_action', return_value='pkeep called')
+    @patch('supvisors.viewsupvisors.SupvisorsView.stop_action', return_value='pstop called')
+    @patch('supvisors.viewsupvisors.SupvisorsView.sup_shutdown_action', return_value='sup_shutdown called')
+    @patch('supvisors.viewsupvisors.SupvisorsView.sup_restart_action', return_value='sup_restart called')
+    @patch('supvisors.viewsupvisors.SupvisorsView.refresh_action', return_value='refresh called')
+    @patch('supvisors.viewsupvisors.SupvisorsView.conciliation_action', return_value='conciliation')
+    def test_make_callback(self, *args):
+        """ Test the make_callback method. """
+        from supvisors.tests.base import DummyHttpContext
+        from supvisors.viewsupvisors import SupvisorsView
+        view = SupvisorsView(DummyHttpContext('ui/hostaddress.html'))
+        view.view_ctx = Mock(**{'get_address.return_value': '10.0.0.1'})
+        # test strategies but USER
+        for strategy in view.strategies:
+            self.assertEqual('conciliation', view.make_callback('dummy_namespec', strategy))
+            self.assertEqual([call('dummy_namespec', strategy.upper())], args[0].call_args_list)
+            args[0].reset_mock()
+        self.assertFalse(any(mocked.called for mocked in args))
+        # test USER strategy
+        self.assertFalse(view.make_callback('dummy_namespec', 'user'))
+        self.assertFalse(any(mocked.called for mocked in args))
+        # test global actions
+        for idx, action in enumerate(['refresh', 'sup_restart', 'sup_shutdown'], 1):
+            self.assertEqual('%s called' % action, view.make_callback(None, action))
+            self.assertEqual([call()], args[idx].call_args_list)
+            args[idx].reset_mock()
+            self.assertFalse(any(mocked.called for mocked in args))
+        # test process actions
+        for idx, action in enumerate(['pstop', 'pkeep'], 4):
+            self.assertEqual('%s called' % action, view.make_callback('dummy_namespec', action))
+            self.assertEqual([call('dummy_namespec', '10.0.0.1')], args[idx].call_args_list)
+            args[idx].reset_mock()
+            self.assertFalse(any(mocked.called for mocked in args))
+
+
+def test_suite():
+    return unittest.findTestCases(sys.modules[__name__])
+
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')
diff --git a/supvisors/tests/test_webutils.py b/supvisors/tests/test_webutils.py
index efc57f18..60a596e2 100644
--- a/supvisors/tests/test_webutils.py
+++ b/supvisors/tests/test_webutils.py
@@ -23,6 +23,8 @@
 from time import ctime
 from types import FunctionType
 
+from unittest.mock import Mock
+
 from supvisors.tests.base import CompatTestCase
 
 
@@ -146,6 +148,17 @@ def check_delayed_message(self, func, gravity):
         self.assertEqual(gravity, msg[0])
         self.assertEqual(msg[1], 'another simple message at ' + ctime() + ' on 10.0.0.1')
 
+    def test_apply_shade(self):
+        """ Test the formatting of shaded / non-shaded elements. """
+        from supvisors.webutils import apply_shade
+        elt = Mock(attrib={})
+        # test shaded
+        apply_shade(elt, True)
+        self.assertEqual('shaded', elt.attrib['class'])
+        # test non-shaded
+        apply_shade(elt, False)
+        self.assertEqual('brightened', elt.attrib['class'])
+
 
 def test_suite():
     return unittest.findTestCases(sys.modules[__name__])