diff --git a/src/Connected.Common.Workspace/Connected.Common.Workspace.Model.csproj b/src/Connected.Common.Workspace/Connected.Common.Workspace.Model.csproj
new file mode 100644
index 0000000..331aba1
--- /dev/null
+++ b/src/Connected.Common.Workspace/Connected.Common.Workspace.Model.csproj
@@ -0,0 +1,20 @@
+
+
+
+ net7.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Connected.Common.Workspace/IWorkspaceEntity.cs b/src/Connected.Common.Workspace/IWorkspaceEntity.cs
new file mode 100644
index 0000000..563f24e
--- /dev/null
+++ b/src/Connected.Common.Workspace/IWorkspaceEntity.cs
@@ -0,0 +1,114 @@
+using Connected.Common.Workspace.Messaging;
+using Connected.Entities.Consistency;
+using Connected.Security.Identity;
+
+namespace Connected.Common.Workspace;
+///
+/// Specifies the read state of the entity.
+///
+public enum ReadStatus
+{
+ ///
+ /// The entity has not been read by the .
+ ///
+ New = 0,
+ ///
+ /// The entity has been read by the .
+ ///
+ Read = 1
+}
+///
+/// Specifies what kind of actions can be performed by the identity on each entity.
+///
+[Flags]
+public enum IdentityVerbs
+{
+ ///
+ /// The entity is read only. Identity cannot perform any actions on it
+ /// except reading.
+ ///
+ ReadOnly = 0,
+ ///
+ /// The entity can be deleted from the workspace by the identity.
+ ///
+ AllowDelete = 1
+}
+///
+/// Represents a base entity for all workspace related entities.
+///
+///
+/// Digital Workspace offers many different services serving different purposes. Each service introduces
+/// its own set of entities. All top level entities inherits from this entity, for example .
+///
+public interface IWorkspaceEntity : IConsistentEntity
+{
+ ///
+ /// The type of identity to which workspace entity belongs to (like Recipient).
+ ///
+ ///
+ /// The most common type of the identity entity is .
+ ///
+ string IdentityEntity { get; init; }
+ ///
+ /// The id of the identity to which workspace entity belongs. This could be the id of the user,
+ /// device, organization unit or any other entity id.
+ ///
+ string IdentityId { get; init; }
+ ///
+ /// The date and time the workspace entity has been created.
+ ///
+ ///
+ /// This value can represent the value when the origin entity has been created or when
+ /// the workspace entity has been created. This value is specific to the service implementation.
+ ///
+ DateTimeOffset Created { get; init; }
+ ///
+ /// The date and time the workspace entity expires.
+ ///
+ ///
+ /// Expired workspace entities are automatically deleted from the system. If this value is null,
+ /// workspace entity never expires.
+ ///
+ DateTimeOffset? Expires { get; init; }
+ ///
+ /// The title of the entity.
+ ///
+ ///
+ /// This should be as short as possible so user can quickly recognize the nature of the entity.
+ ///
+ string Title { get; init; }
+ ///
+ /// The short description of the entity. Can be null.
+ ///
+ string? Description { get; init; }
+ ///
+ /// The read status of the entity. This serves primary for a UI purpose to enable visual feedback
+ /// to the user.
+ ///
+ ReadStatus Status { get; init; }
+ ///
+ /// The domain to which this entity belongs.
+ ///
+ ///
+ /// Each workspace entity should have one and only one domain to which it originates.
+ ///
+ string Domain { get; init; }
+ ///
+ /// Zero or more tags that represents additional meta data of the workspace entity.
+ ///
+ string? Tags { get; init; }
+ ///
+ /// The entity which triggered this workspace entity to be created. Can be null if it was
+ /// automatically generated by the underlying system.
+ ///
+ string? AuthorEntity { get; init; }
+ ///
+ /// The id of the entity which created this workspace entity. Can be null if it was
+ /// automatically generated by the underlying system.
+ ///
+ string? AuthorId { get; init; }
+ ///
+ /// Actions that can be performed by the identity on the workspace entity.
+ ///
+ IdentityVerbs Verbs { get; init; }
+}
diff --git a/src/Connected.Common.Workspace/Identities/IIdentity.cs b/src/Connected.Common.Workspace/Identities/IIdentity.cs
new file mode 100644
index 0000000..5e888a6
--- /dev/null
+++ b/src/Connected.Common.Workspace/Identities/IIdentity.cs
@@ -0,0 +1,22 @@
+using Connected.Data;
+
+namespace Connected.Common.Workspace.Identities;
+///
+/// Represents the workspace identity.
+///
+///
+/// Workspace supports identities through the . There could
+/// be any number of different identities, such as users or devices which are provided via
+/// different identity providers.
+///
+public interface IIdentity : IPrimaryKey
+{
+ ///
+ /// The display name of the identity. This should be short and descriptive.
+ ///
+ string DisplayName { get; init; }
+ ///
+ /// The Url of the identity's avatar if it is supported.
+ ///
+ string Avatar { get; init; }
+}
diff --git a/src/Connected.Common.Workspace/Identities/IIdentityService.cs b/src/Connected.Common.Workspace/Identities/IIdentityService.cs
new file mode 100644
index 0000000..88f97d7
--- /dev/null
+++ b/src/Connected.Common.Workspace/Identities/IIdentityService.cs
@@ -0,0 +1,15 @@
+using System.Collections.Immutable;
+
+namespace Connected.Common.Workspace.Identities;
+///
+/// The provider service used for providing identity descriptors.
+///
+public interface IIdentityService
+{
+ ///
+ /// Queries identities for the specified set of entity types and their ids.
+ ///
+ /// The arguments containing entity types and their ids.
+ /// The list of identities that matches the specified criteria.
+ Task> Query(QueryIdentitiesArgs args);
+}
diff --git a/src/Connected.Common.Workspace/Identities/IdentityArgs.cs b/src/Connected.Common.Workspace/Identities/IdentityArgs.cs
new file mode 100644
index 0000000..7fd272e
--- /dev/null
+++ b/src/Connected.Common.Workspace/Identities/IdentityArgs.cs
@@ -0,0 +1,9 @@
+using Connected.Annotations;
+using Connected.ServiceModel;
+
+namespace Connected.Common.Workspace.Identities;
+public sealed class QueryIdentitiesArgs : QueryArgs
+{
+ [NonDefault]
+ public Dictionary Items { get; set; } = default!;
+}
diff --git a/src/Connected.Common.Workspace/Messaging/IMessage.cs b/src/Connected.Common.Workspace/Messaging/IMessage.cs
new file mode 100644
index 0000000..845d352
--- /dev/null
+++ b/src/Connected.Common.Workspace/Messaging/IMessage.cs
@@ -0,0 +1,5 @@
+namespace Connected.Common.Workspace.Messaging;
+public interface IMessage : IWorkspaceEntity
+{
+
+}
diff --git a/src/Connected.Common.Workspace/Messaging/IMessagesService.cs b/src/Connected.Common.Workspace/Messaging/IMessagesService.cs
new file mode 100644
index 0000000..86f1c40
--- /dev/null
+++ b/src/Connected.Common.Workspace/Messaging/IMessagesService.cs
@@ -0,0 +1,15 @@
+using System.Collections.Immutable;
+using Connected.Notifications;
+using Connected.ServiceModel;
+
+namespace Connected.Common.Workspace.Messaging;
+public interface IMessagesService : IServiceNotifications
+{
+ Task> Query(QueryMessageArgs args);
+ Task Select(PrimaryKeyArgs args);
+
+ Task Insert(InsertMessageArgs args);
+ Task Update(UpdateMessageArgs args);
+ Task Patch(PatchArgs args);
+ Task Delete(PrimaryKeyArgs args);
+}
diff --git a/src/Connected.Common.Workspace/Messaging/MessageArgs.cs b/src/Connected.Common.Workspace/Messaging/MessageArgs.cs
new file mode 100644
index 0000000..3e44b76
--- /dev/null
+++ b/src/Connected.Common.Workspace/Messaging/MessageArgs.cs
@@ -0,0 +1,21 @@
+using System.ComponentModel.DataAnnotations;
+using Connected.ServiceModel;
+
+namespace Connected.Common.Workspace.Messaging;
+public sealed class QueryMessageArgs : QueryArgs
+{
+ [Required, MaxLength(128)]
+ public string IdentityEntity { get; set; } = default!;
+ [Required, MaxLength(128)]
+ public string IdentityId { get; set; } = default!;
+}
+
+public sealed class InsertMessageArgs : InsertWorkspaceArgs
+{
+
+}
+
+public sealed class UpdateMessageArgs : UpdateWorkspaceArgs
+{
+
+}
diff --git a/src/Connected.Common.Workspace/WorkspaceArgs.cs b/src/Connected.Common.Workspace/WorkspaceArgs.cs
new file mode 100644
index 0000000..df57c24
--- /dev/null
+++ b/src/Connected.Common.Workspace/WorkspaceArgs.cs
@@ -0,0 +1,67 @@
+using System.ComponentModel.DataAnnotations;
+using Connected.ServiceModel;
+
+namespace Connected.Common.Workspace;
+///
+/// The base class for the arguments used when inserting one of the
+/// implementations of the entity.
+///
+public abstract class InsertWorkspaceArgs : Dto
+{
+ ///
+ [Required, MaxLength(128)]
+ public string IdentityEntity { get; set; } = default!;
+ ///
+ [Required, MaxLength(128)]
+ public string IdentityId { get; set; } = default!;
+ ///
+ public DateTimeOffset? Created { get; set; }
+ ///
+ public DateTimeOffset? Expires { get; set; }
+ ///
+ [Required, MaxLength(128)]
+ public string Title { get; set; } = default!;
+ ///
+ [MaxLength(256)]
+ public string? Description { get; set; }
+ ///
+ public ReadStatus? Status { get; set; }
+ ///
+ [Required, MaxLength(128)]
+ public string Domain { get; init; } = default!;
+ ///
+ [MaxLength(256)]
+ public string? Tags { get; init; }
+ ///
+ [MaxLength(128)]
+ public string? AuthorEntity { get; init; }
+ ///
+ [MaxLength(128)]
+ public string? AuthorId { get; init; }
+ ///
+ public IdentityVerbs? Verbs { get; init; }
+}
+///
+/// The base class used when updating one of the
+/// implementations of the entity.
+///
+public abstract class UpdateWorkspaceArgs : PrimaryKeyArgs
+{
+ ///
+ public DateTimeOffset? Created { get; set; }
+ ///
+ public DateTimeOffset? Expires { get; set; }
+ ///
+ [Required, MaxLength(128)]
+ public string Title { get; set; } = default!;
+ ///
+ [MaxLength(256)]
+ public string? Description { get; set; }
+ ///
+ public ReadStatus? Status { get; set; }
+ ///
+ [MaxLength(256)]
+ public string? Tags { get; init; }
+ ///
+ public IdentityVerbs? Verbs { get; init; }
+}