diff --git a/src/pystencilssfg/emission/file_printer.py b/src/pystencilssfg/emission/file_printer.py
new file mode 100644
index 0000000000000000000000000000000000000000..2dc1e7b4891c9dcfefff8dcfc7e6f68966d379bc
--- /dev/null
+++ b/src/pystencilssfg/emission/file_printer.py
@@ -0,0 +1,57 @@
+from __future__ import annotations
+from textwrap import indent
+
+from ..ir import (
+    SfgSourceFile,
+    SfgSourceFileType,
+    SfgNamespaceBlock,
+    SfgEntityDecl,
+    SfgEntityDef,
+)
+from ..ir.syntax import SfgNamespaceElement
+from ..config import CodeStyle
+
+
+class SfgFilePrinter:
+    def __init__(self, code_style: CodeStyle) -> None:
+        self._code_style = code_style
+
+    def __call__(self, file: SfgSourceFile) -> str:
+        code = ""
+
+        if file.file_type == SfgSourceFileType.HEADER:
+            code += "#pragma once\n"
+
+        if file.prelude:
+            comment = "/**\n"
+            comment += indent(file.prelude, " * ")
+            comment += "\n */\n\n"
+
+            code += comment
+
+        for header in file.includes:
+            incl = str(header) if header.system_header else f'"{str(header)}"'
+            code += f"#include {incl}\n"
+
+        if file.includes:
+            code += "\n"
+
+        #   Here begins the actual code
+        code += "\n\n".join(self.visit(elem) for elem in file.elements)
+        code += "\n"
+        return code
+
+    def visit(self, elem: SfgNamespaceElement) -> str:
+        match elem:
+            case str():
+                return elem
+            case SfgNamespaceBlock(name, elements):
+                code = f"namespace {name} {{\n"
+                code += self._code_style.indent(
+                    "\n\n".join(self.visit(e) for e in elements)
+                )
+                code += f"\n}} // namespace {name}"
+            case SfgEntityDecl(entity):
+                code += self.visit_decl(entity)
+            case SfgEntityDef(entity):
+                code += self.visit_defin(entity)
diff --git a/src/pystencilssfg/ir/syntax.py b/src/pystencilssfg/ir/syntax.py
index 2e924a032fe8c33d756a59fc62f9b5e6a2fdc732..42b705b46686a24dca8c181db6e54e8ee69fda8c 100644
--- a/src/pystencilssfg/ir/syntax.py
+++ b/src/pystencilssfg/ir/syntax.py
@@ -122,6 +122,8 @@ class SfgNamespaceBlock:
         parent: Parent namespace enclosing this namespace
     """
 
+    __match_args__ = ("name", "elements",)
+
     def __init__(self, namespace: SfgNamespace) -> None:
         self._namespace = namespace
         self._elements: list[SfgNamespaceElement] = []