diff --git a/pystencilssfg/configuration.py b/pystencilssfg/configuration.py
index f2f53a692e739a32fcb6a6f21ebd061713905985..4bb45599938aca88238b34619cfe72e892eac775 100644
--- a/pystencilssfg/configuration.py
+++ b/pystencilssfg/configuration.py
@@ -1,9 +1,12 @@
 from __future__ import annotations
 
-from typing import List, Sequence
+from typing import List, Sequence, Any
 from enum import Enum, auto
 from dataclasses import dataclass, replace, asdict, InitVar
 from argparse import ArgumentParser
+from os import path
+
+import importlib
 
 from jinja2.filters import do_indent
 
@@ -60,6 +63,9 @@ class SfgConfiguration:
     output_directory: str = None
     """Directory to which the generated files should be written."""
 
+    project_info: Any = None
+    """Object for managing project-specific information. To be set by the configurator script."""
+
     def __post_init__(self, cfg_src: SfgConfigSource = None):
         if self.header_only:
             raise SfgConfigException(cfg_src, "Header-only code generation is not implemented yet.")
@@ -88,7 +94,21 @@ DEFAULT_CONFIG = SfgConfiguration(
 
 
 def run_configurator(configurator_script: str):
-    raise NotImplementedError()
+    if not path.exists(configurator_script):
+        raise SfgConfigException(SfgConfigSource.PROJECT,
+                                 f"Configurator script not found: {configurator_script} is not a file.")
+    
+    cfg_spec = importlib.util.spec_from_file_location(configurator_script)
+    configurator = importlib.util.module_from_spec(cfg_spec)
+
+    if not hasattr(project_config, "sfg_config"):
+        raise SfgConfigException(SfgConfigSource.PROJECT, "Project configurator does not define function `sfg_config`.")
+
+    project_config = configurator.sfg_config()
+    if not isinstance(project_config, SfgConfiguration):
+        raise SfgConfigException(SfgConfigSource.PROJECT, "sfg_config did not return a SfgConfiguration object.")
+    
+    return project_config
 
 
 def add_config_args_to_parser(parser: ArgumentParser):