diff --git a/src/language/ASTNodeAffectationExpressionBuilder.cpp b/src/language/ASTNodeAffectationExpressionBuilder.cpp
index 38e6f9802f90c324df42d30e7ef40ccdc05a8a77..b78871b88d0b45a6cea8255b7f5f78dbdfbf6f2f 100644
--- a/src/language/ASTNodeAffectationExpressionBuilder.cpp
+++ b/src/language/ASTNodeAffectationExpressionBuilder.cpp
@@ -198,6 +198,27 @@ ASTNodeAffectationExpressionBuilder::ASTNodeAffectationExpressionBuilder(ASTNode
       }
     };
 
+    auto set_affectation_processor_for_embedded_data = [&](const ASTNodeDataType& data_type) {
+      using OperatorT = std::decay_t<decltype(operator_v)>;
+
+      if constexpr (std::is_same_v<OperatorT, language::eq_op>) {
+        switch (data_type) {
+        case ASTNodeDataType::type_id_t: {
+          n.m_node_processor = std::make_unique<AffectationProcessor<OperatorT, EmbeddedData, EmbeddedData>>(n);
+          break;
+        }
+          // LCOV_EXCL_START
+        default: {
+          throw parse_error("unexpected error: undefined operand type for string affectation",
+                            std::vector{n.children[1]->begin()});
+        }
+          // LCOV_EXCL_STOP
+        }
+      } else {
+        throw parse_error("invalid operator for '" + data_type.typeName() + "' affectation", std::vector{n.begin()});
+      }
+    };
+
     auto set_affectation_processor_for_value = [&](const ASTNodeDataType& value_type) {
       const ASTNodeDataType data_type = n.children[1]->m_data_type;
 
@@ -244,6 +265,10 @@ ASTNodeAffectationExpressionBuilder::ASTNodeAffectationExpressionBuilder(ASTNode
         set_affectation_processor_for_string_data(data_type);
         break;
       }
+      case ASTNodeDataType::type_id_t: {
+        set_affectation_processor_for_embedded_data(data_type);
+        break;
+      }
       default: {
         throw parse_error("unexpected error: undefined value type for affectation", std::vector{n.begin()});
       }
diff --git a/src/language/CMakeLists.txt b/src/language/CMakeLists.txt
index 683ef786049fc0e0c43c424f05e02687c365d056..b04b00c14356938a706749756dda7f7ce6653e20 100644
--- a/src/language/CMakeLists.txt
+++ b/src/language/CMakeLists.txt
@@ -40,9 +40,12 @@ add_library(
 
 # Additional dependencies
 add_dependencies(PugsLanguage
-  PugsUtils)
+  PugsUtils
+  PugsMesh)
+
+include_directories("${PUGS_SOURCE_DIR}/src/mesh"
+  "${PUGS_SOURCE_DIR}/src/algebra")
 
-#add_dependencies(PugsMesh)
 
 # ------------------- Installation --------------------
 # temporary version workaround
diff --git a/src/language/MeshModule.cpp b/src/language/MeshModule.cpp
index 60c038b1f9994e1428d7fd8779ed06ac829c59d1..85e2f74e5e1cab868b5d7b29a1dc59a2438d9318 100644
--- a/src/language/MeshModule.cpp
+++ b/src/language/MeshModule.cpp
@@ -3,6 +3,9 @@
 #include <BuiltinFunctionEmbedder.hpp>
 #include <TypeDescriptor.hpp>
 
+#include <GmshReader.hpp>
+#include <Mesh.hpp>
+
 class IMesh;
 
 template <>
@@ -15,10 +18,11 @@ MeshModule::MeshModule()
 
   this->_addBuiltinFunction("readGmsh", std::make_shared<BuiltinFunctionEmbedder<std::shared_ptr<IMesh>, std::string>>(
                                           std::function<std::shared_ptr<IMesh>(std::string)>{
-                                            [](std::string s) -> std::shared_ptr<IMesh> {
-                                              std::cout << "evaluating 'readGmsh' using argument '" << rang::fg::yellow
-                                                        << s << rang::style::reset << "'\n";
 
-                                              return {};
-                                            }}));
+                                            [](std::string file_name) -> std::shared_ptr<IMesh> {
+                                              GmshReader gmsh_reader(file_name);
+                                              return gmsh_reader.mesh();
+                                            }}
+
+                                          ));
 }
diff --git a/src/main.cpp b/src/main.cpp
index 93ff1e39f0d3ad18c556d141f91754dcc1d4c211..000377ea2d320d4a4df4acf53fb93efb89e63d93 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -37,7 +37,9 @@ main(int argc, char* argv[])
 
   std::regex gmsh_regex("(.*).msh");
   if (not std::regex_match(filename, gmsh_regex)) {
+    SynchronizerManager::create();
     parser(filename);
+    SynchronizerManager::destroy();
     return 0;
   }
 
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 3801492358455b25801deabedf2eed2fae6e6ac4..429774f72f17c22b80974e5790d33c6f500ea3a5 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -82,6 +82,7 @@ add_executable (mpi_unit_tests
 
 target_link_libraries (unit_tests
   PugsLanguage
+  PugsMesh
   PugsUtils
   kokkos
   ${PARMETIS_LIBRARIES}
@@ -91,6 +92,7 @@ target_link_libraries (unit_tests
 
 target_link_libraries (mpi_unit_tests
   PugsUtils
+  PugsMesh
   kokkos
   ${PARMETIS_LIBRARIES}
   ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES}