diff --git a/src/libs/ivcore/resources/iv_system_attributes.xml b/src/libs/ivcore/resources/iv_system_attributes.xml
index ed1cd66f4b95b7f188e120ad5a7194ff52269d85..8c22c2a3d553f4ebeed9de28cd571402d1bb27e3 100644
--- a/src/libs/ivcore/resources/iv_system_attributes.xml
+++ b/src/libs/ivcore/resources/iv_system_attributes.xml
@@ -1,4 +1,9 @@
-<Attrs version="1.0">
+<Attrs version="1.1">
+    <Attr label="id" name="id" visible="false" editable="false">
+        <Type>
+            <String validator="\{[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\}"/>
+        </Type>
+    </Attr>
     <Attr label="Name" name="name">
         <Type>
             <String validator="[a-zA-Z][a-zA-Z0-9_]*"/>
diff --git a/src/libs/shared/veobject.cpp b/src/libs/shared/veobject.cpp
index cd9a80ddc9953962e0c4155bf99529ed88779550..8410ceeccd3e51c5cba10d5183aeec03b57b72b5 100644
--- a/src/libs/shared/veobject.cpp
+++ b/src/libs/shared/veobject.cpp
@@ -21,17 +21,18 @@
 
 #include <QVector>
 
+static const QString ID = QLatin1String("id");
+
 namespace shared {
 
 struct VEObjectPrivate {
     VEObjectPrivate(const shared::Id &id)
-        : m_id(id == shared::InvalidId ? shared::createId() : id)
-        , m_attrs()
+        : m_attrs()
         , m_model(nullptr)
     {
+        m_attrs.insert(ID, EntityAttribute(ID, id == shared::InvalidId ? shared::createId() : id, EntityAttribute::Type::Attribute));
     }
 
-    const shared::Id m_id;
     EntityAttributes m_attrs;
     VEModel *m_model;
 };
@@ -50,7 +51,7 @@ VEObject::~VEObject() {}
 
 shared::Id VEObject::id() const
 {
-    return d->m_id;
+    return entityAttribute(ID).value<QUuid>();
 }
 
 EntityAttributes VEObject::entityAttributes() const
@@ -99,7 +100,7 @@ QVariant VEObject::entityAttributeValue(const QString &name, const QVariant &def
 
 void VEObject::removeEntityAttribute(const QString &attributeName)
 {
-    if (!attributeName.isEmpty() && d->m_attrs.remove(attributeName))
+    if (!attributeName.isEmpty() && attributeName != ID && d->m_attrs.remove(attributeName))
         Q_EMIT attributeChanged(attributeName);
 }
 
@@ -160,7 +161,9 @@ void VEObject::setAttributeImpl(const QString &name, const QVariant &value, Enti
 
 void VEObject::clearAttributes()
 {
+    const EntityAttribute attr = d->m_attrs.take(ID);
     d->m_attrs.clear();
+    d->m_attrs.insert(ID, attr);
 }
 
 QVector<qint32> VEObject::coordinatesFromString(const QString &strCoordinates)