diff --git a/VirtualRobot/CMakeLists.txt b/VirtualRobot/CMakeLists.txt
index ee93d870b78ce85c9aeafbea4de12d1ea3a8f2e8..01a073a4b51957fceae1eb381f1b4e0e71ff8d73 100644
--- a/VirtualRobot/CMakeLists.txt
+++ b/VirtualRobot/CMakeLists.txt
@@ -309,8 +309,6 @@ SET(SOURCES
     
     MJCF/Document.cpp
     MJCF/elements.cpp
-    MJCF/elements/Attribute.cpp
-    MJCF/elements/Element.cpp
     MJCF/elements/actuator.cpp
     MJCF/elements/asset.cpp
     MJCF/elements/body.cpp
@@ -318,15 +316,17 @@ SET(SOURCES
     MJCF/elements/custom.cpp
     MJCF/elements/default.cpp
     MJCF/elements/equality.cpp
-    MJCF/elements/exceptions.cpp
     MJCF/elements/keyframe.cpp
-    MJCF/elements/mjcf_utils.cpp
     MJCF/elements/option.cpp
     MJCF/elements/sensor.cpp
     MJCF/elements/size.cpp
     MJCF/elements/statistic.cpp
     MJCF/elements/tendon.cpp
     MJCF/elements/visual.cpp
+    MJCF/elements/core/Attribute.cpp
+    MJCF/elements/core/Element.cpp
+    MJCF/elements/core/exceptions.cpp
+    MJCF/elements/core/mjcf_utils.cpp
     
     Nodes/CameraSensor.cpp
     Nodes/CameraSensorFactory.cpp
@@ -513,8 +513,6 @@ SET(INCLUDES
     
     MJCF/Document.h
     MJCF/elements.h
-    MJCF/elements/Attribute.h
-    MJCF/elements/Element.h
     MJCF/elements/actuator.h
     MJCF/elements/asset.h
     MJCF/elements/body.h
@@ -522,9 +520,7 @@ SET(INCLUDES
     MJCF/elements/custom.h
     MJCF/elements/default.h
     MJCF/elements/equality.h
-    MJCF/elements/exceptions.h
     MJCF/elements/keyframe.h
-    MJCF/elements/mjcf_utils.h
     MJCF/elements/option.h
     MJCF/elements/sensor.h
     MJCF/elements/size.h
@@ -532,6 +528,10 @@ SET(INCLUDES
     MJCF/elements/tendon.h
     MJCF/elements/visual.h
     MJCF/elements/has_member.hpp
+    MJCF/elements/core/Attribute.h
+    MJCF/elements/core/Element.h
+    MJCF/elements/core/exceptions.h
+    MJCF/elements/core/mjcf_utils.h
     
     Nodes/CameraSensor.h
     Nodes/CameraSensorFactory.h
diff --git a/VirtualRobot/MJCF/elements/asset.h b/VirtualRobot/MJCF/elements/asset.h
index bd9d25bc2f3f5a043fd3685042a184b2f1d29050..4887a3fbc636f71f08fc8298a5835adda088a30d 100644
--- a/VirtualRobot/MJCF/elements/asset.h
+++ b/VirtualRobot/MJCF/elements/asset.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 
 namespace mjcf
diff --git a/VirtualRobot/MJCF/elements/body.h b/VirtualRobot/MJCF/elements/body.h
index 15a781e7b6b936780ce68b5e76b95c229eb8830b..9385c1d72aa7064276c42b3d54ba056ea94d6019 100644
--- a/VirtualRobot/MJCF/elements/body.h
+++ b/VirtualRobot/MJCF/elements/body.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 
 namespace mjcf
diff --git a/VirtualRobot/MJCF/elements/compiler.h b/VirtualRobot/MJCF/elements/compiler.h
index 05492996327db790ce4d0363af5933ceb196fa09..639606a6bf8890d8f7855e536ddf61bdebb66dff 100644
--- a/VirtualRobot/MJCF/elements/compiler.h
+++ b/VirtualRobot/MJCF/elements/compiler.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 namespace mjcf
 {
diff --git a/VirtualRobot/MJCF/elements/contact.h b/VirtualRobot/MJCF/elements/contact.h
index f5bbe7bfb313d595b38b0a25a44512b10a62115f..7287f5ea7937346f3226607ca3549ccba55b4e93 100644
--- a/VirtualRobot/MJCF/elements/contact.h
+++ b/VirtualRobot/MJCF/elements/contact.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 #include "body.h"
 
 
diff --git a/VirtualRobot/MJCF/elements/Attribute.cpp b/VirtualRobot/MJCF/elements/core/Attribute.cpp
similarity index 100%
rename from VirtualRobot/MJCF/elements/Attribute.cpp
rename to VirtualRobot/MJCF/elements/core/Attribute.cpp
diff --git a/VirtualRobot/MJCF/elements/Attribute.h b/VirtualRobot/MJCF/elements/core/Attribute.h
similarity index 100%
rename from VirtualRobot/MJCF/elements/Attribute.h
rename to VirtualRobot/MJCF/elements/core/Attribute.h
diff --git a/VirtualRobot/MJCF/elements/Element.cpp b/VirtualRobot/MJCF/elements/core/Element.cpp
similarity index 100%
rename from VirtualRobot/MJCF/elements/Element.cpp
rename to VirtualRobot/MJCF/elements/core/Element.cpp
diff --git a/VirtualRobot/MJCF/elements/Element.h b/VirtualRobot/MJCF/elements/core/Element.h
similarity index 98%
rename from VirtualRobot/MJCF/elements/Element.h
rename to VirtualRobot/MJCF/elements/core/Element.h
index 034f71ce1968c51187a60e31fb1acab4ddfe97e2..44b5c7a35cd8314099be2f221b4478bfbbccff7f 100644
--- a/VirtualRobot/MJCF/elements/Element.h
+++ b/VirtualRobot/MJCF/elements/core/Element.h
@@ -13,7 +13,6 @@ namespace mjcf
     // Forward declaration.
     class Document;
     
-    
     template <class _Derived>
     class Element
     {
@@ -148,6 +147,9 @@ namespace mjcf
         Document& document() { return *_document; }
         const Document& document() const  { return *_document; }
         
+        tinyxml2::XMLElement* element() { return elem; }
+        const tinyxml2::XMLElement* element() const { return elem; }
+        
         
     private:
 
@@ -364,7 +366,7 @@ namespace mjcf
     template <class D>
     void Element<D>::assertElemValueEqualsTag()
     {
-        if (elem)
+        if (elem && !Derived::Tag.empty())
         {
             VR_ASSERT_MESSAGE(elem->Value() == Derived::tag, 
                               "Element tag '" + std::string(elem->Value()) + "' must be '" + Derived::tag + "'");
diff --git a/VirtualRobot/MJCF/elements/exceptions.cpp b/VirtualRobot/MJCF/elements/core/exceptions.cpp
similarity index 100%
rename from VirtualRobot/MJCF/elements/exceptions.cpp
rename to VirtualRobot/MJCF/elements/core/exceptions.cpp
diff --git a/VirtualRobot/MJCF/elements/exceptions.h b/VirtualRobot/MJCF/elements/core/exceptions.h
similarity index 100%
rename from VirtualRobot/MJCF/elements/exceptions.h
rename to VirtualRobot/MJCF/elements/core/exceptions.h
diff --git a/VirtualRobot/MJCF/elements/mjcf_utils.cpp b/VirtualRobot/MJCF/elements/core/mjcf_utils.cpp
similarity index 100%
rename from VirtualRobot/MJCF/elements/mjcf_utils.cpp
rename to VirtualRobot/MJCF/elements/core/mjcf_utils.cpp
diff --git a/VirtualRobot/MJCF/elements/mjcf_utils.h b/VirtualRobot/MJCF/elements/core/mjcf_utils.h
similarity index 100%
rename from VirtualRobot/MJCF/elements/mjcf_utils.h
rename to VirtualRobot/MJCF/elements/core/mjcf_utils.h
diff --git a/VirtualRobot/MJCF/elements/custom.h b/VirtualRobot/MJCF/elements/custom.h
index 56d302f8950535d1bf9fa8796f7c1b35c5592a34..2a75c50d53211f0dec946c4f45d4d8639fb595dd 100644
--- a/VirtualRobot/MJCF/elements/custom.h
+++ b/VirtualRobot/MJCF/elements/custom.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 namespace mjcf
 {
diff --git a/VirtualRobot/MJCF/elements/default.h b/VirtualRobot/MJCF/elements/default.h
index 826c170171163eadd0cc4dc44141f8083013508f..1eacf2fb8eead5635e44ff7654ad22f1cc91fbae 100644
--- a/VirtualRobot/MJCF/elements/default.h
+++ b/VirtualRobot/MJCF/elements/default.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 
 namespace mjcf
diff --git a/VirtualRobot/MJCF/elements/equality.h b/VirtualRobot/MJCF/elements/equality.h
index 1550a50cf5124dabc119d7fd23169f069d63c697..c7d33602a2cb8ba3b19c66bf3bfdc43991e929bd 100644
--- a/VirtualRobot/MJCF/elements/equality.h
+++ b/VirtualRobot/MJCF/elements/equality.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 
 namespace mjcf
diff --git a/VirtualRobot/MJCF/elements/keyframe.h b/VirtualRobot/MJCF/elements/keyframe.h
index c4ff60b1319e978ae851eb38ec65f541f1ef5638..0867ff7014e3500e9af436355ec302e732e5c8f1 100644
--- a/VirtualRobot/MJCF/elements/keyframe.h
+++ b/VirtualRobot/MJCF/elements/keyframe.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 namespace mjcf
 {
diff --git a/VirtualRobot/MJCF/elements/option.h b/VirtualRobot/MJCF/elements/option.h
index b673dfcdd76828b46f238970899f9b3364fa2fec..1dce69eeee39881aa7e97091b100703d38f52c8f 100644
--- a/VirtualRobot/MJCF/elements/option.h
+++ b/VirtualRobot/MJCF/elements/option.h
@@ -1,7 +1,7 @@
 #pragma once
 
-#include "Attribute.h"
-#include "mjcf_utils.h"
+#include "core/Attribute.h"
+#include "core/mjcf_utils.h"
 
 namespace mjcf
 {
diff --git a/VirtualRobot/MJCF/elements/sensor.h b/VirtualRobot/MJCF/elements/sensor.h
index f9122689cc932cdb6e4df2b20277c03d4df21690..3a775270bbee1049a6127742cd4949f76a263cdf 100644
--- a/VirtualRobot/MJCF/elements/sensor.h
+++ b/VirtualRobot/MJCF/elements/sensor.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 namespace mjcf
 {
diff --git a/VirtualRobot/MJCF/elements/size.h b/VirtualRobot/MJCF/elements/size.h
index 1dffaa63e61a527dd43c519ca1a1e6335c989f89..1b70617f605b3f0ed34b48d4189549c9ffb85959 100644
--- a/VirtualRobot/MJCF/elements/size.h
+++ b/VirtualRobot/MJCF/elements/size.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 namespace mjcf
 {
diff --git a/VirtualRobot/MJCF/elements/statistic.h b/VirtualRobot/MJCF/elements/statistic.h
index 543b6d1135ca45e9db65a9bb804146711e01b4cd..85976bf9d6b979ee134c21f87c7233192b705268 100644
--- a/VirtualRobot/MJCF/elements/statistic.h
+++ b/VirtualRobot/MJCF/elements/statistic.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 namespace mjcf
 {
diff --git a/VirtualRobot/MJCF/elements/tendon.h b/VirtualRobot/MJCF/elements/tendon.h
index 671cfa636629d7bd02e380738bd31d6520e76595..f923b72028d41d6868d4388af195fa388677c493 100644
--- a/VirtualRobot/MJCF/elements/tendon.h
+++ b/VirtualRobot/MJCF/elements/tendon.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 namespace mjcf
 {
diff --git a/VirtualRobot/MJCF/elements/visual.h b/VirtualRobot/MJCF/elements/visual.h
index d52ffe2a64c2a2129363f720ee8c3a84c0a8197a..ed4e2537a5d0ddfa740fd15808aa56f050cbdc54 100644
--- a/VirtualRobot/MJCF/elements/visual.h
+++ b/VirtualRobot/MJCF/elements/visual.h
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "Attribute.h"
+#include "core/Attribute.h"
 
 namespace mjcf
 {