diff --git a/CHANGELOG.md b/CHANGELOG.md
index b6d7d84f1763efba0261116af38755cc3d9c6b00..e4ee1991ea606d0d88aee5bcd2b240fb4e51f57e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Added ###
 
+* Entity State support (experimental). See the `caosdb.State` class for more
+  information.
 * Versioning support (experimental).
 
 ### Changed ###
diff --git a/src/caosdb/common/state.py b/src/caosdb/common/state.py
index 431675fb1893ee215f22b356a78ee50fad987b97..7b6a9ce37d1d5b7a5f00987721d58cc9d56f75dd 100644
--- a/src/caosdb/common/state.py
+++ b/src/caosdb/common/state.py
@@ -1,5 +1,19 @@
 from lxml import etree
 class State:
+    """State
+
+    Represents the state of an entity and take care of the serialization and
+    deserialization of xml for the entity state.
+
+    An entity state is always a State of a StateModel.
+
+    Properties
+    ----------
+    name : str
+        Name of the State
+    model : str
+        Name of the StateModel
+    """
 
     def __init__(self, model, name):
         self.name = name
@@ -19,6 +33,12 @@ class State:
         return f"State('{self.model}', '{self.name}')"
 
     def to_xml(self):
+        """Serialize this State to xml.
+
+        Returns
+        -------
+        xml : etree.Element
+        """
         xml = etree.Element("State")
         if self.name is not None:
             xml.set("name", self.name)
@@ -28,6 +48,16 @@ class State:
 
     @staticmethod
     def from_xml(xml):
+        """Create a new State instance from an xml Element.
+
+        Parameters
+        ----------
+        xml : etree.Element
+
+        Returns
+        -------
+        state : State
+        """
         name = xml.get("name")
         model = xml.get("model")
         return State(name=name, model=model)