diff --git a/id/client.go b/id/client.go
index ed730d32abfbfc9149aa98cfe9aff4478b5aa136..db941c5ad54b539551193004674ac15f15d314be 100644
--- a/id/client.go
+++ b/id/client.go
@@ -55,3 +55,7 @@ func parseClientID(parts []string) (*ClientID, error) {
 	id.ClientID = parts[3]
 	return &id, nil
 }
+
+func NewClientID(spaceID, id string) *ID {
+	return &ID{Descriptor: &ClientID{SpaceID: SpaceID{SpaceID: spaceID}, ClientID: id}}
+}
diff --git a/id/collection.go b/id/collection.go
index 9829c7e628749988bd478d3e8b247f62a7e21975..e0f37585b41e77b58530cc50f249283beb6d8eca 100644
--- a/id/collection.go
+++ b/id/collection.go
@@ -54,3 +54,7 @@ func parseCollectionID(parts []string) (*CollectionID, error) {
 	id.EnvironmentID = *envID
 	return &id, nil
 }
+
+func NewCollectionID(spaceID, envID, id string) *ID {
+	return &ID{Descriptor: &CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: spaceID}, EnvironmentID: envID}, CollectionID: id}}
+}
diff --git a/id/environment.go b/id/environment.go
index e2acdb61cbbbe01328f04e0e5c42765e14b0256f..d42df3e658bc04ae70989d199257a7836bd30f00 100644
--- a/id/environment.go
+++ b/id/environment.go
@@ -55,3 +55,7 @@ func parseEnvironmentID(parts []string) (*EnvironmentID, error) {
 	id.SpaceID = *spaceID
 	return &id, nil
 }
+
+func NewEnvironmentID(spaceID, id string) *ID {
+	return &ID{Descriptor: &EnvironmentID{SpaceID: SpaceID{SpaceID: spaceID}, EnvironmentID: id}}
+}
diff --git a/id/field.go b/id/field.go
index e03361414ed66be2e02edf8d3d24c6a614870307..ca1577552dc7df38d555549ddfc53a51e70e63f1 100644
--- a/id/field.go
+++ b/id/field.go
@@ -55,3 +55,6 @@ func parseFieldID(parts []string) (*FieldID, error) {
 	id.FieldName = parts[9]
 	return &id, nil
 }
+func NewFieldID(spaceID, envID, collID, itemID, id string) *ID {
+	return &ID{Descriptor: &FieldID{ItemID: ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: spaceID}, EnvironmentID: envID}, CollectionID: collID}, ItemID: itemID}, FieldName: id}}
+}
diff --git a/id/item.go b/id/item.go
index add303f6c5409773fdb1e8c4d032f0cbd87903bf..70c3e7be95b517a85e07e487eb00f94f9f73e14f 100644
--- a/id/item.go
+++ b/id/item.go
@@ -55,3 +55,7 @@ func parseItemID(parts []string) (*ItemID, error) {
 	id.ItemID = parts[7]
 	return &id, nil
 }
+
+func NewItemID(spaceID, envID, collID, id string) *ID {
+	return &ID{Descriptor: &ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: spaceID}, EnvironmentID: envID}, CollectionID: collID}, ItemID: id}}
+}
diff --git a/id/organization.go b/id/organization.go
index 94c1b2dc35d8ed02ac2f2143dc16d165d329f936..fe9d22837977b486e78689ebee5f426bdee80fcf 100644
--- a/id/organization.go
+++ b/id/organization.go
@@ -43,3 +43,7 @@ func parseOrganizationID(parts []string) (*OrganizationID, error) {
 	id.OrganizationID = parts[1]
 	return &id, nil
 }
+
+func NewOrganizationID(id string) *ID {
+	return &ID{Descriptor: &OrganizationID{OrganizationID: id}}
+}
diff --git a/id/revision.go b/id/revision.go
index d956b4f89f6054019b4346f470a90b0565e07422..0cb417e132fe1683f1e53a081e7c6244820478df 100644
--- a/id/revision.go
+++ b/id/revision.go
@@ -55,3 +55,7 @@ func parseRevisionID(parts []string) (*RevisionID, error) {
 	id.RevisionID = parts[9]
 	return &id, nil
 }
