diff --git a/integration/CMakeDemo/CMakeLists.txt b/integration/CMakeDemo/CMakeLists.txt
index 54769ad514b4b4194511543e6ebf0e88debdcbff..6642f40e63368d7ad60b4dd602eaab8e737c1c71 100644
--- a/integration/CMakeDemo/CMakeLists.txt
+++ b/integration/CMakeDemo/CMakeLists.txt
@@ -5,12 +5,14 @@ project( pssfg_cmake_integration_test )
 set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${pssfg_cmake_integration_test_SOURCE_DIR}/.cmake )
 
 #   Don't try this at home!
+file(MAKE_DIRECTORY .cmake)
 execute_process( COMMAND sfg-cli cmake make-find-module
                  WORKING_DIRECTORY ${pssfg_cmake_integration_test_SOURCE_DIR}/.cmake )
 
 find_package( PystencilsSfg REQUIRED )
 
-# set( PSSFG_CONFIGURATOR_SCRIPT "codegen_config.py" )
+set( PystencilsSfg_CONFIGURATOR_SCRIPT codegen_config.py )
 
 add_library( genlib )
-pystencilssfg_generate_target_sources( genlib SCRIPTS kernels.py more_kernels.py FILE_EXTENSIONS .hpp .cpp )
+pystencilssfg_generate_target_sources( genlib SCRIPTS kernels.py FILE_EXTENSIONS .h .cpp )
+pystencilssfg_generate_target_sources( genlib SCRIPTS more_kernels.py )
diff --git a/integration/CMakeDemo/codegen_config.py b/integration/CMakeDemo/codegen_config.py
new file mode 100644
index 0000000000000000000000000000000000000000..67f309315f3b6bb95146d4be4a0e40dbd6b57d0e
--- /dev/null
+++ b/integration/CMakeDemo/codegen_config.py
@@ -0,0 +1,16 @@
+from sys import stderr
+from pystencilssfg import SfgConfiguration
+
+def sfg_config():
+    print("sfg_config() called!", file=stderr)
+
+    project_info = {
+        'B': 'A'
+    }
+
+    return SfgConfiguration(
+        header_extension='hpp',
+        source_extension='cpp',
+        base_namespace='cmake_demo',
+        project_info=project_info
+    )
diff --git a/src/pystencilssfg/__init__.py b/src/pystencilssfg/__init__.py
index 96c285db2461ef2dea5bbc6880c4e6c3f5eedcdd..88a635ffd96cfea562ef3ad344ddb0c8b3bfa2e2 100644
--- a/src/pystencilssfg/__init__.py
+++ b/src/pystencilssfg/__init__.py
@@ -1,8 +1,9 @@
+from .configuration import SfgConfiguration
 from .generator import SourceFileGenerator
 from .composer import SfgComposer
 
 __all__ = [
-    "SourceFileGenerator", "SfgComposer"
+    "SourceFileGenerator", "SfgComposer", "SfgConfiguration"
 ]
 
 from . import _version
diff --git a/src/pystencilssfg/cmake/modules/PystencilsSfg.cmake b/src/pystencilssfg/cmake/modules/PystencilsSfg.cmake
index b2d98f2160d6cbd3418ae2484904709289f5c770..26992cbb1e90fb5855248327c8233dcee9ff4a45 100644
--- a/src/pystencilssfg/cmake/modules/PystencilsSfg.cmake
+++ b/src/pystencilssfg/cmake/modules/PystencilsSfg.cmake
@@ -1,5 +1,4 @@
 
-set(PystencilsSfg_CONFIGURATOR_SCRIPT "" CACHE FILEPATH "Configurator script for the pystencils Source File Generator" )
 set(PystencilsSfg_GENERATED_SOURCES_DIR "${CMAKE_BINARY_DIR}/sfg_sources" CACHE PATH "Output directory for genenerated sources" )
 
 mark_as_advanced(PystencilsSfg_GENERATED_SOURCES_DIR)
@@ -19,7 +18,7 @@ function(_pssfg_add_gen_source target script)
     get_filename_component(basename ${script} NAME_WLE)
     cmake_path(ABSOLUTE_PATH script OUTPUT_VARIABLE scriptAbsolute)
 
-    execute_process(COMMAND ${Python_EXECUTABLE} -m pystencilssfg list-files "--sep=\;" --no-newline ${_pssfg_GENERATOR_ARGS} ${script}
+    execute_process(COMMAND ${Python_EXECUTABLE} -m pystencilssfg list-files "--sep=;" --no-newline ${_pssfg_GENERATOR_ARGS} ${script}
                     OUTPUT_VARIABLE generatedSources RESULT_VARIABLE _pssfg_result
                     ERROR_VARIABLE _pssfg_stderr)
 
@@ -29,7 +28,7 @@ function(_pssfg_add_gen_source target script)
 
     set(generatedSourcesAbsolute)
     foreach (filename ${generatedSources})
-        list(APPEND generatedSourcesAbsolute ${generatedSourcesDir}/${filename})
+        list(APPEND generatedSourcesAbsolute "${generatedSourcesDir}/${filename}")
     endforeach ()
 
     file(MAKE_DIRECTORY "${generatedSourcesDir}")
@@ -54,8 +53,9 @@ function(pystencilssfg_generate_target_sources TARGET)
         list(APPEND generatorArgs "--sfg-header-only")
     endif()
 
-    if(NOT (PystencilsSfg_CONFIGURATOR_SCRIPT STREQUAL ""))
-        list(APPEND generatorArgs "--sfg-configurator='${_PystencilsSfg_CONFIGURATOR_SCRIPT}'")
+    if(DEFINED PystencilsSfg_CONFIGURATOR_SCRIPT)
+        cmake_path(ABSOLUTE_PATH PystencilsSfg_CONFIGURATOR_SCRIPT OUTPUT_VARIABLE configscript)
+        list(APPEND generatorArgs "--sfg-configurator=${configscript}")
     endif()
 
     if(DEFINED _pssfg_FILE_EXTENSIONS)
diff --git a/src/pystencilssfg/configuration.py b/src/pystencilssfg/configuration.py
index 1de3a19ed7c8322eb902b614e43b2bd611dd3bf4..ee828f476e0a10e0aa664ee03a9acb8a10c6168a 100644
--- a/src/pystencilssfg/configuration.py
+++ b/src/pystencilssfg/configuration.py
@@ -1,6 +1,8 @@
 from __future__ import annotations
 
+import sys
 from typing import Sequence, Any
+from os import path
 from enum import Enum, auto
 from dataclasses import dataclass, replace, asdict, InitVar
 from argparse import ArgumentParser
@@ -77,7 +79,7 @@ class SfgConfiguration:
 
     def override(self, other: SfgConfiguration):
         other_dict = asdict(other)
-        other_dict = {k: v for k, v in other_dict.items() if v is not None}
+        other_dict: dict[str, Any] = {k: v for k, v in other_dict.items() if v is not None}
         return replace(self, **other_dict)
 
 
@@ -93,13 +95,16 @@ DEFAULT_CONFIG = SfgConfiguration(
 
 
 def run_configurator(configurator_script: str):
-    cfg_spec = iutil.spec_from_file_location(configurator_script)
+    cfg_modulename = path.splitext(path.split(configurator_script)[1])[0]
+
+    cfg_spec = iutil.spec_from_file_location(cfg_modulename, configurator_script)
 
     if cfg_spec is None:
         raise SfgConfigException(SfgConfigSource.PROJECT,
                                  f"Unable to load configurator script {configurator_script}")
 
     configurator = iutil.module_from_spec(cfg_spec)
+    cfg_spec.loader.exec_module(configurator)
 
     if not hasattr(configurator, "sfg_config"):
         raise SfgConfigException(SfgConfigSource.PROJECT, "Project configurator does not define function `sfg_config`.")