diff --git a/.idea/misc.xml b/.idea/misc.xml
index 026cd6b6472b4b8701a0fa65b37e9630f2952e27..b17488e195f3307b580d8f2630fd7fb7014ee9e9 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,5 +3,5 @@
   <component name="Black">
     <option name="sdkName" value="Poetry (mitm-support)" />
   </component>
-  <component name="ProjectRootManager" version="2" project-jdk-name="Poetry (mitm-tooling)" project-jdk-type="Python SDK" />
+  <component name="ProjectRootManager" version="2" project-jdk-name="uv (mitm-tooling)" project-jdk-type="Python SDK" />
 </project>
\ No newline at end of file
diff --git a/.idea/mitm-tooling.iml b/.idea/mitm-tooling.iml
index cef4abc4197d5f67219eb4c03cc2d6f04c3a68de..04cbc6e3e3cf62cd72d3d5e4138b50ce767789f0 100644
--- a/.idea/mitm-tooling.iml
+++ b/.idea/mitm-tooling.iml
@@ -3,8 +3,9 @@
   <component name="NewModuleRootManager">
     <content url="file://$MODULE_DIR$">
       <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/.venv" />
     </content>
-    <orderEntry type="jdk" jdkName="Poetry (mitm-tooling)" jdkType="Python SDK" />
+    <orderEntry type="jdk" jdkName="uv (mitm-tooling)" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
 </module>
\ No newline at end of file
diff --git a/mitm_tooling/transformation/superset/definitions/__init__.py b/mitm_tooling/transformation/superset/definitions/__init__.py
index e8bcb327683c31552434c8e0cfcfb7e9fe3bf573..b520dac2a31467bf575e7783a59069714117121e 100644
--- a/mitm_tooling/transformation/superset/definitions/__init__.py
+++ b/mitm_tooling/transformation/superset/definitions/__init__.py
@@ -1,8 +1,10 @@
-from .chart import *
 from .constants import *
 from .core import *
-from .dashboard import *
 from .database import *
 from .dataset import *
+from .chart import *
+from .dashboard import *
 from .importable import *
 from .post_processing import *
+from .mitm_dataset import *
+
diff --git a/mitm_tooling/transformation/superset/definitions/chart.py b/mitm_tooling/transformation/superset/definitions/chart.py
index 442e4f218eec66ba054562f109352be859471e27..da401e64c251f4a4ef8a8ee611e11301267ad5eb 100644
--- a/mitm_tooling/transformation/superset/definitions/chart.py
+++ b/mitm_tooling/transformation/superset/definitions/chart.py
@@ -1,4 +1,10 @@
-from .core import *
+from typing import Any, Literal
+
+import pydantic
+
+from .constants import StrUrl, StrUUID
+from .core import FormData, DatasourceIdentifier, SupersetVizType, SupersetAdhocFilter, SupersetId, ColorScheme, \
+    SupersetAdhocMetric, ColumnName, TimeGrain, AnnotationLayer, SupersetDefFile, QueryContext
 
 
 class ChartParams(FormData):
diff --git a/mitm_tooling/transformation/superset/definitions/core.py b/mitm_tooling/transformation/superset/definitions/core.py
index 21e175a83556fd8e4080c2ba52768f4516eae551..aa0f70e906dda1b3a17476757133ba1b28657adf 100644
--- a/mitm_tooling/transformation/superset/definitions/core.py
+++ b/mitm_tooling/transformation/superset/definitions/core.py
@@ -1,6 +1,6 @@
 from typing import Any
 
-from mitm_tooling.representation import ColumnName
+from mitm_tooling.representation import ColumnName, TableName
 from .constants import *
 
 
@@ -14,6 +14,7 @@ class DatasourceIdentifier(FrozenSupersetDefinition):
     def datasource_uid(self):
         return f'{self.id}__{self.type}'
 
+DatasourceIdentifierMap = dict[TableName, DatasourceIdentifier]
 
 class SupersetPostProcessing(pydantic.BaseModel, ABC):
     operation: str
@@ -26,7 +27,9 @@ class SupersetColumn(FrozenSupersetDefinition):
     is_dttm: bool = False
     is_active: bool = True
     type: str = str(MITMDataType.Text.sa_sql_type)
-    type_generic: GenericDataType = GenericDataType.STRING
+    # not permitted
+    # type_generic: GenericDataType = GenericDataType.STRING
+    # type_generic=GenericDataType.from_mitm_dt(dt)
     advanced_data_type: str | None = None
     groupby: bool = True
     filterable: bool = True
@@ -178,3 +181,5 @@ class QueryContext(BaseSupersetDefinition):
     result_format: ChartDataResultFormat = ChartDataResultFormat.JSON
     force: bool = False
     custom_cache_timeout: int | None = None
+
+
diff --git a/mitm_tooling/transformation/superset/definitions/dashboard.py b/mitm_tooling/transformation/superset/definitions/dashboard.py
index 8bb9c1ebcf42cc28c439eb8abef2c83ba98b2b22..a693ded650dbbee2646585e20a68b44efcefd7fb 100644
--- a/mitm_tooling/transformation/superset/definitions/dashboard.py
+++ b/mitm_tooling/transformation/superset/definitions/dashboard.py
@@ -3,8 +3,8 @@ from typing import Literal
 
 import pydantic
 
-from . import SupersetDefFile, StrUrl
-from .constants import StrUUID
+from .core import SupersetDefFile
+from .constants import StrUUID, StrUrl
 
 DashboardInternalID = str
 
diff --git a/mitm_tooling/transformation/superset/definitions/database.py b/mitm_tooling/transformation/superset/definitions/database.py
index 32bc282eefd9a25625aa9c52d505389310585e65..f72c3686bb5666444237f78e52b4758be1281587 100644
--- a/mitm_tooling/transformation/superset/definitions/database.py
+++ b/mitm_tooling/transformation/superset/definitions/database.py
@@ -2,7 +2,7 @@ from typing import Any
 
 import pydantic
 
-from mitm_tooling.transformation.superset.definitions import SupersetDefFile, StrUrl, StrUUID
+from .core import SupersetDefFile, StrUrl, StrUUID
 
 
 class SupersetDatabaseDef(SupersetDefFile):
diff --git a/mitm_tooling/transformation/superset/definitions/dataset.py b/mitm_tooling/transformation/superset/definitions/dataset.py
index 150ea5953a112063be3a3911b504fdd5a9997609..6b6d3a0dd19fedcd537e8224d5efa8b3d010ce05 100644
--- a/mitm_tooling/transformation/superset/definitions/dataset.py
+++ b/mitm_tooling/transformation/superset/definitions/dataset.py
@@ -2,7 +2,7 @@ from typing import Any
 
 import pydantic
 
-from mitm_tooling.transformation.superset.definitions import SupersetDefFile, StrUUID, SupersetMetric, SupersetColumn
+from .core import SupersetDefFile, StrUUID, SupersetMetric, SupersetColumn
 
 
 class SupersetDatasetDef(SupersetDefFile):
@@ -19,6 +19,8 @@ class SupersetDatasetDef(SupersetDefFile):
     sql: str | None = None
     params: Any = None
     template_params: Any = None
+    is_managed_externally: bool = True
+    external_url: str | None = None
     filter_select_enabled: bool = True
     fetch_values_predicate: str | None = None
     extra: dict[str, Any] = pydantic.Field(default_factory=dict)
diff --git a/mitm_tooling/transformation/superset/definitions/importable.py b/mitm_tooling/transformation/superset/definitions/importable.py
index 7ceb14858628cd9eab9a317106409b71150bc78a..26a339d19ca5692b4d65c9ce5c343ae5994cbc14 100644
--- a/mitm_tooling/transformation/superset/definitions/importable.py
+++ b/mitm_tooling/transformation/superset/definitions/importable.py
@@ -1,13 +1,17 @@
 from collections import defaultdict
-from datetime import UTC
-
-from .chart import *
+from datetime import UTC, datetime
+from enum import StrEnum
+from abc import ABC, abstractmethod
+from .constants import StrDatetime
+from .core import BaseSupersetDefinition, SupersetDefFile
+from .chart import SupersetChartDef
 from .dashboard import SupersetDashboardDef
 from .database import SupersetDatabaseDef
 from .dataset import SupersetDatasetDef
 from .mitm_dataset import SupersetMitMDatasetDef
-from .post_processing import *
-
+from .post_processing import SupersetPostProcessing
+import pydantic
+from typing import Any
 
 class MetadataType(StrEnum):
     Database = 'Database'
diff --git a/mitm_tooling/transformation/superset/definitions/post_processing.py b/mitm_tooling/transformation/superset/definitions/post_processing.py
index 733cad4a6f2a5368a890491d88f2d0136a6b9499..ad8fd50deab3a8425200e67204174a19b09875b2 100644
--- a/mitm_tooling/transformation/superset/definitions/post_processing.py
+++ b/mitm_tooling/transformation/superset/definitions/post_processing.py
@@ -1,5 +1,6 @@
-from .core import *
-
+from .core import FrozenSupersetDefinition, SupersetPostProcessing, ColumnName
+import pydantic
+from typing import Literal
 
 class PivotOperator(FrozenSupersetDefinition):
     operator: str = 'mean'
diff --git a/mitm_tooling/transformation/superset/factories/core.py b/mitm_tooling/transformation/superset/factories/core.py
index 770772526d4e9da53cc1de8c2352a9f4bd63f6ae..db2d11bd42c2918f4bdc1400fd1c31703b6acf14 100644
--- a/mitm_tooling/transformation/superset/factories/core.py
+++ b/mitm_tooling/transformation/superset/factories/core.py
@@ -66,8 +66,7 @@ def mk_column(col: ColumnName, dt: MITMDataType, col_id: SupersetId | None = Non
                 groupby=dt not in {MITMDataType.Json,
                                    MITMDataType.Numeric},
                 type=(dt.sa_sql_type or MITMDataType.Text.sa_sql_type).compile(
-                    dialect=dialect),
-                type_generic=GenericDataType.from_mitm_dt(dt)) | kwargs
+                    dialect=dialect)) | kwargs
     if col_id is not None:
         return IdentifiedSupersetColumn(**args, id=col_id)
     else:
diff --git a/mitm_tooling/transformation/superset/factories/custom_charts.py b/mitm_tooling/transformation/superset/factories/custom_charts.py
index 54865d3baf977300f3928c483e4da259d0bb1bbc..85e6afb578558fa202dd8f9aa23329e5c9066124 100644
--- a/mitm_tooling/transformation/superset/factories/custom_charts.py
+++ b/mitm_tooling/transformation/superset/factories/custom_charts.py
@@ -1,10 +1,9 @@
 from typing import Literal
 
 from mitm_tooling.transformation.superset.definitions import SupersetChartDef, SupersetVizType, ChartParams, \
-    DatasourceIdentifier
-from mitm_tooling.transformation.superset.definitions.mitm_dataset import MitMDatasetIdentifier
-from mitm_tooling.transformation.superset.factories.chart import mk_chart_def
-from mitm_tooling.transformation.superset.factories.query import mk_query_object, mk_query_context
+    DatasourceIdentifier, MitMDatasetIdentifier
+from .chart import mk_chart_def
+from .query import mk_query_object, mk_query_context
 
 
 class MAEDCustomChartParams(ChartParams):
diff --git a/mitm_tooling/transformation/superset/factories/importable.py b/mitm_tooling/transformation/superset/factories/importable.py
index c601702a4c294ec77a2ca8e79e828016f112da7b..7ae04a7b8c3f683f889836f655d3a08e0afd66a0 100644
--- a/mitm_tooling/transformation/superset/factories/importable.py
+++ b/mitm_tooling/transformation/superset/factories/importable.py
@@ -1,6 +1,5 @@
 from ..definitions import SupersetMetadataDef, SupersetDatabaseDef, SupersetDashboardDef, SupersetDatasetDef, \
-    SupersetChartDef, SupersetMitMDatasetDef
-from ..definitions.importable import MetadataType, SupersetAssetsImport, SupersetMitMDatasetImport
+    SupersetChartDef, SupersetMitMDatasetDef, MetadataType, SupersetAssetsImport, SupersetMitMDatasetImport
 
 
 def mk_metadata(metadata_type: MetadataType) -> SupersetMetadataDef:
diff --git a/mitm_tooling/transformation/superset/factories/mitm_dataset.py b/mitm_tooling/transformation/superset/factories/mitm_dataset.py
index 6d554bb3ac7dbe3432b30414a971cfb7500476e7..8a844ecbb3b1282ec9db05b7c810ec04857015fd 100644
--- a/mitm_tooling/transformation/superset/factories/mitm_dataset.py
+++ b/mitm_tooling/transformation/superset/factories/mitm_dataset.py
@@ -3,8 +3,7 @@ from uuid import UUID
 
 from mitm_tooling.definition import MITM
 from mitm_tooling.utilities.identifiers import mk_uuid, name_plus_uuid
-from ..definitions import SupersetMitMDatasetDef
-from ..definitions.mitm_dataset import RelatedTable, RelatedSlice, RelatedDashboard
+from ..definitions import SupersetMitMDatasetDef, RelatedTable, RelatedSlice, RelatedDashboard
 
 
 def mk_related_obj(kind: Literal['table', 'slice', 'dashboard'],
diff --git a/mitm_tooling/transformation/superset/from_intermediate.py b/mitm_tooling/transformation/superset/from_intermediate.py
index a315f08f0cf89560c8f372aff832a654f02e3a40..5ef8f787208d7407c062b9e48d0600a9a601336d 100644
--- a/mitm_tooling/transformation/superset/from_intermediate.py
+++ b/mitm_tooling/transformation/superset/from_intermediate.py
@@ -1,22 +1,37 @@
+from uuid import UUID
+
 from mitm_tooling.representation import Header
 from .asset_bundles.asset_bundles import SupersetDatasourceBundle, \
     SupersetMitMDatasetBundle
 from .common import DBConnectionInfo
+from .definitions import DatasourceIdentifierMap
 from .definitions.mitm_dataset import MitMDatasetIdentifier
 
 
 def header_into_superset_datasource_bundle(header: Header,
-                                           db_conn_info: DBConnectionInfo) -> SupersetDatasourceBundle:
+                                           db_conn_info: DBConnectionInfo,
+                                           database_uuid: UUID | None = None,
+                                           ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetDatasourceBundle:
     from ..sql.from_intermediate import header_into_db_meta
     from .from_sql import db_meta_into_superset_datasource_bundle
     db_meta = header_into_db_meta(header)
-    return db_meta_into_superset_datasource_bundle(db_meta, db_conn_info)
+    return db_meta_into_superset_datasource_bundle(db_meta,
+                                                   db_conn_info,
+                                                   database_uuid=database_uuid,
+                                                   ds_id_map=ds_id_map)
 
 
 def header_into_mitm_dataset_bundle(header: Header,
                                     db_conn_info: DBConnectionInfo,
-                                    dataset_identifier: MitMDatasetIdentifier) -> SupersetMitMDatasetBundle:
+                                    dataset_identifier: MitMDatasetIdentifier,
+                                    database_uuid: UUID | None = None,
+                                    ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetMitMDatasetBundle:
     from ..sql.from_intermediate import header_into_db_meta
     from .from_sql import db_meta_into_mitm_dataset_bundle
     db_meta = header_into_db_meta(header)
-    return db_meta_into_mitm_dataset_bundle(db_meta, db_conn_info, dataset_identifier, header.mitm)
+    return db_meta_into_mitm_dataset_bundle(db_meta,
+                                            db_conn_info,
+                                            dataset_identifier,
+                                            header.mitm,
+                                            database_uuid=database_uuid,
+                                            ds_id_map=ds_id_map)
diff --git a/mitm_tooling/transformation/superset/from_sql.py b/mitm_tooling/transformation/superset/from_sql.py
index 9cf7822aded53a067869bd69242f592fc8e10c02..f5b28b006fb593c8118535950f705c525997765f 100644
--- a/mitm_tooling/transformation/superset/from_sql.py
+++ b/mitm_tooling/transformation/superset/from_sql.py
@@ -1,3 +1,6 @@
+from uuid import UUID
+
+from mitm_tooling.definition import MITM
 from mitm_tooling.extraction.sql.data_models import DBMetaInfo
 from mitm_tooling.extraction.sql.data_models.db_meta import DBMetaInfoBase
 from mitm_tooling.extraction.sql.db import connect_and_reflect
@@ -5,26 +8,34 @@ from .asset_bundles import SupersetDatasourceBundle, \
     SupersetMitMDatasetBundle
 from .common import DBConnectionInfo
 from .common import _mk_engine, SQLiteFileOrEngine
+from .definitions import DatasourceIdentifierMap
 from .definitions.mitm_dataset import MitMDatasetIdentifier
 from .factories.database import mk_database
 from .factories.dataset import mk_dataset
 from .factories.mitm_dataset import mk_mitm_dataset
-from ...definition import MITM
 
 
 def db_meta_into_superset_datasource_bundle(db_meta: DBMetaInfoBase,
-                                            db_conn_info: DBConnectionInfo) -> SupersetDatasourceBundle:
+                                            db_conn_info: DBConnectionInfo,
+                                            database_uuid: UUID | None = None,
+                                            ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetDatasourceBundle:
     sqlalchemy_uri = db_conn_info.sql_alchemy_uri
     db_name = db_conn_info.db_name
     dialect = db_conn_info.dialect_cls()
 
-    database = mk_database(name=db_name, sqlalchemy_uri=sqlalchemy_uri, uniquify_name=True)
+    database = mk_database(name=db_name, sqlalchemy_uri=sqlalchemy_uri, uniquify_name=True, uuid=database_uuid)
 
     database_uuid = database.uuid
     datasets = []
+    ds_id_map = ds_id_map or {}
+
+    def ds_uuid(tn: str) -> UUID | None:
+        if (ds_id := ds_id_map.get(tn)) is not None:
+            return ds_id.uuid
+
     for schema_name, schema_tables in db_meta.db_structure.items():
         for table_name, tm in schema_tables.items():
-            datasets.append(mk_dataset(tm, database_uuid, dialect=dialect))
+            datasets.append(mk_dataset(tm, database_uuid, dialect=dialect, uuid=ds_uuid(table_name)))
 
     return SupersetDatasourceBundle(database=database, datasets=datasets)
 
@@ -32,8 +43,13 @@ def db_meta_into_superset_datasource_bundle(db_meta: DBMetaInfoBase,
 def db_meta_into_mitm_dataset_bundle(db_meta: DBMetaInfoBase,
                                      db_conn_info: DBConnectionInfo,
                                      dataset_identifier: MitMDatasetIdentifier,
-                                     mitm: MITM) -> SupersetMitMDatasetBundle:
-    datasource_bundle = db_meta_into_superset_datasource_bundle(db_meta, db_conn_info)
+                                     mitm: MITM,
+                                     database_uuid: UUID | None = None,
+                                     ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetMitMDatasetBundle:
+    datasource_bundle = db_meta_into_superset_datasource_bundle(db_meta,
+                                                                db_conn_info,
+                                                                database_uuid=database_uuid,
+                                                                ds_id_map=ds_id_map)
     mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, uuid=dataset_identifier.uuid,
                                    database_uuid=datasource_bundle.database_uuid,
                                    table_uuids=datasource_bundle.dataset_uuids)
@@ -41,20 +57,30 @@ def db_meta_into_mitm_dataset_bundle(db_meta: DBMetaInfoBase,
 
 
 def db_into_superset_datasource_bundle(arg: SQLiteFileOrEngine,
-                                       db_conn_info: DBConnectionInfo) -> SupersetDatasourceBundle:
+                                       db_conn_info: DBConnectionInfo,
+                                       database_uuid: UUID | None = None,
+                                       ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetDatasourceBundle:
     engine = _mk_engine(arg)
 
     meta, _ = connect_and_reflect(engine, allowed_schemas=[db_conn_info.schema_name])
     db_meta = DBMetaInfo.from_sa_meta(meta, default_schema=db_conn_info.schema_name)
 
-    return db_meta_into_superset_datasource_bundle(db_meta, db_conn_info)
+    return db_meta_into_superset_datasource_bundle(db_meta,
+                                                   db_conn_info,
+                                                   database_uuid=database_uuid,
+                                                   ds_id_map=ds_id_map)
 
 
 def db_into_mitm_dataset_bundle(arg: SQLiteFileOrEngine,
                                 db_conn_info: DBConnectionInfo,
                                 dataset_identifier: MitMDatasetIdentifier,
-                                mitm: MITM) -> SupersetMitMDatasetBundle:
-    datasource_bundle = db_into_superset_datasource_bundle(arg, db_conn_info)
+                                mitm: MITM,
+                                database_uuid: UUID | None = None,
+                                ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetMitMDatasetBundle:
+    datasource_bundle = db_into_superset_datasource_bundle(arg,
+                                                           db_conn_info,
+                                                           database_uuid=database_uuid,
+                                                           ds_id_map=ds_id_map)
     mitm_dataset = mk_mitm_dataset(dataset_identifier.dataset_name, mitm, uuid=dataset_identifier.uuid,
                                    database_uuid=datasource_bundle.database_uuid,
                                    table_uuids=datasource_bundle.dataset_uuids)
diff --git a/mitm_tooling/transformation/superset/interface.py b/mitm_tooling/transformation/superset/interface.py
index 43c8de6896a3750575baece647b3552712c8271b..52dbf442ab421d7df970472df54fecf90ccc572f 100644
--- a/mitm_tooling/transformation/superset/interface.py
+++ b/mitm_tooling/transformation/superset/interface.py
@@ -1,17 +1,22 @@
 from collections.abc import Iterable
+from uuid import UUID
 
 from mitm_tooling.representation import Header
 from .asset_bundles.asset_bundles import SupersetDatasourceBundle, \
     SupersetVisualizationBundle, SupersetMitMDatasetBundle
 from .common import DBConnectionInfo
+from .definitions import DatasourceIdentifierMap
 from .definitions.mitm_dataset import MitMDatasetIdentifier
 from .from_intermediate import header_into_superset_datasource_bundle, header_into_mitm_dataset_bundle
-from .visualizations.abstract import DatasourceIdentifierMap
 from .visualizations.registry import VisualizationType, mk_visualization
 
 
-def mk_superset_datasource_bundle(header: Header, db_conn_info: DBConnectionInfo) -> SupersetDatasourceBundle:
-    return header_into_superset_datasource_bundle(header, db_conn_info)
+def mk_superset_datasource_bundle(header: Header, db_conn_info: DBConnectionInfo, database_uuid: UUID | None = None,
+                                  ds_id_map: DatasourceIdentifierMap | None = None) -> SupersetDatasourceBundle:
+    return header_into_superset_datasource_bundle(header,
+                                                  db_conn_info,
+                                                  database_uuid=database_uuid,
+                                                  ds_id_map=ds_id_map)
 
 
 def mk_superset_visualization_bundle(header: Header,
@@ -28,9 +33,15 @@ def mk_superset_visualization_bundle(header: Header,
 def mk_superset_mitm_dataset_bundle(header: Header,
                                     db_conn_info: DBConnectionInfo,
                                     mitm_dataset_identifier: MitMDatasetIdentifier,
+                                    database_uuid: UUID | None = None,
+                                    ds_id_map: DatasourceIdentifierMap | None = None,
                                     visualization_types: Iterable[
                                                              VisualizationType] | None = None) -> SupersetMitMDatasetBundle:
-    mitm_dataset_bundle = header_into_mitm_dataset_bundle(header, db_conn_info, mitm_dataset_identifier)
+    mitm_dataset_bundle = header_into_mitm_dataset_bundle(header,
+                                                          db_conn_info,
+                                                          mitm_dataset_identifier,
+                                                          database_uuid=database_uuid,
+                                                          ds_id_map=ds_id_map)
     if visualization_types is not None:
         mdi = mitm_dataset_bundle.mitm_dataset.identifier
         ds_id_map = mitm_dataset_bundle.datasource_bundle.placeholder_dataset_identifiers
diff --git a/mitm_tooling/transformation/superset/visualizations/abstract.py b/mitm_tooling/transformation/superset/visualizations/abstract.py
index a04671ddf248781fcb8d695a8a9b8cf8346c5545..cc19d5da871bbb67a7052296b52a65a56b63d51a 100644
--- a/mitm_tooling/transformation/superset/visualizations/abstract.py
+++ b/mitm_tooling/transformation/superset/visualizations/abstract.py
@@ -4,12 +4,11 @@ from typing import Self, Type, Callable
 from mitm_tooling.representation import TableName, Header
 from ..asset_bundles.asset_bundles import SupersetVisualizationBundle
 from ..definitions import DatasourceIdentifier, SupersetChartDef, \
-    SupersetDashboardDef
+    SupersetDashboardDef, DatasourceIdentifierMap
 from ..definitions.mitm_dataset import MitMDatasetIdentifier
 
 ChartDefCollection = dict[str, SupersetChartDef]
 DashboardDefCollection = dict[str, SupersetDashboardDef]
-DatasourceIdentifierMap = dict[TableName, DatasourceIdentifier]
 
 
 class ChartCreator(ABC):
diff --git a/mitm_tooling/transformation/superset/visualizations/maed/charts.py b/mitm_tooling/transformation/superset/visualizations/maed/charts.py
index 9ff69590e0ee8fdd98689bd41668549231e28a34..5b5895adff32013ea8b52738e4f8cb21d97fb742 100644
--- a/mitm_tooling/transformation/superset/visualizations/maed/charts.py
+++ b/mitm_tooling/transformation/superset/visualizations/maed/charts.py
@@ -4,8 +4,8 @@ from mitm_tooling.data_types import MITMDataType
 from mitm_tooling.definition import get_mitm_def, ConceptName, MITM, RelationName, TypeName
 from mitm_tooling.representation import SQLRepresentationSchema, Header, mk_sql_rep_schema
 from mitm_tooling.utilities.identifiers import naive_pluralize
-from ..abstract import DatasourceIdentifierMap, ChartDefCollection, ChartCollectionCreator, ChartCreator
-from ...definitions import FilterOperator, DatasourceIdentifier, SupersetChartDef
+from ..abstract import ChartDefCollection, ChartCollectionCreator, ChartCreator
+from ...definitions import FilterOperator, DatasourceIdentifier, SupersetChartDef, DatasourceIdentifierMap
 from ...factories.core import mk_adhoc_filter
 from ...factories.generic_charts import mk_pie_chart, mk_time_series_bar_chart, mk_avg_count_time_series_chart
 
diff --git a/mitm_tooling/transformation/superset/visualizations/maed/dashboards.py b/mitm_tooling/transformation/superset/visualizations/maed/dashboards.py
index 5866f36a90537aca18537d496537bf79334d2ba8..c4c7954fa1b9b5ea75b31e65cb79c200900688ae 100644
--- a/mitm_tooling/transformation/superset/visualizations/maed/dashboards.py
+++ b/mitm_tooling/transformation/superset/visualizations/maed/dashboards.py
@@ -1,10 +1,10 @@
 from mitm_tooling.representation import Header, SQLRepresentationSchema, mk_sql_rep_schema
-from mitm_tooling.transformation.superset.definitions import SupersetDashboardDef
+from mitm_tooling.transformation.superset.definitions import SupersetDashboardDef, DatasourceIdentifierMap
 from mitm_tooling.transformation.superset.definitions.mitm_dataset import MitMDatasetIdentifier
 from mitm_tooling.transformation.superset.factories.custom_charts import mk_maed_custom_chart
 from mitm_tooling.transformation.superset.factories.dashboard import mk_dashboard_chart, mk_dashboard_def
 from mitm_tooling.transformation.superset.visualizations.abstract import DashboardCreator, \
-    ChartCollectionCreator, ChartDefCollection, DatasourceIdentifierMap
+    ChartCollectionCreator, ChartDefCollection
 from mitm_tooling.transformation.superset.visualizations.maed.charts import BaselineMAEDCharts
 from mitm_tooling.utilities.python_utils import take_first
 
diff --git a/mitm_tooling/transformation/superset/visualizations/registry.py b/mitm_tooling/transformation/superset/visualizations/registry.py
index ece717ca0b491db131333c6490fb7f690932c679..957c299c5a5eb3228a1b4c226e1d9e15d2f5893b 100644
--- a/mitm_tooling/transformation/superset/visualizations/registry.py
+++ b/mitm_tooling/transformation/superset/visualizations/registry.py
@@ -4,7 +4,8 @@ from mitm_tooling.definition import MITM
 from mitm_tooling.representation import Header
 from .maed.registry import MAEDVisualizationType, maed_visualization_creators
 from ..definitions.mitm_dataset import MitMDatasetIdentifier
-from ..visualizations.abstract import VisualizationCreator, DatasourceIdentifierMap, SupersetVisualizationBundle
+from ..visualizations.abstract import VisualizationCreator, SupersetVisualizationBundle
+from ..definitions import DatasourceIdentifierMap
 
 VisualizationType = MAEDVisualizationType | None
 
diff --git a/pyproject.toml b/pyproject.toml
index fde4501ba052aac727442cc359d90d6ce6753b35..d973f69aad1ca223b5a8d680691d4318da34201e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,44 +1,51 @@
-[tool.poetry]
+[project]
 name = "mitm-tooling"
-version = "0.4.8"
+version = "0.4.9"
 description = ""
-authors = ["Leah Tacke genannt Unterberg <leah.tgu@pads.rwth-aachen.de>"]
+authors = [{ name = "Leah Tacke genannt Unterberg", email = "l.tgu@pads.rwth-aachen.de" }]
+requires-python = ">=3.11,<3.14"
 readme = "README.md"
-packages = [{ include = "mitm_tooling" }]
-
-[tool.poetry.dependencies]
-python = ">=3.11,<3.14"
-pydantic = "^2.9.2"
-pyyaml = "6.0.2"
-genson = "^1.3.0"
-
-sqlalchemy = { version = ">=2", extras = ["postgresql-psycopg", "postgresql"] }
-sqlalchemy-utils = ">=0.38.0"
-numpy = ">=2"
-pandas = { version = ">=2.0", extras = ["performance", "excel", "hdf5", "output_formatting", "computation", "postgresql", "mysql", "sql-other", "plot", "compression"] }
-
-# visualization
-matplotlib = "*"
-seaborn = "*"
-plotly = "*"
-
-[tool.poetry.extras]
-analysis = ["polars"]
-pm = ["pm4py"]
-
-[tool.poetry.group.dev.dependencies]
-pytest = "*"
-jupyter = "*"
-
-[[tool.poetry.source]]
+dependencies = [
+    "pydantic>=2.9.2",
+    "pyyaml==6.0.2",
+    "genson>=1.3.0",
+    "sqlalchemy[postgresql-psycopg, postgresql]>=2",
+    "sqlalchemy-utils>=0.38.0",
+    "numpy>=2",
+    "pandas[performance, excel, hdf5, output_formatting, computation, postgresql, mysql, sql-other, plot, compression]>=2.0",
+    "matplotlib",
+    "seaborn",
+    "plotly",
+]
+
+[project.optional-dependencies]
+analysis = []
+pm = []
+
+[dependency-groups]
+dev = [
+    "pytest",
+    "jupyter",
+]
+
+[tool.uv]
+
+[[tool.uv.index]]
 name = "testpypi"
 url = "https://test.pypi.org/"
-priority = "explicit"
+explicit = true
 
-[[tool.poetry.source]]
+[[tool.uv.index]]
 name = "PyPI"
-priority = "primary"
+url = "https://pypi.org/simple/"
+default = true
+
+[tool.hatch.build.targets.sdist]
+include = ["mitm_tooling"]
+
+[tool.hatch.build.targets.wheel]
+include = ["mitm_tooling"]
 
 [build-system]
-requires = ["poetry-core"]
-build-backend = "poetry.core.masonry.api"
+requires = ["hatchling"]
+build-backend = "hatchling.build"