diff --git a/src/language/ASTBuilder.cpp b/src/language/ASTBuilder.cpp
index 9ab4cd7a6be344f1c9d5d2bdc4e4ddd377584135..9e187baf3233e394575e987c6725e97e183d2081 100644
--- a/src/language/ASTBuilder.cpp
+++ b/src/language/ASTBuilder.cpp
@@ -7,6 +7,8 @@ using namespace TAO_PEGTL_NAMESPACE;
 
 #include <pegtl/contrib/parse_tree.hpp>
 
+#include <SymbolTable.hpp>
+
 using namespace language;
 
 struct ASTBuilder::rearrange : parse_tree::apply<ASTBuilder::rearrange>
@@ -203,7 +205,9 @@ struct ASTBuilder::simplify_stream_statement : parse_tree::apply<ASTBuilder::sim
 template <typename Rule>
 using selector =
   parse_tree::selector<Rule,
-                       parse_tree::store_content::on<true_kw,
+                       parse_tree::store_content::on<import_instruction,
+                                                     module_name,
+                                                     true_kw,
                                                      false_kw,
                                                      integer,
                                                      real,
@@ -266,7 +270,15 @@ template <typename InputT>
 std::unique_ptr<ASTNode>
 ASTBuilder::build(InputT& input)
 {
-  return parse_tree::parse<language::grammar, ASTNode, selector, nothing, language::errors>(input);
+  std::unique_ptr root_node = parse_tree::parse<language::grammar, ASTNode, selector, nothing, language::errors>(input);
+
+  // build initial symbol tables
+  std::shared_ptr function_table = std::make_shared<FunctionTable>();
+  std::shared_ptr symbol_table   = std::make_shared<SymbolTable>(function_table);
+
+  root_node->m_symbol_table = symbol_table;
+
+  return root_node;
 }
 
 template std::unique_ptr<ASTNode> ASTBuilder::build(read_input<>& input);
diff --git a/src/language/ASTModulesImporter.cpp b/src/language/ASTModulesImporter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0b4b07cd9065baf03e7f503daf00776ccb1b210c
--- /dev/null
+++ b/src/language/ASTModulesImporter.cpp
@@ -0,0 +1,34 @@
+#include <ASTModulesImporter.hpp>
+
+#include <ASTSymbolTableBuilder.hpp>
+#include <SymbolTable.hpp>
+
+#include <PEGGrammar.hpp>
+
+void
+ASTModulesImporter::_importModule(ASTNode& import_node)
+{
+  Assert(import_node.is<language::import_instruction>());
+
+  std::cout << " * importing '" << rang::fgB::green << import_node.children[0]->string() << rang::style::reset
+            << "' module\n";
+}
+
+void
+ASTModulesImporter::_importAllModules(ASTNode& node)
+{
+  if (node.is<language::import_instruction>()) {
+    this->_importModule(node);
+  } else {
+    for (auto& child : node.children) {
+      this->_importAllModules(*child);
+    }
+  }
+}
+
+ASTModulesImporter::ASTModulesImporter(ASTNode& root_node)
+{
+  Assert(root_node.is_root());
+  this->_importAllModules(root_node);
+  std::cout << " - loaded modules\n";
+}
diff --git a/src/language/ASTModulesImporter.hpp b/src/language/ASTModulesImporter.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..1d9c49c738e132ab8955b9e7d53b05ff6c3c1376
--- /dev/null
+++ b/src/language/ASTModulesImporter.hpp
@@ -0,0 +1,19 @@
+#ifndef AST_MODULES_IMPORTER_HPP
+#define AST_MODULES_IMPORTER_HPP
+
+#include <ASTNode.hpp>
+
+class ASTModulesImporter
+{
+  void _importModule(ASTNode& import_node);
+  void _importAllModules(ASTNode& node);
+
+ public:
+  ASTModulesImporter(ASTNode& root_node);
+
+  ASTModulesImporter(const ASTModulesImporter&) = delete;
+
+  ~ASTModulesImporter() = default;
+};
+
+#endif   // AST_MODULES_IMPORTER_HPP
diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp
index 035eb5c02899b9897d2eadc74580d514f18a9470..b90b5b00554612a8c0b14094aa2df1fd5fd40ab1 100644
--- a/src/language/ASTNodeDataTypeBuilder.cpp
+++ b/src/language/ASTNodeDataTypeBuilder.cpp
@@ -14,7 +14,12 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n)
     n.m_data_type = ASTNodeDataType::void_t;
   } else {
     if (n.has_content()) {
-      if (n.is<language::true_kw>() or n.is<language::false_kw>()) {
+      if (n.is<language::import_instruction>()) {
+        n.m_data_type = ASTNodeDataType::void_t;
+      } else if (n.is<language::module_name>()) {
+        n.m_data_type = ASTNodeDataType::string_t;
+
+      } else if (n.is<language::true_kw>() or n.is<language::false_kw>()) {
         n.m_data_type = ASTNodeDataType::bool_t;
       } else if (n.is<language::real>()) {
         n.m_data_type = ASTNodeDataType::double_t;
diff --git a/src/language/ASTNodeDeclarationCleaner.cpp b/src/language/ASTNodeDeclarationCleaner.cpp
deleted file mode 100644
index 7e2f139f92036df30dc7391a4d2681dd94041b6b..0000000000000000000000000000000000000000
--- a/src/language/ASTNodeDeclarationCleaner.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <ASTNodeDeclarationCleaner.hpp>
-
-#include <PEGGrammar.hpp>
-#include <PugsAssert.hpp>
-
-#include <stack>
-
-void
-ASTNodeDeclarationCleaner::_removeDeclarationNode(ASTNode& n)
-{
-  std::stack<size_t> declaration_ids;
-  for (size_t i_child = 0; i_child < n.children.size(); ++i_child) {
-    if (n.children[i_child]->is<language::declaration>() or n.children[i_child]->is<language::let_declaration>()) {
-      declaration_ids.push(i_child);
-    }
-  }
-
-  while (declaration_ids.size() > 0) {
-    size_t i_removed = declaration_ids.top();
-    declaration_ids.pop();
-    for (size_t i = i_removed; i + 1 < n.children.size(); ++i) {
-      n.children[i] = std::move(n.children[i + 1]);
-    }
-    n.children.pop_back();
-  }
-
-  for (auto& child : n.children) {
-    this->_removeDeclarationNode(*child);
-  }
-}
-
-ASTNodeDeclarationCleaner::ASTNodeDeclarationCleaner(ASTNode& n)
-{
-  Assert(n.is_root());
-  this->_removeDeclarationNode(n);
-}
diff --git a/src/language/ASTNodeDeclarationCleaner.hpp b/src/language/ASTNodeDeclarationCleaner.hpp
deleted file mode 100644
index 422f1e910324763c23e96c65ae26ed4b67c259b8..0000000000000000000000000000000000000000
--- a/src/language/ASTNodeDeclarationCleaner.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef AST_NODE_DECLARATION_CLEANER_HPP
-#define AST_NODE_DECLARATION_CLEANER_HPP
-
-#include <ASTNode.hpp>
-
-class ASTNodeDeclarationCleaner
-{
- private:
-  void _removeDeclarationNode(ASTNode& node);
-
- public:
-  ASTNodeDeclarationCleaner(ASTNode& root_node);
-};
-
-#endif   // AST_NODE_DECLARATION_CLEANER_HPP
diff --git a/src/language/ASTNodeTypeCleaner.hpp b/src/language/ASTNodeTypeCleaner.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..8521baa2fe3b89c121fcce9a680e623483b7b7b5
--- /dev/null
+++ b/src/language/ASTNodeTypeCleaner.hpp
@@ -0,0 +1,46 @@
+#ifndef AST_NODE_DECLARATION_CLEANER_HPP
+#define AST_NODE_DECLARATION_CLEANER_HPP
+
+#include <ASTNode.hpp>
+#include <PEGGrammar.hpp>
+#include <PugsAssert.hpp>
+
+#include <stack>
+
+template <typename NodeType>
+class ASTNodeTypeCleaner
+{
+ private:
+  void
+  _removeDeclarationNode(ASTNode& node)
+  {
+    std::stack<size_t> declaration_ids;
+    for (size_t i_child = 0; i_child < node.children.size(); ++i_child) {
+      if (node.children[i_child]->is<NodeType>()) {
+        declaration_ids.push(i_child);
+      }
+    }
+
+    while (declaration_ids.size() > 0) {
+      size_t i_removed = declaration_ids.top();
+      declaration_ids.pop();
+      for (size_t i = i_removed; i + 1 < node.children.size(); ++i) {
+        node.children[i] = std::move(node.children[i + 1]);
+      }
+      node.children.pop_back();
+    }
+
+    for (auto& child : node.children) {
+      this->_removeDeclarationNode(*child);
+    }
+  }
+
+ public:
+  ASTNodeTypeCleaner(ASTNode& root_node)
+  {
+    Assert(root_node.is_root());
+    this->_removeDeclarationNode(root_node);
+  }
+};
+
+#endif   // AST_NODE_DECLARATION_CLEANER_HPP
diff --git a/src/language/ASTSymbolTableBuilder.cpp b/src/language/ASTSymbolTableBuilder.cpp
index 9220c662210f1c97a4f556a0a14592c41e956a84..67fb348c2561049cea11c6dd2bcffa2a23f78eb4 100644
--- a/src/language/ASTSymbolTableBuilder.cpp
+++ b/src/language/ASTSymbolTableBuilder.cpp
@@ -84,11 +84,7 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>
 ASTSymbolTableBuilder::ASTSymbolTableBuilder(ASTNode& node)
 {
   Assert(node.is_root());
-  std::shared_ptr function_table = std::make_shared<FunctionTable>();
-  std::shared_ptr symbol_table   = std::make_shared<SymbolTable>(function_table);
 
-  node.m_symbol_table = symbol_table;
-
-  this->buildSymbolTable(node, symbol_table);
+  this->buildSymbolTable(node, node.m_symbol_table);
   std::cout << " - checked symbols declaration\n";
 }
diff --git a/src/language/CMakeLists.txt b/src/language/CMakeLists.txt
index 1e6777998f93cd2de07d1e416413d2725ae44a0c..5c6cc784b1b3bfb8568c9fbd65b4b99e41e8e9db 100644
--- a/src/language/CMakeLists.txt
+++ b/src/language/CMakeLists.txt
@@ -9,13 +9,13 @@ add_library(
   PugsLanguage
   ASTBuilder.cpp
   ASTDotPrinter.cpp
+  ASTModulesImporter.cpp
   ASTNodeAffectationExpressionBuilder.cpp
   ASTNodeBinaryOperatorExpressionBuilder.cpp
   ASTNodeDataType.cpp
   ASTNodeDataTypeBuilder.cpp
   ASTNodeDataTypeChecker.cpp
   ASTNodeDeclarationToAffectationConverter.cpp
-  ASTNodeDeclarationCleaner.cpp
   ASTNodeEmptyBlockCleaner.cpp
   ASTNodeExpressionBuilder.cpp
   ASTNodeFunctionExpressionBuilder.cpp
diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp
index d59d532101504e208d07ae51fd8c445b2ec740d5..5603fa424012cf3ae4f23ac2b03b0c1e04aab5c1 100644
--- a/src/language/PugsParser.cpp
+++ b/src/language/PugsParser.cpp
@@ -19,6 +19,8 @@
 #include <PEGGrammar.hpp>
 #include <SymbolTable.hpp>
 
+#include <ASTModulesImporter.hpp>
+
 #include <ASTNodeDataTypeBuilder.hpp>
 #include <ASTNodeDataTypeChecker.hpp>
 
@@ -31,8 +33,8 @@
 
 #include <ASTNodeEmptyBlockCleaner.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTDotPrinter.hpp>
 #include <ASTPrinter.hpp>
@@ -54,6 +56,9 @@ parser(const std::string& filename)
   try {
     root_node = ASTBuilder::build(input);
 
+    ASTModulesImporter{*root_node};
+    ASTNodeTypeCleaner<language::import_instruction>{*root_node};
+
     ASTSymbolTableBuilder{*root_node};
 
     ASTSymbolInitializationChecker{*root_node};
@@ -76,7 +81,10 @@ parser(const std::string& filename)
 
     // optimizations
     ASTNodeDeclarationToAffectationConverter{*root_node};
-    ASTNodeDeclarationCleaner{*root_node};
+
+    ASTNodeTypeCleaner<language::declaration>{*root_node};
+    ASTNodeTypeCleaner<language::let_declaration>{*root_node};
+
     ASTNodeEmptyBlockCleaner{*root_node};
 
     ASTNodeExpressionBuilder{*root_node};
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index e3cdf5ea9ad08377eb167ef805a10887bdc70e42..4199526b7cc9f1e6cc481fded1ef94556361535f 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -15,12 +15,12 @@ add_executable (unit_tests
   test_ASTNodeDataType.cpp
   test_ASTNodeDataTypeBuilder.cpp
   test_ASTNodeDataTypeChecker.cpp
-  test_ASTNodeDeclarationCleaner.cpp
   test_ASTNodeDeclarationToAffectationConverter.cpp
   test_ASTNodeExpressionBuilder.cpp
   test_ASTNodeIncDecExpressionBuilder.cpp
   test_ASTNodeJumpPlacementChecker.cpp
   test_ASTNodeListProcessor.cpp
+  test_ASTNodeTypeCleaner.cpp
   test_ASTNodeUnaryOperatorExpressionBuilder.cpp
   test_ASTNodeValueBuilder.cpp
   test_ASTPrinter.cpp
diff --git a/tests/test_ASTNodeAffectationExpressionBuilder.cpp b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
index 4a1be1371ec36dd9552abd1467941ca4c3e1ef32..ea531b67a2c19cf19acac3f311553a75283fe7ce 100644
--- a/tests/test_ASTNodeAffectationExpressionBuilder.cpp
+++ b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -34,7 +34,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
                                                                                                     \
@@ -195,7 +195,7 @@ N n="foo";
         ASTNodeValueBuilder{*ast};
 
         ASTNodeDeclarationToAffectationConverter{*ast};
-        ASTNodeDeclarationCleaner{*ast};
+        ASTNodeTypeCleaner<language::declaration>{*ast};
 
         REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
       }
@@ -281,7 +281,7 @@ Z z="foo";
         ASTNodeValueBuilder{*ast};
 
         ASTNodeDeclarationToAffectationConverter{*ast};
-        ASTNodeDeclarationCleaner{*ast};
+        ASTNodeTypeCleaner<language::declaration>{*ast};
 
         REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
       }
@@ -367,7 +367,7 @@ R r="foo";
         ASTNodeValueBuilder{*ast};
 
         ASTNodeDeclarationToAffectationConverter{*ast};
-        ASTNodeDeclarationCleaner{*ast};
+        ASTNodeTypeCleaner<language::declaration>{*ast};
 
         REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
       }
@@ -579,7 +579,7 @@ string s="foo"; s-="bar";
       ASTNodeValueBuilder{*ast};
 
       ASTNodeDeclarationToAffectationConverter{*ast};
-      ASTNodeDeclarationCleaner{*ast};
+      ASTNodeTypeCleaner<language::declaration>{*ast};
 
       REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
     }
@@ -641,7 +641,7 @@ string s="foo"; s*=2;
       ASTNodeValueBuilder{*ast};
 
       ASTNodeDeclarationToAffectationConverter{*ast};
-      ASTNodeDeclarationCleaner{*ast};
+      ASTNodeTypeCleaner<language::declaration>{*ast};
 
       REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
     }
@@ -703,7 +703,7 @@ string s="foo"; s/="bar";
       ASTNodeValueBuilder{*ast};
 
       ASTNodeDeclarationToAffectationConverter{*ast};
-      ASTNodeDeclarationCleaner{*ast};
+      ASTNodeTypeCleaner<language::declaration>{*ast};
 
       REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
     }
diff --git a/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp b/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
index 6e886f45059a04360b2456688d88939323798f87..0aa28cbe68bc1c6950ad86a48da2974739c5ca90 100644
--- a/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
+++ b/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -34,7 +34,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
                                                                                                     \
@@ -57,7 +57,7 @@
     ASTNodeValueBuilder{*ast};                                                                  \
                                                                                                 \
     ASTNodeDeclarationToAffectationConverter{*ast};                                             \
-    ASTNodeDeclarationCleaner{*ast};                                                            \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                            \
                                                                                                 \
     REQUIRE_THROWS(ASTNodeExpressionBuilder{*ast}, Catch::Matchers::Contains(expected_output)); \
   }
diff --git a/tests/test_ASTNodeExpressionBuilder.cpp b/tests/test_ASTNodeExpressionBuilder.cpp
index d27c0927211731d479d2f9da30790454608c07d0..017f3f39779cbe504e770ea0b64b393c72dde3a9 100644
--- a/tests/test_ASTNodeExpressionBuilder.cpp
+++ b/tests/test_ASTNodeExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
     std::stringstream ast_output;                                                                   \
diff --git a/tests/test_ASTNodeIncDecExpressionBuilder.cpp b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
index 87ee58b8425136b09dce69e2d02ea1078fcfb2ca..11e270b867d1afe327a178a9f057293ddd17e7e4 100644
--- a/tests/test_ASTNodeIncDecExpressionBuilder.cpp
+++ b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -34,7 +34,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
                                                                                                     \
diff --git a/tests/test_ASTNodeListProcessor.cpp b/tests/test_ASTNodeListProcessor.cpp
index c5f36f50682fa94447331dc36ffeab52105c8304..ed0748188e22a12ecadc0459491888a358e70f80 100644
--- a/tests/test_ASTNodeListProcessor.cpp
+++ b/tests/test_ASTNodeListProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTSymbolTableBuilder.hpp>
 
@@ -36,7 +36,7 @@ true;
   ASTNodeValueBuilder{*ast};
 
   ASTNodeDeclarationToAffectationConverter{*ast};
-  ASTNodeDeclarationCleaner{*ast};
+  ASTNodeTypeCleaner<language::declaration>{*ast};
 
   ASTNodeExpressionBuilder{*ast};
   ExecUntilBreakOrContinue exec_policy;
diff --git a/tests/test_ASTNodeDeclarationCleaner.cpp b/tests/test_ASTNodeTypeCleaner.cpp
similarity index 94%
rename from tests/test_ASTNodeDeclarationCleaner.cpp
rename to tests/test_ASTNodeTypeCleaner.cpp
index b92864235060bb94e25a3d3f44940484574f92b8..02da34b90672ecca41d7a1e2dab405c135e65e07 100644
--- a/tests/test_ASTNodeDeclarationCleaner.cpp
+++ b/tests/test_ASTNodeTypeCleaner.cpp
@@ -5,7 +5,7 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTSymbolTableBuilder.hpp>
 
@@ -23,7 +23,7 @@
     ASTNodeDataTypeBuilder{*ast};                                                              \
     ASTNodeValueBuilder{*ast};                                                                 \
                                                                                                \
-    ASTNodeDeclarationCleaner{*ast};                                                           \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                           \
                                                                                                \
     std::stringstream ast_output;                                                              \
     ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::none}}; \
@@ -31,7 +31,7 @@
     REQUIRE(ast_output.str() == expected_output);                                              \
   }
 
-TEST_CASE("ASTNodeDeclarationCleaner", "[language]")
+TEST_CASE("ASTNodeTypeCleaner", "[language]")
 {
   SECTION("no declaration")
   {
diff --git a/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp b/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
index b05998e6b01bf88e0e5f102fede359cbfb9e7109..5ea6a3461391a5dcec9ff433fda664dba241c461 100644
--- a/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
+++ b/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -34,7 +34,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
                                                                                                     \
diff --git a/tests/test_AffectationProcessor.cpp b/tests/test_AffectationProcessor.cpp
index 2ce8f79be9fb0c5ff6c80aef8e3f11d26d399248..b9c2a033c16d9792d83f76382a9de8abcee91bda 100644
--- a/tests/test_AffectationProcessor.cpp
+++ b/tests/test_AffectationProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
@@ -61,7 +61,7 @@
     ASTNodeValueBuilder{*ast};                                                               \
                                                                                              \
     ASTNodeDeclarationToAffectationConverter{*ast};                                          \
-    ASTNodeDeclarationCleaner{*ast};                                                         \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                         \
                                                                                              \
     REQUIRE_THROWS(ASTNodeExpressionBuilder{*ast},                                           \
                    Catch::Matchers::Contains("invalid operands to affectation expression")); \
diff --git a/tests/test_AffectationToStringProcessor.cpp b/tests/test_AffectationToStringProcessor.cpp
index 18831ae213724dd423528b417326655f21242cdf..bdd384762b3210753663ede8ea38a1275837b9e7 100644
--- a/tests/test_AffectationToStringProcessor.cpp
+++ b/tests/test_AffectationToStringProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_BinaryExpressionProcessor_utils.hpp b/tests/test_BinaryExpressionProcessor_utils.hpp
index c6d7a8bd67b67935d636fec49810295272be1772..d442a67631681b69a793c00d38e8625dc2338561 100644
--- a/tests/test_BinaryExpressionProcessor_utils.hpp
+++ b/tests/test_BinaryExpressionProcessor_utils.hpp
@@ -6,8 +6,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -33,7 +33,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_ConcatExpressionProcessor.cpp b/tests/test_ConcatExpressionProcessor.cpp
index 3baa9c59ff2c49480f0e8eefde4ca19b683c998f..7bcfc0a1d4cab9c3cb24081c0913875a5be91cef 100644
--- a/tests/test_ConcatExpressionProcessor.cpp
+++ b/tests/test_ConcatExpressionProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_DoWhileProcessor.cpp b/tests/test_DoWhileProcessor.cpp
index 8cbc13823f9ab159ca41d02f14ba98865432ddbe..9ccf21e37f0e553fc9d3d1cbb1662867c30e0968 100644
--- a/tests/test_DoWhileProcessor.cpp
+++ b/tests/test_DoWhileProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_ForProcessor.cpp b/tests/test_ForProcessor.cpp
index 9f0371d0697f01f5401b8be687e11988e7887b1a..4261a8193fcbe672494152cc717bb2e50f76f434 100644
--- a/tests/test_ForProcessor.cpp
+++ b/tests/test_ForProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_IfProcessor.cpp b/tests/test_IfProcessor.cpp
index 5e6014b750cab1c305b0c91fb475aba868c89323..4ec5973522d37b986575b08f76c9cd3913f69590 100644
--- a/tests/test_IfProcessor.cpp
+++ b/tests/test_IfProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_IncDecExpressionProcessor.cpp b/tests/test_IncDecExpressionProcessor.cpp
index 3cba4f9012fc9e50db061730ff58b9db8b94ede5..0562c3f3180248aa9fec2bb98ba4474a992e9445 100644
--- a/tests/test_IncDecExpressionProcessor.cpp
+++ b/tests/test_IncDecExpressionProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_NameProcessor.cpp b/tests/test_NameProcessor.cpp
index 4152b3ae03189b62d1ecf4f93c8ac4ac498efbf9..cd7374ae773106b164a522806e4af934cd0f6db7 100644
--- a/tests/test_NameProcessor.cpp
+++ b/tests/test_NameProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -40,7 +40,7 @@ n = 2;
   ASTNodeValueBuilder{*ast};
 
   ASTNodeDeclarationToAffectationConverter{*ast};
-  ASTNodeDeclarationCleaner{*ast};
+  ASTNodeTypeCleaner<language::declaration>{*ast};
 
   ASTNodeExpressionBuilder{*ast};
   ExecUntilBreakOrContinue exec_policy;
diff --git a/tests/test_OStreamProcessor.cpp b/tests/test_OStreamProcessor.cpp
index be958502a5b6e62d01c458405e4440eca792c20d..1f135831298c7311da18681dca6f568eb9688672 100644
--- a/tests/test_OStreamProcessor.cpp
+++ b/tests/test_OStreamProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -46,7 +46,7 @@ _replaceOStream(ASTNode& node, std::ostringstream& sout)
     ASTNodeValueBuilder{*ast};                                \
                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};           \
-    ASTNodeDeclarationCleaner{*ast};                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};          \
                                                               \
     ASTNodeExpressionBuilder{*ast};                           \
     ExecUntilBreakOrContinue exec_policy;                     \
diff --git a/tests/test_UnaryExpressionProcessor.cpp b/tests/test_UnaryExpressionProcessor.cpp
index 7947f3f60fcd0af1020245fd37ff0ed312f36c1b..5c6a694369721726227ad15d6b6640718d34db6d 100644
--- a/tests/test_UnaryExpressionProcessor.cpp
+++ b/tests/test_UnaryExpressionProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_WhileProcessor.cpp b/tests/test_WhileProcessor.cpp
index 9d58d96e0402eb7e93841ea1dd83f87673809c86..b94cd973804728f214cde41f6efd89c112837b53 100644
--- a/tests/test_WhileProcessor.cpp
+++ b/tests/test_WhileProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \