diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 43681017cc578eafd50864b75d028806a96ba4a4..395b2b60864faf4bedeed2328209b3e8e421e94b 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,6 +1,19 @@
 Changelog
 =========
 
+`3.2.3`_
+-----------------------------------------------------------------------------
+
+Added
+~~~~~
+
+- Added support for EnOSlib 10
+
+Fixed
+~~~~~
+
+-
+
 `3.2.2`_
 -----------------------------------------------------------------------------
 
diff --git a/e2clab/managers/manager.py b/e2clab/managers/manager.py
index 6c685a1e298673b2452f4510fa351a167b50b267..9b1373691bb832ff5333470383c3b793443470fc 100644
--- a/e2clab/managers/manager.py
+++ b/e2clab/managers/manager.py
@@ -43,8 +43,10 @@ class Manager(ABC):
         roles: Optional[Roles] = None,
         networks: Optional[Networks] = None,
         artifacts_dir: Optional[Path] = None,
+        # TODO: fix this mess
+        # Can't import due to cyclical imports through layers_config
         # provider: Optional[Provider] = None,
-        # Weird stuff only needed for iotlab monitoring
+        # Weird stuff, only needed for iotlab monitoring to have consistent api
         provider=None,
         meta: dict = {},
     ):
diff --git a/e2clab/managers/provenance.py b/e2clab/managers/provenance.py
index eda6e05f331095966d4f47547e93d0fa04c7ad96..b06c5be9eb9b6bcff51e3890af86abab01e719e7 100644
--- a/e2clab/managers/provenance.py
+++ b/e2clab/managers/provenance.py
@@ -15,6 +15,7 @@ from ..constants.layers_services import (
     PROVENANCE_SVC,
     PROVENANCE_SVC_DATAFLOW_SPEC,
     PROVENANCE_SVC_PARALLELISM,
+    PROVENANCE_SVC_PORT,
     PROVENANCE_SVC_PROVIDER,
     ROLES_PROVENANCE,
     SERVERS,
@@ -118,8 +119,24 @@ class ProvenanceManager(Manager):
         self.logger.info("Done destroying")
 
     def get_environment(self) -> Environment:
+        # Provenance_svc_provider can't be none due to schema
         return Environment(self.config.get(PROVENANCE_SVC_PROVIDER))
 
+    def get_extra_info(self) -> dict:
+        """Returns provenance extra information
+
+        Returns:
+            dict: provenance_extra_info
+        """
+        ui_address = self.host.address
+        _provenance_extra_info = {
+            PROVENANCE_SERVICE_ROLE: {
+                "__address__": f"{ui_address}",
+                "url": f"http://{ui_address}:{PROVENANCE_SVC_PORT}",
+            }
+        }
+        return _provenance_extra_info
+
     # Config parsing
     def _get_parallelism(self) -> int:
         return int(self.config.get(PROVENANCE_SVC_PARALLELISM, default.PARALLELISM))
diff --git a/e2clab/providers/provider.py b/e2clab/providers/provider.py
index da204ff662a589ca25824038d5d767b27438c326..0c495926f15ad68aa8e641118b30b1b5abad787a 100644
--- a/e2clab/providers/provider.py
+++ b/e2clab/providers/provider.py
@@ -4,17 +4,13 @@ from typing import Optional, Tuple
 from enoslib import Networks, Roles
 
 from e2clab.config import InfrastructureConfig
-from e2clab.constants import MonitoringType, default
+from e2clab.constants import default
 from e2clab.constants.layers_services import (
     CLUSTER,
     ENVIRONMENT,
     ID,
     LAYERS,
-    MONITORING_SERVICE_ROLE,
-    MONITORING_SVC_PORT,
     NAME,
-    PROVENANCE_SERVICE_ROLE,
-    PROVENANCE_SVC_PORT,
     QUANTITY,
     ROLES,
     SERVERS,
@@ -72,53 +68,6 @@ class Provider:
         the resources of your custom Provider.
         """
 
-    def get_provenance(self) -> dict:
-        """Returns provenance extra information
-
-        Returns:
-            dict: provenance_extra_info
-        """
-        _provenance_extra_info = {}
-        if self.roles and self.networks and self.provenance_provider:
-            ui_address = self.roles[PROVENANCE_SERVICE_ROLE][0].address
-            _provenance_extra_info = {
-                PROVENANCE_SERVICE_ROLE: {
-                    "__address__": f"{ui_address}",
-                    "url": f"http://{ui_address}:{PROVENANCE_SVC_PORT}",
-                }
-            }
-        return _provenance_extra_info
-
-    # TODO: test and move to monitoring manager ?
-    def get_monitoring(self) -> dict:
-        """Returns monitoring information
-
-        Returns:
-            Tuple[str, dict]: monitoring_type, monitoring_extra_info
-        """
-        _monitoring_extra_info = {}
-        _monitoring_type = self.infra_config.get_monitoring_type()
-        if None not in (self.roles, self.networks) and self.monitoring_provider:
-            if _monitoring_type in (
-                MonitoringType.TIG,
-                MonitoringType.TPG,
-            ):
-                ui_address = self.roles[MONITORING_SERVICE_ROLE][0].address
-                _monitoring_extra_info = {
-                    MONITORING_SERVICE_ROLE: {
-                        "__address__": f"{ui_address}",
-                        "url": f"http://{ui_address}:{MONITORING_SVC_PORT}",
-                    }
-                }
-
-        return _monitoring_extra_info
-
-    def is_provenance_provider(self):
-        return self.provenance_provider
-
-    def is_monitoring_provider(self):
-        return self.monitoring_provider
-
     def log_roles_networks(self, target_environment):
         logger.debug(f" Roles [{target_environment}] = {self.roles}")
         logger.debug(f" Networks [{target_environment}] = {self.networks}")
diff --git a/e2clab/tests/unit/test_g5k_provider.py b/e2clab/tests/unit/test_g5k_provider.py
index 21c735991901bceb2846c00bf7adb21b8f207059..e0daf48d76a707f8236d7ee469c7489689436ffc 100644
--- a/e2clab/tests/unit/test_g5k_provider.py
+++ b/e2clab/tests/unit/test_g5k_provider.py
@@ -3,7 +3,6 @@ Teting e2clab.provider.plugins.G5k module
 """
 
 import enoslib as en
-from enoslib import Host, Networks, Roles
 
 import e2clab.constants.default as default
 from e2clab.config import InfrastructureConfig
@@ -24,7 +23,6 @@ from e2clab.constants.layers_services import (
     MONITORING_SVC_NETWORK,
     MONITORING_SVC_NETWORK_PRIVATE,
     MONITORING_SVC_NETWORK_SHARED,
-    MONITORING_SVC_PORT,
     MONITORING_SVC_PROVIDER,
     MONITORING_SVC_TIG,
     MONITORING_SVC_TPG,
@@ -34,7 +32,6 @@ from e2clab.constants.layers_services import (
     PROVENANCE_SVC,
     PROVENANCE_SVC_DATAFLOW_SPEC,
     PROVENANCE_SVC_PARALLELISM,
-    PROVENANCE_SVC_PORT,
     PROVENANCE_SVC_PROVIDER,
     QUANTITY,
     RESERVATION,
@@ -244,87 +241,6 @@ class TestG5kProvider(TestE2cLab):
         # 2 services + 1 monitor + 1 provider
         self.assertEqual(len(prov_conf_dict["resources"]["machines"]), 4)
 
-    def test_get_provenance(self):
-
-        g5k = G5k(infra_config=self.g5k_infra_config, optimization_id=None)
-        g5k.provenance_provider = False
-
-        provenance_extra_info = g5k.get_provenance()
-        self.assertEqual(provenance_extra_info, {})
-
-        g5k.provenance_provider = True
-
-        provenance_extra_info = g5k.get_provenance()
-        self.assertEqual(provenance_extra_info, {})
-
-        g5k.roles = Roles({PROVENANCE_SERVICE_ROLE: [Host("1.1.1.1")]})
-
-        provenance_extra_info = g5k.get_provenance()
-        self.assertEqual(provenance_extra_info, {})
-
-        g5k.networks = Networks({"test": "dummy"})
-
-        provenance_extra_info = g5k.get_provenance()
-        self.assertEqual(
-            provenance_extra_info[PROVENANCE_SERVICE_ROLE]["__address__"], "1.1.1.1"
-        )
-        self.assertEqual(
-            provenance_extra_info[PROVENANCE_SERVICE_ROLE]["url"],
-            f"http://1.1.1.1:{PROVENANCE_SVC_PORT}",
-        )
-
-    def test_get_monitoring(self):
-
-        g5k = G5k(infra_config=self.g5k_infra_config, optimization_id=None)
-        g5k.monitoring_provider = False
-
-        monitoring_info = g5k.get_monitoring()
-        self.assertEqual(monitoring_info, {})
-
-        g5k.monitoring_provider = True
-
-        monitoring_info = g5k.get_monitoring()
-        self.assertEqual(monitoring_info, {})
-
-        g5k.roles = Roles({MONITORING_SERVICE_ROLE: [Host("1.1.1.1")]})
-
-        monitoring_info = g5k.get_monitoring()
-        self.assertEqual(monitoring_info, {})
-
-        g5k.networks = Networks({"test": "dummy"})
-
-        monitoring_info = g5k.get_monitoring()
-        self.assertEqual(
-            monitoring_info[MONITORING_SERVICE_ROLE]["__address__"], "1.1.1.1"
-        )
-        self.assertEqual(
-            monitoring_info[MONITORING_SERVICE_ROLE]["url"],
-            f"http://1.1.1.1:{MONITORING_SVC_PORT}",
-        )
-
-        g5k = G5k(infra_config=self.g5k_infra_config_tpg, optimization_id=None)
-        g5k.monitoring_provider = True
-        g5k.roles = Roles({MONITORING_SERVICE_ROLE: [Host("1.1.1.1")]})
-        g5k.networks = Networks({"test": "dummy"})
-
-        monitoring_info = g5k.get_monitoring()
-        self.assertEqual(
-            monitoring_info[MONITORING_SERVICE_ROLE]["__address__"], "1.1.1.1"
-        )
-        self.assertEqual(
-            monitoring_info[MONITORING_SERVICE_ROLE]["url"],
-            f"http://1.1.1.1:{MONITORING_SVC_PORT}",
-        )
-
-        g5k = G5k(infra_config=self.g5k_infra_config_dstat, optimization_id=None)
-        # DSTAT => no monitoring provider
-        g5k.monitoring_provider = False
-        g5k.roles = Roles({MONITORING_SERVICE_ROLE: [Host("1.1.1.1")]})
-        g5k.networks = Networks({"test": "dummy"})
-
-        monitoring_info = g5k.get_monitoring()
-        self.assertEqual(monitoring_info, {})
-
 
 class TestG5kConfig(TestE2cLab):
     """
diff --git a/e2clab/tests/unit/test_managers.py b/e2clab/tests/unit/test_managers.py
index 8c760d1d72fe65ac8f62d38415d1d0e019488bf9..3973f0efa2f4562fe9f1c0514e7c4f8ae3ce5796 100644
--- a/e2clab/tests/unit/test_managers.py
+++ b/e2clab/tests/unit/test_managers.py
@@ -30,6 +30,7 @@ from e2clab.constants.layers_services import (
     MONITORING_SVC_TPG,
     MONITORING_SVC_TYPE,
     NAME,
+    PROVENANCE_SERVICE_ROLE,
     PROVENANCE_SVC_DATAFLOW_SPEC,
     PROVENANCE_SVC_PARALLELISM,
     PROVENANCE_SVC_PROVIDER,
@@ -133,6 +134,11 @@ class TestProvenanceManager(TestE2cLab):
         # m_backup.assert_called_once_with("here")
         m_backup.assert_called_once()
 
+    def test_get_extra_info(self):
+        extra_info = self.prov.get_extra_info()
+        self.assertIn(PROVENANCE_SERVICE_ROLE, extra_info)
+        self.assertEqual(extra_info[PROVENANCE_SERVICE_ROLE]["__address__"], "1.1.1.1")
+
     @patch.object(Provenance, "destroy")
     def test_destroy(self, m_destroy: Mock):
         self.prov._destroy()
@@ -299,14 +305,17 @@ class TestMonitoringManager(TestE2cLab):
     def test_get_extra_info(self, m_monitoring_type: Mock):
         m_monitoring_type.return_value = MonitoringType.DSTAT
         self.assertEqual(self.monit_dstat.get_extra_info(), {})
+
         expected_output = {
             MONITORING_SERVICE_ROLE: {
                 "__address__": f"{self.host_address}",
                 "url": f"http://{self.host_address}:3000",
             }
         }
+
         m_monitoring_type.return_value = MonitoringType.TIG
         self.assertEqual(self.monit_tig.get_extra_info(), expected_output)
+
         m_monitoring_type.return_value = MonitoringType.TPG
         self.assertEqual(self.monit_tpg.get_extra_info(), expected_output)