diff --git a/optimization_model.py b/optimization_model.py
index 31f2db652dda31c078e1d71b96b8b039fcc8185b..c999fa8b886cdfb2e04d907d9afa88b55497e797 100644
--- a/optimization_model.py
+++ b/optimization_model.py
@@ -94,13 +94,6 @@ class OptimizationBlock:
 
         return objectives
 
-    def extract_result(self, var_names):
-        result = EntityResult(var_names, self.dynamic)
-
-        result.extract_result(self)
-
-        return result
-
 
 class OptimizationModel(OptimizationBlock):
     def __init__(self, name, dynamic):
diff --git a/topology.py b/topology.py
index 550ce082357e5f29cab92720416777dd0e868f4a..9fdd0eeda950344868b1f7dcb0998280e825f3c9 100644
--- a/topology.py
+++ b/topology.py
@@ -25,6 +25,7 @@ THE SOFTWARE.
 from Model_Library.component.core import ComponentCommodity, ComponentKind
 from Model_Library.dynamics import AggregatedDynamic, TreeDynamic, TrivialDynamic
 from Model_Library.optimization_model import (
+    EntityResult,
     OptimizationBlock,
     OptimizationModel,
     VariableKind,
@@ -253,6 +254,8 @@ class Topology:
         if not model.is_ok():
             raise RuntimeError("Model is infeasible or unbounded!")
 
+        self.create_empty_entity_result(key, self._dynamic)
+
         self.extract_result(model, key)
 
     def build_model(self, dynamic, strategy):
@@ -495,12 +498,11 @@ class Topology:
 
         return operational_objectives
 
-    def extract_result(self, block, key):
+    def create_empty_entity_result(self, key, dynamic):
         for asset in self._assets.values():
-            asset_block = block.blocks[asset._name]
-            asset.extract_result(asset_block, key)
+            asset.create_empty_entity_result(key, dynamic)
 
-        if isinstance(block.dynamic, (TrivialDynamic, TreeDynamic)):
+        if isinstance(dynamic, (TrivialDynamic, TreeDynamic)):
             base_variable_names = []
             for component in self._components:
                 base_variable_names.extend(
@@ -513,16 +515,16 @@ class Topology:
             for flow in self._flows:
                 base_variable_names.append((flow, VariableKind.INDEXED))
 
-            result = block.extract_result(base_variable_names)
+            result = EntityResult(base_variable_names, dynamic)
 
-        elif isinstance(block.dynamic, (AggregatedDynamic)):
+        elif isinstance(dynamic, (AggregatedDynamic)):
             design_base_variable_names = []
             for component in self._components:
                 design_base_variable_names.extend(
                     self._components[component].design_base_variable_names()
                 )
 
-            result = block.extract_result(design_base_variable_names)
+            result = EntityResult(design_base_variable_names, dynamic)
 
             operational_base_variable_names = []
             for component in self._components:
@@ -533,21 +535,40 @@ class Topology:
             for flow in self._flows:
                 operational_base_variable_names.append((flow, VariableKind.INDEXED))
 
-            for period_index in range(len(block.dynamic.period_dynamics)):
-                period_block = block.blocks[str(period_index)]
-
-                period_result = period_block.extract_result(
-                    operational_base_variable_names
+            for period_index, period_dynamic in enumerate(dynamic.period_dynamics):
+                period_result = EntityResult(
+                    operational_base_variable_names, period_dynamic
                 )
 
                 result.add_sub_result(period_index, period_result)
 
         else:
-            raise ValueError(f"Invalid dynamic type {type(block.dynamic)}")
+            raise ValueError(f"Invalid dynamic type {type(dynamic)}")
 
         self._results[key] = result
         self._last_result_key = key
 
+    def extract_result(self, block, key):
+        for asset in self._assets.values():
+            asset_block = block.blocks[asset._name]
+            asset.extract_result(asset_block, key)
+
+        if isinstance(block.dynamic, (TrivialDynamic, TreeDynamic)):
+            self._results[key].extract_result(block)
+
+        elif isinstance(block.dynamic, (AggregatedDynamic)):
+            self._results[key].extract_result(block)
+
+            for period_index in range(len(block.dynamic.period_dynamics)):
+                period_block = block.blocks[str(period_index)]
+
+                self._results[key].sub_results[period_index].extract_result(
+                    period_block
+                )
+
+        else:
+            raise ValueError(f"Invalid dynamic type {type(block.dynamic)}")
+
     def save_results(self, path, keys=None):
         for asset in self._assets.values():
             asset.save_results(path, keys)