diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 20f28f1d47a7888b6d5bd43ca4fed20b2f6aa8a1..3ceeef28274b9430333078d952fe8a1c7b935223 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,7 +6,7 @@ pages:
     PAGES_BRANCH: gl-pages
     HTTPS_REMOTE: https://gitlab-ci-token:${ACCESS_TOKEN}@${CI_SERVER_HOST}/rep/${CI_PROJECT_PATH}.git
   before_script:
-    - pip install -q mkdocs-material mike
+    - pip install -q mkdocs-material mike mkdocs-glightbox
     - apt-get update -qq && apt-get -qq install -y git > /dev/null
     - git config --global --replace-all user.name $GITLAB_USER_NAME
     - git config --global --replace-all user.email $GITLAB_USER_EMAIL
diff --git a/doc/alarms_actions.md b/doc/alarms_actions.md
index b7715494e2c504668c69d5a690197346fdb7be4b..96c40be97531fbb112c91ef48f321427cceda4ef 100644
--- a/doc/alarms_actions.md
+++ b/doc/alarms_actions.md
@@ -18,7 +18,7 @@ Alarms can be automatically resolved by specific actions. Today only the followi
 
 Usually used to perform a Day2 configuration (towards OSM). To use it, Create a New Action Specification Name=execDay2 as following
 
-[![Openslice  usage](./images/alarms_actions/day2actionspec.png)](./images/alarms_actions/day2actionspec.png)
+![Openslice  usage](./images/alarms_actions/day2actionspec.png)
 
 
 Now make a Service Order for your service. In this example ςε used a cirros NSD
@@ -26,7 +26,7 @@ Now make a Service Order for your service. In this example ςε used a cirros NS
 Create a  New Action Rule for the running services as the following example:
 
 
-[![Openslice  usage](./images/alarms_actions/action_rule_exampleday2.png)](./images/alarms_actions/action_rule_exampleday2.png)
+![Openslice  usage](./images/alarms_actions/action_rule_exampleday2.png)
 
 The scope is the running cirros service. 
 
diff --git a/doc/architecture/architecture.md b/doc/architecture/architecture.md
index 760485600b46529cca9d793b3ea0d6c80f8cadb0..3847dfdbb9c40df35dac7aa1e92bf28c593749db 100644
--- a/doc/architecture/architecture.md
+++ b/doc/architecture/architecture.md
@@ -11,7 +11,7 @@
 * Service Inventory: The Customer and Provider will be able to view deployed Services status -->
 
 
-[![OpenSlice  architecture](./images/architecture.png)](./images/architecture.png)
+![OpenSlice  architecture](./images/architecture.png)
 
 
 OpenSlice consists of:
@@ -38,7 +38,7 @@ OpenSlice consists of:
 ## Microservices Deployment
 The following figure depicts how OpenSlice microservices are deployed
 
-[![OpenSlice microservices network deployment](./images/microservices_network_deployment.png)](./images/microservices_network_deployment.png)
+![OpenSlice microservices network deployment](./images/microservices_network_deployment.png)
 
 
 
@@ -52,9 +52,9 @@ A typical deployment across domains, involves some typical components:
 
 TMF Open APIs are introduced not only for exposing catalogues and accepting service orders, but also implementing the East-West interfaces between the domains, fulfilling also the [LSO requirements](https://wiki.mef.net/pages/viewpage.action?pageId=56165271) as introduced by MEF.
 
-The following figure shows how openslice could be used in such scenarios:
+The following figure shows how OpenSlice could be used in such scenarios:
 
-[![Openslice  multi-domain-architecture](../getting_started/configuration/images/multi-domain-architecture.png)](../getting_started/configuration/images/multi-domain-architecture.png)
+![Openslice  multi-domain-architecture](../getting_started/configuration/images/multi-domain-architecture.png)
 
 
-See more [Consuming Services From External Partner Organizations](../getting_started/configuration/consuming_services_from_external_partners.md).
\ No newline at end of file
+See more at [Consuming Services From External Partner Organizations](../getting_started/configuration/consuming_services_from_external_partners.md).
\ No newline at end of file
diff --git a/doc/architecture/cridge/cridge_introduction.md b/doc/architecture/cridge/cridge_introduction.md
index 70f45ef39ceadbf66d794f258f35cf1873b8541b..2866d16627516a24bca32c92b948bfb5dec46c29 100644
--- a/doc/architecture/cridge/cridge_introduction.md
+++ b/doc/architecture/cridge/cridge_introduction.md
@@ -41,7 +41,7 @@ Pros, in a nutshell:
  
 The following image illustrates the approach.
 
-[![img01.png](img01.png)]()
+![img01.png](img01.png)
 
 1. A CRD in a cluster will be mapped in TMF model as a Resource specification and therefore can be exposed as a service specification in a catalog
 2. Service Orders can be created for this service specification. The OSL Orchestrator (OSOM) will manage the lifecycle of the Service Order.
@@ -52,7 +52,7 @@ The following image illustrates the approach.
 
 
 
-[![img02.png](img02.png)]()
+![img02.png](img02.png)
 
 
 
@@ -100,7 +100,7 @@ In a nutchell:
 A CRIDGE service is usually responsible for managing one cluster. In the following diagram we show how it can be used for managing multiple clusters:
 
 
-[![img03.png](img03.png)]()
+![img03.png](img03.png)
     	
 We assume that there is an OSL Management cluster that OSL is installed. CRIDGE is also installed there if we would like to manage resources in the same management cluster. 
 
@@ -119,7 +119,7 @@ We assume that there is an OSL Management cluster that OSL is installed. CRIDGE
 The implemented synchronization process is explained by the following diagram:
 
 
-[![img04.png](img04.png)]()
+![img04.png](img04.png)
 
  WatcherService is executed when the CRIDGE service application starts (see onApplicationEvent). Specifically:
  	
@@ -210,7 +210,7 @@ OSOM sends to CRIDGE a message with the following information:
 The implemented process to deploy a CR is explained by the following diagram:
 
 
-[![img05.png](img05.png)]()
+![img05.png](img05.png)
 
 - A message arrives to deploy a CR
 	- The call examines if this CRIDGE service can handle the request (based on context and masterURL)
diff --git a/doc/architecture/issuemgt.md b/doc/architecture/issuemgt.md
index b50f5459a186f1eff82bebcb5e805c0752d6dde8..c5ca920726903c7a409c357daa1cce3ab0a9844c 100644
--- a/doc/architecture/issuemgt.md
+++ b/doc/architecture/issuemgt.md
@@ -4,4 +4,4 @@ For issue management support, Openslice relies on Bugzilla. Bugzilla is a ticket
 
 The figure below displays the overall issue management service architecture integrating Bugzilla as its core and how this tool interacts with other Openslice services presenting some distinctive scenarios. It should be noted that Bugzilla tickets will not only be used for bugs/errors, but also for general requests, e.g. Service Order procedure.
 
-[![Issue management system](../images/issue_management.png)](../images/issue_management.png)
\ No newline at end of file
+![Issue management system](../images/issue_management.png)
\ No newline at end of file
diff --git a/doc/architecture/osom.md b/doc/architecture/osom.md
index 173aa8017d603bb3854eb6b4c0e9baa905e512f6..0e29dfd91cfa66457b3694b8dbb8e883225e53bf 100644
--- a/doc/architecture/osom.md
+++ b/doc/architecture/osom.md
@@ -9,14 +9,14 @@ It uses open source Flowable Business process engine (https://www.flowable.org)
 
 A Service Order follows the states as defined in TMF641 specification: 
 
-[![Service Order state](../images/service_order_states.png)](../images/service_order_states.png)
+![Service Order state](../images/service_order_states.png)
 
 
 ## Initial state
 
 When a new order is created, it goes into the Initial state. It is stored in the repository and triggers an Event.
 
-[![Initial state](../images/service_order_initial_state.png)](../images/service_order_initial_state.png)
+![Initial state](../images/service_order_initial_state.png)
 
 Administrators are notified usually from the Ticketing System of a new order. They login to Openslice and change the State of the order either to ACKNOWLEDGED or REJECTED. If ACKNOWLEDGED they can Propose a startDate, add Notes, and add any additional service items
 
@@ -24,9 +24,9 @@ Administrators are notified usually from the Ticketing System of a new order. Th
 
 A process checks every 1 minute for ACKNOWLEDGED orders.
 
-[![Order scheduler BPM](../images/order_scheduler_bpm.png)](../images/order_scheduler_bpm.png)
+![Order scheduler BPM](../images/order_scheduler_bpm.png)
 
-[![Order scheduler](../images/order_scheduler_diagram.png)](../images/order_scheduler_diagram.png)
+![Order scheduler](../images/order_scheduler_diagram.png)
 
 It retrieves all orders that are in ACKNOWLEDGED state and if the start date is in time it will initialize the process by settingn the order in IN_PROGRESS state. Finally the Start Order Process will start.
 
@@ -35,9 +35,9 @@ It retrieves all orders that are in ACKNOWLEDGED state and if the start date is
 
 This process for now is a draft simple prototype to make a simple orchestration via NFVO. Here the actual Services (TMF638/640 model) are created and attached to Service Order and Service Inventory.
 
-[![Start Order BPM](../images/start_order_process_bpm.png)](../images/start_order_process_bpm.png)
+![Start Order BPM](../images/start_order_process_bpm.png)
 
-[![Start Order interactions](../images/start_order_process_diagram.png)](../images/start_order_process_diagram.png)
+![Start Order interactions](../images/start_order_process_diagram.png)
 
 We expect here to check which tasks can be orchestrated by NFVO and which by human. We create the equivalent Services(TMF638/640 model) for this order.
 
@@ -86,14 +86,14 @@ All services in "Order Complete" are in a status:
   
 A Service follows the states as defined in TMF638 Service Inventory specification: 
 
-[![Service state](../images/service_states.png)](../images/service_states.png)
+![Service state](../images/service_states.png)
   
 
 
 ## NFVODeploymentRequest process
 
  
-[![NFVODeploymentRequest BPM](../images/NFVODeploymentReq_process.png)](../images/NFVODeploymentReq_process.png)
+![NFVODeploymentRequest BPM](../images/NFVODeploymentReq_process.png)
 
 This process is related with the NFVO orchestration
 It will send a msg to NFVO(s?) for a specific deployment request
@@ -105,12 +105,12 @@ Then it checks the deployment status. It will wait 30 secs each time until the d
 
 Every 1 minute the "Check In Progress Orders" process is executed checking if a supported Service changed state (i.e. to ACTIVE) then the whole Order will change state (e.g. go to COMPLETED)
 
-[![Check In Progress BPM](../images/check_inProgress_orders.png)](../images/check_inProgress_orders.png)
+![Check In Progress BPM](../images/check_inProgress_orders.png)
   
   
 ## External Service Provider Deployment Request process
   
-[![External Service Provider Deployment Request process BPM](../images/externalSPDeploymentReq.png)](../images/externalSPDeploymentReq.png)
+![External Service Provider Deployment Request process BPM](../images/externalSPDeploymentReq.png)
 
 This process contains tasks for submitting order requests to external partners.
 - Submit Order To External Service Provider Task: This task creates automatically a Service Order request to a 3rd party provider SO that hosts the Service Specification
@@ -120,7 +120,7 @@ This process contains tasks for submitting order requests to external partners.
 ## Fetch Partner Services Process
 
 
-[![Fetch Partner Services Process BPM](../images/fetchPartnerServices.png)](../images/fetchPartnerServices.png)
+![Fetch Partner Services Process BPM](../images/fetchPartnerServices.png)
 
 Every 2 minutes the "fetchPartnerServicesProcess" process is executed checking remote Partner Organizations for changes in the published catalogues.
 The Fetch and Update External Partner Services Task is executed in paralle l for each Partner Organization 
@@ -129,7 +129,7 @@ The Fetch and Update External Partner Services Task is executed in paralle l for
 ## Local Service Orchestration Process
 
 
-[![Local Service Orchestration Process BPM](../images/LocalServiceOrchestrationProcess.png)](../images/LocalServiceOrchestrationProcess.png)
+![Local Service Orchestration Process BPM](../images/LocalServiceOrchestrationProcess.png)
 
 This process handles automatically services that need to be further orchestrated or processed by OSOM. For example, for a CFS Bundled service we create such automated service instances that just aggregate the underlying services. 
 
diff --git a/doc/contributing/documenting.md b/doc/contributing/documenting.md
index 0645b612207273a0b187217ef5a072ed9770419c..592de275d8ea58c752214889cf8e91bc225ec0cb 100644
--- a/doc/contributing/documenting.md
+++ b/doc/contributing/documenting.md
@@ -36,13 +36,32 @@ git checkout develop
 
 3) Setup a local mkdocs server, using a virtual environment
 
-```bash
-python3 -m venv venv
-source venv/bin/activate
-python -m pip install mkdocs
-python -m pip install mkdocs-material
-python -m pip install mike
-```
+=== "Linux + macOS"
+
+    ``` bash
+    python3 -m venv venv
+    source venv/bin/activate
+    ```
+    ``` bash
+    python -m pip install mkdocs
+    python -m pip install mkdocs-material
+    python -m pip install mike
+    python -m pip install mkdocs-glightbox
+    ```
+
+=== "Windows"
+
+    ``` bash
+    python -m venv venv
+    venv\Scripts\activate
+    ```
+    ``` bash
+    python -m pip install mkdocs
+    python -m pip install mkdocs-material
+    python -m pip install mike
+    python -m pip install mkdocs-glightbox
+    ```
+
 
 4) Wait for all downloads to finish and start the mkdocs server
 
diff --git a/doc/getting_started/configuration/consuming_services_from_external_partners.md b/doc/getting_started/configuration/consuming_services_from_external_partners.md
index faa2efe62ead4904e6112b542a55380d895ddb9d..128d1a26935c155e8a05351b53376d77bfb2ffbd 100644
--- a/doc/getting_started/configuration/consuming_services_from_external_partners.md
+++ b/doc/getting_started/configuration/consuming_services_from_external_partners.md
@@ -6,7 +6,7 @@ TMF Open APIs are introduced not only for exposing catalogues and accepting serv
 
 The following figure shows how openslice could be used in such scenarios:
 
-[![Openslice  multi-domain-architecture](./images/multi-domain-architecture.png)](./images/multi-domain-architecture.png)
+![Openslice  multi-domain-architecture](./images/multi-domain-architecture.png)
 
 
 In Openslice we can consume services from 3rd parties via Open APIs.
diff --git a/doc/history.md b/doc/history.md
index ed19a7f92178dbc0db138d2344d8bddee0e19579..15edae0be2c1a53a0288dda12e081fcb568391bf 100644
--- a/doc/history.md
+++ b/doc/history.md
@@ -9,7 +9,7 @@
 
 ## Citation
 
-Please cite our [![paper]](https://arxiv.org/abs/2102.03290) if you use OpenSlice in your research
+Please cite our [paper](https://arxiv.org/abs/2102.03290) if you use OpenSlice in your research
 
 ```
 @misc{tranoris2021openslice,
diff --git a/doc/index.md b/doc/index.md
index 46d6023f0273454e92375e5536f3f9fd6c80723c..a8a7e6c70378fdc432f858c779b100f2a9427e03 100644
--- a/doc/index.md
+++ b/doc/index.md
@@ -12,7 +12,7 @@ The ETSI Software Development Group for OpenSlice (SDG OSL) is developing an ope
 
 OpenSlice can be used in managing 5G network services from the user device to the core network and cloud as well as for Orchestrating cloud resources across private and public clouds for enterprise applications.  OpenSlice is capable of supporting most of the features of an end-to-end (E2E) service orchestration framework while many of them will be more mature in future releases. The following figure displays the general usage of OpenSlice. 
 
-[![OpenSlice  usage](./images/global_approach.png)](./images/global_approach.png)
+![OpenSlice  usage](./images/global_approach.png)
 
 The image illustrates how OpenSlice supports the idea of an E2E network service orchestration framework by integrating multiple network components and layers, from user devices at the edge to radio, transport networks, core and public cloud services, ensuring seamless, secure, and efficient delivery of network services. Assuming that there are domain controllers for all the above domains OpenSlice can create the end-to-end service via the domain controllers by following the process of creating and deploying the end-to-end service by implementing transformations, and consuming APIs from various network entities.
 OpenSlice, in a nutchell, offers user interfaces where users can interact with the framework to order, expose, and manage service catalogs, services and resources that can be ordered, following business logic and policies and exposed through the APIs. 
diff --git a/doc/naas/gst_to_tmf.md b/doc/naas/gst_to_tmf.md
index e1797c9ae353c4fe8c5fe41be560b03dfbe2a47e..6def11a82622e8661323e6e8e5032c17c5f573d2 100644
--- a/doc/naas/gst_to_tmf.md
+++ b/doc/naas/gst_to_tmf.md
@@ -11,7 +11,7 @@ In OpenSlice we made an effort and translated the GST to a Service Specification
 
 The image illustrates the relationship between the GSMA Generic Slice Template (GST), TM Forum Service Specification, and how they are utilized within OpenSlice to offer network services.
 
-[![gst_to_gsma](./gst_to_gsma/img01.png)](./gst_to_gsma/img01.png)
+![gst_to_gsma](./gst_to_gsma/img01.png)
 
 The GST to TM Forum via OpenSlice:
 
diff --git a/doc/naas/lcm_intro.md b/doc/naas/lcm_intro.md
index 079bc3196d94883f173c782b43fd57c3107e851a..77e844ac77a4c652e8d6cb71833fc293d88ddf96 100644
--- a/doc/naas/lcm_intro.md
+++ b/doc/naas/lcm_intro.md
@@ -8,7 +8,7 @@ Lifecycle Management: The orchestration framework handles the activation, termin
 In OpenSlice the Lifecycle of a service follows in general the concept of Network Slice lifecycle as defined by 3GPP.
 
 
-[![lcm](./lcm/img01.png)](./lcm/img01.png)
+![lcm](./lcm/img01.png)
 
 ## Introduction in OpenSlice LCM
 
diff --git a/doc/naas/lcm_rules_intro.md b/doc/naas/lcm_rules_intro.md
index d8d73e1195d7c8a2fe5898e891314dc13484dc03..5341327616f9230987d4da4819fd6fb00944b43c 100644
--- a/doc/naas/lcm_rules_intro.md
+++ b/doc/naas/lcm_rules_intro.md
@@ -10,7 +10,7 @@ So in the system there are already predefined recipes, which in each process-ste
 
 How is it possible to intervene in the workflow process and inject some user defined actions? The next image illustrates the idea
 
-[![lcm](./lcm/img02.png)](./lcm/img02.png)
+![lcm](./lcm/img02.png)
 
 ## How is it possible to intervene in the workflow process and affect it?
 
@@ -25,7 +25,7 @@ LCM Rules are used for defining complex conditions and actions during the lifecy
 The following figure displays the different phases that the rules are performed, during the lifecycle of a Network Service Instance. 
 
 
-[![lcm](./lcm/img03.png)](./lcm/img03.png)
+![lcm](./lcm/img03.png)
 
 
 * PRE_PROVISION rules: Run only once just before creating a service with a given priority. 
diff --git a/doc/naas/service_catalog.md b/doc/naas/service_catalog.md
index 142c00b43c0503ff5d28f49b5e2082a3dc66c04b..56a4694d88eb06d54e87fa29fdd5c7e5ee93d422 100644
--- a/doc/naas/service_catalog.md
+++ b/doc/naas/service_catalog.md
@@ -16,7 +16,7 @@ The UI is built around Service Catalogs and Categories exposed in the Service Ma
 
 In the menu the administrator can manage the Service Catalogs and Categories.
 
-[![img01](./service_catalog/img01.png)](./service_catalog/img01.png)
+![img01](./service_catalog/img01.png)
 
 
 ## API exposed
diff --git a/doc/naas/so_intro.md b/doc/naas/so_intro.md
index 3eac698bcb773bfce9a2e6e7f7bacc26a2e471d6..95c2aa7f68dbb1c4f86d98162d2211f8d152a4e2 100644
--- a/doc/naas/so_intro.md
+++ b/doc/naas/so_intro.md
@@ -9,7 +9,7 @@ OpenSlice end-to-end (E2E) service orchestration framework is designed to manage
 
 As next image depicts, service orchestrators follow some predefined workflows. OpenSlice end-to-end (E2E) service orchestrator follows some predefined workflows to manage a service lifecycle (They are described in BPMN language and included in our orchestration engine).
 
-[![SO](./so/img01.png)](./so/img01.png)
+![SO](./so/img01.png)
 
 This section provides a high level overview of the Service Orchestration process.
 
diff --git a/doc/naas/so_servicespec_to_services_nfv.md b/doc/naas/so_servicespec_to_services_nfv.md
index 7ca3911dae86d5bf9b704184d11415fda1dac81f..aaacbfe96854ea070c0312dbaa3b4155ff94b270 100644
--- a/doc/naas/so_servicespec_to_services_nfv.md
+++ b/doc/naas/so_servicespec_to_services_nfv.md
@@ -10,7 +10,7 @@ After a Service Order completion, active services with their additional characte
 Openslice creates a Service for the requested CFS. Customers make Service Orders and Openslice instantiates the requested Service Specifications for each Service Order Item of a Service Order. Running Services instantiated by Openslice, reside in Openslice Service Inventory. The following picture displays how Service Specifications are related to Running Services and how Running Services relate with instantiated running Network Services. 
 
 
-[![Openslice  Service Specification instantiation](./so/service_specification_instantiation.png)](./so/service_specification_instantiation.png)
+![Openslice  Service Specification instantiation](./so/service_specification_instantiation.png)
 
 
 There is a hierarchy of services. Usually an Instantiated CFS has Supporting Services some Instantiated RFSs. Then an Instantiated RFS is related to some running NS managed by NFVO
diff --git a/doc/service_design/lcmrules/examples.md b/doc/service_design/lcmrules/examples.md
index 52065b0742c5cd841f154b145ce2582baa3fd897..941acb2a3a2bf54618bce0a59cec206314ad19a1 100644
--- a/doc/service_design/lcmrules/examples.md
+++ b/doc/service_design/lcmrules/examples.md
@@ -15,7 +15,7 @@ In the following example we :
 The strAreaCodes could be passed then e.g. to NFVO for instantiation of services to these cells.
 
 
-[![lcmrules](./images/lcm/lcmfig9.png)](./images/lcm/lcmfig9.png)
+![lcmrules](./images/lcm/lcmfig9.png)
 
 
 
@@ -30,7 +30,7 @@ The strAreaCodes could be passed then e.g. to NFVO for instantiation of services
 
 in the example we modify a YAML spec with parama, paramb, action values from the characteristics spec.parama, spec.paramb, spec.action
 
-[![lcmrules](./images/lcm/lcmfig15.png)](./images/lcm/lcmfig15.png)
+![lcmrules](./images/lcm/lcmfig15.png)
 
 
 ### Define complex OSM configs for DAY 0
@@ -45,7 +45,7 @@ The following displays some complex examples for defining the parameters to pass
 * if the Video quality requested is 1, again we use a simpler OSM Config block to configure the parameter OSM_CONFIG. We use as injected json text a variable constructed later
 
 
-[![lcmrules](./images/lcm/lcmfig10.png)](./images/lcm/lcmfig10.png)
+![lcmrules](./images/lcm/lcmfig10.png)
 
 
 ### Define and instantiate different services according to Service Order request
@@ -60,7 +60,7 @@ There are different ways to accomplish this:
 
 The following image displays for example the latter case.
 
-[![lcmrules](./images/lcm/lcmfig11.png)](./images/lcm/lcmfig11.png)
+![lcmrules](./images/lcm/lcmfig11.png)
 
 
 ### Call an external RESTful service
@@ -68,12 +68,12 @@ The following image displays for example the latter case.
 This is useful in cases for example of alarms , external logging, calling other services e.g. email or even a complex algorithm written in other language e.g. call an external service and get a result. (service e.g. a Python service)
 
 
-[![lcmrules](./images/lcm/lcmfig12.png)](./images/lcm/lcmfig12.png)
+![lcmrules](./images/lcm/lcmfig12.png)
 
-[![lcmrules](./images/lcm/lcmfig13.png)](./images/lcm/lcmfig13.png)
+![lcmrules](./images/lcm/lcmfig13.png)
 
 ### Create New Service Orders
 
 The following example calls to Order a New Service Specification with specific Parameter Values
 
-[![lcmrules](./images/lcm/lcmfig14.png)](./images/lcm/lcmfig14.png)
\ No newline at end of file
+![lcmrules](./images/lcm/lcmfig14.png)
\ No newline at end of file
diff --git a/doc/service_design/lcmrules/intro.md b/doc/service_design/lcmrules/intro.md
index 72b50ee4347bd6b86f49095dd2017b9764b7488a..8282b8c6cbf0a70afce66c745d421d91bcb1ad68 100644
--- a/doc/service_design/lcmrules/intro.md
+++ b/doc/service_design/lcmrules/intro.md
@@ -21,7 +21,7 @@ LCM Rules are used for defining complex conditions and actions during the lifecy
 
 The following figure displays the different phases that the rules are performed, during the lifecycle of a Network Slice Instance.
 
-[![Rules in NSI](./images/lcm/lcmfig1.png)](./images/lcm/lcmfig1.png)
+![Rules in NSI](./images/lcm/lcmfig1.png)
 
 * PRE_PROVISION rules: Run only once just before creating a service with a given priority.
 * CREATION rules: Run while the referenced service dependencies of a service are created.
@@ -49,8 +49,7 @@ Rules are transformed automatically to executable code (currently is Java). If a
 OSOM is the responsible service for executing the rules on a specific phase. The following image explains the design in the BPMN phases:
 
 
-[![Rules](./images/lcm/lcmfig1_osom.png)](./images/lcm/lcmfig1_osom.png)
-
+![Rules](./images/lcm/lcmfig1_osom.png)
 
 
 ## Define Rules
@@ -58,7 +57,7 @@ OSOM is the responsible service for executing the rules on a specific phase. The
 Rules are defined when designing a Service Spec. Here is an example of a list of rules:
 
 
-[![lcmrules](./images/lcm/lcmfig2.png)](./images/lcm/lcmfig2.png)
+![lcmrules](./images/lcm/lcmfig2.png)
 
 Execution order of rules on a specific phase is random
 
@@ -72,7 +71,7 @@ Execution order of rules on a specific phase is random
 
 The following figure is an example of such a rule design. The rule for example will run in PRE_PROVISION phase:
 
-[![lcmrules](./images/lcm/lcmfig3.png)](./images/lcm/lcmfig3.png)
+![lcmrules](./images/lcm/lcmfig3.png)
 
 * The goal of the above rule is to properly define a variable AreaCodes given the chosen AreaOfService from a Service Order.
 * On the right side the user can define some rule properties or observe the underlying generated java code.
@@ -86,7 +85,7 @@ See our [LCM Blocks specification](./specification.md)
 ## Probe further
 
 * Check our [examples](./examples.md) for more usages
-* See next the complete [specification](./specification.md)
+* See next the complete [Specification](./specification.md)
 
 
 
diff --git a/doc/service_design/lcmrules/specification.md b/doc/service_design/lcmrules/specification.md
index dc79c532cba01ad8538113abb6c35175b505da31..01890f64fcf6084b5c9fbb3d7a48ef5f15abfbf2 100644
--- a/doc/service_design/lcmrules/specification.md
+++ b/doc/service_design/lcmrules/specification.md
@@ -9,8 +9,8 @@ Blockly has syntax rules. It helps with colours to define them.
 
 So for example a parameter that is a Number cannot be combined with a String. Will need some conversion first
 
-[![lcmrules](./images/lcm/lcmfig4.png)](./images/lcm/lcmfig4.png)
-[![lcmrules](./images/lcm/lcmfig5.png)](./images/lcm/lcmfig5.png)
-[![lcmrules](./images/lcm/lcmfig6.png)](./images/lcm/lcmfig6.png)
-[![lcmrules](./images/lcm/lcmfig7.png)](./images/lcm/lcmfig7.png)
-[![lcmrules](./images/lcm/lcmfig8.png)](./images/lcm/lcmfig8.png)
+![lcmrules](./images/lcm/lcmfig4.png)
+![lcmrules](./images/lcm/lcmfig5.png)
+![lcmrules](./images/lcm/lcmfig6.png)
+![lcmrules](./images/lcm/lcmfig7.png)
+![lcmrules](./images/lcm/lcmfig8.png)
diff --git a/mkdocs.yml b/mkdocs.yml
index 92c84dc95f2e0fda845391d1e8c7fc7011f7bb58..dea99c9b25fad9e08bff004e9d02d61d0d61aa3e 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -56,10 +56,30 @@ markdown_extensions:
       pygments_lang_class: true
   - pymdownx.inlinehilite
   - pymdownx.snippets
-  - pymdownx.superfences    
+  - pymdownx.superfences
+  - pymdownx.tabbed:
+      alternate_style: true 
 
+plugins:
+  - glightbox:
+      touchNavigation: true
+      loop: false
+      effect: zoom
+      slide_effect: slide
+      width: 100%
+      height: auto
+      zoomable: true
+      draggable: true
+      skip_classes:
+        - custom-skip-class-name
+      auto_caption: false
+      caption_position: bottom
+      background: white
+      shadow: true
+      manual: false
+   
 # Copyright
-copyright: "Copyright © 2024 ETSI OSL"
+copyright: "Copyright © 2025 ETSI OSL"
 
 # Options
 extra: