diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7c58d3d32dde4f89792c3e2e8a9c9457f04c9032..636876302549a50ac4151696d35f5981cb7aba47 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -7,20 +7,29 @@ stages:
 
 .bootstrap-axii:
   cache:
-    key: general-apt-cache
-    paths:
-      - .apt
+    - key: general-pip-cache
+      paths:
+        - .pip
+    - key: general-apt-cache
+      paths:
+        - .apt
 
   before_script:
     - export LC_ALL=C.UTF-8
     - export LANG=C.UTF-8
+    - source /etc/os-release
+
+    # Pip cache configuration.
+    - export PIP_CACHE_DIR="$CI_PROJECT_DIR/.pip"
+    - mkdir -p ".pip" || true
 
     # Apt cache configuration.
     - rm -rf /var/cache/apt/archives || true
     - rm -f /etc/apt/apt.conf.d/docker-clean  # Remove docker-clean script to avoid cache deletion.
-    - mkdir .apt || true
-    - ln -s "$CI_PROJECT_DIR/.apt" /var/cache/apt/archives
+    - mkdir -p ".apt/$VERSION_CODENAME" || true
+    - ln -s "$CI_PROJECT_DIR/.apt/$VERSION_CODENAME" /var/cache/apt/archives
 
+    # Apt preparation.
     - apt-get update -y
     - apt-get install sudo -y
 
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e12f7b62f46ebb99144e3f7a9f87e230edce3b7c..4928717f806f2e30ddd27931908cc64979d41c10 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,26 @@ This document accumulates all changes to Axii with the respective version
 ## Releases 23.01
 
 
+### Release [23.01.4.0](https://git.h2t.iar.kit.edu/sw/armarx/meta/axii/-/releases/23.01.4.0)
+
+**Update procedure**:
+
+- `axii self update`
+- (with workspace activated) `axii workspace verify`
+
+**Modules:**
+
+- `h2t/research_projects/eurobin/*`: Move euROBIN modules to external DB (@kartmann, !490, !492)
+- **New** `tools/nodejs/*`: Add modules for node and npm (@dreher, !489)
+- `armarx/skills/control`: Remove constraint of building project with 4 jobs (@dreher, !488)
+- **New** `armarx_integration/robots/armar6/*`: Add ARMAR-6 Models module (@dreher, !486)
+- **New** `deps/embedded_template_library`: Add embedded_template_library module (@pohl, !485)
+
+_Other:_
+
+- OS-specific apt CI caches and pip CI caches (@dreher, !487)
+
+
 ### Release [23.01.3.0](https://git.h2t.iar.kit.edu/sw/armarx/meta/axii/-/releases/23.01.3.0)
 
 **Update procedure**:
diff --git a/armarx_setup/__init__.py b/armarx_setup/__init__.py
index bd7ab2726c67a2cc0a60ca47235897e54f9a1123..6751921ea8d2d37e277aab77dd61e2ec2817c117 100644
--- a/armarx_setup/__init__.py
+++ b/armarx_setup/__init__.py
@@ -1,6 +1,6 @@
 """Global Axii variables."""
 
-__version__ = "23.01.3.0"
+__version__ = "23.01.4.0"
 
 import os
 
diff --git a/data/modules/armarx/skills/control.json b/data/modules/armarx/skills/control.json
index e8bbf1bfd70321f0595bdd95b3ba956900d6bd1d..77035467ee4323e60a5db9ca113c49b75f7a1949 100644
--- a/data/modules/armarx/skills/control.json
+++ b/data/modules/armarx/skills/control.json
@@ -1,6 +1,9 @@
 {
   "general": {
-    "url": "https://git.h2t.iar.kit.edu/sw/armarx/skills/control"
+    "url": "https://git.h2t.iar.kit.edu/sw/armarx/skills/control",
+    "authors": [
+      "Christian Dreher <c.dreher@kit.edu>"
+    ]
   },
 
   "update": {
@@ -8,6 +11,7 @@
       "h2t_gitlab_slug": "sw/armarx/skills/control"
     }
   },
+
   "prepare": {
     "cmake": {
       "project_name": "armarx_control",
@@ -17,14 +21,8 @@
       }
     }
   },
-  "build": {
-    "cmake": {
-      "env": {
-        "CMAKE_BUILD_PARALLEL_LEVEL": "4"
-      }
-    }
-  },
 
+  "build": "cmake",
 
   "features": {
     "mplib": "mplib",
diff --git a/data/modules/armarx_integration/robots/armar6.json b/data/modules/armarx_integration/robots/armar6.json
index 2ecb932bbaca2f1ea0c718b476fb5ae0665357e4..f255e532bec68d7ec95723e27291e064453a621f 100644
--- a/data/modules/armarx_integration/robots/armar6.json
+++ b/data/modules/armarx_integration/robots/armar6.json
@@ -1,5 +1,13 @@
 {
+  "general": {
+    "url": "https://git.h2t.iar.kit.edu/sw/armarx-integration/robots/armar6",
+    "authors": [
+      "Christian Dreher <c.dreher@kit.edu>"
+    ]
+  },
+
   "required_modules": {
+    "armarx_integration/robots/armar6/models": {},
     "armarx_integration/robots/armar6/rt": {},
     "armarx_integration/robots/armar6/skills": {}
   }
diff --git a/data/modules/armarx_integration/robots/armar6/models.json b/data/modules/armarx_integration/robots/armar6/models.json
new file mode 100644
index 0000000000000000000000000000000000000000..8d59e6b8634ced913264006c83da9d5c3f479ec7
--- /dev/null
+++ b/data/modules/armarx_integration/robots/armar6/models.json
@@ -0,0 +1,31 @@
+{
+  "general": {
+    "url": "https://git.h2t.iar.kit.edu/sw/armarx-integration/robots/armar6/models",
+    "authors": [
+      "Christian Dreher <c.dreher@kit.edu>"
+    ]
+  },
+
+  "update": {
+    "git": {
+      "h2t_gitlab_slug": "sw/armarx-integration/robots/armar6/models"
+    }
+  },
+
+  "prepare": {
+    "cmake": {
+      "project_name": "armar6_models",
+      "definitions": {
+        "CMAKE_C_COMPILER": "$ARMARX_C_COMPILER",
+        "CMAKE_CXX_COMPILER": "$ARMARX_CXX_COMPILER"
+      }
+    }
+  },
+
+  "build": "cmake",
+
+  "required_modules": {
+    "armarx/meta/compiler": {},
+    "armarx/ArmarXCore": {}
+  }
+}
diff --git a/data/modules/armarx_integration/robots/armar6/rt.json b/data/modules/armarx_integration/robots/armar6/rt.json
index 62a2c9477d9d25175cdae6ede0717d7f69638df4..ddc87e5af3be0f990b62beb0fd5df47e83d90bcd 100644
--- a/data/modules/armarx_integration/robots/armar6/rt.json
+++ b/data/modules/armarx_integration/robots/armar6/rt.json
@@ -1,6 +1,9 @@
 {
   "general": {
-    "url": "https://git.h2t.iar.kit.edu/sw/armarx-integration/robots/armar6/rt"
+    "url": "https://git.h2t.iar.kit.edu/sw/armarx-integration/robots/armar6/rt",
+    "authors": [
+      "Christian Dreher <c.dreher@kit.edu>"
+    ]
   },
 
   "update": {
@@ -8,6 +11,7 @@
       "h2t_gitlab_slug": "sw/armarx-integration/robots/armar6/rt"
     }
   },
+
   "prepare": {
     "cmake": {
       "project_name": "armar6_rt",
@@ -17,6 +21,7 @@
       }
     }
   },
+
   "build": "cmake",
 
   "required_modules": {
@@ -26,6 +31,8 @@
     "armarx/RobotAPI": {},
     "armarx/skills/control": {},
 
-    "armarx_integration/devices/ethercat": {}
+    "armarx_integration/devices/ethercat": {},
+
+    "armarx_integration/robots/armar6/models": {}
   }
 }
diff --git a/data/modules/armarx_integration/robots/armar6/skills.json b/data/modules/armarx_integration/robots/armar6/skills.json
index 0d23732a72869ddf6818bf5011d261984db7fc2a..05425a4a05d6fee9c38208bc926d5d49ab5a294e 100644
--- a/data/modules/armarx_integration/robots/armar6/skills.json
+++ b/data/modules/armarx_integration/robots/armar6/skills.json
@@ -1,6 +1,9 @@
 {
   "general": {
-    "url": "https://git.h2t.iar.kit.edu/sw/armarx-integration/robots/armar6/skills"
+    "url": "https://git.h2t.iar.kit.edu/sw/armarx-integration/robots/armar6/skills",
+    "authors": [
+      "Christian Dreher <c.dreher@kit.edu>"
+    ]
   },
 
   "update": {
@@ -8,6 +11,7 @@
       "h2t_gitlab_slug": "sw/armarx-integration/robots/armar6/skills"
     }
   },
+
   "prepare": {
     "cmake": {
       "project_name": "armar6_skills",
@@ -17,6 +21,7 @@
       }
     }
   },
+
   "build": "cmake",
 
   "required_modules": {
@@ -35,7 +40,9 @@
     "armarx/ArmarXSimulation": {},
     "armarx/skills/manipulation": {},
 
-    "armarx_integration/robots/armar6/rt": {}
+    "# TODO: Remove RT when models are moved from armar6::rt to armar6::models": null,
+    "armarx_integration/robots/armar6/rt": {},
+    "armarx_integration/robots/armar6/models": {}
   }
 
 }
diff --git a/data/modules/dbs/research_projects/eurobin.json b/data/modules/dbs/research_projects/eurobin.json
new file mode 100644
index 0000000000000000000000000000000000000000..e75c21173e165c5b44475ef2d52b01c7172365c8
--- /dev/null
+++ b/data/modules/dbs/research_projects/eurobin.json
@@ -0,0 +1,23 @@
+{
+
+  "general": {
+    "url": "https://git.h2t.iar.kit.edu/research-projects/eurobin/axii-database",
+    "authors": "Rainer Kartmann <rainer.kartmann@kit.edu>",
+    "database": {
+      "for_namespace": "h2t/research_projects/eurobin"
+    }
+  },
+
+  "update": {
+    "git": {
+      "h2t_gitlab_slug": "research-projects/eurobin/axii-database"
+    }
+  },
+
+  "install": {
+    "env": {
+      "ARMARX_MODULES": "$MODULE_PATH:$ARMARX_MODULES"
+    }
+  }
+
+}
diff --git a/data/modules/deps/embedded_template_library.json b/data/modules/deps/embedded_template_library.json
new file mode 100644
index 0000000000000000000000000000000000000000..bc7f09da2f3bd7cea82886381e92a2a9ec9a9009
--- /dev/null
+++ b/data/modules/deps/embedded_template_library.json
@@ -0,0 +1,37 @@
+{
+  "general": {
+    "url": "https://github.com/ETLCPP/etl",
+    "authors": "Christoph Pohl <pohl@kit.edu>"
+  },
+
+  "update": {
+    "git": {
+      "github_slug": "ETLCPP/etl"
+    }
+  },
+
+  "prepare": {
+    "cmake": {
+      "# project_name": "etl",
+      "definitions": {
+        "CMAKE_INSTALL_PREFIX": "install",
+        "CMAKE_C_COMPILER": "$ARMARX_C_COMPILER",
+        "CMAKE_CXX_COMPILER": "$ARMARX_CXX_COMPILER"
+      }
+    }
+  },
+
+  "build": "cmake",
+
+  "install": {
+    "cmake": {},
+    "env": {
+      "etl_DIR": "$MODULE_PATH/build/install/share/etl/cmake"
+    }
+  },
+
+  "required_modules": {
+    "tools/cmake/3.21": {},
+    "armarx/meta/compiler": {}
+  }
+}
diff --git a/data/modules/h2t/research_projects/eurobin.json b/data/modules/h2t/research_projects/eurobin.json
deleted file mode 100644
index ecce9ac58c0a3e0b5977537491341e98b194cc7d..0000000000000000000000000000000000000000
--- a/data/modules/h2t/research_projects/eurobin.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "required_modules": {
-    "h2t/research_projects/eurobin/wp2_skills": {}
-  }
-}
diff --git a/data/modules/h2t/research_projects/eurobin/wp2_skills.json b/data/modules/h2t/research_projects/eurobin/wp2_skills.json
deleted file mode 100644
index 4afd41a209eeeea5f839f6dc9ba44058ed7b6be3..0000000000000000000000000000000000000000
--- a/data/modules/h2t/research_projects/eurobin/wp2_skills.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "general": {
-    "url": "https://git.h2t.iar.kit.edu/research-projects/eurobin/wp2-skills"
-  },
-
-  "update": {
-    "git": {
-      "h2t_gitlab_slug": "research-projects/eurobin/communication"
-    }
-  },
-  "prepare": {
-    "cmake": {
-      "definitions": {
-        "CMAKE_C_COMPILER": "$ARMARX_C_COMPILER",
-        "CMAKE_CXX_COMPILER": "$ARMARX_CXX_COMPILER"
-      }
-    },
-    "# python": {
-      "packages": {
-        "python/activity_recognition": {
-          "install_editable": [
-            "$armarx__python3_armarx__PATH"
-          ]
-        }
-      }
-    }
-  },
-  "build": "cmake",
-
-  "required_modules": {
-    "armarx/meta/compiler": {},
-    "armarx/ArmarXCore": {},
-    "# armarx/python3-armarx": {},
-
-    "# armarx_integration/robots/armar6/skills": {},
-    "# armarx_integration/robots/armar7/skills": {}
-  }
-}
diff --git a/data/modules/tools/nodejs/16.19.json b/data/modules/tools/nodejs/16.19.json
new file mode 100644
index 0000000000000000000000000000000000000000..fcce84bef0f0dc57065e0ebc58c40567322f6394
--- /dev/null
+++ b/data/modules/tools/nodejs/16.19.json
@@ -0,0 +1,40 @@
+{
+  "general": {
+    "url": "https://nodejs.org/en/download/releases/",
+    "authors": [
+      "Christian Dreher <c.dreher@kit.edu>"
+    ]
+  },
+
+  "update": {
+    "download": {
+      "url": "https://nodejs.org/download/release/v16.18.1/node-v16.18.1-linux-x64.tar.xz",
+      "md5_checksum": "e580e257385ac9faa0c3ab1ca4dbb783"
+    }
+  },
+
+  "prepare": {
+    "extract": {
+      "file": "node-v16.18.1-linux-x64.tar.xz",
+      "extract_into": "$MODULE_PATH"
+    }
+  },
+
+  "install": {
+    "env": {
+      "NODE_16_18": "$MODULE_PATH/node-v16.18.1-linux-x64/bin/node",
+      "NPM_8_19": "$MODULE_PATH/node-v16.18.1-linux-x64/bin/npm"
+    },
+    "executables": {
+      "node-16.18": {
+        "exec": "$MODULE_PATH/node-v16.18.1-linux-x64/bin/node"
+      },
+      "npm-8.19": {
+        "pre_exec_commands": [
+          "export PATH=$MODULE_PATH/node-v16.18.1-linux-x64/bin:$PATH"
+        ],
+        "exec": "$MODULE_PATH/node-v16.18.1-linux-x64/bin/npm"
+      }
+    }
+  }
+}
diff --git a/data/modules/tools/nodejs/18.13.json b/data/modules/tools/nodejs/18.13.json
new file mode 100644
index 0000000000000000000000000000000000000000..f73cf709b67e7d6df2fc6754ef33328e6280f0d4
--- /dev/null
+++ b/data/modules/tools/nodejs/18.13.json
@@ -0,0 +1,40 @@
+{
+  "general": {
+    "url": "https://nodejs.org/en/download/releases/",
+    "authors": [
+      "Christian Dreher <c.dreher@kit.edu>"
+    ]
+  },
+
+  "update": {
+    "download": {
+      "url": "https://nodejs.org/download/release/v18.13.0/node-v18.13.0-linux-x64.tar.xz",
+      "md5_checksum": "e9c258601271fe0cce4a28d165ba43da"
+    }
+  },
+
+  "prepare": {
+    "extract": {
+      "file": "node-v18.13.0-linux-x64.tar.xz",
+      "extract_into": "$MODULE_PATH"
+    }
+  },
+
+  "install": {
+    "env": {
+      "NODE_18_13": "$MODULE_PATH/node-v18.13.0-linux-x64/bin/node",
+      "NPM_8_19": "$MODULE_PATH/node-v18.13.0-linux-x64/bin/npm"
+    },
+    "executables": {
+      "node-18.13": {
+        "exec": "$MODULE_PATH/node-v18.13.0-linux-x64/bin/node"
+      },
+      "npm-8.19": {
+        "pre_exec_commands": [
+          "export PATH=$MODULE_PATH/node-v18.13.0-linux-x64/bin:$PATH"
+        ],
+        "exec": "$MODULE_PATH/node-v18.13.0-linux-x64/bin/npm"
+      }
+    }
+  }
+}