diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/Gid.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/Gid.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a3acbee8744909d4657925ceb1cb122d4be96b1d
--- /dev/null
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/Gid.kt
@@ -0,0 +1,16 @@
+package unibz.cs.semint.kprime.domain
+
+import java.util.*
+
+// https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html#randomUUID()
+fun nextGid(): Gid = UUID.randomUUID().toString()
+
+// hexDigit 0-9,a-z,A-Z,'-'
+fun Gid.isValidGid(): Boolean {
+    if (this.isEmpty()) return false
+    if (this.length < 10) return false
+    if (!this.matches(Regex("[0-9a-zA-Z\\-]+"))) return false
+    return true
+}
+
+typealias  Gid = String
\ No newline at end of file
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/ddl/Database.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/ddl/Database.kt
index 52ce4a4d5d1ce90a0114fafa61545d2c87cb637d..de9a27ad4b7d22367378cf8c75177b3e5baa94b7 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/domain/ddl/Database.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/ddl/Database.kt
@@ -4,7 +4,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
+import unibz.cs.semint.kprime.domain.Gid
 import unibz.cs.semint.kprime.domain.dql.Query
+import unibz.cs.semint.kprime.domain.nextGid
 import java.util.*
 import javax.xml.bind.annotation.XmlElements
 import kotlin.collections.ArrayList
@@ -12,11 +14,14 @@ import kotlin.collections.ArrayList
 @JacksonXmlRootElement(localName = "database")
 open class Database () {
 
+    @JacksonXmlProperty(isAttribute = true)
+    var gid: Gid? = null
+
     @JacksonXmlProperty(isAttribute = true)
     var name: String =""
 
     @JacksonXmlProperty(isAttribute = true)
-    var id: String=""
+    var id: String = ""
 
     @JacksonXmlProperty(isAttribute = true)
     var author: String? = null
diff --git a/src/main/kotlin/unibz.cs.semint.kprime/domain/dml/ChangeSet.kt b/src/main/kotlin/unibz.cs.semint.kprime/domain/dml/ChangeSet.kt
index 3de103f21757076c613b730492b25b1803d91d18..ddc609e1d50ca2d37254f1ca319b7132347989ac 100644
--- a/src/main/kotlin/unibz.cs.semint.kprime/domain/dml/ChangeSet.kt
+++ b/src/main/kotlin/unibz.cs.semint.kprime/domain/dml/ChangeSet.kt
@@ -4,7 +4,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement
+import unibz.cs.semint.kprime.domain.Gid
 import unibz.cs.semint.kprime.domain.ddl.Database
+import unibz.cs.semint.kprime.domain.nextGid
 
 fun initChangeSet(alfa:ChangeSet.()->Unit):ChangeSet {
     val changeSet = ChangeSet()
@@ -14,6 +16,8 @@ fun initChangeSet(alfa:ChangeSet.()->Unit):ChangeSet {
 @JacksonXmlRootElement(localName = "changeSet")
 class ChangeSet() {
 
+    @JacksonXmlProperty(isAttribute = true)
+    var gid: Gid? = null
 
     @JacksonXmlProperty(isAttribute = true)
     var id: String = ""
@@ -66,7 +70,7 @@ class ChangeSet() {
     @JacksonXmlElementWrapper(useWrapping=false)
     var commands : MutableList<String>? = ArrayList()
 
-    infix fun withId(id:String) = apply {
+    infix fun withId(id:Gid) = apply {
         this.id=id
     }
 
diff --git a/src/test/kotlin/unibz.cs.semint.kprime/domain/GidTest.kt b/src/test/kotlin/unibz.cs.semint.kprime/domain/GidTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..755a5a3067a1831305e99a429115c3182434795b
--- /dev/null
+++ b/src/test/kotlin/unibz.cs.semint.kprime/domain/GidTest.kt
@@ -0,0 +1,22 @@
+package unibz.cs.semint.kprime.domain
+
+import org.junit.Test
+import java.util.*
+import kotlin.test.assertFalse
+import kotlin.test.assertTrue
+
+class GidTest {
+
+    @Test
+    fun test_gid() {
+        assertTrue("1234567890".isValidGid())
+        assertFalse("".isValidGid())
+        assertFalse("123456789".isValidGid())
+        // UUID 9c63265d-f068-46d4-83fb-48d10c6ea8d8
+        assertTrue(UUID.randomUUID().toString().isValidGid())
+        assertTrue(nextGid().isValidGid())
+        assertTrue("9c63265d-f068-46d4-83fb-48d10c6ea8d8".isValidGid())
+        assertFalse("9c63265d-f068-46d4-83fb+48d10c6ea8d8".isValidGid())
+        assertFalse("9c63265d%f068-46d4-83fb-48d10c6ea8d8".isValidGid())
+    }
+}
\ No newline at end of file
diff --git a/src/test/kotlin/unibz.cs.semint.kprime/usecase/serialize/YAMLSerializerDatabaseTest.kt b/src/test/kotlin/unibz.cs.semint.kprime/usecase/serialize/YAMLSerializerDatabaseTest.kt
index b1b1fd4080862cebb4e9236d30a245e375303382..5f2f318f2543f750cd95eb54b6b0411ffe053d58 100644
--- a/src/test/kotlin/unibz.cs.semint.kprime/usecase/serialize/YAMLSerializerDatabaseTest.kt
+++ b/src/test/kotlin/unibz.cs.semint.kprime/usecase/serialize/YAMLSerializerDatabaseTest.kt
@@ -27,6 +27,7 @@ class YAMLSerializerDatabaseTest {
         objectMapper.writeValue(outWriter,database)
         assertEquals("""
             ---
+            gid: null
             name: "dbname"
             id: "iddb"
             author: null