+
+func NewRevisionID(spaceID, envID, collID, itemID, id string) *ID {
+	return &ID{Descriptor: &RevisionID{ItemID: ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: spaceID}, EnvironmentID: envID}, CollectionID: collID}, ItemID: itemID}, RevisionID: id}}
+}
diff --git a/id/role.go b/id/role.go
index d13062bbf19bcb39e8f35a05c2cd6bcd41e5180b..abb6537fc605d3f01f644a67a724cc81e3a6b54b 100644
--- a/id/role.go
+++ b/id/role.go
@@ -55,3 +55,7 @@ func parseRoleID(parts []string) (*RoleID, error) {
 	id.RoleID = parts[3]
 	return &id, nil
 }
+
+func NewRoleID(spaceID, id string) *ID {
+	return &ID{Descriptor: &RoleID{SpaceID: SpaceID{SpaceID: spaceID}, RoleID: id}}
+}
diff --git a/id/schema.go b/id/schema.go
index cc78c6d00f7ea8257fbdc0e661ecfde257afbb80..e3afee8c6cf29bca6cae1f1eedd72253c47362a5 100644
--- a/id/schema.go
+++ b/id/schema.go
@@ -54,3 +54,7 @@ func parseSchemaID(parts []string) (*SchemaID, error) {
 	id.CollectionID = parts[5]
 	return &id, nil
 }
+
+func NewSchemaID(spaceID, envID, id string) *ID {
+	return &ID{Descriptor: &SchemaID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: spaceID}, EnvironmentID: envID}, CollectionID: id}}
+}
diff --git a/id/service.go b/id/service.go
index 5583ae7d3fa59bc5ba6b5718a00337cb3b9375cd..23bb23aa500fbba082e1aae578eae6da5624a5b9 100644
--- a/id/service.go
+++ b/id/service.go
@@ -43,3 +43,7 @@ func parseServiceID(parts []string) (*ServiceID, error) {
 	id.ServiceID = parts[1]
 	return &id, nil
 }
+
+func NewServiceID(id string) *ID {
+	return &ID{Descriptor: &ServiceID{ServiceID: id}}
+}
diff --git a/id/space.go b/id/space.go
index fa6503ecb40cf7dc910df7c3d75af9d4f3b5c93c..39096673456d74462ef203b10814396fe48b2bcf 100644
--- a/id/space.go
+++ b/id/space.go
@@ -43,3 +43,6 @@ func parseSpaceID(parts []string) (*SpaceID, error) {
 	id.SpaceID = parts[1]
 	return &id, nil
 }
+func NewSpaceID(id string) *ID {
+	return &ID{Descriptor: &SpaceID{SpaceID: id}}
+}
diff --git a/id/system.go b/id/system.go
index 24d9737f1f6e987e098ec30bffd53a8545e6df43..de2f3c2571896e448f8aad17be32df58b73a6ea4 100644
--- a/id/system.go
+++ b/id/system.go
@@ -17,3 +17,6 @@ func parseSystemID(parts []string) (*SystemID, error) {
 	}
 	return &id, nil
 }
+func NewSystemID() *ID {
+	return &ID{Descriptor: &SystemID{}}
+}
diff --git a/id/user.go b/id/user.go
index 77832ce2ea2fe304a339d49642c0a6240d221d67..c76f6c9fa0e8ce440a1ef15e36bbb82a73301be5 100644
--- a/id/user.go
+++ b/id/user.go
@@ -43,3 +43,7 @@ func parseUserID(parts []string) (*UserID, error) {
 	id.UserID = parts[1]
 	return &id, nil
 }
+
+func NewUserID(id string) *ID {
+	return &ID{Descriptor: &UserID{UserID: id}}
+}