You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by gi...@apache.org on 2022/07/26 20:48:22 UTC

[celix-site] branch asf-site updated: Updated site from master (ecd0aa7eabe4ee35990536b217fae32c1c34d6d6)

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/celix-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 1cf5604  Updated site from master (ecd0aa7eabe4ee35990536b217fae32c1c34d6d6)
1cf5604 is described below

commit 1cf5604be53ebfcc8d1410bdc21cc1a3b3219dce
Author: jenkins <bu...@apache.org>
AuthorDate: Tue Jul 26 20:48:16 2022 +0000

    Updated site from master (ecd0aa7eabe4ee35990536b217fae32c1c34d6d6)
---
 content/404.html                                   |   3 +-
 content/contributing.html                          |   3 +-
 content/contributing/development-workflow.html     |   3 +-
 content/contributing/releasing.html                |   3 +-
 content/contributing/source-and-builds.html        |   5 +-
 content/contributing/submitting-patches.html       |   3 +-
 content/contributing/volunteers.html               |   3 +-
 content/contributing/youatcelix.html               |   3 +-
 content/docs.html                                  |   3 +-
 content/docs/2.1.0/celix/CHANGES.html              |  18 +-
 content/docs/2.1.0/celix/README.html               |  18 +-
 content/docs/2.1.0/celix/config_admin/readme.html  |  18 +-
 .../2.1.0/celix/dependency_manager/readme.html     |  18 +-
 .../2.1.0/celix/dependency_manager_cxx/readme.html |  18 +-
 .../docs/2.1.0/celix/deployment_admin/README.html  |  18 +-
 content/docs/2.1.0/celix/device_access/README.html |  18 +-
 .../2.1.0/celix/documents/building/readme.html     |  18 +-
 .../celix/documents/cmake_commands/readme.html     |  18 +-
 .../getting_started/creating_a_simple_bundle.html  |  18 +-
 .../celix/documents/getting_started/readme.html    |  18 +-
 .../getting_started/using_services_with_c.html     |  18 +-
 .../getting_started/using_services_with_cxx.html   |  18 +-
 .../docs/2.1.0/celix/documents/intro/readme.html   |  18 +-
 .../celix/documents/roadmap/api_v3/readme.html     |  18 +-
 .../celix/documents/roadmap/improvement_ideas.html |  18 +-
 .../2.1.0/celix/documents/roadmap/roadmap.html     |  18 +-
 .../2.1.0/celix/documents/subprojects/readme.html  |  18 +-
 content/docs/2.1.0/celix/etcdlib/README.html       |  18 +-
 content/docs/2.1.0/celix/launcher/README.html      |  18 +-
 content/docs/2.1.0/celix/log_service/README.html   |  18 +-
 content/docs/2.1.0/celix/log_writer/README.html    |  18 +-
 content/docs/2.1.0/celix/pubsub/README.html        |  18 +-
 .../2.1.0/celix/pubsub/examples/keys/README.html   |  18 +-
 .../celix/pubsub/pubsub_admin_udp_mc/README.html   |  18 +-
 .../docs/2.1.0/celix/remote_services/README.html   |  18 +-
 .../remote_services/discovery_etcd/README.html     |  18 +-
 .../remote_service_admin/README.html               |  18 +-
 .../remote_services/topology_manager/README.html   |  18 +-
 content/docs/2.1.0/celix/remote_shell/README.html  |  18 +-
 content/docs/2.1.0/celix/shell/README.html         |  18 +-
 content/docs/2.1.0/celix/shell_tui/README.html     |  18 +-
 content/docs/2.1.0/celix/utils/README.html         |  18 +-
 .../docs/2.1.0/celix/utils/docs/thpool/Design.html |  18 +-
 .../docs/2.1.0/celix/utils/docs/thpool/FAQ.html    |  18 +-
 .../docs/2.1.0/celix/utils/docs/thpool/README.html |  18 +-
 .../utils/public/include/memstream/README.html     |  18 +-
 content/docs/2.1.0/docs.html                       |   3 +-
 content/docs/2.2.1/celix/CHANGES.html              |  22 +-
 content/docs/2.2.1/celix/README.html               |  20 +-
 .../celix/bundles/deployment_admin/README.html     |  20 +-
 .../2.2.1/celix/bundles/device_access/README.html  |  20 +-
 .../device_access/example/base_driver/README.html  |  20 +-
 .../example/consuming_driver/README.html           |  20 +-
 .../example/refining_driver/README.html            |  20 +-
 .../2.2.1/celix/bundles/http_admin/README.html     |  20 +-
 .../celix/bundles/logging/log_service/README.html  |  20 +-
 .../celix/bundles/logging/log_writer/README.html   |  20 +-
 .../docs/2.2.1/celix/bundles/pubsub/README.html    |  20 +-
 .../celix/bundles/pubsub/examples/keys/README.html |  20 +-
 .../bundles/pubsub/pubsub_admin_udp_mc/README.html |  20 +-
 .../celix/bundles/remote_services/README.html      |  20 +-
 .../remote_services/discovery_etcd/README.html     |  20 +-
 .../remote_service_admin_dfi/README.html           |  20 +-
 .../remote_services_api/README.html                |  20 +-
 .../bundles/remote_services/rsa_spi/README.html    |  20 +-
 .../remote_services/topology_manager/README.html   |  20 +-
 .../celix/bundles/shell/remote_shell/README.html   |  20 +-
 .../2.2.1/celix/bundles/shell/shell/README.html    |  20 +-
 .../celix/bundles/shell/shell_tui/README.html      |  20 +-
 .../celix/bundles/shell/shell_wui/README.html      |  20 +-
 .../2.2.1/celix/documents/building/README.html     |  20 +-
 .../celix/documents/cmake_commands/README.html     |  20 +-
 .../celix/documents/getting_started/README.html    |  20 +-
 .../getting_started/creating_a_simple_bundle.html  |  20 +-
 .../getting_started/using_services_with_c.html     |  20 +-
 .../getting_started/using_services_with_cxx.html   |  20 +-
 .../docs/2.2.1/celix/documents/intro/README.html   |  20 +-
 .../2.2.1/celix/documents/subprojects/README.html  |  20 +-
 .../celix/examples/celix-examples/README.html      |  20 +-
 .../celix-examples/http_example/README.html        |  20 +-
 .../celix-examples/services_example_c/README.html  |  20 +-
 .../celix/libs/dependency_manager/README.html      |  20 +-
 .../2.2.1/celix/libs/dependency_manager/TODO.html  |  20 +-
 .../celix/libs/dependency_manager_cxx/README.html  |  20 +-
 .../celix/libs/dependency_manager_cxx/TODO.html    |  20 +-
 content/docs/2.2.1/celix/libs/etcdlib/README.html  |  20 +-
 content/docs/2.2.1/celix/libs/launcher/README.html |  20 +-
 content/docs/2.2.1/celix/libs/utils/README.html    |  20 +-
 .../2.2.1/celix/libs/utils/docs/thpool/Design.html |  20 +-
 .../2.2.1/celix/libs/utils/docs/thpool/FAQ.html    |  20 +-
 .../2.2.1/celix/libs/utils/docs/thpool/README.html |  20 +-
 .../celix/libs/utils/include/memstream/README.html |  20 +-
 .../docs/2.2.1/celix/misc/experimental/README.html |  20 +-
 .../experimental/bundles/config_admin/README.html  |  20 +-
 content/docs/2.2.1/docs.html                       |   3 +-
 content/docs/{2.2.1 => 2.3.0}/celix/CHANGES.html   |  98 ++-
 content/docs/2.3.0/celix/README.html               | 473 ++++++++++++
 .../celix/bundles/deployment_admin/README.html     |  20 +-
 .../celix/bundles/device_access/README.html        |  20 +-
 .../device_access/example/base_driver/README.html  |  20 +-
 .../example/consuming_driver/README.html           |  20 +-
 .../example/refining_driver/README.html            |  20 +-
 .../celix/bundles/http_admin/README.html           |  20 +-
 .../celix/bundles/logging}/README.html             |  72 +-
 .../celix/bundles/logging/log_writers}/README.html |  32 +-
 .../celix/bundles/pubsub/README.html               |  43 +-
 .../celix/bundles/pubsub/examples/keys/README.html |  20 +-
 .../bundles/pubsub/pubsub_admin_udp_mc/README.html |  20 +-
 .../celix/bundles/remote_services/README.html      |  27 +-
 .../deprecated_rsa_spi}/README.html                |  24 +-
 .../remote_services/discovery_etcd/README.html     |  20 +-
 .../remote_service_admin_dfi/README.html           |  27 +-
 .../remote_services_api/README.html                |  22 +-
 .../remote_services/topology_manager/README.html   |  22 +-
 .../celix/bundles}/shell/README.html               | 110 ++-
 .../celix/documents}/README.html                   |  98 ++-
 .../celix/documents/building/README.html           | 149 ++--
 .../documents/building/dev_celix_with_clion.html}  |  83 +-
 .../media/clion_run_configuration_template.png     | Bin 0 -> 351219 bytes
 content/docs/2.3.0/celix/documents/bundles.html    | 439 +++++++++++
 .../celix/documents/cmake_commands/README.html     | 118 ++-
 content/docs/2.3.0/celix/documents/components.html | 857 +++++++++++++++++++++
 content/docs/2.3.0/celix/documents/containers.html | 269 +++++++
 .../celix/documents/diagrams/bundles_lifecycle.png | Bin 0 -> 25453 bytes
 .../documents/diagrams/component_lifecycle.png     | Bin 0 -> 59748 bytes
 .../celix/documents/diagrams/extender_pattern.png  | Bin 0 -> 17297 bytes
 .../services_register_service_async_seq.png        | Bin 0 -> 46543 bytes
 .../diagrams/services_register_service_seq.png     | Bin 0 -> 46946 bytes
 .../services_tracker_services_add_async_seq.png    | Bin 0 -> 51647 bytes
 .../diagrams/services_tracker_services_add_seq.png | Bin 0 -> 55635 bytes
 .../services_tracker_services_rem_async_seq.png    | Bin 0 -> 47867 bytes
 .../diagrams/services_tracker_services_rem_seq.png | Bin 0 -> 53266 bytes
 .../services_unregister_service_async_seq.png      | Bin 0 -> 43427 bytes
 .../diagrams/services_unregister_service_seq.png   | Bin 0 -> 41522 bytes
 .../2.3.0/celix/documents/diagrams/sod_pattern.png | Bin 0 -> 9674 bytes
 .../documents/diagrams/sod_pattern_log_service.png | Bin 0 -> 17098 bytes
 .../diagrams/sod_pattern_publisher_service.png     | Bin 0 -> 23713 bytes
 .../documents/diagrams/whiteboard_pattern.png      | Bin 0 -> 12021 bytes
 .../diagrams/whiteboard_pattern_http_admin.png     | Bin 0 -> 15058 bytes
 .../diagrams/whiteboard_pattern_log_sink.png       | Bin 0 -> 9403 bytes
 .../diagrams/whiteboard_pattern_shell.png          | Bin 0 -> 18768 bytes
 content/docs/2.3.0/celix/documents/framework.html  | 349 +++++++++
 content/docs/2.3.0/celix/documents/patterns.html   | 307 ++++++++
 content/docs/2.3.0/celix/documents/services.html   | 769 ++++++++++++++++++
 .../celix/documents/subprojects.html}              |  57 +-
 .../celix-examples/http_example/README.html        |  20 +-
 .../celix-examples/services_example_c/README.html  |  30 +-
 .../services_example_cxx}/README.html              |  62 +-
 .../celix/examples/conan_test_package}/README.html |  72 +-
 .../celix/libs/etcdlib/README.html                 |  22 +-
 .../celix/libs/framework/doxygen.html}             |  62 +-
 .../celix/libs/launcher/README.html                |  20 +-
 content/docs/2.3.0/celix/libs/promises/README.html | 260 +++++++
 .../celix/libs/pushstreams}/README.html            |  51 +-
 .../{2.2.1 => 2.3.0}/celix/libs/utils/README.html  |  20 +-
 .../celix/libs/utils/docs/thpool/Design.html       |  22 +-
 .../celix/libs/utils/docs/thpool/FAQ.html          |  22 +-
 .../celix/libs/utils/docs/thpool/README.html       |  22 +-
 .../celix/libs/utils/include/memstream/README.html |  22 +-
 .../celix/misc/experimental/README.html            |  22 +-
 .../experimental/bundles/config_admin/README.html  |  20 +-
 content/docs/{2.2.1 => 2.3.0}/docs.html            |  21 +-
 content/docs/index.xml                             | 519 +++++++++++++
 content/download.html                              |   9 +-
 content/index.html                                 |   6 +-
 content/index.xml                                  | 519 +++++++++++++
 content/sitemap.xml                                | 244 +++++-
 content/support.html                               |   3 +-
 content/support/issue-tracking.html                |   3 +-
 content/support/mailing-list.html                  |   3 +-
 170 files changed, 7754 insertions(+), 590 deletions(-)

diff --git a/content/404.html b/content/404.html
index 82581bf..0284213 100644
--- a/content/404.html
+++ b/content/404.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/contributing.html b/content/contributing.html
index f2e7d1b..f36b5df 100644
--- a/content/contributing.html
+++ b/content/contributing.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/contributing/development-workflow.html b/content/contributing/development-workflow.html
index 17b993c..2f4ae54 100644
--- a/content/contributing/development-workflow.html
+++ b/content/contributing/development-workflow.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/contributing/releasing.html b/content/contributing/releasing.html
index f3f231f..677c8dd 100644
--- a/content/contributing/releasing.html
+++ b/content/contributing/releasing.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/contributing/source-and-builds.html b/content/contributing/source-and-builds.html
index 2e7d5fc..cbfd2d4 100644
--- a/content/contributing/source-and-builds.html
+++ b/content/contributing/source-and-builds.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -147,7 +148,7 @@ Apache and GitHub environments for development. This repository is mirrored and
 </code></pre><p>For more about using version control systems at Apache, see the ASF&rsquo;s
 <a href="https://www.apache.org/dev/#version-control">Source Code Repositories</a> page.</p>
 <h3 id="building-and-using-celix">Building and using Celix</h3>
-<p>How to build and use Celix is described within our &lsquo;Docs&rsquo; section which can be found <a href="/docs/2.2.1/docs.html">here</a> for the latest release.</p>
+<p>How to build and use Celix is described within our &lsquo;Docs&rsquo; section which can be found <a href="/docs/2.3.0/docs.html">here</a> for the latest release.</p>
 <h2 id="website-source-repository">Website source repository</h2>
 <p>The website Celix provides - <a href="https://celix.apache.org">https://celix.apache.org</a> - is mostly written in Markdown and build using <a href="https://gohugo.io/">Hugo</a>.
 The website source code repository can be obtained using</p>
diff --git a/content/contributing/submitting-patches.html b/content/contributing/submitting-patches.html
index a43ff73..b5f4061 100644
--- a/content/contributing/submitting-patches.html
+++ b/content/contributing/submitting-patches.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/contributing/volunteers.html b/content/contributing/volunteers.html
index 7f0067a..f931bf0 100644
--- a/content/contributing/volunteers.html
+++ b/content/contributing/volunteers.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/contributing/youatcelix.html b/content/contributing/youatcelix.html
index eed226d..e19892e 100644
--- a/content/contributing/youatcelix.html
+++ b/content/contributing/youatcelix.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs.html b/content/docs.html
index 680a672..03b375d 100644
--- a/content/docs.html
+++ b/content/docs.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/CHANGES.html b/content/docs/2.1.0/celix/CHANGES.html
index 6b5d891..d404bc7 100644
--- a/content/docs/2.1.0/celix/CHANGES.html
+++ b/content/docs/2.1.0/celix/CHANGES.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/README.html b/content/docs/2.1.0/celix/README.html
index 69e6417..e19583a 100644
--- a/content/docs/2.1.0/celix/README.html
+++ b/content/docs/2.1.0/celix/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/config_admin/readme.html b/content/docs/2.1.0/celix/config_admin/readme.html
index 9a96ff1..13a5e58 100644
--- a/content/docs/2.1.0/celix/config_admin/readme.html
+++ b/content/docs/2.1.0/celix/config_admin/readme.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/dependency_manager/readme.html b/content/docs/2.1.0/celix/dependency_manager/readme.html
index b6f56a0..c4959ed 100644
--- a/content/docs/2.1.0/celix/dependency_manager/readme.html
+++ b/content/docs/2.1.0/celix/dependency_manager/readme.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/dependency_manager_cxx/readme.html b/content/docs/2.1.0/celix/dependency_manager_cxx/readme.html
index 3e1fba6..45b9953 100644
--- a/content/docs/2.1.0/celix/dependency_manager_cxx/readme.html
+++ b/content/docs/2.1.0/celix/dependency_manager_cxx/readme.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/deployment_admin/README.html b/content/docs/2.1.0/celix/deployment_admin/README.html
index 85bd5ab..567dee4 100644
--- a/content/docs/2.1.0/celix/deployment_admin/README.html
+++ b/content/docs/2.1.0/celix/deployment_admin/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/device_access/README.html b/content/docs/2.1.0/celix/device_access/README.html
index 1dfe4f9..9a43702 100644
--- a/content/docs/2.1.0/celix/device_access/README.html
+++ b/content/docs/2.1.0/celix/device_access/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/building/readme.html b/content/docs/2.1.0/celix/documents/building/readme.html
index d31c3db..ed59629 100644
--- a/content/docs/2.1.0/celix/documents/building/readme.html
+++ b/content/docs/2.1.0/celix/documents/building/readme.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/cmake_commands/readme.html b/content/docs/2.1.0/celix/documents/cmake_commands/readme.html
index c3903db..c21ad81 100644
--- a/content/docs/2.1.0/celix/documents/cmake_commands/readme.html
+++ b/content/docs/2.1.0/celix/documents/cmake_commands/readme.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/getting_started/creating_a_simple_bundle.html b/content/docs/2.1.0/celix/documents/getting_started/creating_a_simple_bundle.html
index 636c64a..5281d45 100644
--- a/content/docs/2.1.0/celix/documents/getting_started/creating_a_simple_bundle.html
+++ b/content/docs/2.1.0/celix/documents/getting_started/creating_a_simple_bundle.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/getting_started/readme.html b/content/docs/2.1.0/celix/documents/getting_started/readme.html
index 9a1e23f..e55d2d6 100644
--- a/content/docs/2.1.0/celix/documents/getting_started/readme.html
+++ b/content/docs/2.1.0/celix/documents/getting_started/readme.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/getting_started/using_services_with_c.html b/content/docs/2.1.0/celix/documents/getting_started/using_services_with_c.html
index 084fba0..1e92b4a 100644
--- a/content/docs/2.1.0/celix/documents/getting_started/using_services_with_c.html
+++ b/content/docs/2.1.0/celix/documents/getting_started/using_services_with_c.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/getting_started/using_services_with_cxx.html b/content/docs/2.1.0/celix/documents/getting_started/using_services_with_cxx.html
index a97c3e0..e2b77df 100644
--- a/content/docs/2.1.0/celix/documents/getting_started/using_services_with_cxx.html
+++ b/content/docs/2.1.0/celix/documents/getting_started/using_services_with_cxx.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/intro/readme.html b/content/docs/2.1.0/celix/documents/intro/readme.html
index 6ccf2da..2d7c4d7 100644
--- a/content/docs/2.1.0/celix/documents/intro/readme.html
+++ b/content/docs/2.1.0/celix/documents/intro/readme.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/roadmap/api_v3/readme.html b/content/docs/2.1.0/celix/documents/roadmap/api_v3/readme.html
index e33e16c..82c78c1 100644
--- a/content/docs/2.1.0/celix/documents/roadmap/api_v3/readme.html
+++ b/content/docs/2.1.0/celix/documents/roadmap/api_v3/readme.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/roadmap/improvement_ideas.html b/content/docs/2.1.0/celix/documents/roadmap/improvement_ideas.html
index ad0f4b3..b47c1f2 100644
--- a/content/docs/2.1.0/celix/documents/roadmap/improvement_ideas.html
+++ b/content/docs/2.1.0/celix/documents/roadmap/improvement_ideas.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/roadmap/roadmap.html b/content/docs/2.1.0/celix/documents/roadmap/roadmap.html
index caf2b7b..278af37 100644
--- a/content/docs/2.1.0/celix/documents/roadmap/roadmap.html
+++ b/content/docs/2.1.0/celix/documents/roadmap/roadmap.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/documents/subprojects/readme.html b/content/docs/2.1.0/celix/documents/subprojects/readme.html
index 784b298..e98ffde 100644
--- a/content/docs/2.1.0/celix/documents/subprojects/readme.html
+++ b/content/docs/2.1.0/celix/documents/subprojects/readme.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/etcdlib/README.html b/content/docs/2.1.0/celix/etcdlib/README.html
index 84661db..de69710 100644
--- a/content/docs/2.1.0/celix/etcdlib/README.html
+++ b/content/docs/2.1.0/celix/etcdlib/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/launcher/README.html b/content/docs/2.1.0/celix/launcher/README.html
index a07ced8..7e353f3 100644
--- a/content/docs/2.1.0/celix/launcher/README.html
+++ b/content/docs/2.1.0/celix/launcher/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/log_service/README.html b/content/docs/2.1.0/celix/log_service/README.html
index 081e64d..97c4eae 100644
--- a/content/docs/2.1.0/celix/log_service/README.html
+++ b/content/docs/2.1.0/celix/log_service/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/log_writer/README.html b/content/docs/2.1.0/celix/log_writer/README.html
index 90611e0..c3237e9 100644
--- a/content/docs/2.1.0/celix/log_writer/README.html
+++ b/content/docs/2.1.0/celix/log_writer/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/pubsub/README.html b/content/docs/2.1.0/celix/pubsub/README.html
index ac1d4cd..3278374 100644
--- a/content/docs/2.1.0/celix/pubsub/README.html
+++ b/content/docs/2.1.0/celix/pubsub/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/pubsub/examples/keys/README.html b/content/docs/2.1.0/celix/pubsub/examples/keys/README.html
index 7da203f..58c51ca 100644
--- a/content/docs/2.1.0/celix/pubsub/examples/keys/README.html
+++ b/content/docs/2.1.0/celix/pubsub/examples/keys/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/pubsub/pubsub_admin_udp_mc/README.html b/content/docs/2.1.0/celix/pubsub/pubsub_admin_udp_mc/README.html
index f01d3d3..e3c8f0d 100644
--- a/content/docs/2.1.0/celix/pubsub/pubsub_admin_udp_mc/README.html
+++ b/content/docs/2.1.0/celix/pubsub/pubsub_admin_udp_mc/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/remote_services/README.html b/content/docs/2.1.0/celix/remote_services/README.html
index 69e4fab..bc401ae 100644
--- a/content/docs/2.1.0/celix/remote_services/README.html
+++ b/content/docs/2.1.0/celix/remote_services/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/remote_services/discovery_etcd/README.html b/content/docs/2.1.0/celix/remote_services/discovery_etcd/README.html
index 2f1f692..a530126 100644
--- a/content/docs/2.1.0/celix/remote_services/discovery_etcd/README.html
+++ b/content/docs/2.1.0/celix/remote_services/discovery_etcd/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/remote_services/remote_service_admin/README.html b/content/docs/2.1.0/celix/remote_services/remote_service_admin/README.html
index 00248c0..63c11aa 100644
--- a/content/docs/2.1.0/celix/remote_services/remote_service_admin/README.html
+++ b/content/docs/2.1.0/celix/remote_services/remote_service_admin/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/remote_services/topology_manager/README.html b/content/docs/2.1.0/celix/remote_services/topology_manager/README.html
index 380907b..daca18a 100644
--- a/content/docs/2.1.0/celix/remote_services/topology_manager/README.html
+++ b/content/docs/2.1.0/celix/remote_services/topology_manager/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/remote_shell/README.html b/content/docs/2.1.0/celix/remote_shell/README.html
index bbb99d3..b53e780 100644
--- a/content/docs/2.1.0/celix/remote_shell/README.html
+++ b/content/docs/2.1.0/celix/remote_shell/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/shell/README.html b/content/docs/2.1.0/celix/shell/README.html
index 6f7575f..638daf6 100644
--- a/content/docs/2.1.0/celix/shell/README.html
+++ b/content/docs/2.1.0/celix/shell/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/shell_tui/README.html b/content/docs/2.1.0/celix/shell_tui/README.html
index f909ba8..a2bd1ca 100644
--- a/content/docs/2.1.0/celix/shell_tui/README.html
+++ b/content/docs/2.1.0/celix/shell_tui/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/utils/README.html b/content/docs/2.1.0/celix/utils/README.html
index ee60f66..207aa4c 100644
--- a/content/docs/2.1.0/celix/utils/README.html
+++ b/content/docs/2.1.0/celix/utils/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/utils/docs/thpool/Design.html b/content/docs/2.1.0/celix/utils/docs/thpool/Design.html
index 062d7db..8a338c1 100644
--- a/content/docs/2.1.0/celix/utils/docs/thpool/Design.html
+++ b/content/docs/2.1.0/celix/utils/docs/thpool/Design.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/utils/docs/thpool/FAQ.html b/content/docs/2.1.0/celix/utils/docs/thpool/FAQ.html
index 1edaccc..1db6840 100644
--- a/content/docs/2.1.0/celix/utils/docs/thpool/FAQ.html
+++ b/content/docs/2.1.0/celix/utils/docs/thpool/FAQ.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/utils/docs/thpool/README.html b/content/docs/2.1.0/celix/utils/docs/thpool/README.html
index 9c3b37b..d32d0cf 100644
--- a/content/docs/2.1.0/celix/utils/docs/thpool/README.html
+++ b/content/docs/2.1.0/celix/utils/docs/thpool/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/celix/utils/public/include/memstream/README.html b/content/docs/2.1.0/celix/utils/public/include/memstream/README.html
index c7cebaa..40870cd 100644
--- a/content/docs/2.1.0/celix/utils/public/include/memstream/README.html
+++ b/content/docs/2.1.0/celix/utils/public/include/memstream/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.1.0/docs.html b/content/docs/2.1.0/docs.html
index b0e9c4e..09f2da5 100644
--- a/content/docs/2.1.0/docs.html
+++ b/content/docs/2.1.0/docs.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.2.1/celix/CHANGES.html b/content/docs/2.2.1/celix/CHANGES.html
index 38568f3..a13371a 100644
--- a/content/docs/2.2.1/celix/CHANGES.html
+++ b/content/docs/2.2.1/celix/CHANGES.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/CHANGES.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
@@ -148,7 +162,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 <h1 id="changes-for-221">Changes for 2.2.1</h1>
-<h1 id="fixes">Fixes</h1>
+<h2 id="fixes">Fixes</h2>
 <ul>
 <li>Fixes etcdlib CMake setup to that etcdlib can be build as a separate project</li>
 </ul>
diff --git a/content/docs/2.2.1/celix/README.html b/content/docs/2.2.1/celix/README.html
index 732cf8f..070d7b7 100644
--- a/content/docs/2.2.1/celix/README.html
+++ b/content/docs/2.2.1/celix/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/deployment_admin/README.html b/content/docs/2.2.1/celix/bundles/deployment_admin/README.html
index dceb98b..6087de8 100644
--- a/content/docs/2.2.1/celix/bundles/deployment_admin/README.html
+++ b/content/docs/2.2.1/celix/bundles/deployment_admin/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/deployment_admin/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/device_access/README.html b/content/docs/2.2.1/celix/bundles/device_access/README.html
index c4244f3..a6c5112 100644
--- a/content/docs/2.2.1/celix/bundles/device_access/README.html
+++ b/content/docs/2.2.1/celix/bundles/device_access/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/device_access/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/device_access/example/base_driver/README.html b/content/docs/2.2.1/celix/bundles/device_access/example/base_driver/README.html
index a6b86ba..f09bc57 100644
--- a/content/docs/2.2.1/celix/bundles/device_access/example/base_driver/README.html
+++ b/content/docs/2.2.1/celix/bundles/device_access/example/base_driver/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/device_access/example/base_driver/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/device_access/example/consuming_driver/README.html b/content/docs/2.2.1/celix/bundles/device_access/example/consuming_driver/README.html
index b92a069..9984f24 100644
--- a/content/docs/2.2.1/celix/bundles/device_access/example/consuming_driver/README.html
+++ b/content/docs/2.2.1/celix/bundles/device_access/example/consuming_driver/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/device_access/example/consuming_driver/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/device_access/example/refining_driver/README.html b/content/docs/2.2.1/celix/bundles/device_access/example/refining_driver/README.html
index a6559bd..da6a4d5 100644
--- a/content/docs/2.2.1/celix/bundles/device_access/example/refining_driver/README.html
+++ b/content/docs/2.2.1/celix/bundles/device_access/example/refining_driver/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/device_access/example/refining_driver/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/http_admin/README.html b/content/docs/2.2.1/celix/bundles/http_admin/README.html
index 08ffa0c..2141bb4 100644
--- a/content/docs/2.2.1/celix/bundles/http_admin/README.html
+++ b/content/docs/2.2.1/celix/bundles/http_admin/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/http_admin/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/logging/log_service/README.html b/content/docs/2.2.1/celix/bundles/logging/log_service/README.html
index aaac3e9..15283e1 100644
--- a/content/docs/2.2.1/celix/bundles/logging/log_service/README.html
+++ b/content/docs/2.2.1/celix/bundles/logging/log_service/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/logging/log_service/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/logging/log_writer/README.html b/content/docs/2.2.1/celix/bundles/logging/log_writer/README.html
index 372e69f..44a916d 100644
--- a/content/docs/2.2.1/celix/bundles/logging/log_writer/README.html
+++ b/content/docs/2.2.1/celix/bundles/logging/log_writer/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/logging/log_writer/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/pubsub/README.html b/content/docs/2.2.1/celix/bundles/pubsub/README.html
index d880c1d..b4a6687 100644
--- a/content/docs/2.2.1/celix/bundles/pubsub/README.html
+++ b/content/docs/2.2.1/celix/bundles/pubsub/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/pubsub/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/pubsub/examples/keys/README.html b/content/docs/2.2.1/celix/bundles/pubsub/examples/keys/README.html
index cb15ffe..b2f963a 100644
--- a/content/docs/2.2.1/celix/bundles/pubsub/examples/keys/README.html
+++ b/content/docs/2.2.1/celix/bundles/pubsub/examples/keys/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/pubsub/examples/keys/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html b/content/docs/2.2.1/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html
index 433454f..4191f46 100644
--- a/content/docs/2.2.1/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html
+++ b/content/docs/2.2.1/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/pubsub/pubsub_admin_udp_mc/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/README.html b/content/docs/2.2.1/celix/bundles/remote_services/README.html
index b231f51..e25eaad 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/README.html
+++ b/content/docs/2.2.1/celix/bundles/remote_services/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/remote_services/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/discovery_etcd/README.html b/content/docs/2.2.1/celix/bundles/remote_services/discovery_etcd/README.html
index 52da165..9366467 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/discovery_etcd/README.html
+++ b/content/docs/2.2.1/celix/bundles/remote_services/discovery_etcd/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/remote_services/discovery_etcd/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/remote_service_admin_dfi/README.html b/content/docs/2.2.1/celix/bundles/remote_services/remote_service_admin_dfi/README.html
index 4513224..85b8ca7 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/remote_service_admin_dfi/README.html
+++ b/content/docs/2.2.1/celix/bundles/remote_services/remote_service_admin_dfi/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/remote_services/remote_service_admin_dfi/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/remote_services_api/README.html b/content/docs/2.2.1/celix/bundles/remote_services/remote_services_api/README.html
index d628fee..84c8cb4 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/remote_services_api/README.html
+++ b/content/docs/2.2.1/celix/bundles/remote_services/remote_services_api/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/remote_services/remote_services_api/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/rsa_spi/README.html b/content/docs/2.2.1/celix/bundles/remote_services/rsa_spi/README.html
index 862751e..84c8cb4 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/rsa_spi/README.html
+++ b/content/docs/2.2.1/celix/bundles/remote_services/rsa_spi/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/remote_services/rsa_spi/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/topology_manager/README.html b/content/docs/2.2.1/celix/bundles/remote_services/topology_manager/README.html
index f188fd8..7839014 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/topology_manager/README.html
+++ b/content/docs/2.2.1/celix/bundles/remote_services/topology_manager/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/remote_services/topology_manager/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/shell/remote_shell/README.html b/content/docs/2.2.1/celix/bundles/shell/remote_shell/README.html
index a1d608b..3fa0232 100644
--- a/content/docs/2.2.1/celix/bundles/shell/remote_shell/README.html
+++ b/content/docs/2.2.1/celix/bundles/shell/remote_shell/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/shell/remote_shell/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/shell/shell/README.html b/content/docs/2.2.1/celix/bundles/shell/shell/README.html
index 0e55816..44d74ec 100644
--- a/content/docs/2.2.1/celix/bundles/shell/shell/README.html
+++ b/content/docs/2.2.1/celix/bundles/shell/shell/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/shell/shell/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/shell/shell_tui/README.html b/content/docs/2.2.1/celix/bundles/shell/shell_tui/README.html
index 94f639c..f87a820 100644
--- a/content/docs/2.2.1/celix/bundles/shell/shell_tui/README.html
+++ b/content/docs/2.2.1/celix/bundles/shell/shell_tui/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/shell/shell_tui/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/shell/shell_wui/README.html b/content/docs/2.2.1/celix/bundles/shell/shell_wui/README.html
index 3fc3daf..d9b0d33 100644
--- a/content/docs/2.2.1/celix/bundles/shell/shell_wui/README.html
+++ b/content/docs/2.2.1/celix/bundles/shell/shell_wui/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/shell/shell_wui/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/documents/building/README.html b/content/docs/2.2.1/celix/documents/building/README.html
index 15fe496..96915c6 100644
--- a/content/docs/2.2.1/celix/documents/building/README.html
+++ b/content/docs/2.2.1/celix/documents/building/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/building/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/documents/cmake_commands/README.html b/content/docs/2.2.1/celix/documents/cmake_commands/README.html
index d1a7028..8a6db21 100644
--- a/content/docs/2.2.1/celix/documents/cmake_commands/README.html
+++ b/content/docs/2.2.1/celix/documents/cmake_commands/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/cmake_commands/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/documents/getting_started/README.html b/content/docs/2.2.1/celix/documents/getting_started/README.html
index 8fa6999..0021db2 100644
--- a/content/docs/2.2.1/celix/documents/getting_started/README.html
+++ b/content/docs/2.2.1/celix/documents/getting_started/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/getting_started/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/documents/getting_started/creating_a_simple_bundle.html b/content/docs/2.2.1/celix/documents/getting_started/creating_a_simple_bundle.html
index 41b987d..1965bf6 100644
--- a/content/docs/2.2.1/celix/documents/getting_started/creating_a_simple_bundle.html
+++ b/content/docs/2.2.1/celix/documents/getting_started/creating_a_simple_bundle.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/getting_started/creating_a_simple_bundle.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/documents/getting_started/using_services_with_c.html b/content/docs/2.2.1/celix/documents/getting_started/using_services_with_c.html
index 8848460..d5207f8 100644
--- a/content/docs/2.2.1/celix/documents/getting_started/using_services_with_c.html
+++ b/content/docs/2.2.1/celix/documents/getting_started/using_services_with_c.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/getting_started/using_services_with_c.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/documents/getting_started/using_services_with_cxx.html b/content/docs/2.2.1/celix/documents/getting_started/using_services_with_cxx.html
index bed5b9a..65d7daa 100644
--- a/content/docs/2.2.1/celix/documents/getting_started/using_services_with_cxx.html
+++ b/content/docs/2.2.1/celix/documents/getting_started/using_services_with_cxx.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/getting_started/using_services_with_cxx.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/documents/intro/README.html b/content/docs/2.2.1/celix/documents/intro/README.html
index e0073cf..34bdfda 100644
--- a/content/docs/2.2.1/celix/documents/intro/README.html
+++ b/content/docs/2.2.1/celix/documents/intro/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/intro/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/documents/subprojects/README.html b/content/docs/2.2.1/celix/documents/subprojects/README.html
index e347ed2..5fc5212 100644
--- a/content/docs/2.2.1/celix/documents/subprojects/README.html
+++ b/content/docs/2.2.1/celix/documents/subprojects/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/subprojects/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/examples/celix-examples/README.html b/content/docs/2.2.1/celix/examples/celix-examples/README.html
index 5c4b448..a145732 100644
--- a/content/docs/2.2.1/celix/examples/celix-examples/README.html
+++ b/content/docs/2.2.1/celix/examples/celix-examples/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/examples/celix-examples/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/examples/celix-examples/http_example/README.html b/content/docs/2.2.1/celix/examples/celix-examples/http_example/README.html
index 3c1d611..6f195e6 100644
--- a/content/docs/2.2.1/celix/examples/celix-examples/http_example/README.html
+++ b/content/docs/2.2.1/celix/examples/celix-examples/http_example/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/examples/celix-examples/http_example/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html b/content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html
index 85aeca0..3c167b4 100644
--- a/content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html
+++ b/content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/examples/celix-examples/services_example_c/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/dependency_manager/README.html b/content/docs/2.2.1/celix/libs/dependency_manager/README.html
index 8bbb760..b12b66a 100644
--- a/content/docs/2.2.1/celix/libs/dependency_manager/README.html
+++ b/content/docs/2.2.1/celix/libs/dependency_manager/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/dependency_manager/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/dependency_manager/TODO.html b/content/docs/2.2.1/celix/libs/dependency_manager/TODO.html
index b0c86fb..e238ca4 100644
--- a/content/docs/2.2.1/celix/libs/dependency_manager/TODO.html
+++ b/content/docs/2.2.1/celix/libs/dependency_manager/TODO.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/dependency_manager/TODO.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/dependency_manager_cxx/README.html b/content/docs/2.2.1/celix/libs/dependency_manager_cxx/README.html
index 91a6403..33adc57 100644
--- a/content/docs/2.2.1/celix/libs/dependency_manager_cxx/README.html
+++ b/content/docs/2.2.1/celix/libs/dependency_manager_cxx/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/dependency_manager_cxx/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/dependency_manager_cxx/TODO.html b/content/docs/2.2.1/celix/libs/dependency_manager_cxx/TODO.html
index 8a9a798..a7fba21 100644
--- a/content/docs/2.2.1/celix/libs/dependency_manager_cxx/TODO.html
+++ b/content/docs/2.2.1/celix/libs/dependency_manager_cxx/TODO.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/dependency_manager_cxx/TODO.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/etcdlib/README.html b/content/docs/2.2.1/celix/libs/etcdlib/README.html
index d47d5e9..9b0058f 100644
--- a/content/docs/2.2.1/celix/libs/etcdlib/README.html
+++ b/content/docs/2.2.1/celix/libs/etcdlib/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/etcdlib/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/launcher/README.html b/content/docs/2.2.1/celix/libs/launcher/README.html
index 4f44f2f..837e8e7 100644
--- a/content/docs/2.2.1/celix/libs/launcher/README.html
+++ b/content/docs/2.2.1/celix/libs/launcher/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/launcher/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/utils/README.html b/content/docs/2.2.1/celix/libs/utils/README.html
index 80f92b7..1c50664 100644
--- a/content/docs/2.2.1/celix/libs/utils/README.html
+++ b/content/docs/2.2.1/celix/libs/utils/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/utils/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/utils/docs/thpool/Design.html b/content/docs/2.2.1/celix/libs/utils/docs/thpool/Design.html
index 248e51c..5f66b95 100644
--- a/content/docs/2.2.1/celix/libs/utils/docs/thpool/Design.html
+++ b/content/docs/2.2.1/celix/libs/utils/docs/thpool/Design.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/utils/docs/thpool/Design.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/utils/docs/thpool/FAQ.html b/content/docs/2.2.1/celix/libs/utils/docs/thpool/FAQ.html
index 0abb7a8..f0ed47b 100644
--- a/content/docs/2.2.1/celix/libs/utils/docs/thpool/FAQ.html
+++ b/content/docs/2.2.1/celix/libs/utils/docs/thpool/FAQ.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/utils/docs/thpool/FAQ.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/utils/docs/thpool/README.html b/content/docs/2.2.1/celix/libs/utils/docs/thpool/README.html
index d58b900..2a2b84d 100644
--- a/content/docs/2.2.1/celix/libs/utils/docs/thpool/README.html
+++ b/content/docs/2.2.1/celix/libs/utils/docs/thpool/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/utils/docs/thpool/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/libs/utils/include/memstream/README.html b/content/docs/2.2.1/celix/libs/utils/include/memstream/README.html
index 9952e61..8c811eb 100644
--- a/content/docs/2.2.1/celix/libs/utils/include/memstream/README.html
+++ b/content/docs/2.2.1/celix/libs/utils/include/memstream/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/libs/utils/include/memstream/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/misc/experimental/README.html b/content/docs/2.2.1/celix/misc/experimental/README.html
index c16e567..56c1b56 100644
--- a/content/docs/2.2.1/celix/misc/experimental/README.html
+++ b/content/docs/2.2.1/celix/misc/experimental/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/misc/experimental/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/celix/misc/experimental/bundles/config_admin/README.html b/content/docs/2.2.1/celix/misc/experimental/bundles/config_admin/README.html
index 0eba5fa..df09b2c 100644
--- a/content/docs/2.2.1/celix/misc/experimental/bundles/config_admin/README.html
+++ b/content/docs/2.2.1/celix/misc/experimental/bundles/config_admin/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,8 +137,6 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/misc/experimental/bundles/config_admin/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
diff --git a/content/docs/2.2.1/docs.html b/content/docs/2.2.1/docs.html
index 98b6cd6..3a8ed02 100644
--- a/content/docs/2.2.1/docs.html
+++ b/content/docs/2.2.1/docs.html
@@ -65,7 +65,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
diff --git a/content/docs/2.2.1/celix/CHANGES.html b/content/docs/2.3.0/celix/CHANGES.html
similarity index 91%
copy from content/docs/2.2.1/celix/CHANGES.html
copy to content/docs/2.3.0/celix/CHANGES.html
index 38568f3..4eb7c46 100644
--- a/content/docs/2.2.1/celix/CHANGES.html
+++ b/content/docs/2.3.0/celix/CHANGES.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -147,21 +163,75 @@ 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.
 -->
-<h1 id="changes-for-221">Changes for 2.2.1</h1>
-<h1 id="fixes">Fixes</h1>
+<h1 id="noteworthy-changes-for-230-2022-07-10">Noteworthy changes for 2.3.0 (2022-07-10)</h1>
+<h2 id="new-features">New Features</h2>
+<ul>
+<li>Support for Conan package manager</li>
+<li>Async api to (un0)register services, track services, track bundles and create/remove components.</li>
+<li>C++17 API.</li>
+<li>Celix Promises (experimental)</li>
+<li>Celix PushStreams (experimental)</li>
+<li>C++ Remote Service Admin (experimental)</li>
+<li>Refactored LogAdmin</li>
+</ul>
+<h2 id="improvements">Improvements</h2>
+<ul>
+<li>Build
+<ul>
+<li>multi build type support</li>
+</ul>
+</li>
+<li>Added celix_ api for
+<ul>
+<li>long and string hash map</li>
+<li>shell command</li>
+<li>logging</li>
+</ul>
+</li>
+<li>Added C++17 api for
+<ul>
+<li>BundleContext (service registration, service trackers, use services, bundle trackers)</li>
+<li>BundleActivator</li>
+<li>Framework</li>
+<li>LogHelper</li>
+<li>IShellCommand</li>
+<li>Filter</li>
+<li>Properties</li>
+<li>Utils</li>
+</ul>
+</li>
+<li>Remote Services
+<ul>
+<li>Interceptors support</li>
+</ul>
+</li>
+<li>PubSub
+<ul>
+<li>Interceptors</li>
+<li>Wire protocol service support</li>
+<li>Refactored message serialization</li>
+</ul>
+</li>
+</ul>
+<h2 id="fixes">Fixes</h2>
+<ul>
+<li>Too many to mention</li>
+</ul>
+<h1 id="changes-for-221-2020-05-10">Changes for 2.2.1 (2020-05-10)</h1>
+<h2 id="fixes-1">Fixes</h2>
 <ul>
 <li>Fixes etcdlib CMake setup to that etcdlib can be build as a separate project</li>
 </ul>
-<h1 id="changes-for-220">Changes for 2.2.0</h1>
-<h2 id="new-features">New features:</h2>
+<h1 id="noteworthy-changes-for-220-2020-01-06">Noteworthy changes for 2.2.0 (2020-01-06)</h1>
+<h2 id="new-features-1">New features:</h2>
 <ul>
 <li>PubSub TCP (donation)</li>
 <li>PubSub Avro bin serializer</li>
 <li>PubSub Websocket (donation)</li>
 <li>HTTP Admin (donation)</li>
-<li>Shell Web UI (using HTTP Admin) d</li>
+<li>Shell Web UI (using HTTP Admin)</li>
 </ul>
-<h2 id="improvements">Improvements</h2>
+<h2 id="improvements-1">Improvements</h2>
 <ul>
 <li>CELIX-438: Refactored celix api so that include files and symbols have a _celix &ldquo;namespace&rdquo;</li>
 <li>CELIX-459: Adds PubSub health/usage monitoring</li>
@@ -175,8 +245,8 @@ limitations under the License.
 <li>CELIX-460: Fixed issue with msg not found in pub/sub serializer map due to signed/unsigned difference</li>
 <li>CELIX-466: Fixed race condition Race condition in adding/removing service listener hooks</li>
 </ul>
-<h1 id="changes-for-210">Changes for 2.1.0</h1>
-<h2 id="new-features-1">New Features:</h2>
+<h1 id="noteworthy-changes-for-210-2018-01-24">Noteworthy changes for 2.1.0 (2018-01-24)</h1>
+<h2 id="new-features-2">New Features:</h2>
 <ul>
 <li>CELIX-408: Adds support for generating runtime shell scripts so that multiple Celix containers and other executable can be run with a single command.</li>
 <li>CELIX-418: Adds support for generating properties in the Celix container launcher.</li>
@@ -187,7 +257,7 @@ limitations under the License.
 <li>CELIX-385: Adds etcdlib as library. This libray can be used to communicate with etcd using a C abstraction.</li>
 <li>CELIX-370: Adds C++11 support by adding a C++ Dependency Manager library. This is moslty a header based library.</li>
 </ul>
-<h2 id="improvements-1">Improvements:</h2>
+<h2 id="improvements-2">Improvements:</h2>
 <ul>
 <li>CELIX-415: Improves handling of ANSI control sequences to better support running in IDE&rsquo;s.</li>
 <li>CELIX-414: Improves support for running Celix container inside IDE&rsquo;s by basicly handling Celix containers as add_executable CMake target.</li>
@@ -212,8 +282,8 @@ limitations under the License.
 <li>CELIX-387: Fixes an issue with the travis build and OSX</li>
 <li>CELIX-386: Fixes an issue with the C++ dependency manager and register multiple C++ services.</li>
 </ul>
-<h1 id="changes-for-200">Changes for 2.0.0</h1>
-<h2 id="new-features-2">New Features</h2>
+<h1 id="changes-for-200-2016-10-26">Changes for 2.0.0 (2016-10-26)</h1>
+<h2 id="new-features-3">New Features</h2>
 <ul>
 <li>CELIX-77 Configuration Admin Implementation</li>
 <li>CELIX-116 Event admin</li>
@@ -223,7 +293,7 @@ limitations under the License.
 <li>CELIX-269 New Dependency Manager</li>
 <li>CELIX-370 Add C++ support</li>
 </ul>
-<h2 id="improvements-2">Improvements</h2>
+<h2 id="improvements-3">Improvements</h2>
 <ul>
 <li>CELIX-63 make cmake directory useable for custom bundle projects</li>
 <li>CELIX-66 Refactor shell service struct</li>
diff --git a/content/docs/2.3.0/celix/README.html b/content/docs/2.3.0/celix/README.html
new file mode 100644
index 0000000..9d0ccac
--- /dev/null
+++ b/content/docs/2.3.0/celix/README.html
@@ -0,0 +1,473 @@
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <title>README.md / Apache Celix</title>
+
+    
+    <link rel="icon" href="/assets/img/favicon.ico">
+
+    
+    <link href="/assets/css/bootstrap.min.css" rel="stylesheet">
+
+    
+    <link href="/assets/css/style.css" rel="stylesheet">
+
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
+    
+<script>
+  var _paq = window._paq = window._paq || [];
+   
+  _paq.push(['disableCookies']);
+   
+  _paq.push(['trackPageView']);
+  _paq.push(['enableLinkTracking']);
+  (function() {
+    var u="https://analytics.apache.org/";
+    _paq.push(['setTrackerUrl', u+'matomo.php']);
+    _paq.push(['setSiteId', '9']);
+    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+  })();
+</script>
+
+
+</head>
+<body class="light-grey">
+
+<a href="https://github.com/apache/celix" class="github-ribbon">
+    <img src="/assets/img/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
+</a>
+
+
+<nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top">
+    <div class="container">
+        <a class="navbar-brand" href="/">
+            <img src="/assets/img/celix-white.svg" height="40" class="d-inline-block align-top" alt="Celix Logo">
+        </a>
+        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+        </button>
+        <div class="collapse navbar-collapse" id="navbarResponsive">
+            <ul class="navbar-nav ml-auto">
+                <li class="nav-item">
+                    <a class="nav-link" href="/">Home</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" href="/download.cgi">Download</a>
+                </li>
+                <li class="nav-item dropdown active">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Docs
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddDocs">
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
+                        <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddContributing" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Contributing
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddContributing">
+                        <a class="dropdown-item" href="/contributing/youatcelix.html">You at Celix</a>
+                        <a class="dropdown-item" href="/contributing/submitting-patches.html">Submitting patches</a>
+                        <a class="dropdown-item" href="/contributing/source-and-builds.html">Source code and builds</a>
+                        <hr>
+                        <a class="dropdown-item" href="/contributing/releasing.html">Releasing</a>
+                        <a class="dropdown-item" href="/contributing/volunteers.html">Volunteers</a>
+                        <a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Celix.html">Board Reports</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddSupport" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Support
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddSupport">
+                        <a class="dropdown-item" href="/support/mailing-list.html">Mailing Lists</a>
+                        <a class="dropdown-item" href="/support/issue-tracking.html">Issue Tracking</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddFoundation" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        ASF
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddFoundation">
+                        <a class="dropdown-item" href="https://www.apache.org/">ASF Home</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/how-it-works.html">How it works</a>
+                        <a class="dropdown-item" href="https://www.apache.org/licenses/">License</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
+                        <a class="dropdown-item" href="https://www.apache.org/security/">Security</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a>
+                    </div>
+                </li>
+            </ul>
+        </div>
+    </div>
+</nav>
+
+
+<div class="section">
+    <div class="container">
+        <div class="row py-4">
+            <div class="col-sm-12 card">
+                <div class="card-body pt-5">
+                    
+                    
+                        
+                        
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                        
+                    
+
+                    
+                        
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                    
+
+                    
+	<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+<h1 id="apache-celix">Apache Celix</h1>
+<p><a href="https://opensource.org/licenses/Apache-2.0"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License"></a>
+<img src="https://github.com/apache/celix/workflows/Celix%20Ubuntu/badge.svg" alt="Celix Ubuntu">
+<img src="https://github.com/apache/celix/workflows/Celix%20MacOS/badge.svg" alt="Celix MacOS">
+<a href="https://codecov.io/gh/apache/celix"><img src="https://codecov.io/gh/apache/celix/branch/master/graph/badge.svg" alt="codecov"></a>
+<a href="https://scan.coverity.com/projects/6685"><img src="https://scan.coverity.com/projects/6685/badge.svg" alt="Coverity Scan Build Status"></a></p>
+<p>Apache Celix is an implementation of a dynamic service framework inspired by the OSGi specification and adapted to C
+and C++ (C++17).
+It is a framework to develop dynamic modular software applications using component and in-process service-oriented
+programming.</p>
+<h2 id="documentation">Documentation</h2>
+<ul>
+<li><a href="documents/building/README.html">Building Apache Celix</a></li>
+<li><a href="documents/README.html">Apache Celix Intro</a></li>
+</ul>
+<h2 id="c-usage">C++ Usage</h2>
+<h3 id="hello-world-bundle">Hello World Bundle</h3>
+<p>Modularity in Celix is achieved by runtime installable bundles and dynamic - in process - services.<br>
+A Celix bundle is set of resources packed in a zip containing at least a manifest and almost always
+some shared library containing the bundle functionality.
+A Celix bundle can be created using the Celix CMake function <code>add_celix_bundle</code>.
+A Celix bundle is activated by executing the bundle entry points. For C++ bundles these bundle entry points are generated using the <code>CELIX_GEN_CXX_BUNDLE_ACTIVATOR</code> macro.</p>
+<p>Celix applications (Celix containers) can be created with the Celix CMake function <code>add_celix_container</code>.
+This function generates a C++ main function and is also used to configure default installed bundles.
+This can be bundles provided by Celix, an other project or build by the project self.</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/MyBundleActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;iostream&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">MyBundleActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> MyBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello world from bundle with id </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>getBundleId() <span s [...]
+    }
+
+    <span style="color:#666">~</span>MyBundleActivator() <span style="color:#a2f;font-weight:bold">noexcept</span> {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Goodbye world</span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> std<span style="color:#666">:</span><span style="color:#666">:</span>endl;
+    }
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(MyBundleActivator)
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">MyBundle</span>
+    <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/MyBundleActivator.cc</span>
+)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">MyContainer</span>
+    <span style="color:#b44">BUNDLES</span>
+        <span style="color:#b44">Celix::ShellCxx</span>
+        <span style="color:#b44">Celix::shell_tui</span>
+        <span style="color:#b44">MyBundle</span>
+)<span style="">
+</span></code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-sh" data-lang="sh"><span style="color:#080;font-style:italic">#bash</span>
+<span style="color:#080;font-style:italic">#goto project dir</span>
+<span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
+<span style="color:#a2f">cd</span> deploy/MyContainer
+./MyContainer
+<span style="color:#080;font-style:italic">#Celix shell</span>
+-&gt; lb -a
+<span style="color:#080;font-style:italic">#list of all installed bundles</span>
+-&gt; <span style="color:#a2f">help</span>
+<span style="color:#080;font-style:italic">#list of all available Celix shell commands</span>
+-&gt; <span style="color:#a2f">help</span> celix::lb
+<span style="color:#080;font-style:italic">#Help info about the shell command `celix::lb`</span>
+-&gt; stop <span style="color:#666">3</span>
+<span style="color:#080;font-style:italic">#stops MyBundle</span>
+-&gt; start <span style="color:#666">3</span>
+<span style="color:#080;font-style:italic">#starts MyBundle</span>
+-&gt; stop <span style="color:#666">0</span> 
+<span style="color:#080;font-style:italic">#stops the Celix framework</span>
+</code></pre></div><h3 id="register-a-service">Register a service</h3>
+<p>In the Celix framework, a service is a C++ object or C struct registered in the Celix framework service registry under one interface together with properties (meta information). Services can be discovered and used by bundles.</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//include/ICalc.h
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">pragma once</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ICalc</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#666">~</span>ICalc() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
+    <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">add</span>(<span style="color:#0b0;font-weight:bold">int</span> a, <span style="color:#0b0;font-weight:bold">int</span> b) <span style="color:#666">=</span> <span style="color:#666">0</span>;
+};
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/CalcProviderBundleActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;ICalc.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">CalcProvider</span> <span style="color:#666">:</span> <span style="color:#a2f;font-weight:bold">public</span> ICalc {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#666">~</span>CalcProvider() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#a2f;font-weight:bold">override</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
+    <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">add</span>(<span style="color:#0b0;font-weight:bold">int</span> a, <span style="color:#0b0;font-weight:bold">int</span> b) <span style="color:#a2f;font-weight:bold">override</span> { <span style="color:#a2f;font-weight:bold">return</span> a <span style="color:#666">+</span> b; }
+};
+
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">CalcProviderBundleActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> CalcProviderBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        reg <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>registerService<span style="color:#666">&lt;</span>ICalc<span style="color:#666">&gt;</span>(std<span style="color:#666">:</span><span style="color:#666">:</span>make_shared<span style="color:#666">&lt;</span>CalcProvider<span style="color:#666">&gt;</span>())
+                .build();
+    }
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>ServiceRegistration<span style="color:#666">&gt;</span> reg{};
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(CalcProviderBundleActivator)
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">CalcProviderBundle</span>
+    <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/CalcProviderBundleActivator.cc</span>
+)<span style="">
+</span><span style=""></span><span style="color:#a2f">target_include_directories</span>(<span style="color:#b44">CalcProviderBundle</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">include</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">CalcProviderContainer</span>
+    <span style="color:#b44">BUNDLES</span>
+        <span style="color:#b44">Celix::ShellCxx</span>
+        <span style="color:#b44">Celix::shell_tui</span>
+        <span style="color:#b44">CalcProviderBundle</span>
+)<span style="">
+</span></code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#bash</span>
+<span style="color:#080;font-style:italic">#goto project dir</span>
+<span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
+<span style="color:#a2f">cd</span> deploy/CalcProviderBundle
+./CalcProviderBundle
+</code></pre></div><h3 id="use-a-service-ad-hoc">Use a service (ad hoc)</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//include/ICalc.h
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">pragma once</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ICalc</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#666">~</span>ICalc() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
+    <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">add</span>(<span style="color:#0b0;font-weight:bold">int</span> a, <span style="color:#0b0;font-weight:bold">int</span> b) <span style="color:#666">=</span> <span style="color:#666">0</span>;
+};
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/CalcUserBundleActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;iostream&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;ICalc.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">CalcUserBundleActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> CalcUserBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>useService<span style="color:#666">&lt;</span>ICalc<span style="color:#666">&gt;</span>()
+            .addUseCallback([](ICalc<span style="color:#666">&amp;</span> calc) {
+                std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">result is </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> calc.add(<span style="color:#666">2</span>, <span style="color:#666">3</span>) <span style="color:#666">&lt [...]
+            })
+            .setTimeout(std<span style="color:#666">:</span><span style="color:#666">:</span>chrono<span style="color:#666">:</span><span style="color:#666">:</span>seconds{<span style="color:#666">1</span>}) <span style="color:#080;font-style:italic">//wait for 1 second if a service is not directly found
+</span><span style="color:#080;font-style:italic"></span>            .build();
+    }
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(CalcUserBundleActivator)
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">CalcUserBundle</span>
+    <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/CalcUserBundleActivator.cc</span>
+)<span style="">
+</span><span style=""></span><span style="color:#a2f">target_include_directories</span>(<span style="color:#b44">CalcUserBundle</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">include</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">CalcUserContainer</span>
+    <span style="color:#b44">BUNDLES</span>
+        <span style="color:#b44">Celix::ShellCxx</span>
+        <span style="color:#b44">Celix::shell_tui</span>
+        <span style="color:#b44">CalcProviderBundle</span>
+        <span style="color:#b44">CalcUserBundle</span>
+)<span style="">
+</span></code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#bash</span>
+<span style="color:#080;font-style:italic">#goto project dir</span>
+<span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
+<span style="color:#a2f">cd</span> deploy/CalcUserContainer
+./CalcUserContainer
+</code></pre></div><h3 id="track-services">Track services</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//include/ICalc.h
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">pragma once</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ICalc</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#666">~</span>ICalc() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
+    <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">add</span>(<span style="color:#0b0;font-weight:bold">int</span> a, <span style="color:#0b0;font-weight:bold">int</span> b) <span style="color:#666">=</span> <span style="color:#666">0</span>;
+};
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/CalcTrackerBundleActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;mutex&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;ICalc.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">CalcTrackerBundleActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> CalcTrackerBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        tracker <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>trackServices<span style="color:#666">&lt;</span>ICalc<span style="color:#666">&gt;</span>()
+            .build();
+        <span style="color:#a2f;font-weight:bold">for</span> (<span style="color:#a2f;font-weight:bold">auto</span> <span style="color:#a0a000">calc</span> : tracker<span style="color:#666">-</span><span style="color:#666">&gt;</span>getServices()) {
+            std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">result is </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> std<span style="color:#666">:</span><span style="color:#666">:</span>to_string(calc<span style="color:#666">-</ [...]
+        }
+    }
+    
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>ServiceTracker<span style="color:#666">&lt;</span>ICalc<span style="color:#666">&gt;</span><span style="color:#666">&gt;</span> tracker{};
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(CalcTrackerBundleActivator)
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">CalcTrackerBundle</span>
+    <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/CalcTrackerBundleActivator.cc</span>
+)<span style="">
+</span><span style=""></span><span style="color:#a2f">target_include_directories</span>(<span style="color:#b44">CalcTrackerBundle</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">include</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">CalcTrackerContainer</span>
+    <span style="color:#b44">BUNDLES</span>
+        <span style="color:#b44">Celix::ShellCxx</span>
+        <span style="color:#b44">Celix::shell_tui</span>
+        <span style="color:#b44">CalcProviderBundle</span>
+        <span style="color:#b44">CalcTrackerBundle</span>
+)<span style="">
+</span></code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#bash</span>
+<span style="color:#080;font-style:italic">#goto project dir</span>
+<span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
+<span style="color:#a2f">cd</span> deploy/CalcTrackerContainer
+./CalcTrackerContainer
+</code></pre></div><h3 id="service-properties-and-filters">Service properties and filters</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/FilterExampleBundleActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;iostream&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;celix/IShellCommand.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">HelloWorldShellCommand</span> <span style="color:#666">:</span> <span style="color:#a2f;font-weight:bold">public</span> celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#0b0;font-weight:bold">void</span> executeCommand(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>string<span style="color:#666">&amp;</span> <span style="color:#080;font-style:italic">/*commandLine*/</span>, <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>vector<span style="color:#666">&lt;</span>std<span style="co [...]
+        fprintf(outStream, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello World</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>);
+    }
+};
+
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">FilterExampleBundleActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> FilterExampleBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        <span style="color:#a2f;font-weight:bold">auto</span> reg1 <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>registerService<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span>(std<span style="color:#666">:</span><span style="color:#666">:</span>make_shared<span style="color:#666">&lt;</span>HelloWorldShellCommand<span sty [...]
+                .addProperty(celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">:</span><span style="color:#666">:</span>COMMAND_NAME, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">command1</span><span style="color:#b44">&#34;</span>)
+                .build();
+        <span style="color:#a2f;font-weight:bold">auto</span> reg2 <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>registerService<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span>(std<span style="color:#666">:</span><span style="color:#666">:</span>make_shared<span style="color:#666">&lt;</span>HelloWorldShellCommand<span sty [...]
+                .addProperty(celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">:</span><span style="color:#666">:</span>COMMAND_NAME, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">command2</span><span style="color:#b44">&#34;</span>)
+                .build();
+        regs.push_back(reg1);
+        regs.push_back(reg2);
+        
+        <span style="color:#a2f;font-weight:bold">auto</span> serviceIdsNoFilter  <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>findServices<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span>();
+        <span style="color:#a2f;font-weight:bold">auto</span> serviceIdsWithFilter <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>findServices<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span>(std<span style="color:#666">:</span><span style="color:#666">:</span>string{<span style="color:#b44"></span><span style="color:#b44">& [...]
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Found </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> std<span style="color:#666">:</span><span style="color:#666">:</span>to_string(serviceIdsNoFilter.size()) <span style=" [...]
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> std<span style="color:#666">:</span><span style="color:#666">:</span>to_string(serviceIdsWithFilter.size()) <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44"> IShellCommand service with name command1</span><span style="c [...]
+    }
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    std<span style="color:#666">:</span><span style="color:#666">:</span>vector<span style="color:#666">&lt;</span>std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>ServiceRegistration<span style="color:#666">&gt;</span><span style="color:#666">&gt;</span> regs{};
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(FilterExampleBundleActivator)
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">FilterExampleBundle</span>
+    <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/FilterExampleBundleActivator.cc</span>
+)<span style="">
+</span><span style=""></span><span style="color:#a2f">target_link_libraries</span>(<span style="color:#b44">FilterExampleBundle</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">Celix::shell_api</span>) <span style="color:#080;font-style:italic">#adds celix/IShellCommand.h to the include path
+</span><span style="color:#080;font-style:italic"></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">FilterExampleContainer</span>
+    <span style="color:#b44">BUNDLES</span>
+        <span style="color:#b44">Celix::ShellCxx</span>
+        <span style="color:#b44">Celix::shell_tui</span>
+        <span style="color:#b44">FilterExampleBundle</span>
+)<span style="">
+</span></code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#bash</span>
+<span style="color:#080;font-style:italic">#goto project dir</span>
+<span style="color:#a2f">cd</span> cmake-build-debug <span style="color:#080;font-style:italic">#assuming clion cmake-build-debug dir</span>
+<span style="color:#a2f">cd</span> deploy/FilterExampleContainer
+./FilterExampleContainer
+<span style="color:#080;font-style:italic">#Celix shell</span>
+-&gt; command1
+-&gt; command2
+-&gt; <span style="color:#a2f">help</span>
+</code></pre></div>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<footer class="py-3 bg-secondary">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-8 text-center">
+                <p class="m-0 text-white">
+                    Copyright &copy; 2022 The Apache Software Foundation, Licensed under
+                    the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
+                    <br>
+                    Apache Celix, Celix, Apache, the Apache feather logo and the Apache Celix logo are trademarks of The Apache Software Foundation.
+                </p>
+            </div>
+            <div class="col-md-4 text-center">
+                <a href="https://www.apache.org/events/current-event.html" target="_blank">
+                    <img src="https://www.apache.org/events/current-event-234x60.png" title="Apache Event" width="234" height="60" border="0">
+                </a>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+<script src="/assets/js/jquery.min.js"></script>
+<script src="/assets/js/bootstrap.bundle.min.js"></script>
+
+
+</body>
+</html>
diff --git a/content/docs/2.2.1/celix/bundles/deployment_admin/README.html b/content/docs/2.3.0/celix/bundles/deployment_admin/README.html
similarity index 95%
copy from content/docs/2.2.1/celix/bundles/deployment_admin/README.html
copy to content/docs/2.3.0/celix/bundles/deployment_admin/README.html
index dceb98b..b98143b 100644
--- a/content/docs/2.2.1/celix/bundles/deployment_admin/README.html
+++ b/content/docs/2.3.0/celix/bundles/deployment_admin/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/device_access/README.html b/content/docs/2.3.0/celix/bundles/device_access/README.html
similarity index 95%
copy from content/docs/2.2.1/celix/bundles/device_access/README.html
copy to content/docs/2.3.0/celix/bundles/device_access/README.html
index c4244f3..6086b5c 100644
--- a/content/docs/2.2.1/celix/bundles/device_access/README.html
+++ b/content/docs/2.3.0/celix/bundles/device_access/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/device_access/example/base_driver/README.html b/content/docs/2.3.0/celix/bundles/device_access/example/base_driver/README.html
similarity index 95%
copy from content/docs/2.2.1/celix/bundles/device_access/example/base_driver/README.html
copy to content/docs/2.3.0/celix/bundles/device_access/example/base_driver/README.html
index a6b86ba..95424c2 100644
--- a/content/docs/2.2.1/celix/bundles/device_access/example/base_driver/README.html
+++ b/content/docs/2.3.0/celix/bundles/device_access/example/base_driver/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/device_access/example/consuming_driver/README.html b/content/docs/2.3.0/celix/bundles/device_access/example/consuming_driver/README.html
similarity index 95%
copy from content/docs/2.2.1/celix/bundles/device_access/example/consuming_driver/README.html
copy to content/docs/2.3.0/celix/bundles/device_access/example/consuming_driver/README.html
index b92a069..92bc3c1 100644
--- a/content/docs/2.2.1/celix/bundles/device_access/example/consuming_driver/README.html
+++ b/content/docs/2.3.0/celix/bundles/device_access/example/consuming_driver/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/device_access/example/refining_driver/README.html b/content/docs/2.3.0/celix/bundles/device_access/example/refining_driver/README.html
similarity index 95%
copy from content/docs/2.2.1/celix/bundles/device_access/example/refining_driver/README.html
copy to content/docs/2.3.0/celix/bundles/device_access/example/refining_driver/README.html
index a6559bd..0cfb3cb 100644
--- a/content/docs/2.2.1/celix/bundles/device_access/example/refining_driver/README.html
+++ b/content/docs/2.3.0/celix/bundles/device_access/example/refining_driver/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/http_admin/README.html b/content/docs/2.3.0/celix/bundles/http_admin/README.html
similarity index 96%
copy from content/docs/2.2.1/celix/bundles/http_admin/README.html
copy to content/docs/2.3.0/celix/bundles/http_admin/README.html
index 08ffa0c..342d6b5 100644
--- a/content/docs/2.2.1/celix/bundles/http_admin/README.html
+++ b/content/docs/2.3.0/celix/bundles/http_admin/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/logging/log_service/README.html b/content/docs/2.3.0/celix/bundles/logging/README.html
similarity index 63%
copy from content/docs/2.2.1/celix/bundles/logging/log_service/README.html
copy to content/docs/2.3.0/celix/bundles/logging/README.html
index aaac3e9..bdcd1d0 100644
--- a/content/docs/2.2.1/celix/bundles/logging/log_service/README.html
+++ b/content/docs/2.3.0/celix/bundles/logging/README.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>Log Service / Apache Celix</title>
+    <title>Logging Facilities / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,22 +137,46 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/logging/log_service/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/logging/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
                         
                     
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
-	<h1 id="log-service">Log Service</h1>
-<p>The Celix Log Service realizes an adapted implementation of the OSGi Compendium Log Service. This is a very simple implementation which only stores the log in memory. It can be combined with one of the available Log Writers to forward the buffered entries to e.g. stdout or syslog.</p>
-<p>To ease the use of the Log Service, the <a href="loghelper_include/log_helper.h">Log Helper</a> can be used. It wraps and therefore simplifies the log service usage.</p>
-<h2 id="properties">Properties</h2>
-<pre><code>LOGHELPER_ENABLE_STDOUT_FALLBACK      If set to any value and in case no Log Service is found the logs
-                                      are still printed on stdout. 
+	<h1 id="celix-logging-facilities">Celix Logging Facilities</h1>
+<p>The Celix Logging facility is service oriented and logging technology-agnostic logging solution.</p>
+<p>Bundles can request (services on demand) and use <code>celix_log_service_t</code> services to log events.
+Logging support the following log levels: <code>trace</code>, <code>debug</code>, <code>info</code>, <code>error</code>, <code>fatal</code>.</p>
+<p>Bundles can provide <code>celix_log_sink_t</code> services to sink log message to different logging backends (e.g. syslog, log4c, etc)</p>
+<p>The <code>Celix::log_admin</code> bundle facilitates the <code>celix_log_service_t</code> services and &lsquo;connects&rsquo; these to the available
+<code>celix_log_sink_t</code> services. If there is no <code>celix_log_sink_t</code> service available, log messages will be
+printed on stdout/stderr.</p>
+<p>The Celix shell command <code>celix::log_admin</code> can be used to view the existing log services and sinks,
+changed the active log level per log services and enable/disable log sinks.
+For example:</p>
+<ul>
+<li><code>celix::log_admin</code> list the available log services and log sinks.</li>
+<li><code>celix::log_admin log error</code> Set the active log level for all log services to <code>error</code>.</li>
+<li><code>celix::log_admin log celix_ trace</code> Set the active log level for all log services starting with &lsquo;celix_&rsquo; to <code>trace</code>.</li>
+<li><code>celix::log_admin sink false</code> Disables all available log sinks.</li>
+<li><code>celix::log_admin sink celix_syslog true</code> Enables all log sinks starting with &lsquo;celix_syslog&rsquo;.</li>
+</ul>
+<p>The <code>Celix::log_helper</code> static library can be used to more easily request a <code>celix_log_service_t</code>.
+An additional benefit of the <code>Celix:log_helper</code> is that if the <code>Celix::log_admin</code> is not installed,
+log messages will be printed on stdout/stderr.</p>
+<h2 id="logging-properties">Logging Properties</h2>
+<p>Properties shared among the logging bundles</p>
+<pre><code>CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL The default active log level for created log services. Default is &quot;info&quot;.
+</code></pre>
+<h2 id="log-admin-properties">Log Admin Properties</h2>
+<p>Properties specific for the Celix Log Admin (<code>Celix::log_admin</code> bundle)</p>
+<pre><code>CELIX_LOG_ADMIN_FALLBACK_TO_STDOUT If set to true, the log admin will log to stdout/stderr if no celix log writers are available. Default is true
+CELIX_LOG_ADMIN_ALWAYS_USE_STDOUT If set to true, the log admin will always log to stdout/stderr after forwaring log statements to the available celix log writers. Default is false.
+CELIX_LOG_ADMIN_LOG_SINKS_DEFAULT_ENABLED Whether discovered log sink are default enabled. Default is true.
 </code></pre>
 <h2 id="cmake-option">CMake option</h2>
 <pre><code>BUILD_LOG_SERVICE=ON
@@ -144,9 +184,15 @@
 <h2 id="using-info">Using info</h2>
 <p>If the Celix Log Service is installed, &lsquo;find_package(Celix)&rsquo; will set:</p>
 <ul>
-<li>The <code>Celix::log_service_api</code> interface (i.e. header only) library target</li>
-<li>The <code>Celix::log_service</code> bundle target</li>
-<li>The <code>Celix::log_helper</code> static library target</li>
+<li>The <code>Celix::log_service_api</code> interface (i.e. header only) library target (v2 and v3 api)</li>
+<li>The <code>Celix::log_admin</code> bundle target. The log admin will create log services on demand and forward log message to the available log sinks.</li>
+<li>The <code>Celix::log_helper</code> static library target. Helper library with common logger functionality and helpers to setup logging</li>
+<li>The <code>Celix::log_writer_syslog</code> bundle target. A bundle which provides a <code>celix_log_sink_t</code> service for syslog.</li>
+</ul>
+<p>Also the following deprecated bundle will be set:</p>
+<ul>
+<li>The <code>Celix::log_service</code> bundle target. The log service bundle. Deprecated, use Celix::log_admin instead.</li>
+<li>The <code>Celix::log_writer_stdout</code> bundle target. Deprecated bundle. Logging to stdout is now an integral part of the log admin.</li>
 </ul>
 
 
diff --git a/content/docs/2.2.1/celix/bundles/logging/log_writer/README.html b/content/docs/2.3.0/celix/bundles/logging/log_writers/README.html
similarity index 90%
copy from content/docs/2.2.1/celix/bundles/logging/log_writer/README.html
copy to content/docs/2.3.0/celix/bundles/logging/log_writers/README.html
index 372e69f..dc9e7d0 100644
--- a/content/docs/2.2.1/celix/bundles/logging/log_writer/README.html
+++ b/content/docs/2.3.0/celix/bundles/logging/log_writers/README.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>Log Writer / Apache Celix</title>
+    <title>Log Writers / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,27 +137,25 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/logging/log_writer/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/logging/log_writers/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
                         
                     
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
 	<h1 id="log-writer">Log Writer</h1>
-<p>The Celix Log Writers are components that read/listen to the Log Service and print the Log entries to the console or syslog, respectively.</p>
+<p>The Celix Log Writers are components that sinks log from the Celix log service to different backends.</p>
 <h2 id="cmake-options">CMake options</h2>
-<pre><code>BUILD_LOG_WRITER=ON
-BUILD_LOG_WRITER_SYSLOG=ON
+<pre><code>BUILD_SYSLOG_WRITER=ON
 </code></pre>
 <h2 id="using-info">Using info</h2>
 <p>If the Celix Log Writers are installed <code>find_package(CELIX)</code> will set:</p>
 <ul>
-<li>The <code>Celix::log_writer_stdout</code> bundle target</li>
-<li>The <code>Celix::log_writer_syslog</code> bundle target</li>
+<li>The <code>Celix::syslog_writer</code> bundle target</li>
 </ul>
 
 
diff --git a/content/docs/2.2.1/celix/bundles/pubsub/README.html b/content/docs/2.3.0/celix/bundles/pubsub/README.html
similarity index 88%
copy from content/docs/2.2.1/celix/bundles/pubsub/README.html
copy to content/docs/2.3.0/celix/bundles/pubsub/README.html
index d880c1d..507040e 100644
--- a/content/docs/2.2.1/celix/bundles/pubsub/README.html
+++ b/content/docs/2.3.0/celix/bundles/pubsub/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -149,17 +165,18 @@ limitations under the License.
 -->
 <h1 id="publisher--subscriber-implementation">Publisher / subscriber implementation</h1>
 <p>This subdirectory contains an implementation for a publish-subscribe remote services system, that use dfi library for message serialization.
-For low-level communication, UDP and ZMQ is used.</p>
+For low-level communication, TCP, UDP and ZMQ is used.</p>
 <h1 id="description">Description</h1>
 <p>This publisher / subscriber implementation is based on the concepts of the remote service admin (i.e. rsa / topology / discovery pattern).</p>
 <p>Publishers are senders of data, subscribers can receive data. Publishers can publish/send data to certain channels (called &lsquo;topics&rsquo; further on), subscribers can subscribe to these topics. For every topic a publisher service is created by the pubsub admin. This publisher is announced through etcd. So etcd is used for discovery of the publishers. Subscribers are also registered as a service by the pubsub admin and will watch etcd for changes and when a new publisher is annou [...]
 <p>The dfi library is used for message serialization. The publisher / subscriber implementation will arrange that every message which will be send gets an unique id.</p>
-<p>For communication between publishers and subscribers UDP and ZeroMQ can be used. When using ZeroMQ it&rsquo;s also possible to setup a secure connection to encrypt the traffic being send between publishers and subscribers. This connection can be secured with ZeroMQ by using a curve25519 key pair per topic.</p>
+<p>For communication between publishers and subscribers TCP, UDP and ZeroMQ can be used. When using ZeroMQ it&rsquo;s also possible to setup a secure connection to encrypt the traffic being send between publishers and subscribers. This connection can be secured with ZeroMQ by using a curve25519 key pair per topic.</p>
 <p>The publisher/subscriber implementation supports sending of a single message and sending of multipart messages.</p>
 <h2 id="getting-started">Getting started</h2>
-<p>The publisher/subscriber implementation contains 2 different PubSubAdmins for managing connections:</p>
+<p>The publisher/subscriber implementation contains 3 different PubSubAdmins for managing connections:</p>
 <ul>
-<li>PubsubAdminUDP: This pubsub admin is using linux sockets to setup a connection.</li>
+<li>PubsubAdminUDP: This pubsub admin is using udp (multicast) linux sockets to setup a connection.</li>
+<li>PubsubAdminTCP: This pubsub admin is using tcp linux sockets to setup a connection.</li>
 <li>PubsubAdminZMQ (LGPL License): This pubsub admin is using ZeroMQ and is disabled as default. This is a because the pubsub admin is using ZeroMQ which is licensed as LGPL (<a href="https://github.com/zeromq/libzmq#license">View ZeroMQ License</a>).</li>
 </ul>
 <p>The ZeroMQ pubsub admin can be enabled by specifying the build flag <code>BUILD_PUBSUB_PSA_ZMQ=ON</code>. To get the ZeroMQ pubsub admin running, <a href="https://github.com/zeromq/libzmq">ZeroMQ</a> and <a href="https://github.com/zeromq/czmq">CZMQ</a> need to be installed. Also, to make use of encrypted traffic, <a href="https://github.com/openssl/openssl">OpenSSL</a> is required.</p>
@@ -176,6 +193,18 @@ For low-level communication, UDP and ZMQ is used.</p>
 <li>Run <code>sh run.sh</code></li>
 </ol>
 <p>Design information can be found at pubsub_admin_udp_mc/README.md</p>
+<h3 id="running-psa-tcp">Running PSA TCP</h3>
+<ol>
+<li>Open a terminal</li>
+<li>Run <code>cd runtimes/pubsub/tcp</code></li>
+<li>Run <code>sh start.sh</code></li>
+</ol>
+<h3 id="properties-psa-tcp">Properties PSA TCP</h3>
+<p>Some properties can be set to configure the PSA-TCP. If not configured defaults will be used. These
+properties can be set in the config.properties file (<PROPERTY>=<VALUE> format)</p>
+<pre><code>PSA_IP                              The url address to be used by the TCP admin to publish its data. Default the first IP not on localhost
+                                    This can be hostname / IP address / IP address with postfix, e.g. 192.168.1.0/24
+</code></pre>
 <h3 id="running-psa-zmq">Running PSA ZMQ</h3>
 <p>For ZeroMQ without encryption, skip the steps 1-12 below</p>
 <ol>
@@ -206,7 +235,7 @@ For low-level communication, UDP and ZMQ is used.</p>
 <h3 id="properties-psa-zmq">Properties PSA ZMQ</h3>
 <p>Some properties can be set to configure the PSA-ZMQ. If not configured defaults will be used. These
 properties can be set in the config.properties file (<PROPERTY>=<VALUE> format)</p>
-<pre><code>PSA_IP                              The local IP address to be used by the ZMQ admin to publish its data. Default te first IP not on localhost
+<pre><code>PSA_IP                              The local IP address to be used by the ZMQ admin to publish its data. Default the first IP not on localhost
 PSA_INTERFACE                       The local ethernet interface to be used by the ZMQ admin to publish its data (ie eth0). Default the first non localhost interface
 PSA_ZMQ_RECEIVE_TIMEOUT_MICROSEC    Set the polling interval of the ZMQ receive thread. Default 1ms</code></pre>
 
diff --git a/content/docs/2.2.1/celix/bundles/pubsub/examples/keys/README.html b/content/docs/2.3.0/celix/bundles/pubsub/examples/keys/README.html
similarity index 95%
copy from content/docs/2.2.1/celix/bundles/pubsub/examples/keys/README.html
copy to content/docs/2.3.0/celix/bundles/pubsub/examples/keys/README.html
index cb15ffe..9f07167 100644
--- a/content/docs/2.2.1/celix/bundles/pubsub/examples/keys/README.html
+++ b/content/docs/2.3.0/celix/bundles/pubsub/examples/keys/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html b/content/docs/2.3.0/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html
similarity index 96%
copy from content/docs/2.2.1/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html
copy to content/docs/2.3.0/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html
index 433454f..419d39f 100644
--- a/content/docs/2.2.1/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html
+++ b/content/docs/2.3.0/celix/bundles/pubsub/pubsub_admin_udp_mc/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/README.html b/content/docs/2.3.0/celix/bundles/remote_services/README.html
similarity index 92%
copy from content/docs/2.2.1/celix/bundles/remote_services/README.html
copy to content/docs/2.3.0/celix/bundles/remote_services/README.html
index b231f51..b3cf63c 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/README.html
+++ b/content/docs/2.3.0/celix/bundles/remote_services/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -147,7 +163,6 @@ 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.
 -->
-<p>Title: Apache Celix Remote Service Admin Service</p>
 <h2 id="introduction">Introduction</h2>
 <p>The Remote Service Admin Service subproject contains an adapted implementation of the OSGi Enterprise Remote Service Admin Service Specification. The subproject consists of three parts, each described in more detail in the following sections.</p>
 <h3 id="topology-manager">Topology Manager</h3>
@@ -274,9 +289,9 @@ limitations under the License.
 </ol>
 <p>The Celix source repository provides a simple calculator example that shows all of the described parts:</p>
 <ol>
-<li><a href="https://github.com/apache/celix/blob/develop/bundles/remote_services/examples/calculator_api/include/calculator_service.h">The calculator service interface</a>, providing three methods: one for adding two numbers, one for subtracting two numbers, and lastly, a method that calculates the square root of a number;</li>
-<li><a href="https://github.com/apache/celix/blob/develop/bundles/remote_services/examples/calculator_service/src/calculator_impl.c">A calculator service implementation</a> that simply implements the three previously described functions. To mark this service as &ldquo;remote service&rdquo;, you need to add the <code>service.exported.interfaces</code> service property to its service registration. This way, the RSA implementation can expose it as remote service to others;</li>
-<li><a href="https://github.com/apache/celix/blob/develop/bundles/remote_services/examples/calculator_shell/src/add_command.c">A service client</a>, that exposes the three calculator methods to as Celix shell commands. The implementation simply retrieves the calculator service as it would do with any other Celix service.</li>
+<li><a href="https://github.com/apache/celix/blob/master/bundles/remote_services/examples/calculator_api/include/calculator_service.h">The calculator service interface</a>, providing three methods: one for adding two numbers, one for subtracting two numbers, and lastly, a method that calculates the square root of a number;</li>
+<li><a href="https://github.com/apache/celix/blob/master/bundles/remote_services/examples/calculator_service/src/calculator_impl.c">A calculator service implementation</a> that simply implements the three previously described functions. To mark this service as &ldquo;remote service&rdquo;, you need to add the <code>service.exported.interfaces</code> service property to its service registration. This way, the RSA implementation can expose it as remote service to others;</li>
+<li><a href="https://github.com/apache/celix/blob/master/bundles/remote_services/examples/calculator_shell/src/add_command.c">A service client</a>, that exposes the three calculator methods to as Celix shell commands. The implementation simply retrieves the calculator service as it would do with any other Celix service.</li>
 </ol>
 <p>If you have access to the Celix source repository, you can run the calculator example using various discovery implementations by invoking the <code>deploy</code> target. You can find the example deployments in the <code>CELIX_BUILD/deploy</code> directory. For example, to run the calculator example using the configured discovery mechanism, you should open two terminals. In the first terminal, type:</p>
 <pre><code>remote-service-cfg$ export RSA_PORT=18888
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/rsa_spi/README.html b/content/docs/2.3.0/celix/bundles/remote_services/deprecated_rsa_spi/README.html
similarity index 92%
copy from content/docs/2.2.1/celix/bundles/remote_services/rsa_spi/README.html
copy to content/docs/2.3.0/celix/bundles/remote_services/deprecated_rsa_spi/README.html
index 862751e..26154c3 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/rsa_spi/README.html
+++ b/content/docs/2.3.0/celix/bundles/remote_services/deprecated_rsa_spi/README.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>Remote Service Admin / Apache Celix</title>
+    <title>Remote Services SPI / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,13 +137,13 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/remote_services/rsa_spi/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/remote_services/deprecated_rsa_spi/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
                         
                     
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/discovery_etcd/README.html b/content/docs/2.3.0/celix/bundles/remote_services/discovery_etcd/README.html
similarity index 95%
copy from content/docs/2.2.1/celix/bundles/remote_services/discovery_etcd/README.html
copy to content/docs/2.3.0/celix/bundles/remote_services/discovery_etcd/README.html
index 52da165..8a9a249 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/discovery_etcd/README.html
+++ b/content/docs/2.3.0/celix/bundles/remote_services/discovery_etcd/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/remote_service_admin_dfi/README.html b/content/docs/2.3.0/celix/bundles/remote_services/remote_service_admin_dfi/README.html
similarity index 91%
copy from content/docs/2.2.1/celix/bundles/remote_services/remote_service_admin_dfi/README.html
copy to content/docs/2.3.0/celix/bundles/remote_services/remote_service_admin_dfi/README.html
index 4513224..f532c3f 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/remote_service_admin_dfi/README.html
+++ b/content/docs/2.3.0/celix/bundles/remote_services/remote_service_admin_dfi/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -157,7 +173,12 @@ RSA_IP                      The RSA ip address to use for discovery (default 127
 RSA_INTERFACE               If specified, the ip adress of interface (i.g. eth0) will be used.
 
 RSA_LOG_CALLS              If set to true, the RSA will Log calls info (including serialized data) to the file in RSA_LOG_CALLS_FILE. Default is false.
-RSA_LOG_CALLS_FILE         If RSA_LOG_CALLS is enabled to file to log to (starting rsa will truncate file). Default is stdout.          
+RSA_LOG_CALLS_FILE         If RSA_LOG_CALLS is enabled to file to log to (starting rsa will truncate file). Default is stdout.   
+
+RSA_DFI_USE_CURL_SHARE_HANDLE   If set to true the RSA will use curl's share handle. 
+                                The curl share handle has a significant performance boost by sharing DNS, COOKIE en CONNECTIONS over multiple calls, 
+                                but can also introduce some issues (based on experience).
+                                Default is false
 </code></pre>
 <h6 id="cmake-option">CMake option</h6>
 <pre><code>RSA_REMOTE_SERVICE_ADMIN_DFI=ON
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/remote_services_api/README.html b/content/docs/2.3.0/celix/bundles/remote_services/remote_services_api/README.html
similarity index 94%
copy from content/docs/2.2.1/celix/bundles/remote_services/remote_services_api/README.html
copy to content/docs/2.3.0/celix/bundles/remote_services/remote_services_api/README.html
index d628fee..4e2bbf3 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/remote_services_api/README.html
+++ b/content/docs/2.3.0/celix/bundles/remote_services/remote_services_api/README.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>Remote Service Admin / Apache Celix</title>
+    <title>Remote Services API / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/remote_services/topology_manager/README.html b/content/docs/2.3.0/celix/bundles/remote_services/topology_manager/README.html
similarity index 94%
copy from content/docs/2.2.1/celix/bundles/remote_services/topology_manager/README.html
copy to content/docs/2.3.0/celix/bundles/remote_services/topology_manager/README.html
index f188fd8..d2f6ee9 100644
--- a/content/docs/2.2.1/celix/bundles/remote_services/topology_manager/README.html
+++ b/content/docs/2.3.0/celix/bundles/remote_services/topology_manager/README.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>Topology Manager / Apache Celix</title>
+    <title>RSA Topology Manager / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/bundles/shell/shell/README.html b/content/docs/2.3.0/celix/bundles/shell/README.html
similarity index 64%
copy from content/docs/2.2.1/celix/bundles/shell/shell/README.html
copy to content/docs/2.3.0/celix/bundles/shell/README.html
index 0e55816..b2bc8b7 100644
--- a/content/docs/2.2.1/celix/bundles/shell/shell/README.html
+++ b/content/docs/2.3.0/celix/bundles/shell/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,13 +137,13 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/shell/shell/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/shell/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
                         
                     
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -147,36 +163,76 @@ 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.
 -->
-<h1 id="shell">Shell</h1>
-<p>The Celix Shell provides a service interface which can be used to interact with the Celix framework. Note that it does not offer a user interface. This modular approach enables having multiple frontends, e.g. textual or graphical.</p>
-<p>While the shell can be extended with additional commands by other bundles, it already offers some built in commands:</p>
-<pre><code>lb            list bundles
-install       install additional bundle
-uninstall     uninstall bundles
-update        update bundles
-
-start         start bundle
-stop          stop bundle
-
-help          displays available commands
-inspect       inspect service and components
-
-log           print log
-</code></pre>
+<h1 id="intro">Intro</h1>
+<p>The Celix Shell provides a service interface which can be used to interact with the Celix framework. It uses a modular
+approach to enable multiple frontends, e.g. textual or graphical.</p>
+<p>While the shell can be extended with additional commands by other bundles, it already offers some built in commands,
+for example:</p>
+<ul>
+<li><code>lb</code>: list bundles</li>
+<li><code>install</code>: install additional bundle</li>
+<li><code>uninstall</code>: uninstall bundles</li>
+<li><code>start</code>: start bundle</li>
+<li><code>stop</code>: stop bundle</li>
+<li><code>help</code>: displays available commands</li>
+</ul>
 <p>Further information about a command can be retrieved by using <code>help</code> combined with the command.</p>
-<h2 id="cmake-options">CMake options</h2>
-<pre><code>BUILD_SHELL=ON
-</code></pre>
-<h2 id="shell-config-options">Shell Config Options</h2>
+<h1 id="service-interfaces">Service interfaces</h1>
+<p>The Celix Shell functionality is achieved by 3 service interfaces. These interfaces are available through the
+<code>Celix::shel_api</code> CMake INTERFACE library target.</p>
+<ul>
+<li><code>celix_shell_t</code>: The shell service can be used to get an overview of the available shell commands and to execute
+shell commands.</li>
+<li><code>celix_shell_command_t</code>: A C service interface to provide an additional shell command to the shell.</li>
+<li><code>celix::IShellCommand</code>: A C++ service interface to provide an additional shell command to the shell.</li>
+</ul>
+<h1 id="bundles">Bundles</h1>
+<p>The complete Celix shell functionality is provided by serveral bundles:</p>
+<ul>
+<li><code>Celix::shell</code> : The core shell which offer a <code>celix_shell_t</code> service and uses <code>celix_shell_command_t</code> services.</li>
+<li><code>Celix::CxxShell</code> : The core C++ shell which offers a <code>celix_shell_t</code> service and uses both <code>celix_shell_command_t</code>
+and <code>celix::IShellCommand</code> services. Offers the same functionality as <code>Celix::shell</code>, but also supports C++
+<code>celix::IShellCommand</code> services.</li>
+<li><code>Celix::shell_tui</code> : Textual (terminal) user interface to the shell service.</li>
+<li><code>Celix::shell_wui</code> : Web user interface to the shell service.</li>
+<li><code>Celix::remote_shell</code> : Remote telnet interface to shell service</li>
+<li><code>Celix::bonjour_shell</code>: Chat interface to the shell service using bonjour. Warning not mature and still unstable. When used it should be possible to chat to a Celix shell using Linux&rsquo;s pidgin application or OSX&rsquo;s
+Messages application.</li>
+</ul>
+<h2 id="logical-design-celix-shell">Logical Design Celix Shell</h2>
+<p>|<img src="diagrams/celix_shell.png" alt="Celix Shell Logical Design"></p>
+<h2 id="logical-design-celix-shell-for-c">Logical Design Celix Shell for C++</h2>
+<p><img src="diagrams/celix_cxx_shell.png" alt="Celix C++ Shell Logical Design"></p>
+<h1 id="cmake-options">CMake options</h1>
+<ul>
+<li>BUILD_SHELL=ON</li>
+<li>BUILD_SHELL_TUI=ON</li>
+<li>BUILD_SHELL_WUI=ON</li>
+<li>BUILD_REMOTE_SHELL=ON</li>
+</ul>
+<h1 id="shell-config-options">Shell Config Options</h1>
 <ul>
-<li>SHELL_USE_ANSI_COLORS - Whether shell command are allowed to use
-ANSI colors when printing info. default is true.</li>
+<li>SHELL_USE_ANSI_COLORS - Configures whether shell commands are allowed to use
+ANSI colors when printing info for <code>Celix::shell</code>. Default is true.</li>
+<li>SHELL_TUI_USE_ANSI_CONTROL_SEQUENCES - Configures whether to use ANSI control
+sequences to support backspace, left, up, etc key commands in the
+<code>Celix::shell_tui</code>. Default is true if a TERM environment is set else false.</li>
+<li>&ldquo;remote.shell.telnet.port&rdquo;: Configures port used in <code>Celix::remote_shell</code>. Default is 6666.</li>
+<li>&ldquo;remote.shell.telnet.maxconn&rdquo;: Configures max nr of concurrent connections in <code>Celix::remote_shell</code>. Default is 2.</li>
 </ul>
-<h2 id="using-info">Using info</h2>
-<p>If the Celix Shell is installed, &lsquo;find_package(Celix)&rsquo; will set:</p>
+<h1 id="using-info">Using info</h1>
+<p>If the Celix Shell is installed, <code>find_package(Celix)</code> will set:</p>
 <ul>
 <li>The <code>Celix::shell_api</code> interface (i.e. header only) library target</li>
 <li>The <code>Celix::shell</code> bundle target</li>
+</ul>
+<p>If the Celix Shell TUI is installed, <code>find_package(Celix)</code> will set:</p>
+<ul>
+<li>The <code>Celix::shell_tui</code> bundle target if the shell_tui is installed</li>
+</ul>
+<p>If the Celix Shell WUI is installed, <code>find_package(Celix)</code> will set:</p>
+<ul>
+<li>The <code>Celix::shell_wui</code> bundle target if the shell_wui is installed</li>
 </ul>
 
 
diff --git a/content/docs/2.2.1/celix/bundles/deployment_admin/README.html b/content/docs/2.3.0/celix/documents/README.html
similarity index 62%
copy from content/docs/2.2.1/celix/bundles/deployment_admin/README.html
copy to content/docs/2.3.0/celix/documents/README.html
index dceb98b..4dc8743 100644
--- a/content/docs/2.2.1/celix/bundles/deployment_admin/README.html
+++ b/content/docs/2.3.0/celix/documents/README.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>Deployment Admin / Apache Celix</title>
+    <title>Introduction / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,13 +137,13 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/deployment_admin/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
                         
                     
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -147,27 +163,65 @@ 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.
 -->
-<h2 id="deployment-admin">Deployment Admin</h2>
-<p>The Celix Deployment Admin implements the OSGi Deployment Admin specification, which provides functionality to manage deployment packages. Deployment package are bundles and other artifacts that can be installed, updated and uninstalled as single unit.</p>
-<p>It can be used for example with Apache Ace, which allows you to centrally manage and distribute software components, configuration data and other artifacts.</p>
-<h6 id="properties">Properties</h6>
-<pre><code>              tags used by the deployment admin
-</code></pre>
-<h2 id="cmake-option">CMake option</h2>
-<pre><code>BUILD_DEPLOYMENT_ADMIN=ON
-</code></pre>
-<h2 id="deployment-admin-config-options">Deployment Admin Config Options</h2>
+<h1 id="apache-celix-introduction">Apache Celix Introduction</h1>
+<h2 id="what-is-apache-celix">What is Apache Celix</h2>
+<p>Apache Celix is an implementation of a dynamic service framework inspired by the
+<a href="https://www.osgi.org/developer/specifications">OSGi specification</a> and adapted to C and C++ (C++17).
+It is a framework to develop dynamic modular software applications using component and in-process service-oriented programming.</p>
+<p>Apache Celix core is written in C and has a C++17 header-only API on top of the C API.</p>
+<p>Building applications with Apache Celix can be done by creating <code>bundles</code> which provide and use <code>services</code>;
+These <code>services</code> can be used directly or in a declarative way using <code>components</code>.
+To run a selection of bundles, an Apache Celix <code>container</code> executable can be created. An Apache Celix <code>containter</code> will<br>
+start an Apache Celix framework and install and start the provided bundles.</p>
+<h2 id="bundles">Bundles</h2>
+<p>An Apache Celix Bundle is a zip file which contains a collection of shared libraries,
+configuration files and optional an activation entry.
+Bundles can be dynamically installed and started in an Apache Celix framework.</p>
+<h2 id="services">Services</h2>
+<p>An Apache Celix Service is a pointer registered to the Apache Celix framework under a set of properties (metadata).
+Services can be dynamically registered into and looked up from the Apache Celix framework.</p>
+<p>By convention a C service in Apache Celix is a pointer to struct of function pointers and a C++ service is a pointer
+(which can be provided as a <code>std::shared_ptr</code>) to an object implementing a (pure) abstract class.</p>
+<h2 id="components">Components</h2>
+<p>Apache Celix also offers a way to create components which interact with dynamic services in declarative way.</p>
+<p>This removes some complexity of dynamic services by declaring service dependency and configuring the dependency
+as required or optional.</p>
+<p>Apache Celix components can be created using the built-in C and C++ dependency manager.</p>
+<p>Note that the dependency manager is not part of the OSGi standard, and it is inspired by the
+Apache Felix Dependency Manager.</p>
+<h2 id="containers">Containers</h2>
+<p>Apache Celix Containers are executables which starts an Apache Celix framework, with a set of preconfigured properties
+and a set of preconfigured bundles.
+Although it is also possible to create and start a Celix framework in code, the benefit of a Celix container
+is that this can be done with a single <code>add_celix_container</code> Apache Celix CMake command.</p>
+<h2 id="c-support">C++ Support</h2>
+<p>One of the reasons why C was chosen as implementation language is that C can act as a common denominator for
+(service oriented) interoperability between a range of languages.</p>
+<p>C++ (C++17) support is build on top of the C API and is realized using a header only implementation.
+This means that all the binary artifact for the Apache Celix framework and util library are pure C and do not depend on
+libstdc++.</p>
+<p>Apache Celix also offers some C++ only libraries and bundles. The C++ libraries are also header only, but the C++
+bundles contains binaries depending on the stdlibc++ library.</p>
+<h2 id="more-information">More information</h2>
 <ul>
-<li>deployment_admin_identification     id used by the deployment admin to identify itself</li>
-<li>deployment_admin_url                url of the deployment server</li>
-<li>deployment_cache_dir                possible cache dir for the deployment admin update</li>
-<li>deployment_tags</li>
+<li>Building
+<ul>
+<li><a href="building/README.html">Building and Installing Apache Celix</a></li>
+<li><a href="building/dev_celix_with_clion.html">Building and Developing Apache Celix with CLion</a></li>
 </ul>
-<h2 id="using-info">Using info</h2>
-<p>If the Celix Deployment Admin is installed, &lsquo;find_package(Celix)&rsquo; will set:</p>
+</li>
+<li>Framework
 <ul>
-<li>The <code>Celix::deployment_admin_api</code> interface (i.e. headers only) library target</li>
-<li>The <code>Celix::deployment_admin</code> bundle target</li>
+<li><a href="bundles.html">Apache Celix Bundles</a></li>
+<li><a href="services.html">Apache Celix Services</a></li>
+<li><a href="components.html">Apache Celix Components</a></li>
+<li><a href="framework.html">Apache Celix Framework</a></li>
+<li><a href="containers.html">Apache Celix Containers</a></li>
+<li><a href="patterns.html">Apache Celix Patterns</a></li>
+</ul>
+</li>
+<li><a href="cmake_commands">Apache Celix CMake Commands</a></li>
+<li><a href="subprojects.html">Apache Celix Sub Projects</a></li>
 </ul>
 
 
diff --git a/content/docs/2.2.1/celix/documents/building/README.html b/content/docs/2.3.0/celix/documents/building/README.html
similarity index 70%
copy from content/docs/2.2.1/celix/documents/building/README.html
copy to content/docs/2.3.0/celix/documents/building/README.html
index 15fe496..35d4fda 100644
--- a/content/docs/2.2.1/celix/documents/building/README.html
+++ b/content/docs/2.3.0/celix/documents/building/README.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>Building and Installing / Apache Celix</title>
+    <title>Building and Installing Apache Celix / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -147,11 +163,11 @@ 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.
 -->
-<h1 id="apache-celix---building-and-installing">Apache Celix - Building and Installing</h1>
+<h1 id="building-and-installing-apache-celix">Building and Installing Apache Celix</h1>
 <p>Apache Celix aims to be support a broad range of UNIX platforms.</p>
-<p>Currently the <a href="https://travis-ci.org/apache/celix">continuous integration build server</a> builds and tests Apache Celix for:</p>
+<p>Currently, the [continuous integration build server] builds and tests Apache Celix for:</p>
 <ul>
-<li>Ubuntu Trusty Tahr (14.04)
+<li>Ubuntu Bionic Beaver (20.04)
 <ul>
 <li>GCC</li>
 <li>CLang</li>
@@ -159,101 +175,114 @@ limitations under the License.
 </li>
 <li>OSX
 <ul>
-<li>GCC</li>
 <li>CLang</li>
 </ul>
 </li>
-<li>Android (cross-compiled on Ubuntu Trusty Tahr)
-<ul>
-<li>GCC</li>
 </ul>
-</li>
-</ul>
-<h1 id="preparing">Preparing</h1>
+<h3 id="download-the-apache-celix-sources">Download the Apache Celix sources</h3>
+<p>To get started you first have to download the Apache Celix sources. This can be done by cloning the Apache Celix git repository:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#clone the repro</span>
+git clone --single-branch --branch master https://github.com/apache/celix.git
+</code></pre></div><h2 id="building-and-installing">Building and installing</h2>
+<p>Apache Celix uses <a href="https://cmake.org">CMake</a> as build system. CMake can generate (among others) makefiles.</p>
+<h3 id="building-and-installing-with-preinstalled-libraries">Building and installing with preinstalled libraries</h3>
 <p>The following packages (libraries + headers) should be installed on your system:</p>
 <ul>
 <li>Development Environment
 <ul>
 <li>build-essentials (gcc/g++ or clang/clang++)</li>
+<li>java or zip (for packaging bundles)</li>
+<li>make (3.14 or higher)</li>
 <li>git</li>
-<li>java (for packaging bundles)</li>
-<li>make (3.2 or higher)</li>
 </ul>
 </li>
 <li>Apache Celix Dependencies
 <ul>
-<li>zlib</li>
+<li>libzip</li>
 <li>uuid</li>
+<li>zlib</li>
 <li>curl (only initialized in the Celix framework)</li>
 <li>jansson (for serialization in libdfi)</li>
 <li>libffi (for libdfi)</li>
 <li>libxml2 (for remote services and bonjour shell)</li>
+<li>rapidjson (for C++ remote service discovery)</li>
+<li>libczmq (for PubSubAdmin ZMQ)</li>
 </ul>
 </li>
 </ul>
-<p>For debian based systems (apt), the following command should work:</p>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sudo apt-get install -yq --no-install-recommends <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>	build-essential <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>  	curl <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>  	git <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>  	libjansson-dev <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>  	libcurl4-openssl-dev <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    java <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>  	cmake <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>  	libffi-dev <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>  	libxml2-dev
-</code></pre></div><p>For Fedora based systems (dnf), the following command should work:</p>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">sudo dnf group install -y <span style="color:#b44">&#34;C Development Tools and Libraries&#34;</span>
-sudo dnf install <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    cmake <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    make <span style="color:#b62;font-weight:bold">\
+<p>For Ubuntu 20.04, use the following commands:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#### get dependencies</span>
+sudo apt-get install -yq --no-install-recommends <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    build-essential <span style="color:#b62;font-weight:bold">\
 </span><span style="color:#b62;font-weight:bold"></span>    git <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    java <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    libcurl-devel <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    jansson-devel <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    libffi-devel <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    libxml2-devel <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    libuuid-devel
-</code></pre></div><p>For OSX systems with brew installed, the following command should work:</p>
+</span><span style="color:#b62;font-weight:bold"></span>    curl <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    uuid-dev <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    libjansson-dev <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    libcurl4-openssl-dev <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    default-jdk <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    libffi-dev <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    libzip-dev <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    libxml2-dev <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    libczmq-dev <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    libcpputest-dev <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    rapidjson-dev
+
+<span style="color:#080;font-style:italic">#The cmake version for Ubuntu 20 is older than 3.14,</span>
+<span style="color:#080;font-style:italic">#use snap to install the latest cmake version</span>
+snap install cmake
+</code></pre></div><p>For OSX systems with brew installed, use the following commands:</p>
 <div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">    brew update <span style="color:#666">&amp;&amp;</span> <span style="color:#b62;font-weight:bold">\
-</span><span style="color:#b62;font-weight:bold"></span>    brew install lcov libffi cmake <span style="color:#666">&amp;&amp;</span> <span style="color:#b62;font-weight:bold">\
+</span><span style="color:#b62;font-weight:bold"></span>    brew install lcov libffi libzip czmq rapidjson libxml2 cmake <span style="color:#666">&amp;&amp;</span> <span style="color:#b62;font-weight:bold">\
 </span><span style="color:#b62;font-weight:bold"></span>    brew link --force libffi
-</code></pre></div><h2 id="download-the-apache-celix-sources">Download the Apache Celix sources</h2>
-<p>To get started you first have to download the Apache Celix sources. This can be done by cloning the Apache Celix git repository:</p>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#Create a new workspace to work in, e.g:</span>
-mkdir <span style="color:#b68;font-weight:bold">${</span><span style="color:#b8860b">HOME</span><span style="color:#b68;font-weight:bold">}</span>/workspace
-<span style="color:#a2f">export</span> <span style="color:#b8860b">WS</span><span style="color:#666">=</span><span style="color:#b68;font-weight:bold">${</span><span style="color:#b8860b">HOME</span><span style="color:#b68;font-weight:bold">}</span>/workspace
-<span style="color:#a2f">cd</span> <span style="color:#b68;font-weight:bold">${</span><span style="color:#b8860b">WS</span><span style="color:#b68;font-weight:bold">}</span>
-
-<span style="color:#080;font-style:italic">#clone the repro</span>
-git clone --single-branch --branch master https://github.com/apache/celix.git
-</code></pre></div><h2 id="building-apache-celix">Building Apache Celix</h2>
-<p>Apache Celix uses <a href="https://cmake.org">CMake</a> as build system. CMake can generate (among others) makefiles.</p>
-<h3 id="building-using-cmake-and-makefiles">Building using CMake and makefiles:</h3>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#a2f">cd</span> <span style="color:#b68;font-weight:bold">${</span><span style="color:#b8860b">WS</span><span style="color:#b68;font-weight:bold">}</span>/celix
+</code></pre></div><p>Use CMake and make to build Apache Celix</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#a2f">cd</span> celix
 mkdir build
 <span style="color:#a2f">cd</span> build
-cmake .. 
-make 
+cmake -DCMAKE_BUILD_TYPE<span style="color:#666">=</span>RelWithDebInfo .. 
+make -j
 </code></pre></div><h2 id="editing-build-options">Editing Build options</h2>
 <p>With use of CMake, Apache Celix makes it possible to edit build options. This enabled users, among other options, to configure a install location and select additional bundles.
 To edit the options use ccmake or cmake-gui. For cmake-gui an additional package install can be necessary (Fedora: <code>dnf install cmake-gui</code>).</p>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#a2f">cd</span> <span style="color:#b68;font-weight:bold">${</span><span style="color:#b8860b">WS</span><span style="color:#b68;font-weight:bold">}</span>/celix/build
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#a2f">cd</span> celix/build
 ccmake .
 <span style="color:#080;font-style:italic">#Edit options, e.g. enable BUILD_REMOTE_SHELL to build the remote (telnet) shell</span>
 <span style="color:#080;font-style:italic">#Edit the CMAKE_INSTALL_PREFIX config to set the install location</span>
 </code></pre></div><p>For this guide we assume the CMAKE_INSTALL_PREFIX is <code>/usr/local</code>.</p>
 <h2 id="installing-apache-celix">Installing Apache Celix</h2>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#a2f">cd</span> <span style="color:#b68;font-weight:bold">${</span><span style="color:#b8860b">WS</span><span style="color:#b68;font-weight:bold">}</span>/celix/build
-make
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#a2f">cd</span> celix/build
+make -j
 sudo make install
 </code></pre></div><h2 id="running-apache-celix">Running Apache Celix</h2>
 <p>If Apache Celix is successfully installed running</p>
 <div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">celix
 </code></pre></div><p>should give the following output:
 &ldquo;Error: invalid or non-existing configuration file: &lsquo;config.properties&rsquo;.No such file or directory&rdquo;.</p>
-<p>For more info how to build your own projects and/or running the Apache Celix examples see <a href="../getting_started/README.html">Getting Started</a>.</p>
-
+<p>For more info how to build your own projects and/or running the Apache Celix examples see <a href="../README.html">Celix Intro</a>.</p>
+<h1 id="building-etcdlib-library-standalone">Building etcdlib library standalone</h1>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#bash</span>
+git clone git@github.com:apache/celix.git
+mkdir celix/build
+<span style="color:#a2f">cd</span> celix/build
+cmake -DCMAKE_BUILD_TYPE<span style="color:#666">=</span>RelWithDebInfo ../libs/etcdlib
+make -j
+sudo make install
+</code></pre></div><h1 id="building-celix-promises-library-standalone">Building Celix Promises library standalone</h1>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#bash</span>
+git clone git@github.com:apache/celix.git
+mkdir celix/build
+<span style="color:#a2f">cd</span> celix/build
+cmake -DCMAKE_BUILD_TYPE<span style="color:#666">=</span>RelWithDebInfo ../libs/promises
+make -j
+sudo make install
+</code></pre></div><h1 id="building-celix-push-streams-library-standalone">Building Celix Push Streams library standalone</h1>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#bash</span>
+git clone git@github.com:apache/celix.git
+mkdir celix/build
+<span style="color:#a2f">cd</span> celix/build
+cmake -DCMAKE_BUILD_TYPE<span style="color:#666">=</span>RelWithDebInfo ../libs/pushstreams
+make -j
+sudo make install
+</code></pre></div>
 
                 </div>
             </div>
diff --git a/content/docs/2.2.1/celix/bundles/http_admin/README.html b/content/docs/2.3.0/celix/documents/building/dev_celix_with_clion.html
similarity index 69%
copy from content/docs/2.2.1/celix/bundles/http_admin/README.html
copy to content/docs/2.3.0/celix/documents/building/dev_celix_with_clion.html
index 08ffa0c..d2de264 100644
--- a/content/docs/2.2.1/celix/bundles/http_admin/README.html
+++ b/content/docs/2.3.0/celix/documents/building/dev_celix_with_clion.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>HTTP Admin / Apache Celix</title>
+    <title>Building and Developing Apache Celix with CLion / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,13 +137,13 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/http_admin/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/building/dev_celix_with_clion.md" title="Edit this page on GitHub">Edit on GitHub</a>
                         
                     
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -147,30 +163,41 @@ 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.
 -->
-<h2 id="http-admin">HTTP Admin</h2>
-<p>The HTTP admin provides a service tracker and starts a HTTP web server. The civetweb web server is used as an embedded
-web server. Websockets are supported by the HTTP admin.</p>
-<p>Services can register and implement HTTP requests or websocket support for a specified URI.
-The supported HTTP requests are: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS and PATCH.
-The websocket service can support different callback handlers: connect, ready, data and close.</p>
-<p>Aliasing is also supported for both HTTP services and websocket services. Multiple aliases can be added by using the comma as seperator.
-Adding aliasing is done by adding the following function to the target CMakeFile (fill in <Alias path> and <Path to destination>):</p>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">celix_bundle_headers</span>(<span style="color:#b44">&lt;TARGET&gt;</span>
-        <span style="color:#b44">&#34;X-Web-Resource: /&lt;Alias path&gt;$&lt;SEMICOLON&gt;/&lt;Path to destination&gt;, /&lt;Alias path 2&gt;$&lt;SEMICOLON&gt;/&lt;Path to destination&gt;&#34;</span>
-)<span style="">
-</span></code></pre></div><p>Bundle alias resources can be added by the with the following function in the bundle CMakefile:</p>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">celix_bundle_add_dir</span>(<span style="color:#b44">&lt;TARGET&gt;</span> <span style="color:#b44">&lt;Document</span> <span style="color:#b44">root</span> <span style="color:#b44">of</span> <span style="color:#b44">bundle&gt;</span> <span style="color:#b44">DESTINATION</span> <span style="color:#b44">&#34;.&#34;</s [...]
-</span></code></pre></div><h3 id="celix-supported-configproperties">Celix supported config.properties</h3>
-<pre><code>CELIX_HTTP_ADMIN_LISTENING_PORTS                 default = 8080, can be multiple ports divided by a comma
-CELIX_HTTP_ADMIN_PORT_RANGE_MIN                  default = 8000
-CELIX_HTTP_ADMIN_PORT_RANGE_MAX                  default = 9000
-CELIX_HTTP_ADMIN_USE_WEBSOCKETS                  default = true
-CELIX_HTTP_ADMIN_WEBSOCKET_TIMEOUT_MS            default = 3600000
-CELIX_HTTP_ADMIN_NUM_THREADS                     default = 1
-</code></pre>
-<h2 id="cmake-option">CMake option</h2>
-<pre><code>BUILD_HTTP_ADMIN=ON
-</code></pre>
+<h1 id="building-and-developing-apache-celix-with-clion">Building and Developing Apache Celix with CLion</h1>
+<p>Apache Celix can be build for development in CLion with use of the Conan package manager.
+Conan will arrange the building of the Apache Celix dependencies and generate Find<package> files for these dependencies.</p>
+<p>Conan will also generate a <code>active_run.sh</code> and <code>deactivate_run.sh</code> script that does the environment (de)setup for the
+binary locations of the build dependencies (i.e. configures <code>PATH</code> and <code>LD_LIBRARY_PATH</code>/<code>DYLD_LIBRARY_PATH</code>).</p>
+<h2 id="setting-up-the-build-directory">Setting up the build directory</h2>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell"><span style="color:#080;font-style:italic">#clone git repo</span>
+git clone https://github.com/apache/celix.git
+<span style="color:#a2f">cd</span> celix
+
+<span style="color:#080;font-style:italic">#if needed setup conan default and debug profile</span>
+conan profile new default --detect
+conan profile new debug --detect
+conan profile update settings.build_type<span style="color:#666">=</span>Debug debug
+
+<span style="color:#080;font-style:italic">#generate and configure cmake-build-debug directory</span>
+conan install . celix/2.3.0 -pr:b default -pr:h debug -if cmake-build-debug/ -o celix:enable_testing<span style="color:#666">=</span>True -o celix:enable_address_sanitizer<span style="color:#666">=</span>True -o celix:build_all<span style="color:#666">=</span>True -b missing
+conan build . -bf cmake-build-debug/ --configure
+
+<span style="color:#080;font-style:italic">#optional build</span>
+<span style="color:#a2f">cd</span> cmake-build-debug
+make -j
+
+<span style="color:#080;font-style:italic">#optional setup run env and run tests</span>
+<span style="color:#a2f">source</span> activate_run.sh 
+ctest --verbose
+<span style="color:#a2f">source</span> deactivate_run.sh 
+</code></pre></div><h2 id="configuring-clion">Configuring CLion</h2>
+<p>To ensure that all Conan build dependencies can be found the Run/Debug configurations of CLion needs te be updated.</p>
+<p>This can be done under the menu &ldquo;Run-&gt;Edit Configurations&hellip;&quot;, then select &ldquo;Edit configuration templates&hellip;&rdquo; and
+then update the &ldquo;Google Test&rdquo; template so that the <code>active_run.sh</code> Conan generated script is sourced in the
+&ldquo;Environment variables&rdquo; entry.</p>
+<p>If the Apache Celix CMake build directory is <code>home/joe/workspace/celix/cmake-build-debug</code> then the value for
+&ldquo;Environment variables&rdquo; should be: <code>source /home/joe/workspace/celix/cmake-build-debug/activate_run.sh</code></p>
+<p><img src="media/clion_run_configuration_template.png" alt="Configure CLion"></p>
 
 
                 </div>
diff --git a/content/docs/2.3.0/celix/documents/building/media/clion_run_configuration_template.png b/content/docs/2.3.0/celix/documents/building/media/clion_run_configuration_template.png
new file mode 100644
index 0000000..174dcf3
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/building/media/clion_run_configuration_template.png differ
diff --git a/content/docs/2.3.0/celix/documents/bundles.html b/content/docs/2.3.0/celix/documents/bundles.html
new file mode 100644
index 0000000..068b80e
--- /dev/null
+++ b/content/docs/2.3.0/celix/documents/bundles.html
@@ -0,0 +1,439 @@
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <title>Apache Celix Bundles / Apache Celix</title>
+
+    
+    <link rel="icon" href="/assets/img/favicon.ico">
+
+    
+    <link href="/assets/css/bootstrap.min.css" rel="stylesheet">
+
+    
+    <link href="/assets/css/style.css" rel="stylesheet">
+
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
+    
+<script>
+  var _paq = window._paq = window._paq || [];
+   
+  _paq.push(['disableCookies']);
+   
+  _paq.push(['trackPageView']);
+  _paq.push(['enableLinkTracking']);
+  (function() {
+    var u="https://analytics.apache.org/";
+    _paq.push(['setTrackerUrl', u+'matomo.php']);
+    _paq.push(['setSiteId', '9']);
+    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+  })();
+</script>
+
+
+</head>
+<body class="light-grey">
+
+<a href="https://github.com/apache/celix" class="github-ribbon">
+    <img src="/assets/img/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
+</a>
+
+
+<nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top">
+    <div class="container">
+        <a class="navbar-brand" href="/">
+            <img src="/assets/img/celix-white.svg" height="40" class="d-inline-block align-top" alt="Celix Logo">
+        </a>
+        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+        </button>
+        <div class="collapse navbar-collapse" id="navbarResponsive">
+            <ul class="navbar-nav ml-auto">
+                <li class="nav-item">
+                    <a class="nav-link" href="/">Home</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" href="/download.cgi">Download</a>
+                </li>
+                <li class="nav-item dropdown active">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Docs
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddDocs">
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
+                        <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddContributing" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Contributing
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddContributing">
+                        <a class="dropdown-item" href="/contributing/youatcelix.html">You at Celix</a>
+                        <a class="dropdown-item" href="/contributing/submitting-patches.html">Submitting patches</a>
+                        <a class="dropdown-item" href="/contributing/source-and-builds.html">Source code and builds</a>
+                        <hr>
+                        <a class="dropdown-item" href="/contributing/releasing.html">Releasing</a>
+                        <a class="dropdown-item" href="/contributing/volunteers.html">Volunteers</a>
+                        <a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Celix.html">Board Reports</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddSupport" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Support
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddSupport">
+                        <a class="dropdown-item" href="/support/mailing-list.html">Mailing Lists</a>
+                        <a class="dropdown-item" href="/support/issue-tracking.html">Issue Tracking</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddFoundation" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        ASF
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddFoundation">
+                        <a class="dropdown-item" href="https://www.apache.org/">ASF Home</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/how-it-works.html">How it works</a>
+                        <a class="dropdown-item" href="https://www.apache.org/licenses/">License</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
+                        <a class="dropdown-item" href="https://www.apache.org/security/">Security</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a>
+                    </div>
+                </li>
+            </ul>
+        </div>
+    </div>
+</nav>
+
+
+<div class="section">
+    <div class="container">
+        <div class="row py-4">
+            <div class="col-sm-12 card">
+                <div class="card-body pt-5">
+                    
+                    
+                        
+                        
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/bundles.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                        
+                    
+
+                    
+                        
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                    
+
+                    
+	<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+<h1 id="apache-celix-bundles">Apache Celix Bundles</h1>
+<p>An Apache Celix Bundle contains a collection of shared libraries, configuration files and optional
+an activation entry combined in a zip file. Bundles can be dynamically installed and started in an Apache Celix framework.</p>
+<h2 id="the-anatomy-of-a-celix-bundle">The anatomy of a Celix Bundle</h2>
+<p>Technically an Apache Celix Bundle is a zip file with the following content:</p>
+<ul>
+<li>META-INF/MANIFEST.MF: The required bundle manifest, containing information about the bundle (name, activator library etc)</li>
+<li>Bundle shared libraries (so/dylib files): Optionally a bundle has 1 or more shared libraries.
+The bundle manifest configures which libraries will be loaded (private libs) and which - if any - library is used
+when activating the bundle.</li>
+<li>Bundle resource files: A bundle can also contain additional resource files.
+This could be configuration files, html files, etc.<br>
+It is also possible to have bundles which no shared library, but only resource files.
+Note that bundles can access other bundles resources files.</li>
+</ul>
+<p>If a <code>jar</code> command is available the Celix CMake commands will use that (instead of the <code>zip</code> command) to create bundle
+zip files so that the MANIFEST.MF is always the first entry in the zip file.</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#080;font-style:italic">#unpacking celix_shell_wui.zip bundle file from a cmake build `cmake-build-debug`.</span>
+<span style="color:#080;font-style:italic">#The celix_shell_wui.zip file is the Celix Shell Web UI bundle. Which provides a web ui interface to the Celix</span> 
+<span style="color:#080;font-style:italic">#interactive shell; It contains a manifest file, shared libraries, and additional web resources</span> 
+<span style="color:#080;font-style:italic">#which can be picked up by the `Celix::http_admin` bundle.</span> 
+% unzip cmake-build-debug/bundles/shell/shell_wui/celix_shell_wui.zip -d unpacked_bundle_dir 
+% find unpacked_bundle_dir 
+unpacked_bundle_dir
+unpacked_bundle_dir/resources
+unpacked_bundle_dir/resources/index.html
+unpacked_bundle_dir/resources/ansi_up.js
+unpacked_bundle_dir/resources/script.js
+unpacked_bundle_dir/META-INF
+unpacked_bundle_dir/META-INF/MANIFEST.MF
+unpacked_bundle_dir/libcivetweb_shared.so <span style="color:#080;font-style:italic">#or dylib for OSX</span>
+unpacked_bundle_dir/libshell_wui.1.so <span style="color:#080;font-style:italic">#or dylib for OSX</span>    
+</code></pre></div><h2 id="bundle-lifecycle">Bundle lifecycle</h2>
+<p>An Apache Celix Bundle has its own lifecycle with the following states:</p>
+<ul>
+<li>Installed - The bundle has been installed into the Celix framework, but it is not yet resolved. For Celix this
+currently means that not all bundle libraries can or have been loaded.</li>
+<li>Resolved - The bundle is installed and its requirements have been met. For Celix this currently means that the
+bundle libraries have been loaded.</li>
+<li>Starting - Starting is a temporary state while the bundle activator&rsquo;s create and start callbacks are being executed.</li>
+<li>Active - The bundle is active.</li>
+<li>Stopping - Stopping is a temporary state while the bundle activator stop and destroy callbacks are being executed.</li>
+<li>Uninstalled - The bundle has been removed from the Celix framework.</li>
+</ul>
+<p><img src="diagrams/bundles_lifecycle.png" alt="State diagram of the bundle lifecycle"></p>
+<h2 id="bundle-activation">Bundle activation</h2>
+<p>Bundles can be installed and started dynamically. When a bundle is started it will be activated by looking up the bundle
+activator entry points (using <code>dlsym</code>). The entry points signatures are:</p>
+<ul>
+<li><code>celix_status_t celix_bundleActivator_create(celix_bundle_context_t *ctx, void **userData)</code>:
+Called to create the bundle activator.</li>
+<li><code>celix_status_t celix_bundleActivator_start(void *userData, celix_bundle_context_t *ctx)</code>:
+Called to start the bundle.</li>
+<li><code>celix_status_t celix_bundleActivator_stop(void *userData, celix_bundle_context_t *ctx)</code>:
+Called to stop the bundle.</li>
+<li><code>celix_status_t celix_bundleActivator_destroy(void *userData, celix_bundle_context_t* ctx)</code>:
+Called to destroy (free mem) the bundle activator.</li>
+</ul>
+<p>The most convenient way to create a bundle activator in C is to use the macro <code>CELIX_GEN_BUNDLE_ACTIVATOR</code> defined in
+<code>celix_bundle_activator.h</code>. This macro requires two functions (start,stop), these function can be <code>static</code> and
+use a typed bundle activator struct instead of <code>void*</code>.</p>
+<p>For C++, the macro <code>CELIX_GEN_CXX_BUNDLE_ACTIVATOR</code> defined in <code>celix/BundleActivator.h</code> must be used to create a
+bundle activator. For C++ a RAII approach is used for bundle activation.
+This means that a C++ bundle is started by creating a bundle activator object and stopped by
+letting the bundle activator object go out of scope.</p>
+<h2 id="bundle-and-bundle-context">Bundle and Bundle Context</h2>
+<p>A bundle can interact with the Apache Celix framework using a bundle execution context or bundle context in short.
+The bundle context provides functions/methods to:</p>
+<ul>
+<li>Register and un-register services.</li>
+<li>Install, start, stop or uninstall bundles.</li>
+<li>Track for service being added or removed.</li>
+<li>Track for bundles being installed, started, stopped or uninstalled.</li>
+<li>Track for service tracker being started or stopped</li>
+<li>Find service ids for a given filter.</li>
+<li>Use services directly (without manually creating a service tracker).</li>
+<li>Use bundles directly (without manually creating a bundle tracker).</li>
+<li>Wait for events in the Celix event thread.</li>
+<li>Retrieve framework property values.</li>
+<li>Retrieve the bundle object associated with the bundle context.</li>
+</ul>
+<h2 id="hello-world-bundle-example">Hello World Bundle Example</h2>
+<p>The hello world bundle example is a simple example which print a &ldquo;Hello world&rdquo; and &ldquo;Goodbye world&rdquo; line when
+starting / stopping the bundle.</p>
+<p>Knowledge about C, C++ and CMake is expected to understand the examples.</p>
+<p>The C and C++ examples exists of a single source file which contains the bundle activator and some Apache Celix
+CMake commands to create a bundle and a container.</p>
+<p>Both containers example uses 3 bundles: the Apache Celix Shell bundle, the Apache Celix Shell Textual UI bundle
+and the Hello World bundle. The Apache Celix Shell bundle provides a set of interactive shell commands and the
+Apache Celix Shell Textual UI bundle can be used to run these command from a console terminal.</p>
+<p>When the C or C++ Hello World bundle example container is started, the following commands can be used to dynamically
+stop and start the Hello World bundle.</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">stop <span style="color:#666">3</span> <span style="color:#080;font-style:italic">#Stopping the Hello World bundle. Note that the Hello World is the third bundle, so it will get a bundle id 3.</span>
+start <span style="color:#666">3</span> <span style="color:#080;font-style:italic">#Starting the Hello World bundle again.</span>
+uninstall <span style="color:#666">3</span> <span style="color:#080;font-style:italic">#Stoping and uninstalling the Hello World bundle.</span>
+stop <span style="color:#666">0</span> <span style="color:#080;font-style:italic">#stop the Apache Celix framework</span>
+</code></pre></div><p>The see what other Apache Celix shell commands are available run the <code>celix::help</code> command:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#a2f">help</span> <span style="color:#080;font-style:italic">#note can also be triggered with celix::help (the fully qualified command name).</span> 
+<span style="color:#a2f">help</span> celix::start 
+<span style="color:#a2f">help</span> celix::lb
+stop <span style="color:#666">0</span> <span style="color:#080;font-style:italic">#stop the Apache Celix framework</span>
+</code></pre></div><h3 id="c-example">C Example</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//src/my_bundle_activator.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> my_bundle_activator_data {
+    <span style="color:#080;font-style:italic">/*the hello world bundle activator struct is empty*/</span>
+} my_bundle_activator_data_t;
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">my_bundle_start</span>(my_bundle_activator_data_t <span style="color:#666">*</span>data, celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello world from bundle with id %li</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, celix_bundleContext_getBundleId(ctx));
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">my_bundle_stop</span>(my_bundle_activator_data_t <span style="color:#666">*</span>data, celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Goodbye world</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>);
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(my_bundle_activator_data_t, my_bundle_start, my_bundle_stop)
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#080;font-style:italic">#With `make all`, `make celix-bundles` this bundle will be created at:
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080;font-style:italic">#  ${CMAKE_CURRENT_BINARY_DIR}/my_bundle.zip.
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">my_bundle</span>
+    <span style="color:#b44">VERSION</span> <span style="color:#b44">1.0.0</span> 
+    <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/my_bundle_activator.c</span>
+)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#080;font-style:italic">#With `make all`, `make celix-containers` or `make my_container` this Celix container executable will be created at:
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080;font-style:italic"># ${CMAKE_BINARY_DIR}/deploy/my_container/my_container
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">my_container</span>
+    <span style="color:#b44">C</span>
+    <span style="color:#b44">BUNDLES</span>
+        <span style="color:#b44">Celix::shell</span>
+        <span style="color:#b44">Celix::shell_tui</span>
+        <span style="color:#b44">my_bundle</span>
+)<span style="">
+</span></code></pre></div><h3 id="c-example-1">C++ Example</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/MyBundleActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;iostream&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&#34;celix/BundleActivator.h&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">MyBundleActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> MyBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello world from bundle with id </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>getBundleId() <span s [...]
+    }
+
+    <span style="color:#666">~</span>MyBundleActivator() <span style="color:#a2f;font-weight:bold">noexcept</span> {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Goodbye world</span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> std<span style="color:#666">:</span><span style="color:#666">:</span>endl;
+    }
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(MyBundleActivator)
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#080;font-style:italic">#With `make all`, `make celix-bundles` this bundle will be created at:
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080;font-style:italic">#  ${CMAKE_CURRENT_BINARY_DIR}/MyBundle.zip.
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">MyBundle</span>
+    <span style="color:#b44">SOURCES</span> <span style="color:#b44">src/MyBundleActivator.cc</span>
+)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#080;font-style:italic">#With `make all`, `make celix-containers` or `make MyContainer` this Celix container executable will be created at:
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080;font-style:italic"># ${CMAKE_BINARY_DIR}/deploy/my_container/MyContainer
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">MyContainer</span>
+    <span style="color:#b44">CXX</span>
+    <span style="color:#b44">BUNDLES</span>
+        <span style="color:#b44">Celix::ShellCxx</span>
+        <span style="color:#b44">Celix::shell_tui</span>
+        <span style="color:#b44">MyBundle</span>
+)<span style="">
+</span></code></pre></div><h2 id="interaction-between-bundles">Interaction between bundles</h2>
+<p>By design bundles cannot directly access the symbols of another bundle. Interaction between bundles must be done using
+Apache Celix services. This means that unless functionality is provided by means of an Apache Celix service,
+bundle functionality is private to the bundle.
+In Apache Celix symbols are kept private by loading bundle libraries locally (<code>dlopen</code> with <code>RTLD_LOCAL</code>).</p>
+<h2 id="installing-bundles">Installing bundles</h2>
+<p>Apache Celix bundles can be installed on the system with the Apache Celix CMake command <code>install_celix_bundle</code>.
+Bundles will be installed as zip files in the package (default the CMAKE_PROJECT_NAME) share directory
+(e.g <code>/use/share/celix/bundles</code>).</p>
+<p>It is also possible to use Apache Celix bundles as CMake imported targets, but this requires a more complex
+CMake installation setup.</p>
+<h2 id="installing-celix-cmake-targets">Installing Celix CMake targets</h2>
+<p>The <code>install_celix_targets</code> can be used to generate a CMake file with the imported Apache Celix Bundle CMake targets
+and this is ideally coupled with a CMake config file so that the bundles are made available when
+CMake&rsquo;s <code>find_package</code> is used.</p>
+<p>Example:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#080;font-style:italic">#Project setup
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">project</span>(<span style="color:#b44">ExamplePackage</span> <span style="color:#b44">C</span> <span style="color:#b44">CXX</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#080;font-style:italic">#Create bundles
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">ExampleBundleA</span> <span style="color:#b44">...</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">ExampleBundleB</span> <span style="color:#b44">...</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#080;font-style:italic">#Install bundle zips
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">install_celix_bundle</span>(<span style="color:#b44">ExampleBundleA</span> <span style="color:#b44">EXPORT</span> <span style="color:#b44">MyExport</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">install_celix_bundle</span>(<span style="color:#b44">ExampleBundleB</span> <span style="color:#b44">EXPORT</span> <span style="color:#b44">MyExport</span>)<span style="">
+</span><span style=""></span><span style="color:#080;font-style:italic">#install exported Celix CMake targets
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">install_celix_targets</span>(<span style="color:#b44">MyExport</span> <span style="color:#b44">NAMESPACE</span> <span style="color:#b44">ExamplePackage::</span> <span style="color:#b44">DESTINATION</span> <span style="color:#b44">share/ExamplePackage/cmake</span> <span style="color:#b44">FILE</span> <span style="color:#b44">CelixTargets</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#080;font-style:italic">#Install Package CMake configuration
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">file</span>(<span style="color:#b44">GENERATE</span> <span style="color:#b44">OUTPUT</span> <span style="color:#666">${</span><span style="color:#b8860b">CMAKE_BINARY_DIR</span><span style="color:#666">}</span><span style="color:#b44">/ExamplePackageConfig.cmake</span> <span style="color:#b44">CONTENT</span> <span style="color:#b44">&#34;
+</span><span style="color:#b44">  # relative install dir from lib/CMake/ExamplePackage.
+</span><span style="color:#b44">  get_filename_component(REL_INSTALL_DIR &#34;</span><span style="color:#666">${</span><span style="color:#b8860b">CMAKE_CURRENT_LIST_FILE</span><span style="color:#666">}</span><span style="color:#b44">&#34; PATH)
+</span><span style="color:#b44">  get_filename_component(REL_INSTALL_DIR &#34;</span><span style="color:#666">${</span><span style="color:#b8860b">REL_INSTALL_DIR</span><span style="color:#666">}</span><span style="color:#b44">&#34; PATH)
+</span><span style="color:#b44">  get_filename_component(REL_INSTALL_DIR &#34;</span><span style="color:#666">${</span><span style="color:#b8860b">REL_INSTALL_DIR</span><span style="color:#666">}</span><span style="color:#b44">&#34; PATH)
+</span><span style="color:#b44">  get_filename_component(REL_INSTALL_DIR &#34;</span><span style="color:#666">${</span><span style="color:#b8860b">REL_INSTALL_DIR</span><span style="color:#666">}</span><span style="color:#b44">&#34; PATH)
+</span><span style="color:#b44">  include(${REL_INSTALL_DIR}/share/celix/cmake/CelixTargets.cmake)
+</span><span style="color:#b44">&#34;</span>)<span style="">
+</span><span style=""></span><span style="">
+</span><span style=""></span><span style="color:#a2f">install</span>(<span style="color:#b44">FILES</span>
+  <span style="color:#666">${</span><span style="color:#b8860b">CMAKE_BINARY_DIR</span><span style="color:#666">}</span><span style="color:#b44">/ExamplePackageConfig.cmake</span>
+  <span style="color:#b44">DESTINATION</span> <span style="color:#666">${</span><span style="color:#b8860b">CMAKE_INSTALL_LIBDIR</span><span style="color:#666">}</span><span style="color:#b44">/cmake/ExamplePackage</span>)<span style="">
+</span></code></pre></div><p>Downstream Usage Example:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">project</span>(<span style="color:#b44">UsageExample</span> <span style="color:#b44">C</span> <span style="color:#b44">CXX</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">ExamplePackage</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">test_container</span> <span style="color:#b44">BUNDLES</span>
+  <span style="color:#b44">Celix::shell</span>
+  <span style="color:#b44">Celix::shell_tui</span>
+  <span style="color:#b44">ExamplePackage::ExampleBundleA</span>
+  <span style="color:#b44">ExamplePackage::ExampleBundleB</span>
+)<span style="">
+</span></code></pre></div><p>See <a href="cmake_commands/README.html">Apache Celix CMake Commands</a> for more detailed information.</p>
+<h1 id="the-celixlb-shell-command">The <code>celix::lb</code> shell command</h1>
+<p>To interactively see the installed bundles the <code>celix::lb</code> shell command (list bundles) can be used.</p>
+<p>Examples of supported <code>lb</code> command lines are:</p>
+<ul>
+<li><code>celix::lb</code> - Show an overview of the installed bundles with their bundle id, bundle state, bundle name and
+bundle group.</li>
+<li><code>lb</code> - Same as <code>celix::lb</code> (as long as there is no colliding other <code>lb</code> commands).</li>
+<li><code>lb -s</code> - Same as <code>celix::lb</code> but instead of showing the bundle name the bundle symbolic name is printed.</li>
+<li><code>lb -u</code> - Same as <code>celix::lb</code> but instead of showing the bundle name the bundle update location is printed.</li>
+</ul>
+
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<footer class="py-3 bg-secondary">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-8 text-center">
+                <p class="m-0 text-white">
+                    Copyright &copy; 2022 The Apache Software Foundation, Licensed under
+                    the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
+                    <br>
+                    Apache Celix, Celix, Apache, the Apache feather logo and the Apache Celix logo are trademarks of The Apache Software Foundation.
+                </p>
+            </div>
+            <div class="col-md-4 text-center">
+                <a href="https://www.apache.org/events/current-event.html" target="_blank">
+                    <img src="https://www.apache.org/events/current-event-234x60.png" title="Apache Event" width="234" height="60" border="0">
+                </a>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+<script src="/assets/js/jquery.min.js"></script>
+<script src="/assets/js/bootstrap.bundle.min.js"></script>
+
+
+</body>
+</html>
diff --git a/content/docs/2.2.1/celix/documents/cmake_commands/README.html b/content/docs/2.3.0/celix/documents/cmake_commands/README.html
similarity index 85%
copy from content/docs/2.2.1/celix/documents/cmake_commands/README.html
copy to content/docs/2.3.0/celix/documents/cmake_commands/README.html
index d1a7028..03ae61a 100644
--- a/content/docs/2.2.1/celix/documents/cmake_commands/README.html
+++ b/content/docs/2.3.0/celix/documents/cmake_commands/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -165,7 +181,7 @@ limitations under the License.
 <li>GROUP: The group the bundle is part of. This will be used as Bundle-Group manifest entry. Default this is empty (no group).</li>
 <li>VERSION: The bundle version. This will be used for the Bundle-Version manifest entry. In combination with SOURCES the version will also be used to set the activator library target property VERSION and SOVERSION.
 For SOVERSION only the major part is used. Expected scheme is &ldquo;<major>.<minor>.<path>&rdquo;. Default version is &ldquo;0.0.0&rdquo;</li>
-<li>FILENAME: The filename of the bundle file. Default is &lt;bundle_target_name&gt;.zip.</li>
+<li>FILENAME: The filename of the bundle file, without extension. Default is &lt;bundle_target_name&gt;. Together with the BUILD_TYPE, this will result in a filename like &ldquo;bundle_target_name_Debug.zip</li>
 <li>PRIVATE_LIBRARIES: private libraries to be included in the bundle. Specified libraries are added to the &ldquo;Private-Library&rdquo; manifest statement and added in the root of the bundle. libraries can be cmake library targets or absolute paths to existing libraries.</li>
 <li>HEADERS: Additional headers values that are appended to the bundle manifest.</li>
 </ul>
@@ -205,6 +221,25 @@ For SOVERSION only the major part is used. Expected scheme is &ldquo;<major>.<mi
 </span></code></pre></div><h2 id="celix_bundle_private_libs">celix_bundle_private_libs</h2>
 <p>Add libraries to a bundle. The libraries should be cmake library targets or an absolute path to an existing library.</p>
 <p>The libraries will be copied into the bundle zip and activator library will be linked (PRIVATE) against them.</p>
+<p>Apache Celix uses dlopen with RTLD_LOCAL to load the activator library in a bundle.
+It is important to note that dlopen will always load the activator library,
+but not always load the libraries the bundle activator library is linked against.
+If the activator library is linked against a library which is already loaded, the already loaded library will be used.
+More specifically dlopen will decide this based on the NEEDED header in the activator library
+and the SO_NAME headers of the already loaded libraries.</p>
+<p>For example installing in order:</p>
+<ul>
+<li>Bundle A with a private library libfoo (SONAME=libfoo.so) and</li>
+<li>Bundle B with a private library libfoo (SONAME=libfoo.so).
+Will result in Bundle B also using libfoo loaded from the cache dir in Bundle A.</li>
+</ul>
+<p>This also applies if multiple Celix frameworks are created in the same process. For example installed in order:</p>
+<ul>
+<li>Bundle A with a private library libfoo (SONAME=libfoo.so) in Celix Framework A and</li>
+<li>The same Bundle A in Celix Framework B.
+Will result in Bundle A from Framework B to use the libfoo loaded from the cache dir of Bundle A in framework A.</li>
+</ul>
+<p>Will result in BundleA from framework B to use the libfoo loaded in BundleA from framework A.</p>
 <div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">celix_bundle_private_libs</span>(<span style="color:#b44">&lt;bundle_target&gt;</span>
     <span style="color:#b44">lib1</span> <span style="color:#b44">lib2</span> <span style="color:#b44">...</span>
 )<span style="">
@@ -246,6 +281,20 @@ Updates are not copied !</p>
 </span></code></pre></div><h2 id="celix_bundle_group">celix_bundle_group</h2>
 <p>Set bundle group.</p>
 <div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">celix_bundle_group</span>(<span style="color:#b44">&lt;bundle_target&gt;</span> <span style="color:#b44">bundle</span> <span style="color:#b44">group</span>)<span style="">
+</span></code></pre></div><h2 id="celix_get_bundle_filename">celix_get_bundle_filename</h2>
+<p>Get bundle filename from an (imported) bundle target taking into account the
+used CMAKE_BUILD_TYPE and available bundle configurations.</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">celix_get_bundle_filename</span>(<span style="color:#b44">&lt;bundle_target&gt;</span> <span style="color:#b44">VARIABLE_NAME</span>)<span style="">
+</span></code></pre></div><p>Example: <code>celix_get_bundle_filename(Celix::shell SHELL_BUNDLE_FILENAME)</code> will result in <code>celix_shell.zip</code> for a <code>RelWithDebInfo</code> cmake build type and in <code>celix_shell-Debug.zip</code> for a <code>Debug</code> cmake build type (if the a debug bundle version exists).</p>
+<h2 id="celix_get_bundle_file">celix_get_bundle_file</h2>
+<p>Get bundle file (absolute path to a bundle) from an (imported) bundle target taking into account the used CMAKE_BUILD_TYPE and available bundle configurations.</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">celix_get_bundle_file</span>(<span style="color:#b44">&lt;bundle_target&gt;</span> <span style="color:#b44">VARIABLE_NAME</span>)<span style="">
+</span></code></pre></div><p>Example: <code>celix_get_bundle_file(Celix::shell SHELL_BUNDLE_FILE)</code></p>
+<h2 id="add_celix_bundle_dependencies">add_celix_bundle_dependencies</h2>
+<p>Add bundles as dependencies to a cmake target, so that the bundle zip files will be created before the cmake target.</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">add_celix_bundle_dependencies</span>(<span style="color:#b44">&lt;cmake_target&gt;</span>
+    <span style="color:#b44">bundles...</span>
+)<span style="">
 </span></code></pre></div><h2 id="install_celix_bundle">install_celix_bundle</h2>
 <p>Install bundle when &lsquo;make install&rsquo; is executed.
 Bundles are installed at <code>&lt;install-prefix&gt;/share/&lt;project_name&gt;/bundles</code>.
@@ -269,11 +318,11 @@ The export name can be used to generate a Celix Targets cmake file (see install_
 )<span style="">
 </span></code></pre></div><h2 id="install_celix_targets">install_celix_targets</h2>
 <p>Generate and install a Celix Targets cmake file which contains CMake commands to create imported targets for the bundles
-install using the provided &lt;export_name&gt;. These imported CMake targets can be used in in CMake project using the installed
+install using the provided &lt;export_name&gt;. These imported CMake targets can be used in CMake projects using the installed
 bundles.</p>
 <p>Optional Arguments:</p>
 <ul>
-<li>FILE: The Celix Targets cmake filename to used. Default is &lt;export_name&gt;BundleTargets.cmake</li>
+<li>FILE: The Celix Targets cmake filename to used, without the cmake extension. Default is &lt;export_name&gt;BundleTargets.</li>
 <li>PROJECT_NAME: The project name to used for the share location. Default is the cmake project name.</li>
 <li>DESTINATION: The (relative) location to install the Celix Targets cmake file to. Default is share/&lt;PROJECT_NAME&gt;/cmake.</li>
 </ul>
@@ -284,7 +333,7 @@ bundles.</p>
     <span style="color:#b44">[DESTINATION</span> <span style="color:#b44">&lt;celix_targets_destination&gt;]</span>
 )<span style="">
 </span></code></pre></div><p>Example:</p>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">install_celix_targets</span>(<span style="color:#b44">celix</span> <span style="color:#b44">NAMESPACE</span> <span style="color:#b44">Celix::</span> <span style="color:#b44">DESTINATION</span> <span style="color:#b44">share/celix/cmake</span> <span style="color:#b44">FILE</span> <span style="color:#b44">CelixTargets. [...]
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">install_celix_targets</span>(<span style="color:#b44">celix</span> <span style="color:#b44">NAMESPACE</span> <span style="color:#b44">Celix::</span> <span style="color:#b44">DESTINATION</span> <span style="color:#b44">share/celix/cmake</span> <span style="color:#b44">FILE</span> <span style="color:#b44">CelixTargets< [...]
 </span></code></pre></div><h1 id="celix-containers">Celix Containers</h1>
 <p>The &lsquo;add_celix_container&rsquo; Celix CMake command can be used to create Celix containers.
 Celix containers are executables preconfigured with configuration properties and bundles to run.</p>
@@ -304,16 +353,23 @@ CMake &lsquo;target_sources&rsquo; command.</li>
 These targets can be used to run/debug Celix containers from a IDE (if the IDE supports CMake).</p>
 <p>Optional Arguments:</p>
 <ul>
-<li>COPY: With this option the used bundles are copied to the container build dir in the &lsquo;bundles&rsquo; dir.<br>
-A additional result of this is that the configured references to the bundles are then relative instead of absolute.</li>
-<li>CXX: With this option the generated Celix launcher (if used) will be a C++ source instead of a C source.
-A additional result of this is that Celix launcher is also linked against stdlibc++.</li>
+<li>COPY: With this option the used bundles are copied to the container build dir in the &lsquo;bundles&rsquo; dir.
+A additional result of this is that the configured references to the bundles are then relative instead of absolute.
+Default is COPY</li>
+<li>NO_COPY: With this option the used bundles configured for the container with absolute paths.
+Default is COPY</li>
+<li>CXX: With this option the generated Celix launcher (if used) will be a C++ source. (Default is CXX)
+This ensures that the Celix launcher is linked against stdlibc++.
+Default is CXX</li>
+<li>C: With this option the generated Celix launcher (if used) will be a C source.
+Default is CXX</li>
 <li>USE_CONFIG: With this option config properties are generated in a &lsquo;config.properties&rsquo; instead of embedded in the Celix launcher.</li>
 <li>GROUP: If configured the build location will be prefixed the GROUP. Default is empty.</li>
 <li>NAME: The name of the executable. Default is &lt;celix_container_name&gt;. Only useful for generated/LAUNCHER_SRC Celix launchers.</li>
 <li>DIR: The base build directory of the Celix container. Default is <code>&lt;cmake_build_dir&gt;/deploy</code>.</li>
-<li>BUNDLES: A list of bundles to configured for the Celix container to install and start.
+<li>BUNDLES: A list of bundles for the Celix container to install and start.
 These bundle will be configured for run level 3. See &lsquo;celix_container_bundles&rsquo; for more info.</li>
+<li>INSTALL_BUNDLES: A list of bundles for the Celix container to install (but not start).</li>
 <li>PROPERTIES: A list of configuration properties, these can be used to configure the Celix framework and/or bundles.
 Normally this will be EMBEDED_PROPERTIES, but if the USE_CONFIG option is used this will be RUNTIME_PROPERTIES.
 See the framework library or bundles documentation about the available configuration options.</li>
@@ -322,12 +378,15 @@ See the framework library or bundles documentation about the available configura
 </ul>
 <div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">&lt;celix_container_name&gt;</span>
     <span style="color:#b44">[COPY]</span>
+    <span style="color:#b44">[NO_COPY]</span>
     <span style="color:#b44">[CXX]</span>
+    <span style="color:#b44">[C]</span>
     <span style="color:#b44">[USE_CONFIG]</span>
     <span style="color:#b44">[GROUP</span> <span style="color:#b44">group_name]</span>
     <span style="color:#b44">[NAME</span> <span style="color:#b44">celix_container_name]</span>
     <span style="color:#b44">[DIR</span> <span style="color:#b44">dir]</span>
     <span style="color:#b44">[BUNDLES</span> <span style="color:#b44">&lt;bundle1&gt;</span> <span style="color:#b44">&lt;bundle2&gt;</span> <span style="color:#b44">...]</span>
+    <span style="color:#b44">[INSTALL_BUNDLES</span> <span style="color:#b44">&lt;bundle1&gt;</span> <span style="color:#b44">&lt;bundle2&gt;</span> <span style="color:#b44">...]</span>
     <span style="color:#b44">[PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
     <span style="color:#b44">[EMBEDDED_PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
     <span style="color:#b44">[RUNTIME_PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
@@ -335,42 +394,51 @@ See the framework library or bundles documentation about the available configura
 </span></code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">&lt;celix_container_name&gt;</span>
     <span style="color:#b44">LAUNCHER</span> <span style="color:#b44">launcher</span>
     <span style="color:#b44">[COPY]</span>
+    <span style="color:#b44">[NO_COPY]</span>
     <span style="color:#b44">[CXX]</span>
+    <span style="color:#b44">[C]</span>
     <span style="color:#b44">[USE_CONFIG]</span>
     <span style="color:#b44">[GROUP</span> <span style="color:#b44">group_name]</span>
     <span style="color:#b44">[NAME</span> <span style="color:#b44">celix_container_name]</span>
     <span style="color:#b44">[DIR</span> <span style="color:#b44">dir]</span>
     <span style="color:#b44">[BUNDLES</span> <span style="color:#b44">&lt;bundle1&gt;</span> <span style="color:#b44">&lt;bundle2&gt;</span> <span style="color:#b44">...]</span>
+    <span style="color:#b44">[INSTALL_BUNDLES</span> <span style="color:#b44">&lt;bundle1&gt;</span> <span style="color:#b44">&lt;bundle2&gt;</span> <span style="color:#b44">...]</span>
     <span style="color:#b44">[PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
     <span style="color:#b44">[EMBEDDED_PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
     <span style="color:#b44">[RUNTIME_PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
 )<span style="">
 </span></code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">&lt;celix_container_name&gt;</span>
-    <span style="color:#b44">LAUNCHER_SRC</span> <span style="color:#b44">launcher_src</span>
-    <span style="color:#b44">[COPY]</span>
-    <span style="color:#b44">[CXX]</span>
-    <span style="color:#b44">[USE_CONFIG]</span>
-    <span style="color:#b44">[GROUP</span> <span style="color:#b44">group_name]</span>
-    <span style="color:#b44">[NAME</span> <span style="color:#b44">celix_container_name]</span>
-    <span style="color:#b44">[DIR</span> <span style="color:#b44">dir]</span>
-    <span style="color:#b44">[BUNDLES</span> <span style="color:#b44">&lt;bundle1&gt;</span> <span style="color:#b44">&lt;bundle2&gt;</span> <span style="color:#b44">...]</span>
-    <span style="color:#b44">[PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
-    <span style="color:#b44">[EMBEDDED_PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
-    <span style="color:#b44">[RUNTIME_PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
-)<span style="">
+        <span style="color:#b44">LAUNCHER_SRC</span> <span style="color:#b44">launcher_src</span>
+        <span style="color:#b44">[COPY]</span>
+        <span style="color:#b44">[NO_COPY]</span>
+        <span style="color:#b44">[CXX]</span>
+        <span style="color:#b44">[C]</span>
+        <span style="color:#b44">[USE_CONFIG]</span>
+        <span style="color:#b44">[GROUP</span> <span style="color:#b44">group_name]</span>
+        <span style="color:#b44">[NAME</span> <span style="color:#b44">celix_container_name]</span>
+        <span style="color:#b44">[DIR</span> <span style="color:#b44">dir]</span>
+        <span style="color:#b44">[BUNDLES</span> <span style="color:#b44">&lt;bundle1&gt;</span> <span style="color:#b44">&lt;bundle2&gt;</span> <span style="color:#b44">...]</span>
+        <span style="color:#b44">[INSTALL_BUNDLES</span> <span style="color:#b44">&lt;bundle1&gt;</span> <span style="color:#b44">&lt;bundle2&gt;</span> <span style="color:#b44">...]</span>
+        <span style="color:#b44">[PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
+        <span style="color:#b44">[EMBEDDED_PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
+        <span style="color:#b44">[RUNTIME_PROPERTIES</span> <span style="color:#b44">&#34;prop1=val1&#34;</span> <span style="color:#b44">&#34;prop2=val2&#34;</span> <span style="color:#b44">...]</span>
+        )<span style="">
 </span></code></pre></div><h2 id="celix_container_bundles">celix_container_bundles</h2>
 <p>Add the selected bundles to the Celix container. These bundles are (if configured) copied to the container build dir and
 are added to the configuration properties so that they are installed and started when the Celix container executed.</p>
-<p>The Celix framework support 7 (0 - 6) run levels. Run levels can be used to control the start and stop order of bundles.
+<p>The Celix framework supports 7 (0 - 6) run levels. Run levels can be used to control the start and stop order of bundles.
 Bundles in run level 0 are started first and bundles in run level 6 are started last.
 When stopping bundles in run level 6 are stopped first and bundles in run level 0 are stopped last.
 Within a run level the order of configured decides the start order; bundles added earlier are started first.</p>
 <p>Optional Arguments:</p>
 <ul>
 <li>LEVEL: The run level for the added bundles. Default is 3.</li>
+<li>INSTALL: If this option is present, the bundles will only be installed instead of the default install and start.
+The bundles will be installed after all bundle in LEVEL 0..6 are installed and started.</li>
 </ul>
 <div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">celix_container_bundles</span>(<span style="color:#b44">&lt;celix_container_target_name&gt;</span>
-    <span style="color:#b44">[LEVEL</span> (<span style="color:#b44">0..5</span>)<span style="color:#b44">]</span>
+    <span style="color:#b44">[LEVEL</span> (<span style="color:#b44">0..6</span>)<span style="color:#b44">]</span>
+    <span style="color:#b44">[INSTALL]</span>
     <span style="color:#b44">bundle1</span>
     <span style="color:#b44">bundle2</span>
     <span style="color:#b44">...</span>
diff --git a/content/docs/2.3.0/celix/documents/components.html b/content/docs/2.3.0/celix/documents/components.html
new file mode 100644
index 0000000..285f3a0
--- /dev/null
+++ b/content/docs/2.3.0/celix/documents/components.html
@@ -0,0 +1,857 @@
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <title>Apache Celix Components / Apache Celix</title>
+
+    
+    <link rel="icon" href="/assets/img/favicon.ico">
+
+    
+    <link href="/assets/css/bootstrap.min.css" rel="stylesheet">
+
+    
+    <link href="/assets/css/style.css" rel="stylesheet">
+
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
+    
+<script>
+  var _paq = window._paq = window._paq || [];
+   
+  _paq.push(['disableCookies']);
+   
+  _paq.push(['trackPageView']);
+  _paq.push(['enableLinkTracking']);
+  (function() {
+    var u="https://analytics.apache.org/";
+    _paq.push(['setTrackerUrl', u+'matomo.php']);
+    _paq.push(['setSiteId', '9']);
+    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+  })();
+</script>
+
+
+</head>
+<body class="light-grey">
+
+<a href="https://github.com/apache/celix" class="github-ribbon">
+    <img src="/assets/img/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
+</a>
+
+
+<nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top">
+    <div class="container">
+        <a class="navbar-brand" href="/">
+            <img src="/assets/img/celix-white.svg" height="40" class="d-inline-block align-top" alt="Celix Logo">
+        </a>
+        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+        </button>
+        <div class="collapse navbar-collapse" id="navbarResponsive">
+            <ul class="navbar-nav ml-auto">
+                <li class="nav-item">
+                    <a class="nav-link" href="/">Home</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" href="/download.cgi">Download</a>
+                </li>
+                <li class="nav-item dropdown active">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Docs
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddDocs">
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
+                        <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddContributing" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Contributing
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddContributing">
+                        <a class="dropdown-item" href="/contributing/youatcelix.html">You at Celix</a>
+                        <a class="dropdown-item" href="/contributing/submitting-patches.html">Submitting patches</a>
+                        <a class="dropdown-item" href="/contributing/source-and-builds.html">Source code and builds</a>
+                        <hr>
+                        <a class="dropdown-item" href="/contributing/releasing.html">Releasing</a>
+                        <a class="dropdown-item" href="/contributing/volunteers.html">Volunteers</a>
+                        <a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Celix.html">Board Reports</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddSupport" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Support
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddSupport">
+                        <a class="dropdown-item" href="/support/mailing-list.html">Mailing Lists</a>
+                        <a class="dropdown-item" href="/support/issue-tracking.html">Issue Tracking</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddFoundation" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        ASF
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddFoundation">
+                        <a class="dropdown-item" href="https://www.apache.org/">ASF Home</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/how-it-works.html">How it works</a>
+                        <a class="dropdown-item" href="https://www.apache.org/licenses/">License</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
+                        <a class="dropdown-item" href="https://www.apache.org/security/">Security</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a>
+                    </div>
+                </li>
+            </ul>
+        </div>
+    </div>
+</nav>
+
+
+<div class="section">
+    <div class="container">
+        <div class="row py-4">
+            <div class="col-sm-12 card">
+                <div class="card-body pt-5">
+                    
+                    
+                        
+                        
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/components.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                        
+                    
+
+                    
+                        
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                    
+
+                    
+	<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+<h1 id="apache-celix-components">Apache Celix Components</h1>
+<p>In Apache Celix, components are plain old C/C++ objects (POCOs) managed by the Apache Celix Dependency Manager (DM).
+Components can provide services and depend on services. Components are configured declarative using the DM api.</p>
+<p>Service dependencies will influence the component&rsquo;s lifecycle as a component will only be active when all required
+dependencies are available.<br>
+The DM is responsible for managing the component&rsquo;s service dependencies, the component&rsquo;s lifecycle and when
+to register/unregister the component&rsquo;s provided services.</p>
+<p>Note that the Apache Celix Dependency Manager is inspired by the
+<a href="http://felix.apache.org/documentation/subprojects/apache-felix-dependency-manager.html">Apache Felix Dependency Manager</a>,
+adapted to Apache Celix and the C/C++ usage.</p>
+<h1 id="component-lifecycle">Component Lifecycle</h1>
+<p>Each component has its own lifecycle.
+A component&rsquo;s lifecycle state model is depicted in the state diagram below.</p>
+<p><img src="diagrams/component_lifecycle.png" alt="Component Life Cycle"></p>
+<p>The DM can be used to configure a component&rsquo;s lifecycle callbacks, the following component&rsquo;s lifecycle callbacks can
+be configured:</p>
+<ul>
+<li><code>init</code></li>
+<li><code>start</code></li>
+<li><code>stop</code></li>
+<li><code>deinit</code></li>
+</ul>
+<p>These callbacks are used in the intermediate component&rsquo;s lifecycle states <code>Initializing</code>, <code>Starting</code>, <code>Suspending</code>, <code>Resuming</code>, <code>Stopping</code> and <code>Deinitializing</code> and the lifecycle callbacks are always called from the Celix event thread.</p>
+<p>A component has the following lifecycle states:</p>
+<ul>
+<li><code>Inactive</code>: The component is inactive and the DM is not managing the component yet.</li>
+<li><code>Waiting For Required</code>: The component is waiting for required service dependencies.</li>
+<li><code>Initializing</code>: The component has found its required dependencies and is initializing by
+calling the <code>init</code> callback.</li>
+<li><code>Initialized And Waiting For Required</code>: The component has been initialized, but is waiting for required
+dependencies.
+_Note: that this can mean that:
+<ul>
+<li>During the <code>init</code> callback, 1 or more unavailable required service dependencies where added.</li>
+<li>The component was active, but 1 or more required service dependency where removed and as result the
+component is not active anymore.</li>
+</ul>
+</li>
+<li><code>Starting</code>: The component has found its required dependencies and is starting by calling the <code>start</code> callback and
+registering the components provided services.</li>
+<li><code>Tracking Optional</code>: The component has found its required dependencies and is started. It is still tracking for
+additional optional and required services.</li>
+<li><code>Suspending</code>: The component has found its required dependencies, but is suspending to prepare for a service change by
+unregistering the components provided service and calling the <code>stop</code> callback.</li>
+<li><code>Suspended</code>: The component has found its required dependencies and is suspended so that a service change can be
+processed.</li>
+<li><code>Resuming</code>: The component has found its required dependencies, a service change has been processed, and it is
+resuming by calling the <code>start</code> callback and registering the components provided services.</li>
+<li><code>Stopping</code>: The component has lost one or more of its required dependencies and is stopping by unregistering the
+components provided service and calling the <code>stop</code> callback.</li>
+<li><code>Deinitializing</code>: The component is being removed and is deinitializing by calling the <code>deinit</code> callback.</li>
+</ul>
+<h2 id="component-api">Component API</h2>
+<p>The DM Component C api can be found in the <code>celix_dm_component.h</code> header and the C++ api can be found in the
+<code>celix/dm/Component.h</code> header.</p>
+<h2 id="example-create-and-configure-components-lifecycle-callbacks-in-c">Example: Create and configure component&rsquo;s lifecycle callbacks in C</h2>
+<p>The following example shows how a simple component can be created and managed with the DM in C.
+Because the component&rsquo;s lifecycle is managed by the DM, this also means that if configured correctly no additional
+code is needed to remove and destroy the DM component and its implementation.</p>
+<p>Remarks for the C example:</p>
+<ol>
+<li>Although this is a C component. The simple component functions have been design for a component approach,
+using the component pointer as first argument.</li>
+<li>The component implementation can be any POCO, as long as its lifecycle and destroy function signature follow a
+component approach: A single argument, with as type the component implementation pointer and an int return
+for the component lifecycle functions and a void return for the component destroy function.</li>
+<li>Creates the DM component, but note that the DM component is not yet known to the DM. This makes it possible to
+first configure the DM component over multiple function calls, before adding it to the DM.</li>
+<li>Configures the component implementation in the DM component, so that the implementation pointer can be used
+in the configured component callbacks.</li>
+<li>Configures the component lifecycle callbacks to the DM Component. These callbacks should accept the component
+implementation as its only argument. The <code>CELIX_DM_COMPONENT_SET_CALLBACKS</code> marco is used instead of the
+<code>celix_dmComponent_setCallbacks</code> function so that the component implementation type can directly be used
+in the lifecycle callbacks (instead of <code>void*</code>).</li>
+<li>Configures the component destroy implementation callback to the Dm Component. This callback will be called when
+the DM component is removed from the DM and has become inactive. The callback will be called from the Celix event
+thread. The advantages of configuring this callback is that the DM manages when the callback needs to be called;
+this removes some complexity for the users. The <code>CELIX_DM_COMPONENT_SET_IMPLEMENTATION_DESTROY_FUNCTION</code> marco
+is used instead of the <code>celix_dmComponent_setImplementationDestroyFunction</code> function so that the component
+implementation type can be directly used in the callback (instead of <code>void*</code>).</li>
+<li>Adds the DM Component the DM and as result the DM will that point on manage the components&rsquo; lifecycle, service
+dependencies and provided services.</li>
+<li>No additional code is needed to clean up components and as such no activator stop callback function needs to be
+configured. The generated bundle activator will ensure that all components are removed from the DM when the
+bundle is stopped and the DM will ensure that the components are deactivated and destroyed correctly.</li>
+</ol>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//src/simple_component_activator.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;stdio.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#080;font-style:italic">//********************* COMPONENT *******************************/
+</span><span style="color:#080;font-style:italic"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> simple_component {
+    <span style="color:#0b0;font-weight:bold">int</span> transitionCount; <span style="color:#080;font-style:italic">//not protected, only updated and read in the celix event thread.
+</span><span style="color:#080;font-style:italic"></span>} simple_component_t;
+
+<span style="color:#a2f;font-weight:bold">static</span> simple_component_t<span style="color:#666">*</span> <span style="color:#00a000">simpleComponent_create</span>() {
+    simple_component_t<span style="color:#666">*</span> cmp <span style="color:#666">=</span> calloc(<span style="color:#666">1</span>, <span style="color:#a2f;font-weight:bold">sizeof</span>(<span style="color:#666">*</span>cmp));
+    cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>transitionCount <span style="color:#666">=</span> <span style="color:#666">1</span>;
+    <span style="color:#a2f;font-weight:bold">return</span> cmp;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">simpleComponent_destroy</span>(simple_component_t<span style="color:#666">*</span> cmp) {
+    free(cmp);
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">simpleComponent_init</span>(simple_component_t<span style="color:#666">*</span> cmp) { <span style="color:#080;font-style:italic">// &lt;------------------------------------------------------&lt;1&gt;
+</span><span style="color:#080;font-style:italic"></span>    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Initializing simple component. Transition nr %i</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>transitionCount<span style="color:#666">+</span><span style="color:#666">+</span>);
+    <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">0</span>;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">simpleComponent_start</span>(simple_component_t<span style="color:#666">*</span> cmp) {
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Starting simple component. Transition nr %i</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>transitionCount<span style="color:#666">+</span><span style="color:#666">+</span>);
+    <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">0</span>;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">simpleComponent_stop</span>(simple_component_t<span style="color:#666">*</span> cmp) {
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Stopping simple component. Transition nr %i</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>transitionCount<span style="color:#666">+</span><span style="color:#666">+</span>);
+    <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">0</span>;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">simpleComponent_deinit</span>(simple_component_t<span style="color:#666">*</span> cmp) {
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">De-initializing simple component. Transition nr %i</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>transitionCount<span style="color:#666">+</span><span style="color:#666">+</span>);
+    <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#666">0</span>;
+}
+
+
+<span style="color:#080;font-style:italic">//********************* ACTIVATOR *******************************/
+</span><span style="color:#080;font-style:italic"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> simple_component_activator {
+    <span style="color:#080;font-style:italic">//nop
+</span><span style="color:#080;font-style:italic"></span>} simple_component_activator_t;
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">simpleComponentActivator_start</span>(simple_component_activator_t <span style="color:#666">*</span>act, celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    <span style="color:#080;font-style:italic">//creating component
+</span><span style="color:#080;font-style:italic"></span>    simple_component_t<span style="color:#666">*</span> impl <span style="color:#666">=</span> simpleComponent_create(); <span style="color:#080;font-style:italic">// &lt;--------------------------------------------------------&lt;2&gt;
+</span><span style="color:#080;font-style:italic"></span>
+    <span style="color:#080;font-style:italic">//create and configuring component and its lifecycle callbacks using the Apache Celix Dependency Manager
+</span><span style="color:#080;font-style:italic"></span>    celix_dm_component_t<span style="color:#666">*</span> dmCmp <span style="color:#666">=</span> celix_dmComponent_create(ctx, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">simple_component_1</span><span style="color:#b44">&#34;</span>); <span style="color:#080;font-style:italic">// &lt;--------------------------&lt;3&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_dmComponent_setImplementation(dmCmp, impl); <span style="color:#080;font-style:italic">// &lt;-----------------------------------------------------------&lt;4&gt;
+</span><span style="color:#080;font-style:italic"></span>    CELIX_DM_COMPONENT_SET_CALLBACKS(
+            dmCmp,
+            simple_component_t,
+            simpleComponent_init,
+            simpleComponent_start,
+            simpleComponent_stop,
+            simpleComponent_deinit); <span style="color:#080;font-style:italic">// &lt;----------------------------------------------------------------------------&lt;5&gt;
+</span><span style="color:#080;font-style:italic"></span>    CELIX_DM_COMPONENT_SET_IMPLEMENTATION_DESTROY_FUNCTION(
+            dmCmp,
+            simple_component_t,
+            simpleComponent_destroy); <span style="color:#080;font-style:italic">// &lt;---------------------------------------------------------------------------&lt;6&gt;
+</span><span style="color:#080;font-style:italic"></span>
+    <span style="color:#080;font-style:italic">//Add dm component to the dm.
+</span><span style="color:#080;font-style:italic"></span>    celix_dependency_manager_t<span style="color:#666">*</span> dm <span style="color:#666">=</span> celix_bundleContext_getDependencyManager(ctx);
+    celix_dependencyManager_add(dm, dmCmp); <span style="color:#080;font-style:italic">// &lt;---------------------------------------------------------------------&lt;7&gt;
+</span><span style="color:#080;font-style:italic"></span>    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(simple_component_activator_t, simpleComponentActivator_start, <span style="color:#a2f">NULL</span>) <span style="color:#080;font-style:italic">// &lt;------------------&lt;8&gt;
+</span></code></pre></div><h2 id="example-create-and-configure-components-lifecycle-callbacks-in-c-1">Example: Create and configure component&rsquo;s lifecycle callbacks in C++</h2>
+<p>The following example shows how a simple component can be created and managed with the DM in C++.
+For C++ the DM will manage the component and also ensures that component implementation is kept in scope for as
+long as the component is managed by the DM.</p>
+<p>Remarks for the C++ example:</p>
+<ol>
+<li>For C++ the DM can directly work on classes and as result lifecycle callback can be class methods.</li>
+<li>Creates a component implementation using a unique_ptr.</li>
+<li>Create a C++ DM Component and directly add it to the DM. For C++ DM Component needs to be &ldquo;build&rdquo; first, before the
+DM will manage them. This way C++ components can be build using a fluent api and marked complete with a <code>build()</code>
+method call.
+For a component implementation the DM accepts a unique_ptr, a shared_ptr, a value type or no implementation. If no
+implementation is provided the DM will create a component implementation using the template argument and
+assuming a default constructor (e.g. <code>ctx-&gt;getDependencyManager()-&gt;createComponent&lt;CmpWithDefaultCTOR&gt;()</code>).</li>
+<li>Configures the component lifecycle callbacks as class methods. The DM will call these callbacks using the
+component implementation raw pointer as object instance (<code>this</code>).</li>
+<li>&ldquo;Builds&rdquo; the component. C++ components will only be managed by the DM after they are build. This makes it possible
+to configure a component over multiple method calls before marking the component complete (build).
+The generated C++ bundle activator will also enable all components created during the bundle activation, this is
+done to ensure that the build behaviour is backwards compatible with previous released DM implementation.
+It is preferred that users explicitly build their components when they are completely configured.</li>
+</ol>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/SimpleComponentActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/BundleActivator.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">SimpleComponent</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#0b0;font-weight:bold">void</span> init() { <span style="color:#080;font-style:italic">// &lt;-----------------------------------------------------------------------------------------------&lt;1&gt;
+</span><span style="color:#080;font-style:italic"></span>        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Initializing simple component. Transition nr </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> transitionCount<span st [...]
+    }
+
+    <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">start</span>() {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">starting simple component. Transition nr </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> transitionCount<span style="color:#666">+</span><span style="color:#666">+</span> <s [...]
+    }
+
+    <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">stop</span>() {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Stopping simple component. Transition nr </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> transitionCount<span style="color:#666">+</span><span style="color:#666">+</span> <s [...]
+    }
+
+    <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">deinit</span>() {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">De-initializing simple component. Transition nr </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> transitionCount<span style="color:#666">+</span><span style="color:#666">+</s [...]
+    }
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    <span style="color:#0b0;font-weight:bold">int</span> transitionCount <span style="color:#666">=</span> <span style="color:#666">1</span>; <span style="color:#080;font-style:italic">//not protected, only updated and read in the celix event thread.
+</span><span style="color:#080;font-style:italic"></span>};
+
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">SimpleComponentActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> SimpleComponentActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        <span style="color:#a2f;font-weight:bold">auto</span> cmp <span style="color:#666">=</span> std<span style="color:#666">:</span><span style="color:#666">:</span>make_unique<span style="color:#666">&lt;</span>SimpleComponent<span style="color:#666">&gt;</span>(); <span style="color:#080;font-style:italic">// &lt;---------------------------------------------------------&lt;2&gt;
+</span><span style="color:#080;font-style:italic"></span>        ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>getDependencyManager()<span style="color:#666">-</span><span style="color:#666">&gt;</span>createComponent(std<span style="color:#666">:</span><span style="color:#666">:</span>move(cmp), <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">SimpleComponent1</span><span style="color:#b44">&#34;</span>) <span style= [...]
+</span><span style="color:#080;font-style:italic"></span>                .setCallbacks(
+                        <span style="color:#666">&amp;</span>SimpleComponent<span style="color:#666">:</span><span style="color:#666">:</span>init,
+                        <span style="color:#666">&amp;</span>SimpleComponent<span style="color:#666">:</span><span style="color:#666">:</span>start,
+                        <span style="color:#666">&amp;</span>SimpleComponent<span style="color:#666">:</span><span style="color:#666">:</span>stop,
+                        <span style="color:#666">&amp;</span>SimpleComponent<span style="color:#666">:</span><span style="color:#666">:</span>deinit) <span style="color:#080;font-style:italic">// &lt;---------------------------------------------------------------&lt;4&gt;
+</span><span style="color:#080;font-style:italic"></span>                .build(); <span style="color:#080;font-style:italic">// &lt;---------------------------------------------------------------------------------------&lt;5&gt;
+</span><span style="color:#080;font-style:italic"></span>    }
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(SimpleComponentActivator)
+</code></pre></div><h1 id="components-provided-services">Component&rsquo;s Provided Services</h1>
+<p>Components can be configured to provide services. These provided services will result in service registrations
+when a component is <code>Starting</code> or <code>Resuming</code> (i.e. when a component goes to the <code>Tracking Optional</code> state).</p>
+<p>If a component provide services, these services will have an additional automatically added service property - named &ldquo;component.uuid&rdquo; - next to its configured provided service properties. The &ldquo;component.uuid&rdquo; service property can be
+used to identify if a service is provided by a component and which component.</p>
+<h2 id="example-component-with-a-provided-service-in-c">Example: Component with a provided service in C</h2>
+<p>The following example shows how a component that provide a <code>celix_shell_command</code> service.</p>
+<p>Remarks for the C example:</p>
+<ol>
+<li>C services do not support inheritance. So even if a C component provides a certain service, it is not an
+instance of said service. This also means the C service struct provided by a component needs to be stored
+separately. In this example this is done storing the service struct in the bundle activator data. Note
+that the bundle activator data &ldquo;outlives&rdquo; the component, because all components are removed before a bundle
+is completely stopped.</li>
+<li>Configures a provided service (interface) for the component. The service will not directly be registered, but
+instead will be registered in the component states <code>Starting</code> and <code>Resuming</code>.</li>
+</ol>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"> <span style="color:#080;font-style:italic">//src/component_with_provided_service_activator.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;stdlib.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#080;font-style:italic">//********************* COMPONENT *******************************/
+</span><span style="color:#080;font-style:italic"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> component_with_provided_service {
+    <span style="color:#0b0;font-weight:bold">int</span> callCount; <span style="color:#080;font-style:italic">//atomic
+</span><span style="color:#080;font-style:italic"></span>} component_with_provided_service_t;
+
+<span style="color:#a2f;font-weight:bold">static</span> component_with_provided_service_t<span style="color:#666">*</span> <span style="color:#00a000">componentWithProvidedService_create</span>() {
+    component_with_provided_service_t<span style="color:#666">*</span> cmp <span style="color:#666">=</span> calloc(<span style="color:#666">1</span>, <span style="color:#a2f;font-weight:bold">sizeof</span>(<span style="color:#666">*</span>cmp));
+    <span style="color:#a2f;font-weight:bold">return</span> cmp;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">componentWithProvidedService_destroy</span>(component_with_provided_service_t<span style="color:#666">*</span> cmp) {
+    free(cmp);
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">bool</span> <span style="color:#00a000">componentWithProvidedService_executeCommand</span>(
+        component_with_provided_service_t <span style="color:#666">*</span>cmp,
+        <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span>commandLine,
+        FILE <span style="color:#666">*</span>outStream,
+        FILE <span style="color:#666">*</span>errorStream __attribute__((unused))) {
+    <span style="color:#0b0;font-weight:bold">int</span> count <span style="color:#666">=</span> __atomic_add_fetch(<span style="color:#666">&amp;</span>cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>callCount, <span style="color:#666">1</span>, __ATOMIC_SEQ_CST);
+    fprintf(outStream, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello from cmp. command called %i times. commandLine: %s</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, count, commandLine);
+    <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#a2f">true</span>;
+}
+
+<span style="color:#080;font-style:italic">//********************* ACTIVATOR *******************************/
+</span><span style="color:#080;font-style:italic"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> component_with_provided_service_activator {
+    celix_shell_command_t shellCmd; <span style="color:#080;font-style:italic">// &lt;-----------------------------------------------------------------------------&lt;1&gt;
+</span><span style="color:#080;font-style:italic"></span>} component_with_provided_service_activator_t;
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">componentWithProvidedServiceActivator_start</span>(component_with_provided_service_activator_t <span style="color:#666">*</span>act, celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    <span style="color:#080;font-style:italic">//creating component
+</span><span style="color:#080;font-style:italic"></span>    component_with_provided_service_t<span style="color:#666">*</span> impl <span style="color:#666">=</span> componentWithProvidedService_create();
+
+    <span style="color:#080;font-style:italic">//create and configuring component and its lifecycle callbacks using the Apache Celix Dependency Manager
+</span><span style="color:#080;font-style:italic"></span>    celix_dm_component_t<span style="color:#666">*</span> dmCmp <span style="color:#666">=</span> celix_dmComponent_create(ctx, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">component_with_provided_service_1</span><span style="color:#b44">&#34;</span>);
+    celix_dmComponent_setImplementation(dmCmp, impl);
+    CELIX_DM_COMPONENT_SET_IMPLEMENTATION_DESTROY_FUNCTION(
+            dmCmp,
+            component_with_provided_service_t,
+            componentWithProvidedService_destroy);
+
+    <span style="color:#080;font-style:italic">//configure provided service
+</span><span style="color:#080;font-style:italic"></span>    act<span style="color:#666">-</span><span style="color:#666">&gt;</span>shellCmd.handle <span style="color:#666">=</span> impl;
+    act<span style="color:#666">-</span><span style="color:#666">&gt;</span>shellCmd.executeCommand <span style="color:#666">=</span> (<span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span>)componentWithProvidedService_executeCommand;
+    celix_properties_t<span style="color:#666">*</span> props <span style="color:#666">=</span> celix_properties_create();
+    celix_properties_set(props, CELIX_SHELL_COMMAND_NAME, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">hello_component</span><span style="color:#b44">&#34;</span>);
+    celix_dmComponent_addInterface(
+            dmCmp,
+            CELIX_SHELL_COMMAND_SERVICE_NAME,
+            CELIX_SHELL_COMMAND_SERVICE_VERSION,
+            <span style="color:#666">&amp;</span>act<span style="color:#666">-</span><span style="color:#666">&gt;</span>shellCmd,
+            props); <span style="color:#080;font-style:italic">// &lt;---------------------------------------------------------------------------------------------&lt;2&gt;
+</span><span style="color:#080;font-style:italic"></span>
+
+    <span style="color:#080;font-style:italic">//Add dm component to the dm.
+</span><span style="color:#080;font-style:italic"></span>    celix_dependency_manager_t<span style="color:#666">*</span> dm <span style="color:#666">=</span> celix_bundleContext_getDependencyManager(ctx);
+    celix_dependencyManager_add(dm, dmCmp);
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(
+        component_with_provided_service_activator_t,
+        componentWithProvidedServiceActivator_start,
+        <span style="color:#a2f">NULL</span>)
+</code></pre></div><h2 id="example-component-with-a-provided-service-in-c-1">Example: Component with a provided service in C++</h2>
+<p>The following example shows how a C++ component that provide a C++ <code>celix::IShellCommand</code> service
+and a C <code>celix_shell_command</code> service. For a C++ component it&rsquo;s possible to provide C and C++ services.</p>
+<p>Remarks for the C++ example:</p>
+<ol>
+<li>If a component provides a C++ services, it also expected that the component implementation inherits the service
+interface.</li>
+<li>The overridden <code>executeCommand</code> method of <code>celix::IShellCommand</code>.</li>
+<li>Methods of C service interfaces can be implemented as class methods, but the bundle activator should ensure that
+the underlining C service interface structs are assigned with compatible C function pointers.</li>
+<li>Creating a component using only a template argument. The DM will construct - using a default constructor - a
+component implementation instance.</li>
+<li>Configures the component to provide a C++ <code>celix::IShellCommand</code> service. Note that because the component
+implementation is an instance of <code>celix::IShellCommand</code> no additional storage is needed. The service will not
+directly be registered, but instead will be registered in the components states <code>Starting</code> and <code>Resuming</code>.</li>
+<li>Set the C <code>executeCommand</code> function pointer of the <code>celix_shell_command_t</code> service interface struct to a
+capture-less lambda expression. The lambda expression is used to forward the call to the <code>executeCCommand</code>
+class method. Note the capture-less lambda expression can decay to C-style function pointers.</li>
+<li>Configures the component to provide a C <code>celix_shell_command_t</code> service. Note that for a C service, the
+<code>createUnassociatedProvidedService</code> must be used, because the component does not inherit <code>celix_shell_command_t</code>.
+The service will not directly be registered, but instead will be registered in the component states <code>Starting</code> and
+<code>Resuming</code>.</li>
+<li>&ldquo;Build&rdquo; the component so the DM will manage the component.</li>
+</ol>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/ComponentWithProvidedServiceActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/BundleActivator.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/IShellCommand.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ComponentWithProvidedService</span> <span style="color:#666">:</span> <span style="color:#a2f;font-weight:bold">public</span> celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand { <span style="color:#080;font-style:italic">// &lt;----------------------------------------------&lt;1&gt;
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#666">~</span>ComponentWithProvidedService() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#a2f;font-weight:bold">override</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
+
+    <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">executeCommand</span>(
+            <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>string<span style="color:#666">&amp;</span> commandLine,
+            <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>vector<span style="color:#666">&lt;</span>std<span style="color:#666">:</span><span style="color:#666">:</span>string<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> <span style="color:#080;font-style:italic">/*commandArgs*/</span>,
+            FILE<span style="color:#666">*</span> outStream,
+            FILE<span style="color:#666">*</span> <span style="color:#080;font-style:italic">/*errorStream*/</span>) <span style="color:#a2f;font-weight:bold">override</span> {
+        fprintf(outStream, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello from cmp. C++ command called %i times. commandLine is %s</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, 
+                cxxCallCount<span style="color:#666">+</span><span style="color:#666">+</span>, commandLine.c_str());
+    } <span style="color:#080;font-style:italic">// &lt;-----------------------------------------------------------------------------------------------------------&lt;2&gt;
+</span><span style="color:#080;font-style:italic"></span>
+    <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">executeCCommand</span>(<span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span><span style="color:#666">*</span> commandLine, FILE<span style="color:#666">*</span> outStream) {
+        fprintf(outStream, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello from cmp. C command called %i times. commandLine is %s</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, cCallCount<span style="color:#666">+</span><span style="color:#666">+</span>, commandLine);
+    } <span style="color:#080;font-style:italic">// &lt;-----------------------------------------------------------------------------------------------------------&lt;3&gt;
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    std<span style="color:#666">:</span><span style="color:#666">:</span>atomic<span style="color:#666">&lt;</span><span style="color:#0b0;font-weight:bold">int</span><span style="color:#666">&gt;</span> cxxCallCount{<span style="color:#666">1</span>};
+    std<span style="color:#666">:</span><span style="color:#666">:</span>atomic<span style="color:#666">&lt;</span><span style="color:#0b0;font-weight:bold">int</span><span style="color:#666">&gt;</span> cCallCount{<span style="color:#666">1</span>};
+};
+
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ComponentWithProvidedServiceActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> ComponentWithProvidedServiceActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> cmp <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>getDependencyManager()<span style="color:#666">-</span><span style="color:#666">&gt;</span>createComponent<span style="color:#666">&lt;</span>ComponentWithProvidedService<span style="color:#666">&gt;</span>(); <span style="color:#080;font-style:italic">// &lt;---------------&lt;4&gt;
+</span><span style="color:#080;font-style:italic"></span>
+        cmp.createProvidedService<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span>()
+                .addProperty(celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">:</span><span style="color:#666">:</span>COMMAND_NAME, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">HelloComponent</span><span style="color:#b44">&#34;</span>); <span style="color:#080;font-style:italic">// &lt;-----------------------------&lt;5&gt;
+</span><span style="color:#080;font-style:italic"></span>
+        <span style="color:#a2f;font-weight:bold">auto</span> shellCmd <span style="color:#666">=</span> std<span style="color:#666">:</span><span style="color:#666">:</span>make_shared<span style="color:#666">&lt;</span>celix_shell_command_t<span style="color:#666">&gt;</span>();
+        shellCmd<span style="color:#666">-</span><span style="color:#666">&gt;</span>handle <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">static_cast</span><span style="color:#666">&lt;</span><span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span><span style="color:#666">&gt;</span>(<span style="color:#666">&amp;</span>cmp.getInstance());
+        shellCmd<span style="color:#666">-</span><span style="color:#666">&gt;</span>executeCommand <span style="color:#666">=</span> [](<span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span> handle, <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span><span style="color:#666">*</span> commandLine, FILE<span style="color:#666">*</span> outStream, FILE<span style="color:#666">*</span>) <span style="colo [...]
+            <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">*</span> impl <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">static_cast</span><span style="color:#666">&lt;</span>ComponentWithProvidedService<span style="color:#666">*</span><span style="color:#666">&gt;</span>(handle);
+            impl<span style="color:#666">-</span><span style="color:#666">&gt;</span>executeCCommand(commandLine, outStream);
+            <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#a2f">true</span>;
+        }; <span style="color:#080;font-style:italic">// &lt;------------------------------------------------------------------------------------------------------&lt;6&gt;
+</span><span style="color:#080;font-style:italic"></span>
+        cmp.createUnassociatedProvidedService(std<span style="color:#666">:</span><span style="color:#666">:</span>move(shell.html), CELIX_SHELL_COMMAND_SERVICE_NAME)
+                .addProperty(CELIX_SHELL_COMMAND_NAME, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">hello_component</span><span style="color:#b44">&#34;</span>); <span style="color:#080;font-style:italic">// &lt; -------------------------------------&lt;7&gt;
+</span><span style="color:#080;font-style:italic"></span>
+        cmp.build(); <span style="color:#080;font-style:italic">// &lt;--------------------------------------------------------------------------------------------&lt;8&gt;
+</span><span style="color:#080;font-style:italic"></span>    }
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(ComponentWithProvidedServiceActivator)
+</code></pre></div><h1 id="components-service-dependencies">Component&rsquo;s Service Dependencies</h1>
+<p>Components can be configured to have service dependencies. These service dependencies will influence the component&rsquo;s
+lifecycle. Components can have optional and required service dependencies. When service dependencies are required the
+component can only be active if all required dependencies are available; where available means at least 1 matching
+service dependency is found.</p>
+<p>When configuring service dependencies, callbacks can be configured for handling services that are being added,
+removed or for when a new highest ranking service is available.</p>
+<p>Service dependency callbacks can be configured with 3 different types of argument signatures:</p>
+<ul>
+<li>A single argument for the service pointer (raw pointer or shared_ptr);</li>
+<li>A service pointer (raw pointer or shared_ptr) as first argument and the service properties as second argument.</li>
+<li>A service pointer (raw pointer or shared_ptr) as first argument, the service properties as second argument and
+the bundle providing the service as third argument.</li>
+</ul>
+<p>Service dependency callbacks will always be called from the Celix event thread.</p>
+<p>A service change (injection/removal) can be handled by the component using a Locking-strategy or a suspend-strategy.
+This strategy can be configured per service dependency and expect the following behaviour from the component
+implementation:</p>
+<ul>
+<li>Locking-strategy: The component implementation must ensure that the stored service pointers (and if applicable the
+service properties and its bundle) are protected using a locking mechanism (e.g. a mutex).
+This should ensure that services are no longer in use after they are removed (or replaced) from a component and
+thus can be safely deleted from memory.</li>
+<li>Suspend-strategy: The DM will ensure that before service dependency callbacks are called, all provided services
+are (temporary) unregistered and the component is suspended (using the components&rsquo; <code>stop</code> callback). This should mean
+that there are no active users - through the provided services or active threads - of the service dependencies
+anymore and that service changes can safely be handling without locking. The component implementation must ensure
+that after a <code>stop</code> callback there are no active threads, thread pools, timers, etc - that use service dependencies -
+are active anymore.</li>
+</ul>
+<h2 id="example-component-with-a-service-dependencies-in-c">Example: Component with a service dependencies in C</h2>
+<p>The following example shows how a C component that has two service dependency on the <code>celix_shell_command_t</code> service.</p>
+<p>One service dependency is a required dependency with a suspend-strategy and uses a <code>set </code> callback which ensure
+that a single service is injected and that is always the highest ranking service. Note that the highest ranking
+service can be <code>NULL</code> if there are no other matching services.</p>
+<p>The other dependency is an optional dependency with a locking-strategy and uses a <code>addWithProps</code> and
+<code>removeWithProps</code> callback. These callbacks will be called for every <code>celix_shell_command_t</code> service being added/removed
+and will be called with not only the service pointer, but also the service properties.</p>
+<p>Remarks for the C example:</p>
+<ol>
+<li>Creates a mutex to protect the <code>cmdShells</code> field which is configured with a locking-strategy service dependency.</li>
+<li>Updates the <code>highestRankingCmdShell</code> field without locking. Note that because the service dependency is
+configured with a suspend-strategy the <code>componentWithServiceDependency_setHighestRankingShellCommand</code> function
+will only be called when the component is in the <code>Suspended</code> state or when it is not in the <code>Active</code> compound state.</li>
+<li>Locks the mutex and adds the newly added service to the <code>cmdShells</code> list. Note that because the service dependency
+is configured with a locking-strategy the <code>componentWithServiceDependency_addShellCommand</code> and
+<code>componentWithServiceDependency_removeShellCommand</code> functions can be called from any component lifecycle state.</li>
+<li>Creates a new DM service dependency object. Note that the DM service dependency is not yet known to the DM Component.</li>
+<li>Configures for which service name the service dependency will track services for. Optionally it is also possible
+to fine tune the tracked service by providing a service version range and/or service filter.</li>
+<li>Configures the update strategy for the service dependency to suspend-strategy.</li>
+<li>Configures the service dependency as a required service dependency.</li>
+<li>Creates an empty service dependency callback options struct. This struct can be used to configure different
+service dependency callbacks.</li>
+<li>Configures the <code>set</code> service dependency callback to <code>componentWithServiceDependency_setHighestRankingShellCommand</code></li>
+<li>Configures the dependency manager to use the callbacks configures in opts.</li>
+<li>Adds the DM service dependency object to the DM component object.</li>
+<li>Configures the update strategy for the service dependency to locking-strategy.</li>
+<li>Configures the service dependency as an optional service dependency.</li>
+<li>Configures the <code>addWithProps</code> service dependency callback to <code>componentWithServiceDependency_addShellCommand</code>.</li>
+</ol>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//src/component_with_service_dependency_activator.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;stdlib.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#080;font-style:italic">//********************* COMPONENT *******************************/
+</span><span style="color:#080;font-style:italic"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> component_with_service_dependency {
+    celix_shell_command_t<span style="color:#666">*</span> highestRankingCmdShell; <span style="color:#080;font-style:italic">//only updated when component is not active or suspended
+</span><span style="color:#080;font-style:italic"></span>    celix_thread_mutex_t mutex; <span style="color:#080;font-style:italic">//protects cmdShells
+</span><span style="color:#080;font-style:italic"></span>    celix_array_list_t<span style="color:#666">*</span> cmdShells;
+} component_with_service_dependency_t;
+
+<span style="color:#a2f;font-weight:bold">static</span> component_with_service_dependency_t<span style="color:#666">*</span> <span style="color:#00a000">componentWithServiceDependency_create</span>() {
+    component_with_service_dependency_t<span style="color:#666">*</span> cmp <span style="color:#666">=</span> calloc(<span style="color:#666">1</span>, <span style="color:#a2f;font-weight:bold">sizeof</span>(<span style="color:#666">*</span>cmp));
+    celixThreadMutex_create(<span style="color:#666">&amp;</span>cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex, <span style="color:#a2f">NULL</span>); <span style="color:#080;font-style:italic">// &lt;-----------------------------------------------------------------&lt;1&gt;
+</span><span style="color:#080;font-style:italic"></span>    cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>cmdShells <span style="color:#666">=</span> celix_arrayList_create();
+    <span style="color:#a2f;font-weight:bold">return</span> cmp;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">componentWithServiceDependency_destroy</span>(component_with_service_dependency_t<span style="color:#666">*</span> cmp) {
+    celix_arrayList_destroy(cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>cmdShells);
+    celixThreadMutex_destroy(<span style="color:#666">&amp;</span>cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+    free(cmp);
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">componentWithServiceDependency_setHighestRankingShellCommand</span>(
+        component_with_service_dependency_t<span style="color:#666">*</span> cmp,
+        celix_shell_command_t<span style="color:#666">*</span> shell.html) {
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">New highest ranking service (can be NULL): %p</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, shell.html);
+    cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>highestRankingCmdShell <span style="color:#666">=</span> shellCmd; <span style="color:#080;font-style:italic">// &lt;---------------------------------------------------------------------&lt;2&gt;
+</span><span style="color:#080;font-style:italic"></span>}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">componentWithServiceDependency_addShellCommand</span>(
+        component_with_service_dependency_t<span style="color:#666">*</span> cmp,
+        celix_shell_command_t<span style="color:#666">*</span> shellCmd,
+        <span style="color:#a2f;font-weight:bold">const</span> celix_properties_t<span style="color:#666">*</span> props) {
+    <span style="color:#0b0;font-weight:bold">long</span> id <span style="color:#666">=</span> celix_properties_getAsLong(props, CELIX_FRAMEWORK_SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>);
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Adding shell command service with service.id %li</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, id);
+    celixThreadMutex_lock(<span style="color:#666">&amp;</span>cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex); <span style="color:#080;font-style:italic">// &lt;-------------------------------------------------------------------------&lt;3&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_arrayList_add(cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>cmdShells, shell.html);
+    celixThreadMutex_unlock(<span style="color:#666">&amp;</span>cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">componentWithServiceDependency_removeShellCommand</span>(
+        component_with_service_dependency_t<span style="color:#666">*</span> cmp,
+        celix_shell_command_t<span style="color:#666">*</span> shellCmd,
+        <span style="color:#a2f;font-weight:bold">const</span> celix_properties_t<span style="color:#666">*</span> props) {
+    <span style="color:#0b0;font-weight:bold">long</span> id <span style="color:#666">=</span> celix_properties_getAsLong(props, CELIX_FRAMEWORK_SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>);
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Removing shell command service with service.id %li</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, id);
+    celixThreadMutex_lock(<span style="color:#666">&amp;</span>cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+    celix_arrayList_remove(cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>cmdShells, shell.html);
+    celixThreadMutex_unlock(<span style="color:#666">&amp;</span>cmp<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+}
+
+<span style="color:#080;font-style:italic">//********************* ACTIVATOR *******************************/
+</span><span style="color:#080;font-style:italic"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> component_with_service_dependency_activator {
+    <span style="color:#080;font-style:italic">//nop
+</span><span style="color:#080;font-style:italic"></span>} component_with_service_dependency_activator_t;
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">componentWithServiceDependencyActivator_start</span>(component_with_service_dependency_activator_t <span style="color:#666">*</span>act, celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    <span style="color:#080;font-style:italic">//creating component
+</span><span style="color:#080;font-style:italic"></span>    component_with_service_dependency_t<span style="color:#666">*</span> impl <span style="color:#666">=</span> componentWithServiceDependency_create();
+
+    <span style="color:#080;font-style:italic">//create and configuring component and its lifecycle callbacks using the Apache Celix Dependency Manager
+</span><span style="color:#080;font-style:italic"></span>    celix_dm_component_t<span style="color:#666">*</span> dmCmp <span style="color:#666">=</span> celix_dmComponent_create(ctx, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">component_with_service_dependency_1</span><span style="color:#b44">&#34;</span>);
+    celix_dmComponent_setImplementation(dmCmp, impl);
+    CELIX_DM_COMPONENT_SET_IMPLEMENTATION_DESTROY_FUNCTION(
+            dmCmp,
+            component_with_service_dependency_t,
+            componentWithServiceDependency_destroy);
+
+    <span style="color:#080;font-style:italic">//create mandatory service dependency with cardinality one and with a suspend-strategy
+</span><span style="color:#080;font-style:italic"></span>    celix_dm_service_dependency_t<span style="color:#666">*</span> dep1 <span style="color:#666">=</span> celix_dmServiceDependency_create(); <span style="color:#080;font-style:italic">// &lt;-----------------------------------&lt;4&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_dmServiceDependency_setService(dep1, CELIX_SHELL_COMMAND_SERVICE_NAME, <span style="color:#a2f">NULL</span>, <span style="color:#a2f">NULL</span>); <span style="color:#080;font-style:italic">// &lt;-------------------&lt;5&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_dmServiceDependency_setStrategy(dep1, DM_SERVICE_DEPENDENCY_STRATEGY_SUSPEND); <span style="color:#080;font-style:italic">// &lt;------------------------&lt;6&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_dmServiceDependency_setRequired(dep1, <span style="color:#a2f">true</span>); <span style="color:#080;font-style:italic">// &lt;----------------------------------------------------------&lt;7&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_dm_service_dependency_callback_options_t opts1 <span style="color:#666">=</span> CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS; <span style="color:#080;font-style:italic">// &lt;--&lt;8&gt;
+</span><span style="color:#080;font-style:italic"></span>    opts1.set <span style="color:#666">=</span> (<span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span>)componentWithServiceDependency_setHighestRankingShellCommand; <span style="color:#080;font-style:italic">// &lt;----------------------------&lt;9&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_dmServiceDependency_setCallbacksWithOptions(dep1, <span style="color:#666">&amp;</span>opts1); <span style="color:#080;font-style:italic">// &lt;-------------------------------------------&lt;10&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_dmComponent_addServiceDependency(dmCmp, dep1); <span style="color:#080;font-style:italic">// &lt;-------------------------------------------------------&lt;11&gt;
+</span><span style="color:#080;font-style:italic"></span>
+    <span style="color:#080;font-style:italic">//create optional service dependency with cardinality many and with a locking-strategy
+</span><span style="color:#080;font-style:italic"></span>    celix_dm_service_dependency_t<span style="color:#666">*</span> dep2 <span style="color:#666">=</span> celix_dmServiceDependency_create();
+    celix_dmServiceDependency_setService(dep2, CELIX_SHELL_COMMAND_SERVICE_NAME, <span style="color:#a2f">NULL</span>, <span style="color:#a2f">NULL</span>);
+    celix_dmServiceDependency_setStrategy(dep2, DM_SERVICE_DEPENDENCY_STRATEGY_LOCKING);  <span style="color:#080;font-style:italic">// &lt;----------------------&lt;12&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_dmServiceDependency_setRequired(dep2, <span style="color:#a2f">false</span>); <span style="color:#080;font-style:italic">// &lt;--------------------------------------------------------&lt;13&gt;
+</span><span style="color:#080;font-style:italic"></span>    celix_dm_service_dependency_callback_options_t opts2 <span style="color:#666">=</span> CELIX_EMPTY_DM_SERVICE_DEPENDENCY_CALLBACK_OPTIONS;
+    opts2.addWithProps <span style="color:#666">=</span> (<span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span>)componentWithServiceDependency_addShellCommand;  <span style="color:#080;font-style:italic">// &lt;-------------------------------&lt;14&gt;
+</span><span style="color:#080;font-style:italic"></span>    opts2.removeWithProps <span style="color:#666">=</span> (<span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span>)componentWithServiceDependency_removeShellCommand;
+    celix_dmServiceDependency_setCallbacksWithOptions(dep2, <span style="color:#666">&amp;</span>opts2);
+    celix_dmComponent_addServiceDependency(dmCmp, dep2);
+
+    <span style="color:#080;font-style:italic">//Add dm component to the dm.
+</span><span style="color:#080;font-style:italic"></span>    celix_dependency_manager_t<span style="color:#666">*</span> dm <span style="color:#666">=</span> celix_bundleContext_getDependencyManager(ctx);
+    celix_dependencyManager_add(dm, dmCmp);
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(
+        component_with_service_dependency_activator_t,
+        componentWithServiceDependencyActivator_start,
+        <span style="color:#a2f">NULL</span>)
+</code></pre></div><h2 id="example-component-with-a-service-dependencies-in-c-1">Example: Component with a service dependencies in C++</h2>
+<p>The following example shows how a C++ component that has two service dependency. One
+service dependency for the C++ <code>celix::IShellCommand</code> service and one for the C <code>celix_shell_command_t</code> service.</p>
+<p>The <code>celix::IShellCommand</code> service dependency is a required dependency with a suspend-strategy and uses a
+<code>set</code> callback which ensure that a single service is injected and that is always the highest ranking service.
+Note that the highest ranking service can be an empty shared_ptr if there are no service.</p>
+<p>The <code>celix_shell_command_t</code> service dependency is an optional dependency with a locking-strategy and uses a
+<code>addWithProperties</code> and <code>removeWithProperties</code> callback.
+These callbacks will be called for every <code>celix_shell_command_t</code> service being added/removed
+and will be called with not only the service shared_ptr, but also the service properties.</p>
+<p>Note that for C++ component service dependencies, there is no real different between a C++ or a C service dependency;
+In both cases the service pointers are injected using shared_ptr and if applicable the service properties and
+bundle argument are also provided as shared_ptr using the C++ <code>celix::Properties</code> and <code>celix::Bundle</code>.</p>
+<p>Remarks for the C++ example:</p>
+<ol>
+<li>Creates a mutex to protect the <code>shellCommands</code> field which is configured with a locking-strategy service dependency.</li>
+<li>Updates the <code>highestRankingShellCmd</code> field without locking. Note that because the service dependency is
+configured with a suspend-strategy the <code>ComponentWithServiceDependency::setHighestRankingShellCommand</code> method
+will only be called when the component is in the <code>Suspended</code> state or when it is not in the <code>Active</code> compound state.</li>
+<li>Locks the mutex and adds the newly added service to the <code>shellCommands</code> list. Note that because the service
+dependency is configured with a locking-strategy the <code>ComponentWithServiceDependency::addCShellCmd</code> and
+<code>ComponentWithServiceDependency::removeCShellCmd</code> methods can be called from any component lifecycle state.</li>
+<li>Creates a new DM service dependency object, the service dependency is considered incomplete until the
+service dependency, component or DM is build. Note that the <code>celix::dm::Component::createServiceDependency</code> method
+is called without provided a service name, the service name will be inferred using the <code>celix::typeName</code>.</li>
+<li>Configures the service dependency set callback.</li>
+<li>Configures the service dependency as a required service dependency.</li>
+<li>Configures the update strategy for the service dependency to suspend-strategy.</li>
+<li>Creates another new DM service dependency object and in this case also explicitly provides the service name
+to use (<code>CELIX_SHELL_COMMAND_SERVICE_NAME</code>).</li>
+<li>Builds the component and as result also builds the components&rsquo; service dependencies (i.e. marking them as complete).</li>
+</ol>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/ComponentWithServiceDependencyActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/BundleActivator.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/IShellCommand.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ComponentWithServiceDependency</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#0b0;font-weight:bold">void</span> setHighestRankingShellCommand(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> cmdSvc) {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">New highest ranking service (can be NULL): </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> (intptr_t)cmdSvc.get() <span style="color:#666">&lt;</span><span style="color:#666 [...]
+        highestRankingShellCmd <span style="color:#666">=</span> cmdSvc; <span style="color:#080;font-style:italic">// &lt;------------------------------------------------------------------------&lt;2&gt;
+</span><span style="color:#080;font-style:italic"></span>    }
+
+    <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">addCShellCmd</span>(
+            <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix_shell_command_t<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> cmdSvc,
+            <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span><span style="color:#a2f;font-weight:bold">const</span> celix<span style="color:#666">:</span><span style="color:#666">:</span>Properties<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> props) {
+        <span style="color:#a2f;font-weight:bold">auto</span> id <span style="color:#666">=</span> props<span style="color:#666">-</span><span style="color:#666">&gt;</span>getAsLong(celix<span style="color:#666">:</span><span style="color:#666">:</span>SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>);
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Adding shell command service with service.id: </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> id <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> std [...]
+        std<span style="color:#666">:</span><span style="color:#666">:</span>lock_guard lck{mutex}; <span style="color:#080;font-style:italic">// &lt;-----------------------------------------------------------------------------&lt;3&gt;
+</span><span style="color:#080;font-style:italic"></span>        shellCommands.emplace(id, cmdSvc);
+    }
+
+    <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">removeCShellCmd</span>(
+            <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix_shell_command_t<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> <span style="color:#080;font-style:italic">/*cmdSvc*/</span>,
+            <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span><span style="color:#a2f;font-weight:bold">const</span> celix<span style="color:#666">:</span><span style="color:#666">:</span>Properties<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> props) {
+        <span style="color:#a2f;font-weight:bold">auto</span> id <span style="color:#666">=</span> props<span style="color:#666">-</span><span style="color:#666">&gt;</span>getAsLong(celix<span style="color:#666">:</span><span style="color:#666">:</span>SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>);
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Removing shell command service with service.id: </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> id <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> s [...]
+        std<span style="color:#666">:</span><span style="color:#666">:</span>lock_guard lck{mutex};
+        shellCommands.erase(id);
+    }
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span> highestRankingShellCmd{};
+    std<span style="color:#666">:</span><span style="color:#666">:</span>mutex mutex{}; <span style="color:#080;font-style:italic">//protect shellCommands // &lt;-----------------------------------------------------------------&lt;1&gt;
+</span><span style="color:#080;font-style:italic"></span>    std<span style="color:#666">:</span><span style="color:#666">:</span>unordered_map<span style="color:#666">&lt;</span><span style="color:#0b0;font-weight:bold">long</span>, std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix_shell_command_t<span style="color:#666">&gt;</span><span style="color:#666">&gt;</span> shellCommands{};
+};
+
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">ComponentWithServiceDependencyActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> ComponentWithServiceDependencyActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        <span style="color:#a2f;font-weight:bold">using</span> Cmp <span style="color:#666">=</span> ComponentWithServiceDependency;
+        <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> cmp <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>getDependencyManager()<span style="color:#666">-</span><span style="color:#666">&gt;</span>createComponent<span style="color:#666">&lt;</span>Cmp<span style="color:#666">&gt;</span>(); 
+
+        cmp.createServiceDependency<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span>() <span style="color:#080;font-style:italic">// &lt;-----------------------------------------------------&lt;4&gt;
+</span><span style="color:#080;font-style:italic"></span>                .setCallbacks(<span style="color:#666">&amp;</span>Cmp<span style="color:#666">:</span><span style="color:#666">:</span>setHighestRankingShellCommand) <span style="color:#080;font-style:italic">// &lt;----------------------------------------------&lt;5&gt;
+</span><span style="color:#080;font-style:italic"></span>                .setRequired(<span style="color:#a2f">true</span>) <span style="color:#080;font-style:italic">// &lt;------------------------------------------------------------------------------&lt;6&gt;
+</span><span style="color:#080;font-style:italic"></span>                .setStrategy(DependencyUpdateStrategy<span style="color:#666">:</span><span style="color:#666">:</span>suspend); <span style="color:#080;font-style:italic">// &lt;------------------------------------------------&lt;7&gt;
+</span><span style="color:#080;font-style:italic"></span>
+        cmp.createServiceDependency<span style="color:#666">&lt;</span>celix_shell_command_t<span style="color:#666">&gt;</span>(CELIX_SHELL_COMMAND_SERVICE_NAME) <span style="color:#080;font-style:italic">// &lt;--------------------&lt;8&gt;
+</span><span style="color:#080;font-style:italic"></span>                .setCallbacks(<span style="color:#666">&amp;</span>Cmp<span style="color:#666">:</span><span style="color:#666">:</span>addCShellCmd, <span style="color:#666">&amp;</span>Cmp<span style="color:#666">:</span><span style="color:#666">:</span>removeCShell.html) 
+                .setRequired(<span style="color:#a2f">false</span>)
+                .setStrategy(DependencyUpdateStrategy<span style="color:#666">:</span><span style="color:#666">:</span>locking);
+
+        cmp.build(); <span style="color:#080;font-style:italic">// &lt;--------------------------------------------------------------------------------------------&lt;9&gt;
+</span><span style="color:#080;font-style:italic"></span>    }
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(ComponentWithServiceDependencyActivator)
+</code></pre></div><h1 id="when-will-a-component-be-suspended">When will a component be suspended</h1>
+<p>Components will only suspend if:</p>
+<ul>
+<li>The component is in the state <code>Tracking Optional</code>;</li>
+<li>The component has at least 1 service dependency where the update strategy is configured as suspend-strategy;</li>
+<li>There is a service update event ongoing, where the update service event matches 1 of the components&rsquo;
+suspend-strategy service dependencies;</li>
+<li>And least one of the component&rsquo;s matching suspend-strategy service dependency has a configured service injection/
+removal callback configured.</li>
+</ul>
+<h1 id="the-celixdm-shell-command">The <code>celix::dm</code> shell command</h1>
+<p>To interactively see the available components, their current lifecycle state, provided service and service dependencies
+the <code>celix::dm</code> shell command can be used.</p>
+<p>Examples of supported <code>dm</code> command lines are:</p>
+<ul>
+<li><code>celix::dm</code> - Show an overview of all components in the Celix framework. Only shows component lifecycle state.</li>
+<li><code>dm</code> - Same as <code>celix::dm</code> (as long as there is no colliding other <code>dm</code> commands).</li>
+<li><code>dm full</code> - Show a detailed overview of all components in the Celix framework. This also shows the provided
+services and service dependencies of each component.</li>
+</ul>
+
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<footer class="py-3 bg-secondary">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-8 text-center">
+                <p class="m-0 text-white">
+                    Copyright &copy; 2022 The Apache Software Foundation, Licensed under
+                    the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
+                    <br>
+                    Apache Celix, Celix, Apache, the Apache feather logo and the Apache Celix logo are trademarks of The Apache Software Foundation.
+                </p>
+            </div>
+            <div class="col-md-4 text-center">
+                <a href="https://www.apache.org/events/current-event.html" target="_blank">
+                    <img src="https://www.apache.org/events/current-event-234x60.png" title="Apache Event" width="234" height="60" border="0">
+                </a>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+<script src="/assets/js/jquery.min.js"></script>
+<script src="/assets/js/bootstrap.bundle.min.js"></script>
+
+
+</body>
+</html>
diff --git a/content/docs/2.3.0/celix/documents/containers.html b/content/docs/2.3.0/celix/documents/containers.html
new file mode 100644
index 0000000..5b78674
--- /dev/null
+++ b/content/docs/2.3.0/celix/documents/containers.html
@@ -0,0 +1,269 @@
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <title>Apache Celix Containers / Apache Celix</title>
+
+    
+    <link rel="icon" href="/assets/img/favicon.ico">
+
+    
+    <link href="/assets/css/bootstrap.min.css" rel="stylesheet">
+
+    
+    <link href="/assets/css/style.css" rel="stylesheet">
+
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
+    
+<script>
+  var _paq = window._paq = window._paq || [];
+   
+  _paq.push(['disableCookies']);
+   
+  _paq.push(['trackPageView']);
+  _paq.push(['enableLinkTracking']);
+  (function() {
+    var u="https://analytics.apache.org/";
+    _paq.push(['setTrackerUrl', u+'matomo.php']);
+    _paq.push(['setSiteId', '9']);
+    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+  })();
+</script>
+
+
+</head>
+<body class="light-grey">
+
+<a href="https://github.com/apache/celix" class="github-ribbon">
+    <img src="/assets/img/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
+</a>
+
+
+<nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top">
+    <div class="container">
+        <a class="navbar-brand" href="/">
+            <img src="/assets/img/celix-white.svg" height="40" class="d-inline-block align-top" alt="Celix Logo">
+        </a>
+        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+        </button>
+        <div class="collapse navbar-collapse" id="navbarResponsive">
+            <ul class="navbar-nav ml-auto">
+                <li class="nav-item">
+                    <a class="nav-link" href="/">Home</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" href="/download.cgi">Download</a>
+                </li>
+                <li class="nav-item dropdown active">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Docs
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddDocs">
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
+                        <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddContributing" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Contributing
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddContributing">
+                        <a class="dropdown-item" href="/contributing/youatcelix.html">You at Celix</a>
+                        <a class="dropdown-item" href="/contributing/submitting-patches.html">Submitting patches</a>
+                        <a class="dropdown-item" href="/contributing/source-and-builds.html">Source code and builds</a>
+                        <hr>
+                        <a class="dropdown-item" href="/contributing/releasing.html">Releasing</a>
+                        <a class="dropdown-item" href="/contributing/volunteers.html">Volunteers</a>
+                        <a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Celix.html">Board Reports</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddSupport" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Support
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddSupport">
+                        <a class="dropdown-item" href="/support/mailing-list.html">Mailing Lists</a>
+                        <a class="dropdown-item" href="/support/issue-tracking.html">Issue Tracking</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddFoundation" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        ASF
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddFoundation">
+                        <a class="dropdown-item" href="https://www.apache.org/">ASF Home</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/how-it-works.html">How it works</a>
+                        <a class="dropdown-item" href="https://www.apache.org/licenses/">License</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
+                        <a class="dropdown-item" href="https://www.apache.org/security/">Security</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a>
+                    </div>
+                </li>
+            </ul>
+        </div>
+    </div>
+</nav>
+
+
+<div class="section">
+    <div class="container">
+        <div class="row py-4">
+            <div class="col-sm-12 card">
+                <div class="card-body pt-5">
+                    
+                    
+                        
+                        
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/containers.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                        
+                    
+
+                    
+                        
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                    
+
+                    
+	<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+<h1 id="apache-celix-containers">Apache Celix Containers</h1>
+<p>Apache Celix containers are executables which starts an Apache Celix framework, with an embedded set of properties
+and an embedded set of bundles.
+Although it is also possible to create and start an Apache Celix framework in code, the benefit of an Apache Celix
+Container is that this can be done with a single <code>add_celix_container</code> Apache Celix CMake command.</p>
+<p>The <code>add_celix_container</code> Apache Celix CMake command eventually uses the CMake <code>add_executable</code> with the same
+target name.  As result, it is possible to handle an Apache Celix Container as a normal CMake executable
+(e.g. use <code>target_link_libraries</code>) and also ensures that the CLion IDE detects the containers as an executable.</p>
+<p>For a complete list of options the <code>add_celix_container</code> Apache Celix CMake command supports, see the
+<a href="cmake_commands">Apache Celix CMake Commands documentation</a></p>
+<h2 id="generated-main-source-files">Generated main source files</h2>
+<p>The main purpose of the <code>add_celix_container</code> Apache Celix CMake command is to generate a main source file
+which starts an Apache Celix framework with a set of preconfigured properties and set of preconfigured bundles.</p>
+<p>For example the following (empty) Apache Celix Container:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">my_empty_container</span>)<span style="">
+</span></code></pre></div><p>will create the following main source file (note: reformatted for display purpose):</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//${CMAKE_BINARY_DIR}/celix/gen/containers/my_empty_container/main.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_launcher.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>(<span style="color:#0b0;font-weight:bold">int</span> argc, <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span>argv[]) {
+    <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span> config <span style="color:#666">=</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">\
+</span><span style="color:#b44"></span><span style="color:#b44">CELIX_CONTAINER_NAME=my_empty_container</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">\
+</span><span style="color:#b44"></span><span style="color:#b44">CELIX_BUNDLES_PATH=bundles</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">\
+</span><span style="color:#b44"></span><span style="color:#b44">&#34;</span>;
+    celix_properties_t <span style="color:#666">*</span>embeddedProps <span style="color:#666">=</span> celix_properties_loadFromString(config);
+    <span style="color:#a2f;font-weight:bold">return</span> celixLauncher_launchAndWaitForShutdown(argc, argv, embeddedProps);
+}
+</code></pre></div><p>Note that because the source file is a C++ source file (.cc extension) the executable will be compiled with a C++
+compiler.</p>
+<p>To create C Apache Celix Containers, use the <code>C</code> option in the <code>add_celix_container</code> Apache Celix CMake command;
+This will generate a <code>main.c</code> instead of <code>main.cc</code> source file:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">my_empty_container</span> <span style="color:#b44">C</span>)<span style="">
+</span></code></pre></div><p>When an Apache Celix Container is also configured with framework properties and/or auto start of bundles, the
+generated main source file will add these properties as embedded framework properties.</p>
+<p>For example the following <code>add_celix_container</code> Apache Celix CMake command:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">my_web_shell_container</span>
+    <span style="color:#b44">BUNDLES</span>
+        <span style="color:#b44">Celix::http_admin</span>
+        <span style="color:#b44">Celix::shell</span>
+        <span style="color:#b44">Celix::shell_wui</span>
+    <span style="color:#b44">PROPERTIES</span>
+        <span style="color:#b44">CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=debug</span>
+        <span style="color:#b44">CELIX_HTTP_ADMIN_LISTENING_PORTS=8888</span>
+)<span style="">
+</span></code></pre></div><p>will create the following main source file (note: reformatted for display purpose):</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_launcher.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>(<span style="color:#0b0;font-weight:bold">int</span> argc, <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span>argv[]) {
+    <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span> config <span style="color:#666">=</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">\
+</span><span style="color:#b44"></span><span style="color:#b44">CELIX_CONTAINER_NAME=my_web_shell_container</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">\
+</span><span style="color:#b44"></span><span style="color:#b44">CELIX_BUNDLES_PATH=bundles</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">\
+</span><span style="color:#b44"></span><span style="color:#b44">CELIX_AUTO_START_3=celix_http_admin-Debug.zip celix_shell-Debug.zip celix_shell_wui-Debug.zip</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">\
+</span><span style="color:#b44"></span><span style="color:#b44">CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL=debug</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">\
+</span><span style="color:#b44"></span><span style="color:#b44">CELIX_HTTP_ADMIN_LISTENING_PORTS=8888</span><span style="color:#b44">&#34;</span>;
+
+    celix_properties_t <span style="color:#666">*</span>embeddedProps <span style="color:#666">=</span> celix_properties_loadFromString(config);
+    <span style="color:#a2f;font-weight:bold">return</span> celixLauncher_launchAndWaitForShutdown(argc, argv, embeddedProps);
+}
+</code></pre></div><h2 id="installing-celix-container">Installing Celix container</h2>
+<p>Currently, installing Apache Celix containers (i.e. using <code>make install</code> on a Celix Container) is not supported.</p>
+<p>The reason behind this is that an Apache Celix container depends on the location of bundles and there is currently no
+reliable way to find bundles in a system. For this to work Apache Celix should support something like:</p>
+<ul>
+<li>A bundle search path concept like <code>LD_LIBRARY_PATH</code></li>
+<li>Support for embedded bundles in an executable so that Apache Celix containers can be self containing</li>
+<li>Bundles as shared libraries (instead of zip) so that the normal shared libraries concepts
+(installation, <code>LD_LIBRARY_PATH</code>, etc ) can be reused.</li>
+</ul>
+<p>There is an exception when an installation of an Apache Celix containers works: If all used bundles are based on already
+installed bundles and are added to the Apache Celix container with an absolute path (default).</p>
+
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<footer class="py-3 bg-secondary">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-8 text-center">
+                <p class="m-0 text-white">
+                    Copyright &copy; 2022 The Apache Software Foundation, Licensed under
+                    the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
+                    <br>
+                    Apache Celix, Celix, Apache, the Apache feather logo and the Apache Celix logo are trademarks of The Apache Software Foundation.
+                </p>
+            </div>
+            <div class="col-md-4 text-center">
+                <a href="https://www.apache.org/events/current-event.html" target="_blank">
+                    <img src="https://www.apache.org/events/current-event-234x60.png" title="Apache Event" width="234" height="60" border="0">
+                </a>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+<script src="/assets/js/jquery.min.js"></script>
+<script src="/assets/js/bootstrap.bundle.min.js"></script>
+
+
+</body>
+</html>
diff --git a/content/docs/2.3.0/celix/documents/diagrams/bundles_lifecycle.png b/content/docs/2.3.0/celix/documents/diagrams/bundles_lifecycle.png
new file mode 100644
index 0000000..679568a
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/bundles_lifecycle.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/component_lifecycle.png b/content/docs/2.3.0/celix/documents/diagrams/component_lifecycle.png
new file mode 100644
index 0000000..de03715
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/component_lifecycle.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/extender_pattern.png b/content/docs/2.3.0/celix/documents/diagrams/extender_pattern.png
new file mode 100644
index 0000000..16b8ad2
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/extender_pattern.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/services_register_service_async_seq.png b/content/docs/2.3.0/celix/documents/diagrams/services_register_service_async_seq.png
new file mode 100644
index 0000000..3e61736
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/services_register_service_async_seq.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/services_register_service_seq.png b/content/docs/2.3.0/celix/documents/diagrams/services_register_service_seq.png
new file mode 100644
index 0000000..acd5948
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/services_register_service_seq.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_add_async_seq.png b/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_add_async_seq.png
new file mode 100644
index 0000000..c764741
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_add_async_seq.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_add_seq.png b/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_add_seq.png
new file mode 100644
index 0000000..84162eb
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_add_seq.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_rem_async_seq.png b/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_rem_async_seq.png
new file mode 100644
index 0000000..a810266
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_rem_async_seq.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_rem_seq.png b/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_rem_seq.png
new file mode 100644
index 0000000..bbf0d2a
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/services_tracker_services_rem_seq.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/services_unregister_service_async_seq.png b/content/docs/2.3.0/celix/documents/diagrams/services_unregister_service_async_seq.png
new file mode 100644
index 0000000..1d48019
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/services_unregister_service_async_seq.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/services_unregister_service_seq.png b/content/docs/2.3.0/celix/documents/diagrams/services_unregister_service_seq.png
new file mode 100644
index 0000000..65f17e6
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/services_unregister_service_seq.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/sod_pattern.png b/content/docs/2.3.0/celix/documents/diagrams/sod_pattern.png
new file mode 100644
index 0000000..449a26f
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/sod_pattern.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/sod_pattern_log_service.png b/content/docs/2.3.0/celix/documents/diagrams/sod_pattern_log_service.png
new file mode 100644
index 0000000..71e9e35
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/sod_pattern_log_service.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/sod_pattern_publisher_service.png b/content/docs/2.3.0/celix/documents/diagrams/sod_pattern_publisher_service.png
new file mode 100644
index 0000000..64892a5
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/sod_pattern_publisher_service.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern.png b/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern.png
new file mode 100644
index 0000000..e92d43b
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern_http_admin.png b/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern_http_admin.png
new file mode 100644
index 0000000..10e5a86
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern_http_admin.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern_log_sink.png b/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern_log_sink.png
new file mode 100644
index 0000000..4fe1642
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern_log_sink.png differ
diff --git a/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern_shell.png b/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern_shell.png
new file mode 100644
index 0000000..db2c3ae
Binary files /dev/null and b/content/docs/2.3.0/celix/documents/diagrams/whiteboard_pattern_shell.png differ
diff --git a/content/docs/2.3.0/celix/documents/framework.html b/content/docs/2.3.0/celix/documents/framework.html
new file mode 100644
index 0000000..a40c54d
--- /dev/null
+++ b/content/docs/2.3.0/celix/documents/framework.html
@@ -0,0 +1,349 @@
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <title>Apache Celix Framework / Apache Celix</title>
+
+    
+    <link rel="icon" href="/assets/img/favicon.ico">
+
+    
+    <link href="/assets/css/bootstrap.min.css" rel="stylesheet">
+
+    
+    <link href="/assets/css/style.css" rel="stylesheet">
+
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
+    
+<script>
+  var _paq = window._paq = window._paq || [];
+   
+  _paq.push(['disableCookies']);
+   
+  _paq.push(['trackPageView']);
+  _paq.push(['enableLinkTracking']);
+  (function() {
+    var u="https://analytics.apache.org/";
+    _paq.push(['setTrackerUrl', u+'matomo.php']);
+    _paq.push(['setSiteId', '9']);
+    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+  })();
+</script>
+
+
+</head>
+<body class="light-grey">
+
+<a href="https://github.com/apache/celix" class="github-ribbon">
+    <img src="/assets/img/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
+</a>
+
+
+<nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top">
+    <div class="container">
+        <a class="navbar-brand" href="/">
+            <img src="/assets/img/celix-white.svg" height="40" class="d-inline-block align-top" alt="Celix Logo">
+        </a>
+        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+        </button>
+        <div class="collapse navbar-collapse" id="navbarResponsive">
+            <ul class="navbar-nav ml-auto">
+                <li class="nav-item">
+                    <a class="nav-link" href="/">Home</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" href="/download.cgi">Download</a>
+                </li>
+                <li class="nav-item dropdown active">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Docs
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddDocs">
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
+                        <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddContributing" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Contributing
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddContributing">
+                        <a class="dropdown-item" href="/contributing/youatcelix.html">You at Celix</a>
+                        <a class="dropdown-item" href="/contributing/submitting-patches.html">Submitting patches</a>
+                        <a class="dropdown-item" href="/contributing/source-and-builds.html">Source code and builds</a>
+                        <hr>
+                        <a class="dropdown-item" href="/contributing/releasing.html">Releasing</a>
+                        <a class="dropdown-item" href="/contributing/volunteers.html">Volunteers</a>
+                        <a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Celix.html">Board Reports</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddSupport" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Support
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddSupport">
+                        <a class="dropdown-item" href="/support/mailing-list.html">Mailing Lists</a>
+                        <a class="dropdown-item" href="/support/issue-tracking.html">Issue Tracking</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddFoundation" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        ASF
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddFoundation">
+                        <a class="dropdown-item" href="https://www.apache.org/">ASF Home</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/how-it-works.html">How it works</a>
+                        <a class="dropdown-item" href="https://www.apache.org/licenses/">License</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
+                        <a class="dropdown-item" href="https://www.apache.org/security/">Security</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a>
+                    </div>
+                </li>
+            </ul>
+        </div>
+    </div>
+</nav>
+
+
+<div class="section">
+    <div class="container">
+        <div class="row py-4">
+            <div class="col-sm-12 card">
+                <div class="card-body pt-5">
+                    
+                    
+                        
+                        
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/framework.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                        
+                    
+
+                    
+                        
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                    
+
+                    
+	<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+<h1 id="apache-celix-framework">Apache Celix Framework</h1>
+<p>The Apache Celix framework is the core of Apache Celix applications and provides supports for deployments of
+dynamic, extensible modules known as bundles.</p>
+<p>An instance of an Apache Celix framework can be created with the celix framework factory or by configuring
+<a href="containers.html">Apache Celix containers</a> using the <code>add_celix_container</code> Apache Celix CMake command.</p>
+<h2 id="framework-factory">Framework factory</h2>
+<p>A new instance of an Apache Celix framework can be created using the C/C++ function/method:</p>
+<ul>
+<li><code>celix_frameworkFactory_createFramework</code></li>
+<li><code>celix::createFramework</code></li>
+</ul>
+<p>When an Apache Celix framework is destroyed it will automatically stop and uninstall all running bundles.
+For C, an Apache Celix framework needs to be destroyed with the call <code>celix_frameworkFactory_destroyFramework</code> and
+for C++ this happens when the framework goes out of scope.</p>
+<h3 id="example-creating-an-apache-celix-framework-in-c">Example: Creating an Apache Celix Framework in C</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//src/main.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>() {
+    <span style="color:#080;font-style:italic">//create framework properties
+</span><span style="color:#080;font-style:italic"></span>    celix_properties_t<span style="color:#666">*</span> properties <span style="color:#666">=</span> properties_create();
+    properties_set(properties, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL</span><span style="color:#b44">&#34;</span>, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">debug</span><span style="color:#b44">&#34;</span>);
+
+    <span style="color:#080;font-style:italic">//create framework
+</span><span style="color:#080;font-style:italic"></span>    celix_framework_t<span style="color:#666">*</span> fw <span style="color:#666">=</span> celix_frameworkFactory_createFramework(properties);
+
+    <span style="color:#080;font-style:italic">//get framework bundle context and log hello
+</span><span style="color:#080;font-style:italic"></span>    celix_bundle_context_t<span style="color:#666">*</span> fwContext <span style="color:#666">=</span> celix_framework_getFrameworkContext(fw);
+    celix_bundleContext_log(fwContext, CELIX_LOG_LEVEL_INFO, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello from framework bundle context</span><span style="color:#b44">&#34;</span>);
+
+    <span style="color:#080;font-style:italic">//destroy framework
+</span><span style="color:#080;font-style:italic"></span>    celix_frameworkFactory_destroyFramework(fw);
+}
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cmake" data-lang="cmake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">add_executable</span>(<span style="color:#b44">create_framework_in_c</span> <span style="color:#b44">src/main.c</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">target_link_libraries</span>(<span style="color:#b44">create_framework_in_c</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">Celix::framework</span>)<span style="">
+</span></code></pre></div><h3 id="example-creating-an-apache-celix-framework-in-c-1">Example: Creating an Apache Celix Framework in C++</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/main.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/FrameworkFactory.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>() {
+    <span style="color:#080;font-style:italic">//create framework properties
+</span><span style="color:#080;font-style:italic"></span>    celix<span style="color:#666">:</span><span style="color:#666">:</span>Properties properties{};
+    properties.set(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">CELIX_LOGGING_DEFAULT_ACTIVE_LOG_LEVEL</span><span style="color:#b44">&#34;</span>, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">debug</span><span style="color:#b44">&#34;</span>);
+
+    <span style="color:#080;font-style:italic">//create framework
+</span><span style="color:#080;font-style:italic"></span>    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>Framework<span style="color:#666">&gt;</span> fw <span style="color:#666">=</span> celix<span style="color:#666">:</span><span style="color:#666">:</span>createFramework(properties);
+
+    <span style="color:#080;font-style:italic">//get framework bundle context and log hello
+</span><span style="color:#080;font-style:italic"></span>    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span> ctx <span style="color:#666">=</span> fw<span style="color:#666">-</span><span style="color:#666">&gt;</span>getFrameworkBundleContext();
+    ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>logInfo(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello from framework bundle context</span><span style="color:#b44">&#34;</span>);
+}
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cmake" data-lang="cmake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">add_executable</span>(<span style="color:#b44">create_framework_in_cxx</span> <span style="color:#b44">src/main.cc</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">target_link_libraries</span>(<span style="color:#b44">create_framework_in_cxx</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">Celix::framework</span>)<span style="">
+</span></code></pre></div><h2 id="apache-celix-launcher">Apache Celix launcher</h2>
+<p>If the Apache Celix framework is the main application, the Apache Celix launcher can be used to create the framework
+and wait for a framework shutdown.</p>
+<p>The Apache Celix launcher also does some additional work:</p>
+<ul>
+<li>Handles command arguments (mainly to print to embedded and runtime framework properties).</li>
+<li>Tries to read a &ldquo;config.properties&rdquo; file from the current workdir and combines this with the optional provided
+embedded properties to the Apache Celix Launcher.</li>
+<li>Configures a framework shutdown for the <code>SIGINT</code> and <code>SIGTERM</code> signal.</li>
+<li>Configures an &ldquo;ignore&rdquo; signal handler for the <code>SIGUSR1</code> and <code>SIGUSR2</code> signal.</li>
+<li>Calls the <code>curl_global_init</code> to initialize potential use of curl. Note that the <code>curl_global_init</code> is not thread safe
+or protected by something like pthread_once.</li>
+<li>Destroys the Apache Celix Framework after shutdown.</li>
+</ul>
+<h3 id="example-creating-an-apache-celix-framework-with-the-apache-celix-launcher">Example: Creating an Apache Celix Framework with the Apache Celix Launcher</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//src/launcher.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>(<span style="color:#0b0;font-weight:bold">int</span> argc, <span style="color:#0b0;font-weight:bold">char</span><span style="color:#666">*</span><span style="color:#666">*</span> argv) {
+    <span style="color:#a2f;font-weight:bold">return</span> celixLauncher_launchAndWaitForShutdown(argc, argv, <span style="color:#a2f">NULL</span>);
+}
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cmake" data-lang="cmake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">add_executable</span>(<span style="color:#b44">create_framework_with_celix_launcher</span> <span style="color:#b44">src/launcher.c</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">target_link_libraries</span>(<span style="color:#b44">create_framework_with_celix_launcher</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">Celix::framework</span>)<span style="">
+</span></code></pre></div><h2 id="installing-and-starting-bundles-in-an-apache-celix-framework">Installing and starting bundles in an Apache Celix framework</h2>
+<p>Bundles can be installed and started using the Apache Celix framework bundle context or - when using the Apache Celix
+launcher - with a &ldquo;config.properties&rdquo; file.</p>
+<p>Bundles are installed using a path to a zip file. If the path is a relative path, the framework will search for the
+bundle in the directories configured in the framework property <code>CELIX_BUNDLES_PATH</code>.
+The default value of <code>CELIX_BUNDLES_PATH</code> is &ldquo;bundles&rdquo;.</p>
+<p>Another option is to use framework properties to configure which bundles to install and start.
+This can be done by using the CELIX_AUTO_START_0 till CELIX_AUTO_START_6 framework properties.
+(note that bundles configured in CELIX_AUTO_START_0 are installed and started first).
+For a more complete overview of possible framework properties see <code>celix_constants.h</code></p>
+<p>If the Apache Celix launcher is used, the framework properties can be provided with a &ldquo;config.properties&rdquo;
+file using the Java Properties File Format.</p>
+<p>Framework properties to install and start bundles:</p>
+<ul>
+<li>CELIX_AUTO_START_0</li>
+<li>CELIX_AUTO_START_1</li>
+<li>CELIX_AUTO_START_2</li>
+<li>CELIX_AUTO_START_3</li>
+<li>CELIX_AUTO_START_4</li>
+<li>CELIX_AUTO_START_5</li>
+<li>CELIX_AUTO_START_6</li>
+</ul>
+<h3 id="example-installing-and-starting-bundles-in-c">Example: Installing and starting bundles in C</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//src/main.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>() {
+    <span style="color:#080;font-style:italic">//create framework properties
+</span><span style="color:#080;font-style:italic"></span>    celix_properties_t<span style="color:#666">*</span> properties <span style="color:#666">=</span> properties_create();
+    properties_set(properties, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">CELIX_BUNDLES_PATH</span><span style="color:#b44">&#34;</span>, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">bundles;/opt/alternative/bundles</span><span style="color:#b44">&#34;</span>);
+    
+    <span style="color:#080;font-style:italic">//create framework
+</span><span style="color:#080;font-style:italic"></span>    celix_framework_t<span style="color:#666">*</span> fw <span style="color:#666">=</span> celix_frameworkFactory_createFramework(<span style="color:#a2f">NULL</span>);
+
+    <span style="color:#080;font-style:italic">//get framework bundle context and install a bundle
+</span><span style="color:#080;font-style:italic"></span>    celix_bundle_context_t<span style="color:#666">*</span> fwContext <span style="color:#666">=</span> celix_framework_getFrameworkContext(fw);
+    celix_bundleContext_installBundle(fwContext, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">FooBundle.zip</span><span style="color:#b44">&#34;</span>, <span style="color:#a2f">true</span>);
+
+    <span style="color:#080;font-style:italic">//destroy framework
+</span><span style="color:#080;font-style:italic"></span>    celix_frameworkFactory_destroyFramework(fw);
+}
+</code></pre></div><h3 id="example-installing-and-starting-bundles-in-c-1">Example: Installing and starting bundles in C++</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/main.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/FrameworkFactory.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>() {
+    <span style="color:#080;font-style:italic">//create framework properties
+</span><span style="color:#080;font-style:italic"></span>    celix<span style="color:#666">:</span><span style="color:#666">:</span>Properties properties{};
+    properties.set(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">CELIX_BUNDLES_PATH</span><span style="color:#b44">&#34;</span>, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">bundles;/opt/alternative/bundles</span><span style="color:#b44">&#34;</span>);
+    
+    <span style="color:#080;font-style:italic">//create framework
+</span><span style="color:#080;font-style:italic"></span>    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>Framework<span style="color:#666">&gt;</span> fw <span style="color:#666">=</span> celix<span style="color:#666">:</span><span style="color:#666">:</span>createFramework(properties);
+    
+    <span style="color:#080;font-style:italic">//get framework bundle context and install a bundle
+</span><span style="color:#080;font-style:italic"></span>    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span> ctx <span style="color:#666">=</span> fw<span style="color:#666">-</span><span style="color:#666">&gt;</span>getFrameworkBundleContext();
+    ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>installBundle(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">FooBundle.zip</span><span style="color:#b44">&#34;</span>);
+}
+</code></pre></div><h3 id="example-installing-and-starting-bundles-using-the-apache-celix-launcher">Example: Installing and starting bundles using the Apache Celix Launcher</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//src/launcher.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#0b0;font-weight:bold">int</span> <span style="color:#00a000">main</span>(<span style="color:#0b0;font-weight:bold">int</span> argc, <span style="color:#0b0;font-weight:bold">char</span><span style="color:#666">*</span><span style="color:#666">*</span> argv) {
+    <span style="color:#a2f;font-weight:bold">return</span> celixLauncher_launchAndWaitForShutdown(argc, argv, <span style="color:#a2f">NULL</span>);
+}
+</code></pre></div><div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-cmake" data-lang="cmake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">find_package</span>(<span style="color:#b44">Celix</span> <span style="color:#b44">REQUIRED</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">file</span>(<span style="color:#b44">GENERATE</span> <span style="color:#b44">OUTPUT</span> <span style="color:#666">${</span><span style="color:#b8860b">CMAKE_CURRENT_BINARY_DIR</span><span style="color:#666">}</span><span style="color:#b44">/config.properties</span> <span style="color:#b44">CONTENT</span> <span style="color:#b44">&#34;
+</span><span style="color:#b44">CELIX_BUNDLES_PATH=bundles;/opt/alternative/bundles
+</span><span style="color:#b44">CELIX_AUTO_START_3=FooBundle.zip
+</span><span style="color:#b44">&#34;</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">add_executable</span>(<span style="color:#b44">create_framework_with_celix_launcher</span> <span style="color:#b44">src/launcher.c</span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">target_link_libraries</span>(<span style="color:#b44">create_framework_with_celix_launcher</span> <span style="color:#b44">PRIVATE</span> <span style="color:#b44">Celix::framework</span>)<span style="">
+</span></code></pre></div>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<footer class="py-3 bg-secondary">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-8 text-center">
+                <p class="m-0 text-white">
+                    Copyright &copy; 2022 The Apache Software Foundation, Licensed under
+                    the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
+                    <br>
+                    Apache Celix, Celix, Apache, the Apache feather logo and the Apache Celix logo are trademarks of The Apache Software Foundation.
+                </p>
+            </div>
+            <div class="col-md-4 text-center">
+                <a href="https://www.apache.org/events/current-event.html" target="_blank">
+                    <img src="https://www.apache.org/events/current-event-234x60.png" title="Apache Event" width="234" height="60" border="0">
+                </a>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+<script src="/assets/js/jquery.min.js"></script>
+<script src="/assets/js/bootstrap.bundle.min.js"></script>
+
+
+</body>
+</html>
diff --git a/content/docs/2.3.0/celix/documents/patterns.html b/content/docs/2.3.0/celix/documents/patterns.html
new file mode 100644
index 0000000..c1bff95
--- /dev/null
+++ b/content/docs/2.3.0/celix/documents/patterns.html
@@ -0,0 +1,307 @@
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <title>Apache Celix Services / Apache Celix</title>
+
+    
+    <link rel="icon" href="/assets/img/favicon.ico">
+
+    
+    <link href="/assets/css/bootstrap.min.css" rel="stylesheet">
+
+    
+    <link href="/assets/css/style.css" rel="stylesheet">
+
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
+    
+<script>
+  var _paq = window._paq = window._paq || [];
+   
+  _paq.push(['disableCookies']);
+   
+  _paq.push(['trackPageView']);
+  _paq.push(['enableLinkTracking']);
+  (function() {
+    var u="https://analytics.apache.org/";
+    _paq.push(['setTrackerUrl', u+'matomo.php']);
+    _paq.push(['setSiteId', '9']);
+    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+  })();
+</script>
+
+
+</head>
+<body class="light-grey">
+
+<a href="https://github.com/apache/celix" class="github-ribbon">
+    <img src="/assets/img/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
+</a>
+
+
+<nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top">
+    <div class="container">
+        <a class="navbar-brand" href="/">
+            <img src="/assets/img/celix-white.svg" height="40" class="d-inline-block align-top" alt="Celix Logo">
+        </a>
+        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+        </button>
+        <div class="collapse navbar-collapse" id="navbarResponsive">
+            <ul class="navbar-nav ml-auto">
+                <li class="nav-item">
+                    <a class="nav-link" href="/">Home</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" href="/download.cgi">Download</a>
+                </li>
+                <li class="nav-item dropdown active">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Docs
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddDocs">
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
+                        <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddContributing" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Contributing
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddContributing">
+                        <a class="dropdown-item" href="/contributing/youatcelix.html">You at Celix</a>
+                        <a class="dropdown-item" href="/contributing/submitting-patches.html">Submitting patches</a>
+                        <a class="dropdown-item" href="/contributing/source-and-builds.html">Source code and builds</a>
+                        <hr>
+                        <a class="dropdown-item" href="/contributing/releasing.html">Releasing</a>
+                        <a class="dropdown-item" href="/contributing/volunteers.html">Volunteers</a>
+                        <a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Celix.html">Board Reports</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddSupport" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Support
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddSupport">
+                        <a class="dropdown-item" href="/support/mailing-list.html">Mailing Lists</a>
+                        <a class="dropdown-item" href="/support/issue-tracking.html">Issue Tracking</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddFoundation" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        ASF
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddFoundation">
+                        <a class="dropdown-item" href="https://www.apache.org/">ASF Home</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/how-it-works.html">How it works</a>
+                        <a class="dropdown-item" href="https://www.apache.org/licenses/">License</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
+                        <a class="dropdown-item" href="https://www.apache.org/security/">Security</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a>
+                    </div>
+                </li>
+            </ul>
+        </div>
+    </div>
+</nav>
+
+
+<div class="section">
+    <div class="container">
+        <div class="row py-4">
+            <div class="col-sm-12 card">
+                <div class="card-body pt-5">
+                    
+                    
+                        
+                        
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/patterns.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                        
+                    
+
+                    
+                        
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                    
+
+                    
+	<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+<h1 id="apache-celix--osgi--patterns">Apache Celix / OSGi  patterns</h1>
+<p>There are several design patterns used in Apache Celix and OSGi.</p>
+<h2 id="whiteboard-pattern">Whiteboard Pattern</h2>
+<p>The whiteboard pattern is a pattern where the act of registering a service is enough to participate in or extend
+an existing functionality.<br>
+A typical aspect of the whiteboard pattern is that an application should
+still resolve and startup even if the bundle or bundles that pick up the whiteboard pattern services are absent.</p>
+<p><img src="diagrams/whiteboard_pattern.png" alt="Whiteboard Pattern"></p>
+<p>Many Apache Celix services are whiteboard services. For example:</p>
+<ul>
+<li><code>celix_shell_command_t</code> and <code>celix::IShellCommand</code> services. These services can be
+picked up by the <code>Celix::shell</code> bundle, but applications should still work if there is no <code>Celix::shell</code> installed
+and started. <br/>
+<img src="diagrams/whiteboard_pattern_shell.png" alt="Celix Shell"></li>
+<li><code>celix_http_service_t</code> and <code>celix_websocket_service_t</code> services. These services can be picked up by the
+<code>Celix::http_admin</code> bundle to provide http url endpoints or websocket url endpoints. <br/>
+<img src="diagrams/whiteboard_pattern_http_admin.png" alt="Celix HTTP Admin"></li>
+<li><code>celix_log_sink_t</code> services. If there is no <code>Celix::log_admin</code> bundle installed and started, the log sinks
+services will never be called, but the application should still work. Note that the <code>Celix::log_admin</code> bundle
+also uses a service on demand pattern (see below). <br/>
+<img src="diagrams/whiteboard_pattern_log_sink.png" alt="Celix Log Admin"></li>
+<li>Services marked as remote service (<code>service.exported.interface=*</code>). These services will work fine
+but only as local services - if there are no remote service bundles installed and started.</li>
+</ul>
+<p>For modularity, the whiteboard pattern is a nice fit, because a whiteboard service admin does not need to know how
+many - if any - whiteboard services are going to be provided and how the implementation details work (as long as
+the implementation adheres to the service contract).</p>
+<p>Whiteboard pattern services are always <a href="https://docs.osgi.org/javadoc/osgi.annotation/8.0.0/org/osgi/annotation/versioning/ConsumerType.html">consumer types</a>, although for Apache Celix interfaces cannot be annotated as
+consumer or provider type.</p>
+<p>One of the downsides of the whiteboard pattern is that it is not always clear why an application is not working as
+expected or what is missing to get the application working as expected. This is because it is not an error
+if there are unused services, and as result there is no error to help a user to identify what is missing.</p>
+<p>For example: A <code>log_collector</code> bundle which provides a <code>celix_log_sink_t</code> service is installed and started,
+so that logging can be collected at in a central log database.
+But no logging is added to the central log database. Initially it could seem that the <code>log_collector</code> bundle
+does not work, especially because the application will not print any warnings or errors.
+But if the <code>Celix::log_admin</code> bundle is not installed and started, the <code>log_collector</code> bundle provided<br>
+<code>celix_log_sink_t</code> service will never be called, so installing and starting the <code>Celix::log_admin</code> is the issue
+in this example.</p>
+<h2 id="extender-pattern">Extender Pattern</h2>
+<p>The extender pattern is a design pattern which leverages the concept of resource containing bundles.
+With the extender pattern, functionality of an extender bundle can be extended by installing so called extendee bundles.
+The extendee bundles contain certain resources files and/or bundle manifest entries which are used by the extender
+bundle.</p>
+<p><img src="diagrams/extender_pattern.png" alt="Extender Pattern"></p>
+<p>An example of the extender pattern is the <code>Celix::http_admin</code> bundle. The extender bundle <code>Celix::http_admin</code>
+monitors installed bundles and reads bundle <code>MANIFEST.MF</code> entries for a <code>X-Web-Resource</code> entry.
+If a <code>X-Web-Resource</code> entry is found, its value is used to set up new HTTP endpoint in the HTTP server of
+the <code>Celix::http_admin</code> bundle using the static web resources of the extendee bundle.</p>
+<h3 id="celixhttp_admin-extendee-bundle-example"><code>Celix::http_admin</code> Extendee Bundle Example</h3>
+<p>The following example shows how a very simple <code>Celix::http_admin</code> extendee bundle, which provided a minimal
+hello world <code>index.html</code> page for the <code>Celix::http_admin</code> to pick up.</p>
+<p>Remarks for the <code>Celix::http_admin</code> extendee bundle example:</p>
+<ol>
+<li>Creates a bundle which will function as an extendee bundle for the <code>Celix::http_admin</code>.</li>
+<li>Marks the bundle as a resource-only bundle, i.e. a bundle with no C or C++ activator.</li>
+<li>Creates a very simple <code>index.html</code> file in CMake</li>
+<li>Adds the <code>index.html</code> file to the <code>http_admin_extendee_bundle</code> bundle in the bundle directory resources.</li>
+<li>Adds a <code>X-Web-Resource</code> bundle manifest entry, which marks the bundle as an extendee bundle for the
+<code>Celix::http_admin</code> bundle. See <code>Celix::http_admin</code> for more info. Note that <code>$&lt;SEMICOLON&gt;</code> is used,
+because a literal <code>;</code> has a special meaning in CMake.</li>
+<li>Create a container which installs and starts the <code>Celix::http_admin</code> (extender) bundle and the
+<code>http_admin_extendee_bundle</code> (extendee) bundle.</li>
+</ol>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#080;font-style:italic">#CMakeLists.txt
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">add_celix_bundle</span>(<span style="color:#b44">http_admin_extendee_bundle</span> <span style="color:#080;font-style:italic"># &lt;----------------------------------------------------------------------&lt;1&gt;
+</span><span style="color:#080;font-style:italic"></span>    <span style="color:#b44">VERSION</span> <span style="color:#b44">1.0.0</span>
+    <span style="color:#b44">NO_ACTIVATOR</span> <span style="color:#080;font-style:italic"># &lt;-------------------------------------------------------------------------------------------------&lt;2&gt;
+</span><span style="color:#080;font-style:italic"></span>)<span style="">
+</span><span style=""></span><span style="color:#a2f">file</span>(<span style="color:#b44">WRITE</span> <span style="color:#b44">&#34;${CMAKE_CURRENT_BINARY_DIR}/index.html&#34;</span> <span style="color:#b44">&#34;&lt;html&gt;&lt;body&gt;Hello World&lt;/body&gt;&lt;/html&gt;&#34;</span>) <span style="color:#080;font-style:italic"># &lt;---------------------&lt;3&gt;
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">celix_bundle_files</span>(<span style="color:#b44">http_admin_extendee_bundle</span> <span style="color:#b44">&#34;${CMAKE_CURRENT_BINARY_DIR}/index.html&#34;</span> <span style="color:#b44">DESTINATION</span> <span style="color:#b44">resources</span>) <span style="color:#080;font-style:italic"># &lt;----&lt;4&gt;
+</span><span style="color:#080;font-style:italic"></span><span style="color:#a2f">celix_bundle_headers</span>(<span style="color:#b44">http_admin_extendee_bundle</span> <span style="color:#b44">&#34;X-Web-Resource: /hello$&lt;SEMICOLON&gt;/resources&#34;</span>) <span style="color:#080;font-style:italic"># &lt;------------------&lt;5&gt;
+</span><span style="color:#080;font-style:italic"></span><span style="">
+</span><span style=""></span><span style="color:#a2f">add_celix_container</span>(<span style="color:#b44">extender_pattern_example_container</span> <span style="color:#080;font-style:italic"># &lt;-----------------------------------------------------------&lt;6&gt;
+</span><span style="color:#080;font-style:italic"></span>    <span style="color:#b44">BUNDLES</span>
+        <span style="color:#b44">Celix::http_admin</span>
+        <span style="color:#b44">http_admin_extendee_bundle</span>
+)<span style="">
+</span></code></pre></div><p>When the <code>extender_pattern_example_container</code> executable is running the web address <code>http://localhost:8080/hello</code>
+should show the content of the <code>index.html</code></p>
+<h2 id="service-on-demand-sod-pattern">Service on Demand (SOD) Pattern</h2>
+<p>A less known Apache Celix / OSGi pattern is the service on demand (SOD) pattern. With the SOD pattern,
+services are ad hoc registered at the moment they are requested.</p>
+<p>Where the whiteboard pattern can be used to extend functionality in modular and service oriented fashion, the SOD
+pattern can be used to use to provide more functional cohesive services to users in a service oriented fashion.</p>
+<p>For the SOD pattern, the service filter to request services can be used to extract information about if and how
+a service on demand needs to be created.</p>
+<p><img src="diagrams/sod_pattern.png" alt="Service On Demand Pattern"></p>
+<p>Some Apache Celix bundles use the SOD pattern. For example:</p>
+<ul>
+<li>The <code>Celix::log_admin</code> bundle creates and registers <code>celix_log_service_t</code> services already preconfigured for
+a requested logger name. <br/>
+<img src="diagrams/sod_pattern_log_service.png" alt="Celix Log Admin"></li>
+<li>The Celix PubSub bundles uses SOD to create and register <code>pubsub_publisher_t</code> services when these are requested
+with a valid &ldquo;topic.name&rdquo; and &ldquo;topic.scope&rdquo; filter attribute. For PubSub, the Celix PubSub Topology Manager monitors
+the <code>pubsub_publisher_t</code> requests and instructs the available Celix PubSub Admins to create
+<code>pubsub_publisher_t</code>. <br/>
+<img src="diagrams/sod_pattern_publisher_service.png" alt="Celix PubSub"></li>
+<li>The Apache Celix / OSGi remote services uses SOD, by ad hoc imported services only when they are discovered and
+requested.</li>
+</ul>
+<p>SOD services are always <a href="https://docs.osgi.org/javadoc/osgi.annotation/8.0.0/org/osgi/annotation/versioning/ProviderType.html">provider types</a>, although for Apache Celix interfaces cannot be annotated as
+consumer or provider type.</p>
+<p>For OSGi the <a href="https://docs.osgi.org/javadoc/osgi.core/8.0.0/org/osgi/framework/hooks/service/FindHook.html">FindHook</a>
+service can be used to further fine tune which services are visible for bundle requesting a SOD service.
+Apache Celix does not yet support the FindHook service.</p>
+
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<footer class="py-3 bg-secondary">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-8 text-center">
+                <p class="m-0 text-white">
+                    Copyright &copy; 2022 The Apache Software Foundation, Licensed under
+                    the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
+                    <br>
+                    Apache Celix, Celix, Apache, the Apache feather logo and the Apache Celix logo are trademarks of The Apache Software Foundation.
+                </p>
+            </div>
+            <div class="col-md-4 text-center">
+                <a href="https://www.apache.org/events/current-event.html" target="_blank">
+                    <img src="https://www.apache.org/events/current-event-234x60.png" title="Apache Event" width="234" height="60" border="0">
+                </a>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+<script src="/assets/js/jquery.min.js"></script>
+<script src="/assets/js/bootstrap.bundle.min.js"></script>
+
+
+</body>
+</html>
diff --git a/content/docs/2.3.0/celix/documents/services.html b/content/docs/2.3.0/celix/documents/services.html
new file mode 100644
index 0000000..e73b541
--- /dev/null
+++ b/content/docs/2.3.0/celix/documents/services.html
@@ -0,0 +1,769 @@
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="">
+    <meta name="author" content="">
+
+    <title>Apache Celix Services / Apache Celix</title>
+
+    
+    <link rel="icon" href="/assets/img/favicon.ico">
+
+    
+    <link href="/assets/css/bootstrap.min.css" rel="stylesheet">
+
+    
+    <link href="/assets/css/style.css" rel="stylesheet">
+
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
+    
+<script>
+  var _paq = window._paq = window._paq || [];
+   
+  _paq.push(['disableCookies']);
+   
+  _paq.push(['trackPageView']);
+  _paq.push(['enableLinkTracking']);
+  (function() {
+    var u="https://analytics.apache.org/";
+    _paq.push(['setTrackerUrl', u+'matomo.php']);
+    _paq.push(['setSiteId', '9']);
+    var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
+    g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
+  })();
+</script>
+
+
+</head>
+<body class="light-grey">
+
+<a href="https://github.com/apache/celix" class="github-ribbon">
+    <img src="/assets/img/forkme_right_red_aa0000.png" alt="Fork me on GitHub">
+</a>
+
+
+<nav class="navbar navbar-expand-lg navbar-dark bg-primary fixed-top">
+    <div class="container">
+        <a class="navbar-brand" href="/">
+            <img src="/assets/img/celix-white.svg" height="40" class="d-inline-block align-top" alt="Celix Logo">
+        </a>
+        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+        </button>
+        <div class="collapse navbar-collapse" id="navbarResponsive">
+            <ul class="navbar-nav ml-auto">
+                <li class="nav-item">
+                    <a class="nav-link" href="/">Home</a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link" href="/download.cgi">Download</a>
+                </li>
+                <li class="nav-item dropdown active">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddDocs" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Docs
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddDocs">
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
+                        <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddContributing" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Contributing
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddContributing">
+                        <a class="dropdown-item" href="/contributing/youatcelix.html">You at Celix</a>
+                        <a class="dropdown-item" href="/contributing/submitting-patches.html">Submitting patches</a>
+                        <a class="dropdown-item" href="/contributing/source-and-builds.html">Source code and builds</a>
+                        <hr>
+                        <a class="dropdown-item" href="/contributing/releasing.html">Releasing</a>
+                        <a class="dropdown-item" href="/contributing/volunteers.html">Volunteers</a>
+                        <a class="dropdown-item" href="https://whimsy.apache.org/board/minutes/Celix.html">Board Reports</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddSupport" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        Support
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddSupport">
+                        <a class="dropdown-item" href="/support/mailing-list.html">Mailing Lists</a>
+                        <a class="dropdown-item" href="/support/issue-tracking.html">Issue Tracking</a>
+                    </div>
+                </li>
+                <li class="nav-item dropdown">
+                    <a class="nav-link dropdown-toggle" href="#" id="ddFoundation" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                        ASF
+                    </a>
+                    <div class="dropdown-menu" aria-labelledby="ddFoundation">
+                        <a class="dropdown-item" href="https://www.apache.org/">ASF Home</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/how-it-works.html">How it works</a>
+                        <a class="dropdown-item" href="https://www.apache.org/licenses/">License</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
+                        <a class="dropdown-item" href="https://www.apache.org/security/">Security</a>
+                        <a class="dropdown-item" href="https://www.apache.org/foundation/policies/conduct">Code of Conduct</a>
+                    </div>
+                </li>
+            </ul>
+        </div>
+    </div>
+</nav>
+
+
+<div class="section">
+    <div class="container">
+        <div class="row py-4">
+            <div class="col-sm-12 card">
+                <div class="card-body pt-5">
+                    
+                    
+                        
+                        
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/services.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                        
+                    
+
+                    
+                        
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                    
+
+                    
+	<!--
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You 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.
+-->
+<h1 id="apache-celix-services">Apache Celix Services</h1>
+<p>An Apache Celix Service is a pointer registered to the Celix framework under a set of properties (metadata).
+Services can be dynamically registered into and looked up from the Apache Celix framework.</p>
+<p>By convention a C service in Apache Celix is a pointer to struct of function pointers and a C++ service is a pointer
+(which can be provided as a <code>std::shared_ptr</code>) to an object implementing a (pure) abstract class.</p>
+<p>A service is always registered under a service name and this service name is also used to lookup services.
+For C the service name must be provided by the user and for C++ the service name can be provided by the user.
+If for C++ no service name is provided the service name will be inferred based on the service template argument using
+<code>celix::typeName&lt;I&gt;</code>.</p>
+<p>Note that the service name is represented in the service properties under the property name <code>objectClass</code>,
+this is inherited for the Java OSGi specification.
+Also note that for Celix - in contrast with Java OSGi - it is only possible to register a single interface
+per service registration in the Apache Celix Framework. This restriction was added because C does not
+(natively) supports multiple interfaces (struct with function pointers) on a single object/pointer.</p>
+<h2 id="a-c-service-example">A C service example</h2>
+<p>As mentioned an Apache Celix C service is a registered pointer to a struct with function pointers.
+This struct ideally contains a handle pointer, a set of function pointers and should be well documented to
+form a well-defined service contract.</p>
+<p>A simple example of an Apache Celix C service is a shell command service.
+For C, the shell command header looks like:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//celix_shell_command.h
+</span><span style="color:#080;font-style:italic"></span>...
+<span style="color:#080">#</span><span style="color:#080">define CELIX_SHELL_COMMAND_NAME                &#34;command.name&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">define CELIX_SHELL_COMMAND_USAGE               &#34;command.usage&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">define CELIX_SHELL_COMMAND_DESCRIPTION         &#34;command.description&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#080">#</span><span style="color:#080">define  CELIX_SHELL_COMMAND_SERVICE_NAME       &#34;celix_shell_command&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">define  CELIX_SHELL_COMMAND_SERVICE_VERSION    &#34;1.0.0&#34;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> celix_shell_command celix_shell_command_t;
+
+<span style="color:#080;font-style:italic">/**
+</span><span style="color:#080;font-style:italic"> * The shell command can be used to register additional shell commands.
+</span><span style="color:#080;font-style:italic"> * This service should be registered with the following properties:
+</span><span style="color:#080;font-style:italic"> *  - command.name: mandatory, name of the command e.g. &#39;lb&#39;
+</span><span style="color:#080;font-style:italic"> *  - command.usage: optional, string describing how tu use the command e.g. &#39;lb [-l | -s | -u]&#39;
+</span><span style="color:#080;font-style:italic"> *  - command.description: optional, string describing the command e.g. &#39;list bundles.&#39;
+</span><span style="color:#080;font-style:italic"> */</span>
+<span style="color:#a2f;font-weight:bold">struct</span> celix_shell_command {
+    <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#666">*</span>handle;
+
+    <span style="color:#080;font-style:italic">/**
+</span><span style="color:#080;font-style:italic">     * Calls the shell command.
+</span><span style="color:#080;font-style:italic">     * @param handle        The shell command handle.
+</span><span style="color:#080;font-style:italic">     * @param commandLine   The complete provided cmd line (e.g. for a &#39;stop&#39; command -&gt; &#39;stop 42&#39;)
+</span><span style="color:#080;font-style:italic">     * @param outStream     The output stream, to use for printing normal flow info.
+</span><span style="color:#080;font-style:italic">     * @param errorStream   The error stream, to use for printing error flow info.
+</span><span style="color:#080;font-style:italic">     * @return              Whether a command is successfully executed.
+</span><span style="color:#080;font-style:italic">     */</span>
+    <span style="color:#0b0;font-weight:bold">bool</span> (<span style="color:#666">*</span>executeCommand)(<span style="color:#0b0;font-weight:bold">void</span> <span style="color:#666">*</span>handle, <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span>commandLine, FILE <span style="color:#666">*</span>outStream, FILE <span style="color:#666">*</span>errorStream);
+};
+</code></pre></div><p>The service struct is documented, explains which service properties needs to be provided, contains a handle pointer and
+a <code>executeCommand</code> function pointer.</p>
+<p>The <code>handle</code> field and the <code>handle</code> function argument should function as an opaque instance (<code>this</code> / <code>self</code>) handle
+and generally is unique for every service instance. Users of the service should forward the handle field when calling
+a service function, e.g.:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C">celix_shell_command_t<span style="color:#666">*</span> command <span style="color:#666">=</span> ...;
+command<span style="color:#666">-</span><span style="color:#666">&gt;</span>executeCommand(command<span style="color:#666">-</span><span style="color:#666">&gt;</span>handle, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">test 123</span><span style="color:#b44">&#34;</span>, stdout, stderr);
+</code></pre></div><h2 id="a-c-service-example-1">A C++ service example</h2>
+<p>As mentioned an Apache Celix C++ service is a registered pointer to an object implementing an abstract class.
+The service class ideally should be well documented to form a well-defined service contract.</p>
+<p>A simple example of an Apache Celix C++ service is a C++ shell command.
+For C++, the shell command header looks like:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//celix/IShellCommand.h
+</span><span style="color:#080;font-style:italic"></span>...
+<span style="color:#a2f;font-weight:bold">namespace</span> celix {
+
+    <span style="color:#080;font-style:italic">/**
+</span><span style="color:#080;font-style:italic">     * The shell command interface can be used to register additional Celix shell commands.
+</span><span style="color:#080;font-style:italic">     * This service should be registered with the following properties:
+</span><span style="color:#080;font-style:italic">     *  - name: mandatory, name of the command e.g. &#39;celix::lb&#39;
+</span><span style="color:#080;font-style:italic">     *  - usage: optional, string describing how tu use the command e.g. &#39;celix::lb [-l | -s | -u]&#39;
+</span><span style="color:#080;font-style:italic">     *  - description: optional, string describing the command e.g. &#39;list bundles.&#39;
+</span><span style="color:#080;font-style:italic">     */</span>
+    <span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">IShellCommand</span> {
+    <span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+        <span style="color:#080;font-style:italic">/**
+</span><span style="color:#080;font-style:italic">         * The required name of the shell command service (service property)
+</span><span style="color:#080;font-style:italic">         */</span>
+        <span style="color:#a2f;font-weight:bold">static</span> <span style="color:#a2f;font-weight:bold">constexpr</span> <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span> <span style="color:#a2f;font-weight:bold">const</span> COMMAND_NAME <span style="color:#666">=</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">name</span><span style="color: [...]
+
+        <span style="color:#080;font-style:italic">/**
+</span><span style="color:#080;font-style:italic">         * The optional usage text of the shell command service (service property)
+</span><span style="color:#080;font-style:italic">         */</span>
+        <span style="color:#a2f;font-weight:bold">static</span> <span style="color:#a2f;font-weight:bold">constexpr</span> <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span> <span style="color:#a2f;font-weight:bold">const</span> COMMAND_USAGE <span style="color:#666">=</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">usage</span><span style="colo [...]
+
+        <span style="color:#080;font-style:italic">/**
+</span><span style="color:#080;font-style:italic">         * The optional description text of the shell command service (service property)
+</span><span style="color:#080;font-style:italic">         */</span>
+        <span style="color:#a2f;font-weight:bold">static</span> <span style="color:#a2f;font-weight:bold">constexpr</span> <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span> <span style="color:#a2f;font-weight:bold">const</span> COMMAND_DESCRIPTION <span style="color:#666">=</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">description</span><span [...]
+
+        <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#666">~</span>IShellCommand() <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
+
+        <span style="color:#080;font-style:italic">/**
+</span><span style="color:#080;font-style:italic">         * Calls the shell command.
+</span><span style="color:#080;font-style:italic">         * @param commandLine   The complete provided command line (e.g. for a &#39;stop&#39; command -&gt; &#39;stop 42&#39;). Only valid during the call.
+</span><span style="color:#080;font-style:italic">         * @param commandArgs   A list of the arguments for the command (e.g. for a &#34;stop 42 43&#34; commandLine -&gt; {&#34;42&#34;, &#34;43&#34;}). Only valid during the call.
+</span><span style="color:#080;font-style:italic">         * @param outStream     The C output stream, to use for printing normal flow info.
+</span><span style="color:#080;font-style:italic">         * @param errorStream   The C error stream, to use for printing error flow info.
+</span><span style="color:#080;font-style:italic">         * @return              Whether the command has been executed correctly.
+</span><span style="color:#080;font-style:italic">         */</span>
+        <span style="color:#a2f;font-weight:bold">virtual</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">executeCommand</span>(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>string<span style="color:#666">&amp;</span> commandLine, <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>vector<span style= [...]
+    };
+}
+</code></pre></div><p>As with the C shell command struct, the C++ service class is documented and explains which service properties needs to
+be provided. The <code>handle</code> construct is not needed for C++ services and using a C++ service function is just the same
+as calling a function member of any C++ object.</p>
+<h2 id="impact-of-dynamic-services">Impact of dynamic services</h2>
+<p>Services in Apache Celix are dynamic, meaning that they can come and go at any moment.
+This makes it possible to create emerging functionality based on the coming and going of Celix services.
+How to cope with this dynamic behaviour is critical for creating a stable solution.</p>
+<p>For Java OSGi this is already a challenge to program correctly, but less critical because generally speaking the
+garbage collector will arrange that objects still exists even if the providing bundle is un-installed.
+Taking into account that C and C++ has no garbage collection, handling the dynamic behaviour correctly is
+more critical; If a bundle providing a certain service is removed, the code segment / memory allocated for
+that service will also be removed / deallocated.</p>
+<p>Apache Celix has several mechanisms for dealing with this dynamic behaviour:</p>
+<ul>
+<li>A built-in abstraction to use services with callbacks function where the Celix framework ensures the services
+are not removed during callback execution.</li>
+<li>Service trackers which ensure that service can only complete their un-registration when all service
+remove callbacks have been processed.</li>
+<li>Components with declarative service dependency so that a component life cycle is coupled with the availability of
+service dependencies. See the components&rsquo; documentation section for more information about components.</li>
+<li>The Celix framework will handle all service registration/un-registration events and the starting/stopping of trackers
+on the Celix event thread to ensure that only 1 event can be processed per time and that callbacks for service
+registration and service tracker are always called from the same thread.</li>
+<li>Service registration, service un-registration, starting trackers and closing trackers can be done async.</li>
+</ul>
+<h2 id="registering-and-un-registering-services">Registering and un-registering services</h2>
+<p>Service registration and un-registration in Celix can be done synchronized or asynchronized and although
+(un-)registering services synchronized is more inline with the OSGi spec, (un-)registering is preferred for Celix.</p>
+<p>When registering a service synchronized, the service registration event and all events resulting from the service
+registration are handled; in practice this means that when a synchronized service registration returns all bundles
+are aware of the new service and if needed have updated their administration accordingly.</p>
+<p>Synchronized service (un-)registration can lead to problems if for example another service registration event is
+triggered on the handling of the current service registration events.
+In that case normal mutexes are not always enough and reference counting or recursive mutexes are needed.
+reference counting can be complex to handle (especially in C) and recursive mutexes are arguable a bad idea.</p>
+<p>Interestingly for Java the use of <code>synchronized</code> is recursive and as result this seems te be smaller issue with Java.</p>
+<p>When registering a service asynchronized, the service properties and specifically the <code>service.id</code> property will be
+finalized when the service registration call returns. The actual service registration event will be done asynchronized
+by the Celix event thread and this can be done before or after the service registration call returns.</p>
+<p>To register a service asynchronized the following C functions / C++ methods can be used:</p>
+<ul>
+<li><code>celix_bundleContext_registerServiceAsync</code>.</li>
+<li><code>celix_bundleContext_registerServiceWithOptionsAsync</code>.</li>
+<li><code>celix::BundleContext::registerService</code>.</li>
+<li><code>celix::BundleContext::registerUnmanagedService</code>.</li>
+</ul>
+<p>To register a service synchronized the following C functions / C++ methods can be used:</p>
+<ul>
+<li><code>celix_bundleContext_registerService</code>.</li>
+<li><code>celix_bundleContext_registerServiceWithOptions</code>.</li>
+<li><code>celix::BundleContext::registerService</code>, use <code>celix::ServiceRegistrationBuilder::setRegisterAsync</code> to configure
+registration synchronized because the default is asynchronized.</li>
+<li><code>celix::BundleContext::registerUnmanagedService</code>, use <code>celix::ServiceRegistrationBuilder::setRegisterAsync</code>
+to configure registration synchronized because the default is asynchronized.</li>
+</ul>
+<p>To unregister a service asynchronized the following C function can be used:</p>
+<ul>
+<li><code>celix_bundleContext_unregisterServiceAsync</code>.</li>
+</ul>
+<p>And to unregister a service synchronized the following C function can be used:</p>
+<ul>
+<li><code>celix_bundleContext_unregisterService</code>.</li>
+</ul>
+<p>For C++ a service un-registration happens when its corresponding <code>celix::ServiceRegistration</code> object goes out of
+scope. A C++ service can be configured for synchronized un-registration using ServiceRegistrationBuilder,
+specifically:</p>
+<ul>
+<li><code>celix::ServiceRegistrationBuilder::setUnregisterAsync</code>. The default is asynchronized.</li>
+</ul>
+<h3 id="example-register-a-service-in-c">Example: Register a service in C</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//src/my_shell_command_provider_bundle_activator.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> my_shell_command_provider_activator_data {
+    celix_bundle_context_t<span style="color:#666">*</span> ctx;
+    celix_shell_command_t shellCmdSvc;
+    <span style="color:#0b0;font-weight:bold">long</span> shellCmdSvcId;
+} my_shell_command_provider_activator_data_t;
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">bool</span> <span style="color:#00a000">my_shell_command_executeCommand</span>(<span style="color:#0b0;font-weight:bold">void</span> <span style="color:#666">*</span>handle, <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span> <span style="color:#666">*</span>commandLine, FILE <span style="color:#666">*</span>outStream, FILE <span style [...]
+    my_shell_command_provider_activator_data_t<span style="color:#666">*</span> data <span style="color:#666">=</span> handle;
+    celix_bundle_t<span style="color:#666">*</span> bnd <span style="color:#666">=</span> celix_bundleContext_getBundle(data<span style="color:#666">-</span><span style="color:#666">&gt;</span>ctx);
+    fprintf(outStream, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello from bundle %s with command line &#39;%s&#39;</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, celix_bundle_getName(bnd), commandLine);
+    <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#a2f">true</span>;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">my_shell_command_provider_bundle_start</span>(my_shell_command_provider_activator_data_t <span style="color:#666">*</span>data, celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    data<span style="color:#666">-</span><span style="color:#666">&gt;</span>ctx <span style="color:#666">=</span> ctx;
+    data<span style="color:#666">-</span><span style="color:#666">&gt;</span>shellCmdSvc.handle <span style="color:#666">=</span> data;
+    data<span style="color:#666">-</span><span style="color:#666">&gt;</span>shellCmdSvc.executeCommand <span style="color:#666">=</span> my_shell_command_executeCommand;
+    
+    celix_properties_t<span style="color:#666">*</span> props <span style="color:#666">=</span> celix_properties_create();
+    celix_properties_set(props, CELIX_SHELL_COMMAND_NAME, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">my_command</span><span style="color:#b44">&#34;</span>);
+    
+    data<span style="color:#666">-</span><span style="color:#666">&gt;</span>shellCmdSvcId <span style="color:#666">=</span> celix_bundleContext_registerServiceAsync(ctx, <span style="color:#666">&amp;</span>data<span style="color:#666">-</span><span style="color:#666">&gt;</span>shellCmdSvc, CELIX_SHELL_COMMAND_SERVICE_NAME, props);
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">my_shell_command_provider_bundle_stop</span>(my_shell_command_provider_activator_data_t <span style="color:#666">*</span>data, celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    celix_bundleContext_unregisterServiceAsync(ctx, data<span style="color:#666">-</span><span style="color:#666">&gt;</span>shellCmdSvcId, <span style="color:#a2f">NULL</span>, <span style="color:#a2f">NULL</span>);
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(my_shell_command_provider_activator_data_t, my_shell_command_provider_bundle_start, my_shell_command_provider_bundle_stop)
+</code></pre></div><h3 id="example-register-a-c-service-in-c">Example: Register a C++ service in C++</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/MyShellCommandBundleActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/BundleActivator.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/IShellCommand.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">MyCommand</span> <span style="color:#666">:</span> <span style="color:#a2f;font-weight:bold">public</span> celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> MyCommand(std<span style="color:#666">:</span><span style="color:#666">:</span>string_view _name) <span style="color:#666">:</span> name{_name} {}
+
+    <span style="color:#666">~</span>MyCommand() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#a2f;font-weight:bold">override</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
+
+    <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">executeCommand</span>(
+            <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>string<span style="color:#666">&amp;</span> commandLine,
+            <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>vector<span style="color:#666">&lt;</span>std<span style="color:#666">:</span><span style="color:#666">:</span>string<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> <span style="color:#080;font-style:italic">/*commandArgs*/</span>,
+            FILE<span style="color:#666">*</span> outStream,
+            FILE<span style="color:#666">*</span> <span style="color:#080;font-style:italic">/*errorStream*/</span>) <span style="color:#a2f;font-weight:bold">override</span> {
+        fprintf(outStream, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello from bundle %s with command line &#39;%s&#39;</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, name.c_str(), commandLine.c_str());
+    }
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>string name;
+};
+
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">MyShellCommandProviderBundleActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> MyShellCommandProviderBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        <span style="color:#a2f;font-weight:bold">auto</span> svcObject <span style="color:#666">=</span> std<span style="color:#666">:</span><span style="color:#666">:</span>make_shared<span style="color:#666">&lt;</span>MyCommand<span style="color:#666">&gt;</span>(ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>getBundle().getName());
+        cmdShellRegistration <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>registerService<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span>(std<span style="color:#666">:</span><span style="color:#666">:</span>move(svcObject))
+                .addProperty(celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">:</span><span style="color:#666">:</span>COMMAND_NAME, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">MyCommand</span><span style="color:#b44">&#34;</span>)
+                .build();
+    }
+
+    <span style="color:#666">~</span>MyShellCommandProvider() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    <span style="color:#080;font-style:italic">//NOTE when celix::ServiceRegistration goes out of scope the underlining service will be un-registered
+</span><span style="color:#080;font-style:italic"></span>    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>ServiceRegistration<span style="color:#666">&gt;</span> cmdShellRegistration{};
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(MyShellCommandProviderBundleActivator)
+</code></pre></div><h3 id="example-register-a-c-service-in-c-1">Example: Register a C service in C++</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/MyCShellCommandProviderBundleActivator.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/BundleActivator.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">struct</span> <span style="color:#00f">MyCShellCommand</span> <span style="color:#666">:</span> <span style="color:#a2f;font-weight:bold">public</span> celix_shell_command {
+    <span style="color:#a2f;font-weight:bold">explicit</span> <span style="color:#00a000">MyCShellCommand</span>(std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span> _ctx) <span style="color:#666">:</span> celix_shell_command(), ctx{std<span style="color:#666">:</span><span style="color:#666">:</span>move(_ctx)} {
+        handle <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">this</span>;
+        executeCommand <span style="color:#666">=</span> [] (<span style="color:#0b0;font-weight:bold">void</span> <span style="color:#666">*</span>handle, <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#0b0;font-weight:bold">char</span><span style="color:#666">*</span> commandLine, FILE<span style="color:#666">*</span> outStream, FILE<span style="color:#666">*</span> <span style="color:#080;font-style:italic">/*errorStream*/</span>) <span style="color:#666">-< [...]
+            <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">*</span> cmdProvider <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">static_cast</span><span style="color:#666">&lt;</span>MyCShellCommand<span style="color:#666">*</span><span style="color:#666">&gt;</span>(handle);
+            fprintf(outStream, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Hello from bundle %s with command line &#39;%s&#39;</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, cmdProvider<span style="color:#666">-</span><span style="color:#666">&gt;</span>ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>getBundle().getName().c_str(), commandLine);
+            <span style="color:#a2f;font-weight:bold">return</span> <span style="color:#a2f">true</span>;
+        };
+    }
+
+    <span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span> ctx;
+};
+
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">MyCShellCommandProviderBundleActivator</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> MyCShellCommandProviderBundleActivator(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span>  ctx) {
+        <span style="color:#a2f;font-weight:bold">auto</span> shellCmd <span style="color:#666">=</span> std<span style="color:#666">:</span><span style="color:#666">:</span>make_shared<span style="color:#666">&lt;</span>MyCShellCommand<span style="color:#666">&gt;</span>(ctx);
+        cmdShellRegistration <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>registerService<span style="color:#666">&lt;</span>celix_shell_command<span style="color:#666">&gt;</span>(std<span style="color:#666">:</span><span style="color:#666">:</span>move(shell.html), CELIX_SHELL_COMMAND_SERVICE_NAME)
+                .addProperty(CELIX_SHELL_COMMAND_NAME, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">MyCCommand</span><span style="color:#b44">&#34;</span>)
+                .setUnregisterAsync(<span style="color:#a2f">false</span>)
+                .build();
+    }
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    <span style="color:#080;font-style:italic">//NOTE when celix::ServiceRegistration goes out of scope the underlining service will be un-registered
+</span><span style="color:#080;font-style:italic"></span>    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>ServiceRegistration<span style="color:#666">&gt;</span> cmdShellRegistration{};
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(MyCShellCommandProviderBundleActivator)
+</code></pre></div><h3 id="sequence-diagrams-for-service-registration">Sequence diagrams for service registration</h3>
+<p><img src="diagrams/services_register_service_async_seq.png" alt="Register Service Async">
+<em>An asynchronized service registration</em></p>
+<hr>
+<p><img src="diagrams/services_register_service_seq.png" alt="Register Service Async">
+<em>A synchronized service registration</em></p>
+<hr>
+<p><img src="diagrams/services_unregister_service_async_seq.png" alt="Unregister Service Async">
+<em>An asynchronized service un-registration</em></p>
+<hr>
+<p><img src="diagrams/services_unregister_service_seq.png" alt="Unregister Service Async">
+<em>A synchronized service un-registration</em></p>
+<h2 id="using-services">Using services</h2>
+<p>Services can be used directly using the bundle context C functions or C++ methods:</p>
+<ul>
+<li><code>celix_bundleContext_useServiceWithId</code></li>
+<li><code>celix_bundleContext_useService</code></li>
+<li><code>celix_bundleContext_useServices</code></li>
+<li><code>celix_bundleContext_useServiceWithOptions</code></li>
+<li><code>celix_bundleContext_useServicesWithOptions</code></li>
+<li><code>celix::BundleContext::useService</code></li>
+<li><code>celix::BundleContext::useServices</code></li>
+</ul>
+<p>These functions and methods work by providing a callback function which will be called by the Celix framework with the
+matching service or services.
+when a &ldquo;use service&rdquo; function/method returns the callback function can can be safely deallocated.
+A &ldquo;use service&rdquo; function/method return value will indicate if a matching service is found or how many matching services
+are found.</p>
+<p>The Celix framework provides service usage through callbacks - instead of directly return a service pointer -
+to ensure that services are prevented from removal while the services are still in use without forwarding
+this responsibility to the user; i.e. by adding an api to &ldquo;lock&rdquo; and &ldquo;unlock&rdquo; services for usage.</p>
+<h3 id="example-using-a-service-in-c">Example: Using a service in C</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;stdio.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> use_command_service_example_data {
+    <span style="color:#080;font-style:italic">//nop
+</span><span style="color:#080;font-style:italic"></span>} use_command_service_example_data_t;
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">useShellCommandCallback</span>(<span style="color:#0b0;font-weight:bold">void</span> <span style="color:#666">*</span>handle __attribute__((unused)), <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#666">*</span>svc) {
+    celix_shell_command_t<span style="color:#666">*</span> cmdSvc <span style="color:#666">=</span> (celix_shell_command_t<span style="color:#666">*</span>)svc;
+    cmdSvc<span style="color:#666">-</span><span style="color:#666">&gt;</span>executeCommand(cmdSvc<span style="color:#666">-</span><span style="color:#666">&gt;</span>handle, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">my_command test call from C</span><span style="color:#b44">&#34;</span>, stdout, stderr);
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">use_command_service_example_start</span>(use_command_service_example_data_t <span style="color:#666">*</span>data __attribute__((unused)), celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    celix_service_use_options_t opts <span style="color:#666">=</span> CELIX_EMPTY_SERVICE_USE_OPTIONS;
+    opts.callbackHandle <span style="color:#666">=</span> <span style="color:#a2f">NULL</span>;
+    opts.use <span style="color:#666">=</span> useShellCommandCallback;
+    opts.filter.serviceName <span style="color:#666">=</span> CELIX_SHELL_COMMAND_SERVICE_NAME;
+    opts.filter.filter <span style="color:#666">=</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">(command.name=my_command)</span><span style="color:#b44">&#34;</span>;
+    <span style="color:#0b0;font-weight:bold">bool</span> called <span style="color:#666">=</span> celix_bundleContext_useServicesWithOptions(ctx, <span style="color:#666">&amp;</span>opts);
+    <span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#666">!</span>called) {
+        fprintf(stderr, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">%s: Command service not called!</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, __PRETTY_FUNCTION__);
+    }
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">use_command_service_example_stop</span>(use_command_service_example_data_t <span style="color:#666">*</span>data __attribute__((unused)), celix_bundle_context_t <span style="color:#666">*</span>ctx __attribute__((unused))) {
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(use_command_service_example_data_t, use_command_service_example_start, use_command_service_example_stop)
+</code></pre></div><h3 id="example-using-a-service-in-c-1">Example: Using a service in C++</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/UsingCommandServicesExample.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/IShellCommand.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/BundleActivator.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">useCxxShellCommand</span>(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+    <span style="color:#a2f;font-weight:bold">auto</span> called <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>useService<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span>()
+            .setFilter(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">(name=MyCommand)</span><span style="color:#b44">&#34;</span>)
+            .addUseCallback([](celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&amp;</span> cmdSvc) {
+                cmdSvc.executeCommand(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">MyCommand test call from C++</span><span style="color:#b44">&#34;</span>, {}, stdout, stderr);
+            })
+            .build();
+    <span style="color:#a2f;font-weight:bold">if</span> (<span style="color:#666">!</span>called) {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cerr <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> __PRETTY_FUNCTION__  <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">: Command service not called!</span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> st [...]
+    }
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">useCShellCommand</span>(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+    <span style="color:#a2f;font-weight:bold">auto</span> calledCount <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>useServices<span style="color:#666">&lt;</span>celix_shell_command<span style="color:#666">&gt;</span>(CELIX_SHELL_COMMAND_SERVICE_NAME)
+            <span style="color:#080;font-style:italic">//Note the filter should match 2 shell commands
+</span><span style="color:#080;font-style:italic"></span>            .setFilter(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">(|(command.name=MyCCommand)(command.name=my_command))</span><span style="color:#b44">&#34;</span>) 
+            .addUseCallback([](celix_shell_command<span style="color:#666">&amp;</span> cmdSvc) {
+                cmdSvc.executeCommand(cmdSvc.handle, <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">MyCCommand test call from C++</span><span style="color:#b44">&#34;</span>, stdout, stderr);
+            })
+            .build();
+    <span style="color:#a2f;font-weight:bold">if</span> (calledCount <span style="color:#666">=</span><span style="color:#666">=</span> <span style="color:#666">0</span>) {
+        std<span style="color:#666">:</span><span style="color:#666">:</span>cerr <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> __PRETTY_FUNCTION__  <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">: Command service not called!</span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> st [...]
+    }
+}
+
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">UsingCommandServicesExample</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> UsingCommandServicesExample(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        useCxxShellCommand(ctx);
+        useCShellCommand(ctx);
+    }
+
+    <span style="color:#666">~</span>UsingCommandServicesExample() <span style="color:#a2f;font-weight:bold">noexcept</span> <span style="color:#666">=</span> <span style="color:#a2f;font-weight:bold">default</span>;
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(UsingCommandServicesExample)
+</code></pre></div><h2 id="tracking-services">Tracking services</h2>
+<p>To monitor the coming and going of services, a service tracker can be used. Service trackers use - user provided -
+callbacks to handle matching services being added or removed. A service name and an optional LDAP filter is used
+to select which services to monitor. A service name <code>*</code> can be used to match services with any service name.
+When a service unregisters, the un-registration can only finish after all matching service trackers
+remove callbacks are processed.</p>
+<p>For C a service tracker can be created using the following bundle context functions:</p>
+<ul>
+<li><code>celix_bundleContext_trackServicesAsync</code></li>
+<li><code>celix_bundleContext_trackServices</code></li>
+<li><code>celix_bundleContext_trackServicesWithOptionsAsync</code></li>
+<li><code>celix_bundleContext_trackServicesWithOptions</code></li>
+</ul>
+<p>The &ldquo;track services&rdquo; C functions always return a service id (long) which can be used to close and destroy the
+service tracker:</p>
+<ul>
+<li><code>celix_bundleContext_stopTrackerAsync</code></li>
+<li><code>celix_bundleContext_stopTracker</code></li>
+</ul>
+<p>For C++ a service tracker can be created using the following bundle context methods:</p>
+<ul>
+<li><code>celix::BundleContext::trackServices</code></li>
+<li><code>celix::BundleContext::trackAnyServices</code></li>
+</ul>
+<p>The C++ methods work with a builder API and will eventually return a <code>std::shared_ptr&lt;celix::ServiceTracker&lt;I&gt;&gt;</code> object.
+if the underlining ServiceTracker object goes out of scope, the service tracker will be closed and destroyed.</p>
+<p>C++ service trackers are created and opened asynchronized, but closed synchronized.
+The closing is done synchronized so that users can be sure that after a <code>celix::ServiceTracker::close()</code> call the
+added callbacks will not be invoked anymore.</p>
+<h3 id="example-tracking-services-in-c">Example: Tracking services in C</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"><span style="color:#080;font-style:italic">//src/track_command_services_example.c
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;stdio.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_api.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">typedef</span> <span style="color:#a2f;font-weight:bold">struct</span> track_command_services_example_data {
+    <span style="color:#0b0;font-weight:bold">long</span> trackerId;
+    celix_thread_mutex_t mutex; <span style="color:#080;font-style:italic">//protects below
+</span><span style="color:#080;font-style:italic"></span>    celix_array_list_t<span style="color:#666">*</span> commandServices;
+} track_command_services_example_data_t;
+
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">addShellCommandService</span>(<span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span> data,<span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span> svc, <span style="color:#a2f;font-weight:bold">const</span> celix_properties_t <span style="color:#666">*</span> properties) {
+    track_command_services_example_data_t<span style="color:#666">*</span> activatorData <span style="color:#666">=</span> data;
+    celix_shell_command_t<span style="color:#666">*</span> cmdSvc <span style="color:#666">=</span> svc;
+
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Adding command service with svc id %li</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, celix_properties_getAsLong(properties, CELIX_FRAMEWORK_SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>));
+    celixThreadMutex_lock(<span style="color:#666">&amp;</span>activatorData<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+    celix_arrayList_add(activatorData<span style="color:#666">-</span><span style="color:#666">&gt;</span>commandServices, cmdSvc);
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Nr of command service found: %i</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, celix_arrayList_size(activatorData<span style="color:#666">-</span><span style="color:#666">&gt;</span>commandServices));
+    celixThreadMutex_unlock(<span style="color:#666">&amp;</span>activatorData<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> <span style="color:#0b0;font-weight:bold">void</span> <span style="color:#00a000">removeShellCommandService</span>(<span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span> data,<span style="color:#0b0;font-weight:bold">void</span><span style="color:#666">*</span> svc, <span style="color:#a2f;font-weight:bold">const</span> celix_properties_t <span style="color:#666">*</span> properties) {
+    track_command_services_example_data_t<span style="color:#666">*</span> activatorData <span style="color:#666">=</span> data;
+    celix_shell_command_t<span style="color:#666">*</span> cmdSvc <span style="color:#666">=</span> svc;
+
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Removing command service with svc id %li</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, celix_properties_getAsLong(properties, CELIX_FRAMEWORK_SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>));
+    celixThreadMutex_lock(<span style="color:#666">&amp;</span>activatorData<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+    celix_arrayList_remove(activatorData<span style="color:#666">-</span><span style="color:#666">&gt;</span>commandServices, cmdSvc);
+    printf(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Nr of command service found: %i</span><span style="color:#b62;font-weight:bold">\n</span><span style="color:#b44">&#34;</span>, celix_arrayList_size(activatorData<span style="color:#666">-</span><span style="color:#666">&gt;</span>commandServices));
+    celixThreadMutex_unlock(<span style="color:#666">&amp;</span>activatorData<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">track_command_services_example_start</span>(track_command_services_example_data_t <span style="color:#666">*</span>data, celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    celixThreadMutex_create(<span style="color:#666">&amp;</span>data<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex, <span style="color:#a2f">NULL</span>);
+    data<span style="color:#666">-</span><span style="color:#666">&gt;</span>commandServices <span style="color:#666">=</span> celix_arrayList_create();
+
+    celix_service_tracking_options_t opts <span style="color:#666">=</span> CELIX_EMPTY_SERVICE_TRACKING_OPTIONS;
+    opts.filter.serviceName <span style="color:#666">=</span> CELIX_SHELL_COMMAND_SERVICE_NAME;
+    opts.filter.filter <span style="color:#666">=</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">(command.name=my_command)</span><span style="color:#b44">&#34;</span>;
+    opts.callbackHandle <span style="color:#666">=</span> data;
+    opts.addWithProperties <span style="color:#666">=</span> addShellCommandService;
+    opts.removeWithProperties <span style="color:#666">=</span> removeShellCommandService;
+    data<span style="color:#666">-</span><span style="color:#666">&gt;</span>trackerId <span style="color:#666">=</span> celix_bundleContext_trackServicesWithOptionsAsync(ctx, <span style="color:#666">&amp;</span>opts);
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+<span style="color:#a2f;font-weight:bold">static</span> celix_status_t <span style="color:#00a000">track_command_services_example_stop</span>(track_command_services_example_data_t <span style="color:#666">*</span>data, celix_bundle_context_t <span style="color:#666">*</span>ctx) {
+    celix_bundleContext_stopTracker(ctx, data<span style="color:#666">-</span><span style="color:#666">&gt;</span>trackerId);
+    celixThreadMutex_lock(<span style="color:#666">&amp;</span>data<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+    celix_arrayList_destroy(data<span style="color:#666">-</span><span style="color:#666">&gt;</span>commandServices);
+    celixThreadMutex_unlock(<span style="color:#666">&amp;</span>data<span style="color:#666">-</span><span style="color:#666">&gt;</span>mutex);
+    <span style="color:#a2f;font-weight:bold">return</span> CELIX_SUCCESS;
+}
+
+CELIX_GEN_BUNDLE_ACTIVATOR(track_command_services_example_data_t, track_command_services_example_start, track_command_services_example_stop)
+</code></pre></div><h3 id="example-tracking-services-in-c-1">Example: Tracking services in C++</h3>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C++" data-lang="C++"><span style="color:#080;font-style:italic">//src/TrackingCommandServicesExample.cc
+</span><span style="color:#080;font-style:italic"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;unordered_map&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/IShellCommand.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix/BundleActivator.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span><span style="color:#080">#</span><span style="color:#080">include</span> <span style="color:#080">&lt;celix_shell_command.h&gt;</span><span style="color:#080">
+</span><span style="color:#080"></span>
+<span style="color:#a2f;font-weight:bold">class</span> <span style="color:#00f">TrackingCommandServicesExample</span> {
+<span style="color:#a2f;font-weight:bold">public</span><span style="color:#666">:</span>
+    <span style="color:#a2f;font-weight:bold">explicit</span> TrackingCommandServicesExample(<span style="color:#a2f;font-weight:bold">const</span> std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>BundleContext<span style="color:#666">&gt;</span><span style="color:#666">&amp;</span> ctx) {
+        <span style="color:#080;font-style:italic">//Tracking C++ IShellCommand services and filtering for services that have a &#34;name=MyCommand&#34; property.
+</span><span style="color:#080;font-style:italic"></span>        cxxCommandServiceTracker <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>trackServices<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span>()
+                .setFilter(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">(name=MyCommand)</span><span style="color:#b44">&#34;</span>)
+                .addAddWithPropertiesCallback([<span style="color:#a2f;font-weight:bold">this</span>](<span style="color:#a2f;font-weight:bold">const</span> <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> svc, <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> properties) {
+                    <span style="color:#0b0;font-weight:bold">long</span> svcId <span style="color:#666">=</span> properties<span style="color:#666">-</span><span style="color:#666">&gt;</span>getAsLong(celix<span style="color:#666">:</span><span style="color:#666">:</span>SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>);
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Adding C++ command services with svc id</span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> svcId <span style="color:#666">&lt;</span><span style="color:#666">&lt;</s [...]
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>lock_guard lock{mutex};
+                    cxxCommandServices[svcId] <span style="color:#666">=</span> svc;
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Nr of C++ command services found: </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> cxxCommandServices.size() <span style="color:#666">&lt;</span><span style="colo [...]
+                })
+                .addRemWithPropertiesCallback([<span style="color:#a2f;font-weight:bold">this</span>](<span style="color:#a2f;font-weight:bold">const</span> <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> <span style="color:#080;font-style:italic">/*svc*/</span>, <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> properties) {
+                    <span style="color:#0b0;font-weight:bold">long</span> svcId <span style="color:#666">=</span> properties<span style="color:#666">-</span><span style="color:#666">&gt;</span>getAsLong(celix<span style="color:#666">:</span><span style="color:#666">:</span>SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>);
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Removing C++ command services with svc id </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> svcId <span style="color:#666">&lt;</span><span style="color:#666">&lt; [...]
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>lock_guard lock{mutex};
+                    <span style="color:#a2f;font-weight:bold">auto</span> it <span style="color:#666">=</span> cxxCommandServices.find(svcId);
+                    <span style="color:#a2f;font-weight:bold">if</span> (it <span style="color:#666">!</span><span style="color:#666">=</span> cxxCommandServices.end()) {
+                        cxxCommandServices.erase(it);
+                    }
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Nr of C++ command services found: </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> cxxCommandServices.size() <span style="color:#666">&lt;</span><span style="colo [...]
+                })
+                .build();
+
+        <span style="color:#080;font-style:italic">//Tracking C celix_shell_command services and filtering for services that have a &#34;command.name=MyCCommand&#34; or
+</span><span style="color:#080;font-style:italic"></span>        <span style="color:#080;font-style:italic">// &#34;command.name=my_command&#34; property.
+</span><span style="color:#080;font-style:italic"></span>        cCommandServiceTracker <span style="color:#666">=</span> ctx<span style="color:#666">-</span><span style="color:#666">&gt;</span>trackServices<span style="color:#666">&lt;</span>celix_shell_command<span style="color:#666">&gt;</span>()
+                .setFilter(<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">(|(command.name=MyCCommand)(command.name=my_command))</span><span style="color:#b44">&#34;</span>)
+                .addAddWithPropertiesCallback([<span style="color:#a2f;font-weight:bold">this</span>](<span style="color:#a2f;font-weight:bold">const</span> <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> svc, <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> properties) {
+                    <span style="color:#0b0;font-weight:bold">long</span> svcId <span style="color:#666">=</span> properties<span style="color:#666">-</span><span style="color:#666">&gt;</span>getAsLong(celix<span style="color:#666">:</span><span style="color:#666">:</span>SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>);
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Adding C command services with svc id </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> svcId <span style="color:#666">&lt;</span><span style="color:#666">&lt;</sp [...]
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>lock_guard lock{mutex};
+                    cCommandServices[svcId] <span style="color:#666">=</span> svc;
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Nr of C command services found: </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> cxxCommandServices.size() <span style="color:#666">&lt;</span><span style="color: [...]
+                })
+                .addRemWithPropertiesCallback([<span style="color:#a2f;font-weight:bold">this</span>](<span style="color:#a2f;font-weight:bold">const</span> <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> <span style="color:#080;font-style:italic">/*svc*/</span>, <span style="color:#a2f;font-weight:bold">const</span> <span style="color:#a2f;font-weight:bold">auto</span><span style="color:#666">&amp;</span> properties) {
+                    <span style="color:#0b0;font-weight:bold">long</span> svcId <span style="color:#666">=</span> properties<span style="color:#666">-</span><span style="color:#666">&gt;</span>getAsLong(celix<span style="color:#666">:</span><span style="color:#666">:</span>SERVICE_ID, <span style="color:#666">-</span><span style="color:#666">1</span>);
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Removing C command services with svc id </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> svcId <span style="color:#666">&lt;</span><span style="color:#666">&lt;</ [...]
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>lock_guard lock{mutex};
+                    <span style="color:#a2f;font-weight:bold">auto</span> it <span style="color:#666">=</span> cCommandServices.find(svcId);
+                    <span style="color:#a2f;font-weight:bold">if</span> (it <span style="color:#666">!</span><span style="color:#666">=</span> cCommandServices.end()) {
+                        cCommandServices.erase(it);
+                    }
+                    std<span style="color:#666">:</span><span style="color:#666">:</span>cout <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> <span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">Nr of C command services found: </span><span style="color:#b44">&#34;</span> <span style="color:#666">&lt;</span><span style="color:#666">&lt;</span> cxxCommandServices.size() <span style="color:#666">&lt;</span><span style="color: [...]
+                })
+                .build();
+    }
+
+    <span style="color:#666">~</span>TrackingCommandServicesExample() <span style="color:#a2f;font-weight:bold">noexcept</span> {
+        cxxCommandServiceTracker<span style="color:#666">-</span><span style="color:#666">&gt;</span>close();
+        cCommandServiceTracker<span style="color:#666">-</span><span style="color:#666">&gt;</span>close();
+    };
+<span style="color:#a2f;font-weight:bold">private</span><span style="color:#666">:</span>
+    std<span style="color:#666">:</span><span style="color:#666">:</span>mutex mutex; <span style="color:#080;font-style:italic">//protects cxxCommandServices and cCommandServices
+</span><span style="color:#080;font-style:italic"></span>    std<span style="color:#666">:</span><span style="color:#666">:</span>unordered_map<span style="color:#666">&lt;</span><span style="color:#0b0;font-weight:bold">long</span>, std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span><span style="color:#666 [...]
+    std<span style="color:#666">:</span><span style="color:#666">:</span>unordered_map<span style="color:#666">&lt;</span><span style="color:#0b0;font-weight:bold">long</span>, std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix_shell_command<span style="color:#666">&gt;</span><span style="color:#666">&gt;</span> cCommandServices{};
+
+    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>ServiceTracker<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>IShellCommand<span style="color:#666">&gt;</span><span style="color:#666">&gt;</span> cxxCommandServiceTracker{};
+    std<span style="color:#666">:</span><span style="color:#666">:</span>shared_ptr<span style="color:#666">&lt;</span>celix<span style="color:#666">:</span><span style="color:#666">:</span>ServiceTracker<span style="color:#666">&lt;</span>celix_shell_command<span style="color:#666">&gt;</span><span style="color:#666">&gt;</span> cCommandServiceTracker{};
+};
+
+CELIX_GEN_CXX_BUNDLE_ACTIVATOR(TrackingCommandServicesExample)
+</code></pre></div><h3 id="sequence-diagrams-for-service-tracker-and-service-registration">Sequence diagrams for service tracker and service registration</h3>
+<p><img src="diagrams/services_tracker_services_add_async_seq.png" alt="Register Service Async">
+<em>Service tracker callback with an asynchronized service registration</em></p>
+<hr>
+<p><img src="diagrams/services_tracker_services_rem_async_seq.png" alt="Register Service Async">
+<em>Service tracker callback with an asynchronized service un-registration</em></p>
+<hr>
+<p><img src="diagrams/services_tracker_services_add_seq.png" alt="Register Service Async">
+<em>Service tracker callback with a synchronized service registration</em></p>
+<hr>
+<p><img src="diagrams/services_tracker_services_rem_seq.png" alt="Register Service Async">
+<em>Service tracker callback with a synchronized service un-registration</em></p>
+<h1 id="the-celixquery-shell-command">The <code>celix::query</code> shell command</h1>
+<p>To interactively see the which service and service trackers are available the <code>celix::query</code> shell command
+can be used.</p>
+<p>Examples of supported <code>query</code> command lines are:</p>
+<ul>
+<li><code>celix::query</code> - Show an overview of registered services and active service trackers per bundle.</li>
+<li><code>query</code> - Same as <code>celix::query</code> (as long as there is no colliding other <code>query</code> commands).</li>
+<li><code>query -v</code> - Show a detailed overview of registered services and active service trackers per bundle.
+For registered services the services properties are also printed and for active service trackers the number
+of tracked services is also printed.</li>
+<li><code>query foo</code> - Show an overview of registered services and active service tracker where &ldquo;foo&rdquo; is
+(case-insensitive) part of the provided/tracked service name.</li>
+<li><code>query (service.id&gt;=10)</code> - Shown an overview of registered services which match the provided LDAP filter.</li>
+</ul>
+
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+<footer class="py-3 bg-secondary">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-8 text-center">
+                <p class="m-0 text-white">
+                    Copyright &copy; 2022 The Apache Software Foundation, Licensed under
+                    the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.
+                    <br>
+                    Apache Celix, Celix, Apache, the Apache feather logo and the Apache Celix logo are trademarks of The Apache Software Foundation.
+                </p>
+            </div>
+            <div class="col-md-4 text-center">
+                <a href="https://www.apache.org/events/current-event.html" target="_blank">
+                    <img src="https://www.apache.org/events/current-event-234x60.png" title="Apache Event" width="234" height="60" border="0">
+                </a>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+<script src="/assets/js/jquery.min.js"></script>
+<script src="/assets/js/bootstrap.bundle.min.js"></script>
+
+
+</body>
+</html>
diff --git a/content/docs/2.2.1/celix/documents/subprojects/README.html b/content/docs/2.3.0/celix/documents/subprojects.html
similarity index 77%
copy from content/docs/2.2.1/celix/documents/subprojects/README.html
copy to content/docs/2.3.0/celix/documents/subprojects.html
index e347ed2..7abde62 100644
--- a/content/docs/2.2.1/celix/documents/subprojects/README.html
+++ b/content/docs/2.3.0/celix/documents/subprojects.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,13 +137,13 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/subprojects/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/documents/subprojects.md" title="Edit this page on GitHub">Edit on GitHub</a>
                         
                     
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -148,23 +164,26 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 <h1 id="apache-celix---subprojects">Apache Celix - Subprojects</h1>
-<p>Apache Celix is organized into several subprojects. The following subproject are currently available:</p>
+<p>Apache Celix is organized into several subprojects. The following subproject are available:</p>
+<ul>
+<li><a href="../libs/framework">Framework</a> - The Apache Celix framework, an implementation of OSGi adapted to C and C++11.</li>
+<li><a href="../libs/utils/README.html">Utils</a> - The Celix utils library, containing a wide range of utils functions (string, file, C hashmap, C arraylist, etc)</li>
+<li><a href="../examples">Examples</a> - A Selection of examples showing how the framework can be used.</li>
+<li><a href="../bundles/logging/README.html">Log Service</a> - A Log Service logging abstraction for Apache Celix.
+<ul>
+<li><a href="../bundles/logging/log_writers/syslog_writer">Syslog Writer</a> - A syslog writer for use in combination with the Log Service.</li>
+</ul>
+</li>
+<li><a href="../bundles/shell/README.html">Shell</a> - A OSGi C and C++11 shell implementation.</li>
+<li><a href="../bundles/pubsub/README.html">Pubsub</a> - An implementation for a publish-subscribe remote message communication system.</li>
+<li><a href="../bundles/http_admin/README.html">HTTP Admin</a> - An implementation for the OSGi HTTP whiteboard adapted to C and based on civetweb.</li>
+<li><a href="../bundles/cxx_remote_services">Remote Services</a> - A C++17 adaption and implementation of the OSGi Remote Service Admin specification.</li>
+</ul>
+<p>Standalone libraries:</p>
 <ul>
-<li><a href="../../libs/framework">Framework</a> - The Apache Celix framework, an implementation of OSGi adapted to C.</li>
-<li><a href="../../libs/dependency_manager/README.html">C Dependency Manager</a> - A C component/dependency model for use through an API provided as library.</li>
-<li><a href="../../libs/dependency_manager_cxx/README.html">C++ Dependency Manager</a> - A C++ component/dependency model for use through an API provided as library.</li>
-<li><a href="../../bundles/device_access/README.html">Device Access</a> - An implementation of the OSGi Device Access specification adapted to C.</li>
-<li><a href="../../libs/etcdlib/README.html">Etcd library</a> - A C library that interfaces with ETCD.</li>
-<li><a href="../../examples">Examples</a> - A Selection of examples showing how the framework can be used.</li>
-<li><a href="../../bundles/log_service/README.html">Log Service</a> - An implementation of the OSGi Log Service adapted to C.</li>
-<li><a href="../../bundles/log_writer/README.html">Log Writer</a> - A simple log writer for use in combination with the Log Service.</li>
-<li><a href="../../bundles/remote_services/README.html">Remote Service Admin</a> - An implementation of the OSGi Remote Service Admin Service - for several protocols - adapted to C.</li>
-<li><a href="../../bundles/shell/shell/README.html">Shell</a> - A OSGi shell implementation.</li>
-<li><a href="../../bundles/shell/shell_tui/README.html">Shell TUI</a> - A textual UI for the Celix Shell.</li>
-<li><a href="../../bundles/shell/remote_shell/README.html">Remote Shell</a> - A remote (telnet) frontend for the Celix shell.</li>
-<li><a href="../../bundles/shell/shell_bonjour">Bonjour Shell</a> - A remote (Bonjour / mDNS) frontend for the Celix shell.</li>
-<li><a href="../../bundles/deployment_admin/README.html">Deployment Admin</a> - A deployment admin implementation.</li>
-<li><a href="../../bundles/pubsub/README.html">Pubsub</a> - An implementation for a publish-subscribe remote services system, that use dfi library for message serialization.</li>
+<li><a href="../libs/etcdlib/README.html">Etcd library</a> - A C library that interfaces with ETCD.</li>
+<li><a href="../libs/promises/README.html">Promises library</a> - A C++17 header only adaption and implementation of the OSGi Promise specification.</li>
+<li><a href="../libs/pushstreams/README.html">Push Streams Library</a> - A C++17 header adaption and only implementation of the OSGi Push Stream specification.</li>
 </ul>
 
 
diff --git a/content/docs/2.2.1/celix/examples/celix-examples/http_example/README.html b/content/docs/2.3.0/celix/examples/celix-examples/http_example/README.html
similarity index 95%
copy from content/docs/2.2.1/celix/examples/celix-examples/http_example/README.html
copy to content/docs/2.3.0/celix/examples/celix-examples/http_example/README.html
index 3c1d611..6ec06bf 100644
--- a/content/docs/2.2.1/celix/examples/celix-examples/http_example/README.html
+++ b/content/docs/2.3.0/celix/examples/celix-examples/http_example/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
diff --git a/content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html b/content/docs/2.3.0/celix/examples/celix-examples/services_example_c/README.html
similarity index 93%
copy from content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html
copy to content/docs/2.3.0/celix/examples/celix-examples/services_example_c/README.html
index 85aeca0..895c466 100644
--- a/content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html
+++ b/content/docs/2.3.0/celix/examples/celix-examples/services_example_c/README.html
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -127,7 +143,7 @@
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -150,8 +166,8 @@ limitations under the License.
 <h1 id="intro">Intro</h1>
 <p>These examples shows howto create and interact with services by example.</p>
 <p>In both examples there is a provider and consumer bundle.
-The provider bundle creates services and registers them to the Celix framework so that these services are available for use (provide).
-And the consumer bundle request the services from the Celix framework and uses (consumes) them.</p>
+The provider bundle creates services and registers them to the Celix framework so that these services are available for use.
+And the consumer bundle request the services from the Celix framework and uses them.</p>
 <p>The examples use the <code>celix_bundleContext_registerService</code> to provide
 services and uses a combination of <code>celix_bundleContext_useService</code>,
 <code>celix_bundleContext_useServices</code> and <code>celix_bundleContext_trackServices</code>
@@ -170,8 +186,8 @@ and can be used to:</p>
 <h1 id="simple-service-provider--consumer-example">Simple Service Provider &amp; Consumer Example</h1>
 <p>The simple provider/consumer example can be executed by launching the
 <code>services_example_c</code> executable target
-(build in <code>${CMAKE_BUILD_DIR}/deploy/services_example/services_example_c</code>)</p>
-<p>In this example the provider bundle only register one calc service. And
+(build in the directory <code>${CMAKE_BUILD_DIR}/deploy/c_examples/services_example_c</code>)</p>
+<p>In this example the provider bundle only registers 1 calc service. And
 the consumer bundle tries to use this during startup and registered
 a service tracker for the calc service.</p>
 <pre><code class="language-ditaa" data-lang="ditaa">+----------------------+                  +------------------------+
@@ -189,7 +205,7 @@ I.e. type <code>stop 3</code>, <code>stop 4</code>, <code>start 3</code>, <code>
 <h1 id="dynamic-service-provider--consumer-example">Dynamic Service Provider &amp; Consumer Example</h1>
 <p>The dynamic provider/consumer example can be executed by launching the
 <code>dynamic_services_example_c</code> executable target
-(build in <code>${CMAKE_BUILD_DIR}/deploy/services_example/dynamic_services_example_c</code>)</p>
+(build in <code>${CMAKE_BUILD_DIR}/deploy/c_examples/dynamic_services_example_c</code>)</p>
 <p>The dynamic service provide / consumer example show how the framework copes
 with the dynamic behaviour of services.</p>
 <p>This this example the provided dynamically register more and less calc services in a thread.
diff --git a/content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html b/content/docs/2.3.0/celix/examples/celix-examples/services_example_cxx/README.html
similarity index 82%
copy from content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html
copy to content/docs/2.3.0/celix/examples/celix-examples/services_example_cxx/README.html
index 85aeca0..8c31f7f 100644
--- a/content/docs/2.2.1/celix/examples/celix-examples/services_example_c/README.html
+++ b/content/docs/2.3.0/celix/examples/celix-examples/services_example_cxx/README.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>Services example C / Apache Celix</title>
+    <title>Services Example C&#43;&#43; / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,13 +137,11 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/examples/celix-examples/services_example_c/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
-                        
                     
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0&#43;&#43;/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -148,52 +162,48 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 <h1 id="intro">Intro</h1>
-<p>These examples shows howto create and interact with services by example.</p>
+<p>These examples show howto create and interact with services by example.</p>
 <p>In both examples there is a provider and consumer bundle.
-The provider bundle creates services and registers them to the Celix framework so that these services are available for use (provide).
-And the consumer bundle request the services from the Celix framework and uses (consumes) them.</p>
-<p>The examples use the <code>celix_bundleContext_registerService</code> to provide
-services and uses a combination of <code>celix_bundleContext_useService</code>,
-<code>celix_bundleContext_useServices</code> and <code>celix_bundleContext_trackServices</code>
-to consume services.</p>
+The provider bundle creates services and registers them to the Celix framework so that these services are available for use.
+And the consumer bundle request the services from the Celix framework and uses them.</p>
+<p>The examples use the <code>celix::BundleContext::registerService</code> to provide
+services and uses a <code>celix::BundleContext::trackServices</code> to consume services.</p>
 <p>The bundle context is the proxy to the Celix framework for a bundle
 and can be used to:</p>
 <ul>
 <li>Register services</li>
-<li>Register service factories</li>
 <li>Use services</li>
 <li>Track services</li>
 <li>Track bundles</li>
 <li>Track service trackers</li>
 </ul>
-<p>See the <code>bundle_context.h</code> for documentation about these - and other -functions</p>
+<p>See the <code>celix/BundleContext.h</code> for documentation about these - and other -functions</p>
 <h1 id="simple-service-provider--consumer-example">Simple Service Provider &amp; Consumer Example</h1>
 <p>The simple provider/consumer example can be executed by launching the
-<code>services_example_c</code> executable target
-(build in <code>${CMAKE_BUILD_DIR}/deploy/services_example/services_example_c</code>)</p>
+<code>SimpleServicesExample</code> executable target
+(build in <code>${CMAKE_BUILD_DIR}/deploy/cxx_examples/SimpleServicesExample</code>)</p>
 <p>In this example the provider bundle only register one calc service. And
-the consumer bundle tries to use this during startup and registered
-a service tracker for the calc service.</p>
+the consumer bundle uses this service with use of a service tracker.</p>
 <pre><code class="language-ditaa" data-lang="ditaa">+----------------------+                  +------------------------+
 |                      |                  |                        |
 |                      |                  |                        |
-|   provider_example   |   example_calc   |    consumer_example    |
+|   SimpleProvider     | examples::ICalc  |    SimpleConsumer      |
 |                      +--------O)--------+                        |
 |       &lt;bundle&gt;       |                  |       &lt;bundle&gt;         |
 |                      |                  |                        |
 |                      |                  |                        |
 +----------------------+                  +------------------------+
-</code></pre><p>Try stopping/starting the provider/consumer bundles (respectively bundle id 3 &amp; 4) using the interactive shell
+</code></pre><p>The effect of this can be examed by stopping and starting the provider/consumer bundles (respectively bundle id 3 &amp; 4) using the interactive shell
 to see how this works at runtime.
 I.e. type <code>stop 3</code>, <code>stop 4</code>, <code>start 3</code>, <code>start 4</code> in different combinations.</p>
 <h1 id="dynamic-service-provider--consumer-example">Dynamic Service Provider &amp; Consumer Example</h1>
 <p>The dynamic provider/consumer example can be executed by launching the
-<code>dynamic_services_example_c</code> executable target
-(build in <code>${CMAKE_BUILD_DIR}/deploy/services_example/dynamic_services_example_c</code>)</p>
-<p>The dynamic service provide / consumer example show how the framework copes
-with the dynamic behaviour of services.</p>
-<p>This this example the provided dynamically register more and less calc services in a thread.
-The consumer bundle uses these services in a every 5 seconds and print some info.</p>
+<code>DynamicServicesExample</code> executable target
+(build in <code>${CMAKE_BUILD_DIR}/deploy/cxx_examples/DynamicServicesExample</code>)</p>
+<p>The dynamic service provide / consumer example show howto handle the dynamic behavior
+of services.</p>
+<p>In this example the provider dynamically register more and less ICalc services in a thread.
+The consumer create and destroy consumer for the ICalc services.</p>
 <p>This example should give an idea how services can be safely used and tracked in a dynamic environment.</p>
 
 
diff --git a/content/docs/2.2.1/celix/bundles/http_admin/README.html b/content/docs/2.3.0/celix/examples/conan_test_package/README.html
similarity index 71%
copy from content/docs/2.2.1/celix/bundles/http_admin/README.html
copy to content/docs/2.3.0/celix/examples/conan_test_package/README.html
index 08ffa0c..a2d4854 100644
--- a/content/docs/2.2.1/celix/bundles/http_admin/README.html
+++ b/content/docs/2.3.0/celix/examples/conan_test_package/README.html
@@ -7,7 +7,7 @@
     <meta name="description" content="">
     <meta name="author" content="">
 
-    <title>HTTP Admin / Apache Celix</title>
+    <title>Conan Test Package / Apache Celix</title>
 
     
     <link rel="icon" href="/assets/img/favicon.ico">
@@ -18,6 +18,21 @@
     
     <link href="/assets/css/style.css" rel="stylesheet">
 
+    <style>
+         
+         
+        .card-body img {
+            max-width: 100%;
+            width: 100%;
+            height: auto;
+        }
+
+         
+        .card-body img + em {
+            text-decoration: underline;
+        }
+    </style>
+
     
 <script>
   var _paq = window._paq = window._paq || [];
@@ -65,7 +80,8 @@
                         Docs
                     </a>
                     <div class="dropdown-menu" aria-labelledby="ddDocs">
-                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.3.0/docs.html">2.3.0 (latest)</a>
+                        <a class="dropdown-item" href="/docs/2.2.1/docs.html">2.2.1</a>
                         <a class="dropdown-item" href="/docs/2.1.0/docs.html">2.1.0</a>
                     </div>
                 </li>
@@ -121,13 +137,13 @@
                     
                         
                         
-                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/bundles/http_admin/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
+                            <a class="edit-on-gh" href="https://github.com/apache/celix/edit/master/examples/conan_test_package/README.md" title="Edit this page on GitHub">Edit on GitHub</a>
                         
                     
 
                     
                         
-                        <a href="/docs/2.2.1/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
+                        <a href="/docs/2.3.0/docs.html" title="back to documentation">&lt;&lt; back to documentation</a>
                     
 
                     
@@ -138,7 +154,7 @@ this work for additional information regarding copyright ownership.
 The ASF licenses this file to You 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
@@ -147,31 +163,27 @@ 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.
 -->
-<h2 id="http-admin">HTTP Admin</h2>
-<p>The HTTP admin provides a service tracker and starts a HTTP web server. The civetweb web server is used as an embedded
-web server. Websockets are supported by the HTTP admin.</p>
-<p>Services can register and implement HTTP requests or websocket support for a specified URI.
-The supported HTTP requests are: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS and PATCH.
-The websocket service can support different callback handlers: connect, ready, data and close.</p>
-<p>Aliasing is also supported for both HTTP services and websocket services. Multiple aliases can be added by using the comma as seperator.
-Adding aliasing is done by adding the following function to the target CMakeFile (fill in <Alias path> and <Path to destination>):</p>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">celix_bundle_headers</span>(<span style="color:#b44">&lt;TARGET&gt;</span>
-        <span style="color:#b44">&#34;X-Web-Resource: /&lt;Alias path&gt;$&lt;SEMICOLON&gt;/&lt;Path to destination&gt;, /&lt;Alias path 2&gt;$&lt;SEMICOLON&gt;/&lt;Path to destination&gt;&#34;</span>
-)<span style="">
-</span></code></pre></div><p>Bundle alias resources can be added by the with the following function in the bundle CMakefile:</p>
-<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-CMake" data-lang="CMake"><span style="color:#a2f">celix_bundle_add_dir</span>(<span style="color:#b44">&lt;TARGET&gt;</span> <span style="color:#b44">&lt;Document</span> <span style="color:#b44">root</span> <span style="color:#b44">of</span> <span style="color:#b44">bundle&gt;</span> <span style="color:#b44">DESTINATION</span> <span style="color:#b44">&#34;.&#34;</s [...]
-</span></code></pre></div><h3 id="celix-supported-configproperties">Celix supported config.properties</h3>
-<pre><code>CELIX_HTTP_ADMIN_LISTENING_PORTS                 default = 8080, can be multiple ports divided by a comma
-CELIX_HTTP_ADMIN_PORT_RANGE_MIN                  default = 8000
-CELIX_HTTP_ADMIN_PORT_RANGE_MAX                  default = 9000
-CELIX_HTTP_ADMIN_USE_WEBSOCKETS                  default = true
-CELIX_HTTP_ADMIN_WEBSOCKET_TIMEOUT_MS            default = 3600000
-CELIX_HTTP_ADMIN_NUM_THREADS                     default = 1
-</code></pre>
-<h2 id="cmake-option">CMake option</h2>
-<pre><code>BUILD_HTTP_ADMIN=ON
-</code></pre>
-
+<h1 id="conan-test-package">Conan Test Package</h1>
+<blockquote>
+<p>To learn API usage, we refer our users to <code>celix-examples</code> and various tests. The C/C++ source codes in this folder are NOT worth reading.</p>
+</blockquote>
+<p>This example is actually a classical Conan <code>test_package</code>, which is quite different from traditional tests. Its main purpose is to verify that
+a Celix package is properly installed in the local Conan cache. To this end, it needs to make sure that:</p>
+<ul>
+<li>Celix CMake commands are usable.</li>
+<li>Public headers can be included.</li>
+<li>Libraries are linkable.</li>
+<li>Bundles are accessible to commands such as <code>add_celix_container</code>.</li>
+</ul>
+<p>To create a Celix package in the local cache with C++ support and verify that it&rsquo;s properly installed, run the following command in the Celix root directory:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-BASH" data-lang="BASH">conan create . celix/2.2.3@zhengpeng/testing -tf examples/conan_test_package/ -o celix:celix_cxx<span style="color:#666">=</span>True
+</code></pre></div><p>To verify a Celix package with C++ support is properly installed in the local cache, run the following command in the Celix root directory:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-BASH" data-lang="BASH">conan <span style="color:#a2f">test</span> examples/conan_test_package/ celix/2.2.3@zhengpeng/testing  -o celix:celix_cxx<span style="color:#666">=</span>True
+</code></pre></div><p>Though it might not be wise to spend time reading C/C++ codes in this folder, it&rsquo;s instructive to have a look at <code>conanfile.py</code> and <code>CMakeLists.txt</code>,
+which illustrates a non-intrusive way of using Conan with CMake build system. Pay attention to our use of <code>cmake_paths</code> <code>cmake_find_package</code> generators
+and the following line:</p>
+<div class="highlight"><pre style="background-color:#f8f8f8;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-python" data-lang="python">    cmake<span style="color:#666">.</span>definitions[<span style="color:#b44"></span><span style="color:#b44">&#34;</span><span style="color:#b44">CMAKE_PROJECT_test_package_INCLUDE</span><span style="color:#b44">&#34;</span>] <span style="color:#666">=</span> os<span style="color:#666">.</span>path<span style="color:#666">.</span>join(se [...]
+</code></pre></div>
 
                 </div>
             </div>
diff --git a/content/docs/2.2.1/celix/libs/etcdlib/README.html b/content/docs/2.3.0/celix/libs/etcdlib/README.html
similarity index 96%
copy from content/docs/2.2.1/celix/libs/etcdlib/README.html
copy to content/docs/2.3.0/celix/libs/etcdlib/README.html
index d47d5e9..6a879fe 100644
--- a/content/docs/2.2.1/celix/libs/etcdlib/README.html
+++ b/content/docs/2.3.0/celix/libs/etcdlib/README.html
@@ -18,6 +18,21 @@
... 3031 lines suppressed ...