diff --git a/CMakeLists.txt b/CMakeLists.txt
index 02d061b2ca0d42e7c281ace0380a57266a5beac0..644e4a03a397b0770278d474501ad7ac788d7bb9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -395,6 +395,7 @@ target_link_libraries(
   PugsMesh
   PugsUtils
   PugsLanguage
+  PugsLanguageModules
   kokkos
   ${PARMETIS_LIBRARIES}
   ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES}
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 42d75ad7e7146554812cef242214d290903d8f31..0d6e8cbb996d4f6c18c9098bb9af7051c11b0dbf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -15,8 +15,5 @@ add_subdirectory(language)
 # Pugs mesh
 add_subdirectory(mesh)
 
-# Pugs mesh
-#add_subdirectory(mesh)
-
 # Pugs output
 #add_subdirectory(output)
diff --git a/src/language/ASTModulesImporter.hpp b/src/language/ASTModulesImporter.hpp
index 39080e38a2b14ed85050ba4540f1c4290e352760..3f8b695a4c80035182e130f8bce94ee111910698 100644
--- a/src/language/ASTModulesImporter.hpp
+++ b/src/language/ASTModulesImporter.hpp
@@ -2,7 +2,7 @@
 #define AST_MODULES_IMPORTER_HPP
 
 #include <language/ASTNode.hpp>
-#include <language/ModuleRepository.hpp>
+#include <language/modules/ModuleRepository.hpp>
 
 #include <set>
 #include <string>
diff --git a/src/language/CMakeLists.txt b/src/language/CMakeLists.txt
index dc667ea9c2282fcd4cf2a3169b1c774218479e87..7068b491137f4039fdd2d6c687e27a6850eabbbe 100644
--- a/src/language/CMakeLists.txt
+++ b/src/language/CMakeLists.txt
@@ -1,6 +1,7 @@
 # ------------------- Source files --------------------
 
 add_subdirectory(node_processor)
+add_subdirectory(modules)
 
 add_library(
   PugsLanguage
@@ -28,18 +29,12 @@ add_library(
   ASTPrinter.cpp
   ASTSymbolTableBuilder.cpp
   ASTSymbolInitializationChecker.cpp
-  BuiltinModule.cpp
   EmbeddedData.cpp
-  MathModule.cpp
-  MeshModule.cpp
-  VTKModule.cpp
-  ModuleRepository.cpp
   PugsParser.cpp)
 
 # Additional dependencies
 add_dependencies(PugsLanguage
-  PugsUtils
-  PugsMesh)
+  PugsUtils)
 
 # ------------------- Installation --------------------
 # temporary version workaround
diff --git a/src/language/BuiltinModule.cpp b/src/language/modules/BuiltinModule.cpp
similarity index 94%
rename from src/language/BuiltinModule.cpp
rename to src/language/modules/BuiltinModule.cpp
index 93908f66cec2e797b0bf69f4a5368b6a447fab92..d7729964da54a1209159a796eb9c9737c21ea70d 100644
--- a/src/language/BuiltinModule.cpp
+++ b/src/language/modules/BuiltinModule.cpp
@@ -1,4 +1,4 @@
-#include <language/BuiltinModule.hpp>
+#include <language/modules/BuiltinModule.hpp>
 
 #include <language/BuiltinFunctionEmbedder.hpp>
 #include <language/TypeDescriptor.hpp>
diff --git a/src/language/BuiltinModule.hpp b/src/language/modules/BuiltinModule.hpp
similarity index 95%
rename from src/language/BuiltinModule.hpp
rename to src/language/modules/BuiltinModule.hpp
index 575e2890cd76d4674713d431b16e1716924a6686..58424e868bd22936d877dec6060920affc39759c 100644
--- a/src/language/BuiltinModule.hpp
+++ b/src/language/modules/BuiltinModule.hpp
@@ -1,7 +1,7 @@
 #ifndef BUILTIN_MODULE_HPP
 #define BUILTIN_MODULE_HPP
 
-#include <language/IModule.hpp>
+#include <language/modules/IModule.hpp>
 
 class IBuiltinFunctionEmbedder;
 class TypeDescriptor;
diff --git a/src/language/modules/CMakeLists.txt b/src/language/modules/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..545278f586dffffe68bc7e293f0ce7752981d5d6
--- /dev/null
+++ b/src/language/modules/CMakeLists.txt
@@ -0,0 +1,14 @@
+# ------------------- Source files --------------------
+
+add_library(PugsLanguageModules
+  BuiltinModule.cpp
+  MathModule.cpp
+  MeshModule.cpp
+  ModuleRepository.cpp
+  VTKModule.cpp
+)
+
+
+add_dependencies(PugsLanguageModules
+  PugsUtils
+  PugsMesh)
diff --git a/src/language/IModule.hpp b/src/language/modules/IModule.hpp
similarity index 100%
rename from src/language/IModule.hpp
rename to src/language/modules/IModule.hpp
diff --git a/src/language/MathModule.cpp b/src/language/modules/MathModule.cpp
similarity index 99%
rename from src/language/MathModule.cpp
rename to src/language/modules/MathModule.cpp
index ea4aa3fe4a5e9efb05bd94fb2ec31aab34c8faad..ca3056da03bbeebfe725221803f05136f8e25ece 100644
--- a/src/language/MathModule.cpp
+++ b/src/language/modules/MathModule.cpp
@@ -1,4 +1,4 @@
-#include <language/MathModule.hpp>
+#include <language/modules/MathModule.hpp>
 
 #include <language/BuiltinFunctionEmbedder.hpp>
 
diff --git a/src/language/MathModule.hpp b/src/language/modules/MathModule.hpp
similarity index 84%
rename from src/language/MathModule.hpp
rename to src/language/modules/MathModule.hpp
index 165f1ab49d34b9f6070899b5e4e376d022ac7ff4..1f001e1938691c4227722adda9724c9d88f33137 100644
--- a/src/language/MathModule.hpp
+++ b/src/language/modules/MathModule.hpp
@@ -1,7 +1,7 @@
 #ifndef MATH_MODULE_HPP
 #define MATH_MODULE_HPP
 
-#include <language/BuiltinModule.hpp>
+#include <language/modules/BuiltinModule.hpp>
 
 class MathModule : public BuiltinModule
 {
diff --git a/src/language/MeshModule.cpp b/src/language/modules/MeshModule.cpp
similarity index 99%
rename from src/language/MeshModule.cpp
rename to src/language/modules/MeshModule.cpp
index b8e64da519aa99b49d6a8858d0f8b6bf01aa978b..23f44f8af7c0be033462b5965efd23463b3b9c64 100644
--- a/src/language/MeshModule.cpp
+++ b/src/language/modules/MeshModule.cpp
@@ -1,4 +1,4 @@
-#include <language/MeshModule.hpp>
+#include <language/modules/MeshModule.hpp>
 
 #include <language/BuiltinFunctionEmbedder.hpp>
 #include <language/FunctionTable.hpp>
diff --git a/src/language/MeshModule.hpp b/src/language/modules/MeshModule.hpp
similarity index 85%
rename from src/language/MeshModule.hpp
rename to src/language/modules/MeshModule.hpp
index b6ba74a0f34dd4fb54558c0ebd57d593123e64a2..33aa4b92d88576fdd69b4ab70aaa6afbeff3c3ba 100644
--- a/src/language/MeshModule.hpp
+++ b/src/language/modules/MeshModule.hpp
@@ -1,7 +1,7 @@
 #ifndef MESH_MODULE_HPP
 #define MESH_MODULE_HPP
 
-#include <language/BuiltinModule.hpp>
+#include <language/modules/BuiltinModule.hpp>
 #include <utils/PugsMacros.hpp>
 
 class MeshModule : public BuiltinModule
diff --git a/src/language/ModuleRepository.cpp b/src/language/modules/ModuleRepository.cpp
similarity index 93%
rename from src/language/ModuleRepository.cpp
rename to src/language/modules/ModuleRepository.cpp
index 4937fdc604e675c7270303490a9d4519fe7fbb12..5765979f84285f90cc22991726544effe6a95272 100644
--- a/src/language/ModuleRepository.cpp
+++ b/src/language/modules/ModuleRepository.cpp
@@ -1,11 +1,11 @@
-#include <language/ModuleRepository.hpp>
+#include <language/modules/ModuleRepository.hpp>
 
 #include <language/ASTNode.hpp>
 #include <language/BuiltinFunctionEmbedder.hpp>
-#include <language/MathModule.hpp>
-#include <language/MeshModule.hpp>
 #include <language/SymbolTable.hpp>
-#include <language/VTKModule.hpp>
+#include <language/modules/MathModule.hpp>
+#include <language/modules/MeshModule.hpp>
+#include <language/modules/VTKModule.hpp>
 #include <utils/PugsAssert.hpp>
 
 void
diff --git a/src/language/ModuleRepository.hpp b/src/language/modules/ModuleRepository.hpp
similarity index 96%
rename from src/language/ModuleRepository.hpp
rename to src/language/modules/ModuleRepository.hpp
index 140e920d207a040fae4c59c0461aba73c52bffc5..f928a1552563612ed77434e4295a2d31fb2969c1 100644
--- a/src/language/ModuleRepository.hpp
+++ b/src/language/modules/ModuleRepository.hpp
@@ -1,7 +1,7 @@
 #ifndef MODULE_REGISTRY_HPP
 #define MODULE_REGISTRY_HPP
 
-#include <language/IModule.hpp>
+#include <language/modules/IModule.hpp>
 
 #include <map>
 #include <memory>
diff --git a/src/language/VTKModule.cpp b/src/language/modules/VTKModule.cpp
similarity index 98%
rename from src/language/VTKModule.cpp
rename to src/language/modules/VTKModule.cpp
index 01eb1cabae4501f21067267f52f015ff7ada176b..7a482a9b2721ee0648c2b0188c404d729a1d82ee 100644
--- a/src/language/VTKModule.cpp
+++ b/src/language/modules/VTKModule.cpp
@@ -1,4 +1,4 @@
-#include <language/VTKModule.hpp>
+#include <language/modules/VTKModule.hpp>
 
 #include <language/BuiltinFunctionEmbedder.hpp>
 #include <language/TypeDescriptor.hpp>
diff --git a/src/language/VTKModule.hpp b/src/language/modules/VTKModule.hpp
similarity index 85%
rename from src/language/VTKModule.hpp
rename to src/language/modules/VTKModule.hpp
index 9adbe24e2db9a549423e322c5715ad721a735d08..1578fad811b7dae1181053317e891dbb865ad035 100644
--- a/src/language/VTKModule.hpp
+++ b/src/language/modules/VTKModule.hpp
@@ -1,7 +1,7 @@
 #ifndef VTK_MODULE_HPP
 #define VTK_MODULE_HPP
 
-#include <language/BuiltinModule.hpp>
+#include <language/modules/BuiltinModule.hpp>
 #include <utils/PugsMacros.hpp>
 
 class VTKModule : public BuiltinModule
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 4450b2b7a0a512b7bbfea5df091147139f382798..4c55eb2e5b5e9c41aef2a48caf4d152c97fe309c 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -85,6 +85,7 @@ add_executable (mpi_unit_tests
 
 target_link_libraries (unit_tests
   PugsLanguage
+  PugsLanguageModules
   PugsMesh
   PugsUtils
   kokkos
diff --git a/tests/test_BuiltinFunctionProcessor.cpp b/tests/test_BuiltinFunctionProcessor.cpp
index c3870ba94446ae312af3708c63fc38e1afa194f9..48c7ccb3439c95184a1049f957d250f302738f05 100644
--- a/tests/test_BuiltinFunctionProcessor.cpp
+++ b/tests/test_BuiltinFunctionProcessor.cpp
@@ -7,7 +7,7 @@
 #include <language/ASTNodeExpressionBuilder.hpp>
 #include <language/ASTNodeTypeCleaner.hpp>
 #include <language/ASTSymbolTableBuilder.hpp>
-#include <language/MathModule.hpp>
+#include <language/modules/MathModule.hpp>
 
 #define CHECK_BUILTIN_FUNCTION_EVALUATION_RESULT(data, variable_name, expected_value)                \
   {                                                                                                  \
diff --git a/tests/test_MathModule.cpp b/tests/test_MathModule.cpp
index 1adf3b825fd48a32a59b63402399a273b74f52aa..ae3db9dc5658569582c478919ddd61060a7d8e8f 100644
--- a/tests/test_MathModule.cpp
+++ b/tests/test_MathModule.cpp
@@ -1,7 +1,7 @@
 #include <catch2/catch.hpp>
 
 #include <language/BuiltinFunctionEmbedder.hpp>
-#include <language/MathModule.hpp>
+#include <language/modules/MathModule.hpp>
 
 // clazy:excludeall=non-pod-global-static