Index: flexoentity/__init__.py
===================================================================
--- flexoentity/__init__.py	(revision 859e2b15bed84f745ac19e8a3a688bf73c5999e9)
+++ flexoentity/__init__.py	(revision 2f650ac2e7785d9119d1bf6cc71d62a5397f183a)
@@ -9,4 +9,5 @@
 from .id_factory import FlexOID, canonical_seed
 from .flexo_entity import FlexoEntity, EntityType, EntityState
+from .domain import Domain
 
 __all__ = [
@@ -15,4 +16,5 @@
     "FlexoEntity",
     "EntityType",
+    "Domain",
     "EntityState",
 ]
Index: flexoentity/domain.py
===================================================================
--- flexoentity/domain.py	(revision 859e2b15bed84f745ac19e8a3a688bf73c5999e9)
+++ flexoentity/domain.py	(revision 2f650ac2e7785d9119d1bf6cc71d62a5397f183a)
@@ -1,18 +1,24 @@
+from dataclasses import dataclass
+from flexoentity.flexo_entity import FlexoEntity, EntityType, EntityState
+
 @dataclass
 class Domain(FlexoEntity):
-    abbrev: str
-    fullname: str
+    fullname: str = ""
     description: str = ""
     classification: str = "UNCLASSIFIED"
     owner: str = "unknown"
 
+    def __post_init__(self):
+        self.etype = EntityType.DOMAIN
+        super().__post_init__()
+
     @property
-    def qtype(self):  # or entity_type
-        return EntityType.DOMAIN
+    def text_seed(self) -> str:
+        """Deterministic text seed for ID generation."""
+        return f"{self.domain}|{self.fullname}|{self.classification}|{self.owner}"
 
     def to_dict(self):
         base = super().to_dict()
         base.update({
-            "abbrev": self.abbrev,
             "fullname": self.fullname,
             "description": self.description,
@@ -21,2 +27,12 @@
         })
         return base
+
+    @classmethod
+    def from_dict(cls, data):
+        return cls(
+            fullname=data.get("fullname", ""),
+            description=data.get("description", ""),
+            classification=data.get("classification", "UNCLASSIFIED"),
+            owner=data.get("owner", "unknown"),
+            state=EntityState[data.get("state", "DRAFT")],
+        )
Index: flexoentity/flexo_entity.py
===================================================================
--- flexoentity/flexo_entity.py	(revision 859e2b15bed84f745ac19e8a3a688bf73c5999e9)
+++ flexoentity/flexo_entity.py	(revision 2f650ac2e7785d9119d1bf6cc71d62a5397f183a)
@@ -4,4 +4,5 @@
 """
 import json
+import re
 from enum import Enum, auto
 from dataclasses import dataclass, field
@@ -14,5 +15,4 @@
 from flexoentity.id_factory import FlexOID
 from flexoentity import canonical_seed
- 
 
 # ──────────────────────────────────────────────────────────────────────────────
@@ -28,8 +28,11 @@
     DATABASE = auto()
     CERTIFICATE = auto()
-
+    DOMAIN = auto()
+    
     def short(self) -> str:
         mapping = {
             EntityType.QUESTION: "Q",
+            EntityType.MEDIA: "M",
+            EntityType.DOMAIN: "DOM",
             EntityType.CATALOG:  "CAT",
             EntityType.EXAM:     "EX",
@@ -89,12 +92,27 @@
 class FlexoEntity(ABC):
     domain: str
-    etype: EntityType
-    state: EntityState = EntityState.DRAFT
-    flexo_id: FlexOID = field(init=False)
-    created_at: datetime = field(default_factory=lambda: datetime.now(UTC))
-    updated_at: Optional[datetime] = None
-
-    # ───────────────────────────────────────────────────────────────
-
+    etype: EntityType 
+    state: EntityState
+
+    OID_PATTERN = re.compile(
+        r"^(?P<domain>[A-Z0-9]+)-(?P<etype>[A-Z]+)"
+        r"(?P<date>\d{6,8})-(?P<hash>[0-9A-F]+)@(?P<version>\d{3})(?P<state>[A-Z])$"
+    )
+
+    def __str__(self) -> str:
+        return f"{self.domain}-{self.etype}{self.date}-{self.unique_hash}@{self.version:03d}{self.state}"
+
+    @classmethod
+    def from_string(cls, s: str) -> "FlexOID":
+        """Rehydrate a FlexOID from its canonical string form."""
+        m = cls.OID_PATTERN.match(s.strip())
+        if not m:
+            raise ValueError(f"Invalid FlexOID string: {s}")
+        gd = m.groupdict()
+        return cls(
+            domain=gd["domain"],
+            etype=gd["etype"],
+            state=gd["state"],
+        )
     @property
     @abstractmethod
@@ -121,11 +139,6 @@
             "domain": self.domain,
             "etype": self.etype.name,
-            "text_seed": self.text_seed,
             "state": self.state.name,
-            "version": self.version,
             "flexo_id": str(self.flexo_id),
-            "signature": self.flexo_id.signature,
-            "created_at": self.created_at.isoformat(),
-            "updated_at": self.updated_at.isoformat() if self.updated_at else None,
         }
 
@@ -139,6 +152,4 @@
         )
         obj.flexo_id = FlexOID(data["flexo_id"], data.get("signature", ""))
-        if data.get("updated_at"):
-            obj.updated_at = datetime.fromisoformat(data["updated_at"])
         return obj
 
Index: tests/conftest.py
===================================================================
--- tests/conftest.py	(revision 859e2b15bed84f745ac19e8a3a688bf73c5999e9)
+++ tests/conftest.py	(revision 2f650ac2e7785d9119d1bf6cc71d62a5397f183a)
@@ -3,5 +3,5 @@
 import pytest
 import json
-from flexoentity import FlexoEntity, EntityType, EntityState
+from flexoentity import FlexoEntity, EntityType, EntityState, Domain
 
 
@@ -34,5 +34,5 @@
     """Generic FlexoEntity-like instance in draft state."""
     return DummyEntity(
-        domain="AF",
+        domain=Domain(domain="SIG", etype=EntityType.DOMAIN, state=EntityState.DRAFT, fullname="Signal Corps", classification="RESTRICTED"),
         etype=EntityType.CATALOG,
         state=EntityState.DRAFT,
Index: tests/test_id_stress.py
===================================================================
--- tests/test_id_stress.py	(revision 859e2b15bed84f745ac19e8a3a688bf73c5999e9)
+++ tests/test_id_stress.py	(revision 2f650ac2e7785d9119d1bf6cc71d62a5397f183a)
@@ -6,5 +6,5 @@
 import random
 
-from flexoentity import FlexOID, EntityType, EntityState
+from flexoentity import FlexOID, EntityType, EntityState, Domain
 
 from tests.conftest import DummyEntity
@@ -13,5 +13,7 @@
 def test_bulk_generation_uniqueness():
     """Generate 10,000 IDs and assert uniqueness (statistical test)."""
-    domain = "AF"
+    domain = Domain(domain="SIG", etype=EntityType.DOMAIN, state=EntityState.DRAFT,
+                    fullname="Signal Corps", classification="RESTRICTED", owner="MESE")
+
     etype = EntityType.QUESTION
     estate = EntityState.DRAFT
@@ -44,5 +46,6 @@
     should yield the same base ID (without suffix).
     """
-    domain = "AF"
+    domain = Domain(domain="SIG", etype=EntityType.DOMAIN, state=EntityState.DRAFT,
+                    fullname="Signal Corps", classification="RESTRICTED")
     etype = EntityType.CATALOG
     estate = EntityState.DRAFT
