diff --git a/functions/classes.py b/functions/classes.py
index 845ec8df67eba71ba2d70545dfe6470911909895..45081d568e293365c44ee46900b7fe310ab854ab 100644
--- a/functions/classes.py
+++ b/functions/classes.py
@@ -4,32 +4,23 @@ File consists of several classes for the different elements of a device.
 from __future__ import annotations
 from enum import Enum, auto
 import uuid
-from typing import List, Dict
+from typing import List, Dict, Optional
 import json
 
 
 # TODO
 # - Docstrings
 # - Beschreibung von Teilen (-> properties) -> Raus aus dem Konstruktor rein in ein dict. (Deep-Copy)
+#   - Erstmal als Shallow Copy umgesetzt, wir verwenden momentan keine nested dicts
 # - Minimalbeispiel für KPIs -> halb umgesetzt -> mit get_components veranschaulichen
 # - Erlaube Clone bei Assembly (jedes child muss durch durch Klon ersetzt werden)
 # - Änderungen an Beispiel umsetzen
 
+# -> Integriere AggregationLayer und die Funktionen in die Klassen (evtl. per Vererbung?) -> Nä Semester
 # - Erlaube Listen bei add_component und add_assembly  (-> Nä Semester)
 # - Gute String Darstellung -> Ist so schon ok bisher? -> Nä Semester
 # - Export als GraphViz -> Nä Semeseter
 
-
-
-class ComponentCategory(Enum):
-    BATTERY = auto()
-    MOTOR = auto()
-    FRAME = auto()
-    WHEEL = auto()
-    AXLE = auto()
-    GEAR = auto()
-
-
 class AggregationLayer(Enum):
     SYSTEM = auto()
     ASSEMBLY = auto()
@@ -38,38 +29,31 @@ class AggregationLayer(Enum):
 
 
 class LegoComponent:
-    def __init__(
-        self,
-        name: str,
-        category: ComponentCategory,
-        lego_id: str,
-        cost: float,
-        mass: float,
-        delivery_time: int,
-        layer: AggregationLayer = AggregationLayer.COMPONENT,
-        **properties,
-    ) -> None:
+    def __init__(self, name: Optional[str] = None, datasheet: Optional[dict] = None, *more_properties: dict, **kwargs) -> None:
         self.uuid: uuid.UUID = uuid.uuid4()
         self.parent: None | LegoAssembly = None
-        self.name: str = name
-        self.category: ComponentCategory = category
-        self.lego_id: str = lego_id
-        self.cost: float = cost
-        self.mass: float = mass
-        self.delivery_time: int = delivery_time
-        self.layer: AggregationLayer = layer
-        self.properties: dict = properties
+        self.layer: AggregationLayer = AggregationLayer.COMPONENT
+        self.properties: dict = {}
+        if name is not None:
+            self.properties['name'] = name
+        if datasheet is not None:
+            self.properties.update(datasheet)
+            self.properties[]
+        for prop in more_properties:
+            if isinstance(prop, dict):
+                self.properties.update(prop)
+            else:
+                raise ValueError(f"Unexpected argument type: {type(more_properties)}")
+        for key, value in kwargs.items():
+            self.properties[key] = value
+
+
+
 
     def clone(self) -> LegoComponent:
         clone = LegoComponent(
-            self.name,
-            self.category,
-            self.lego_id,
-            self.cost,
-            self.mass,
-            self.delivery_time,
-            self.layer,
-            **self.properties,
+            None,
+            self.properties,
         )
         return clone
 
@@ -112,16 +96,18 @@ class LegoComponent:
 
     # TODO good repr representation
     def __repr__(self):
-        return f"LegoComponent {self.name} [{self.uuid}]"
+        return f"LegoComponent {self.properties['name']} [{self.uuid}]"
 
 
 class LegoAssembly:
-    def __init__(self, name: str, layer: AggregationLayer, **properties) -> None:
+    def __init__(self, layer: AggregationLayer, name: Optional[str] = None, *properties: dict , **kwargs) -> None:
         self.uuid: uuid.UUID = uuid.uuid4()
         self.parent: None | LegoAssembly = None
-        self.name: str = name
+        self.properties: dict = {}
+        if name is not None:
+            self.properties['name'] = name
         self.layer: AggregationLayer = layer
-        self.properties: dict = properties
+        self.properties.update(properties)
         self.components: List[LegoComponent] = []
         self.assemblies: List[LegoAssembly] = []
 
@@ -199,7 +185,7 @@ class LegoAssembly:
 
     # TODO find good string representation
     def __repr__(self):
-        return f"LegoAssembly {self.name} [{self.uuid}]"
+        return f"LegoAssembly {self.properties['name']} [{self.uuid}]"
 
 
 def print_assembly_tree(root, level=0, is_last=False):
@@ -222,11 +208,11 @@ def print_assembly_tree(root, level=0, is_last=False):
         component_padding += "├── " if i < len(root.components) - 1 else "└── "
         print(f"{component_padding}{item}")
 
-
+## TODO maybe add Components entry from dict?
 class KPIEncoder(json.JSONEncoder):
     def default(self, o):
         if isinstance(o, uuid.UUID):
             return "kpi-" + str(o)
-        if isinstance(o, (ComponentCategory, AggregationLayer)):
+        if isinstance(o, (AggregationLayer)):
             return "kpi-" + o.name
         return super().default(o)