diff --git a/cml/domain/reconstruction.py b/cml/domain/reconstruction.py
index 14a7dd387eea681d12fd6e763a0c73d56e92b6a9..830aab67904a519c68edeb2cb8400cc8cf03083d 100644
--- a/cml/domain/reconstruction.py
+++ b/cml/domain/reconstruction.py
@@ -1,5 +1,6 @@
 from random import sample
 from collections import defaultdict
+from dataclasses import dataclass
 from functools import partial
 
 import krippendorff
@@ -12,10 +13,79 @@ __all__ = (
 )
 
 
+@dataclass
+class Metadata:
+    knowledge_domain: str
+    knowledge_tier: int
+    identifier: int
+    pre_image: list
+    t_min: int
+    t_max: int
+    sigma: list
+    zeta: list
+
+    def __str__(self):
+        return f"Knowledge domain: <{self.knowledge_domain}> " \
+               f"Knowledge tier: <{self.knowledge_tier}> " \
+               f"Identifier: <{self.identifier}> " \
+               f"Pre image: <{self.pre_image}> " \
+               f"T min: <{self.t_min}> " \
+               f"T max: <{self.t_max}> " \
+               f"Subjects: <{self.sigma}> " \
+               f"Puposes: <{self.zeta}>"
+
+
 class PragmaticMachineLearningModel:
-    def __init__(self, model, learnblock):
+    def __init__(self, meta, model, learnblock):
+        self.meta = meta
         self.model = model
         self.domain_size = learnblock.n_features
+        self.domain = learnblock.indexes
+
+    def __hash__(self):
+        return hash(self.uid)
+
+    def __eq__(self, other):
+        if isinstance(other, PragmaticMachineLearningModel):
+            return hash(self) == hash(other)
+        raise NotImplementedError()
+
+    @property
+    def tier(self):
+        return self.meta.knowledge_tier
+
+    @property
+    def min_timestamp(self):
+        return self.meta.t_min
+
+    @property
+    def max_timestamp(self):
+        return self.meta.t_max
+
+    @property
+    def pre_image(self):
+        return self.meta.pre_image
+
+    @property
+    def subject(self):
+        return self.meta.sigma
+
+    @property
+    def purpose(self):
+        return self.meta.zeta
+
+    @property
+    def uid(self):
+        return ".".join([self.meta.knowledge_domain,
+                         str(self.meta.knowledge_tier),
+                         str(self.meta.identifier)])
+
+    @property
+    def sample_times(self):
+        pass
+
+    def fusion(self, prag_model):
+        pass
 
 
 class Reconstructor: