Repository: quantori/quantori-pesn-python-sdk (language: python)

Issue:
Sbt 75. delete library



Discussion / hints:

Fix patch:
diff --git a/docs/signals_notebook/common_types.html b/docs/signals_notebook/common_types.html
index 9ebca114..15efef45 100644
--- a/docs/signals_notebook/common_types.html
+++ b/docs/signals_notebook/common_types.html
@@ -70,6 +70,7 @@ <h1 class="title">Module <code>signals_notebook.common_types</code></h1>
     PLATE_ROW = &#39;plateRow&#39;
     ATTRIBUTE_OPTION = &#39;option&#39;
     CHOICE = &#39;choice&#39;
+    SUB_EXPERIMENT = &#39;subexpSummaryRow&#39;
     CONTAINER = &#39;container&#39;
 
 
@@ -93,6 +94,10 @@ <h1 class="title">Module <code>signals_notebook.common_types</code></h1>
     TASK = &#39;task&#39;
     PLATE_CONTAINER = &#39;plateContainer&#39;
     MATERIAL_TABLE = &#39;materialsTable&#39;
+    PARALLEL_EXPERIMENT = &#39;paraexp&#39;
+    SUB_EXPERIMENT = &#39;parasubexp&#39;
+    SUB_EXPERIMENT_SUMMARY = &#39;paragrid&#39;
+    SUB_EXPERIMENT_LAYOUT = &#39;paraLayout&#39;
 
 
 class MaterialType(str, Enum):
@@ -102,9 +107,8 @@ <h1 class="title">Module <code>signals_notebook.common_types</code></h1>
 
 
 class EID(str):
-    &#34;&#34;&#34;Entity ID
+    &#34;&#34;&#34;Entity ID&#34;&#34;&#34;
 
-    &#34;&#34;&#34;
     def __new__(cls, content: Any, validate: bool = True):
         if validate:
             cls.validate(content)
@@ -122,14 +126,13 @@ <h1 class="title">Module <code>signals_notebook.common_types</code></h1>
             v: Entity ID
 
         Returns:
-
         &#34;&#34;&#34;
         if not isinstance(v, str):
             log.error(&#39;%s is not instance of str&#39;, v)
             raise EIDError(value=v)
 
         try:
-            _type, _id = v.split(&#39;:&#39;)
+            _type, _id, *_ = v.split(&#39;:&#39;)
             UUID(_id)
         except ValueError:
             log.exception(&#39;Cannot get id and type from value&#39;)
@@ -144,7 +147,7 @@ <h1 class="title">Module <code>signals_notebook.common_types</code></h1>
         Returns:
             One of the entity types
         &#34;&#34;&#34;
-        _type, _ = self.split(&#39;:&#39;)
+        _type, _id, *_ = self.split(&#39;:&#39;)
         try:
             return EntityType(_type)
         except ValueError:
@@ -158,14 +161,12 @@ <h1 class="title">Module <code>signals_notebook.common_types</code></h1>
         Returns:
             UUID
         &#34;&#34;&#34;
-        _, _id = self.split(&#39;:&#39;)
+        _type, _id, *_ = self.split(&#39;:&#39;)
         return UUID(_id)
 
 
 class MID(str):
-    &#34;&#34;&#34;Material ID
-
-    &#34;&#34;&#34;
+    &#34;&#34;&#34;Material ID&#34;&#34;&#34;
 
     _id_pattern = re.compile(&#39;[0-9a-f]+&#39;, flags=re.IGNORECASE)
 
@@ -227,9 +228,8 @@ <h1 class="title">Module <code>signals_notebook.common_types</code></h1>
 
 
 class AttrID(str):
-    &#34;&#34;&#34;Attribute ID
+    &#34;&#34;&#34;Attribute ID&#34;&#34;&#34;
 
-    &#34;&#34;&#34;
     def __new__(cls, content: Any, validate: bool = True):
         if validate:
             cls.validate(content)
@@ -476,9 +476,8 @@ <h3>Class variables</h3>
 <span>Expand source code</span>
 </summary>
 <pre><code class="python">class AttrID(str):
-    &#34;&#34;&#34;Attribute ID
+    &#34;&#34;&#34;Attribute ID&#34;&#34;&#34;
 
-    &#34;&#34;&#34;
     def __new__(cls, content: Any, validate: bool = True):
         if validate:
             cls.validate(content)
@@ -765,7 +764,9 @@ <h3>Subclasses</h3>
 <ul class="hlist">
 <li>pydantic.generics.DataObject[_RequestBody]</li>
 <li>pydantic.generics.DataObject[_RequestBody]</li>
+<li>pydantic.generics.DataObject[_RequestBody]</li>
 <li>pydantic.generics.DataObject[_SampleRequestBody]</li>
+<li>pydantic.generics.DataObject[_SubExperimentRequestBody]</li>
 <li><a title="signals_notebook.common_types.DataObject[EntityShortDescription]" href="#signals_notebook.common_types.DataObject[EntityShortDescription]">DataObject[EntityShortDescription]</a></li>
 <li><a title="signals_notebook.common_types.EntityCreationRequestPayload" href="#signals_notebook.common_types.EntityCreationRequestPayload">EntityCreationRequestPayload</a></li>
 </ul>
@@ -819,9 +820,8 @@ <h3>Class variables</h3>
 <span>Expand source code</span>
 </summary>
 <pre><code class="python">class EID(str):
-    &#34;&#34;&#34;Entity ID
+    &#34;&#34;&#34;Entity ID&#34;&#34;&#34;
 
-    &#34;&#34;&#34;
     def __new__(cls, content: Any, validate: bool = True):
         if validate:
             cls.validate(content)
@@ -839,14 +839,13 @@ <h3>Class variables</h3>
             v: Entity ID
 
         Returns:
-
         &#34;&#34;&#34;
         if not isinstance(v, str):
             log.error(&#39;%s is not instance of str&#39;, v)
             raise EIDError(value=v)
 
         try:
-            _type, _id = v.split(&#39;:&#39;)
+            _type, _id, *_ = v.split(&#39;:&#39;)
             UUID(_id)
         except ValueError:
             log.exception(&#39;Cannot get id and type from value&#39;)
@@ -861,7 +860,7 @@ <h3>Class variables</h3>
         Returns:
             One of the entity types
         &#34;&#34;&#34;
-        _type, _ = self.split(&#39;:&#39;)
+        _type, _id, *_ = self.split(&#39;:&#39;)
         try:
             return EntityType(_type)
         except ValueError:
@@ -875,7 +874,7 @@ <h3>Class variables</h3>
         Returns:
             UUID
         &#34;&#34;&#34;
-        _, _id = self.split(&#39;:&#39;)
+        _type, _id, *_ = self.split(&#39;:&#39;)
         return UUID(_id)</code></pre>
 </details>
 <h3>Ancestors</h3>
@@ -907,14 +906,13 @@ <h2 id="args">Args</h2>
         v: Entity ID
 
     Returns:
-
     &#34;&#34;&#34;
     if not isinstance(v, str):
         log.error(&#39;%s is not instance of str&#39;, v)
         raise EIDError(value=v)
 
     try:
-        _type, _id = v.split(&#39;:&#39;)
+        _type, _id, *_ = v.split(&#39;:&#39;)
         UUID(_id)
     except ValueError:
         log.exception(&#39;Cannot get id and type from value&#39;)
@@ -942,7 +940,7 @@ <h2 id="returns">Returns</h2>
     Returns:
         UUID
     &#34;&#34;&#34;
-    _, _id = self.split(&#39;:&#39;)
+    _type, _id, *_ = self.split(&#39;:&#39;)
     return UUID(_id)</code></pre>
 </details>
 </dd>
@@ -962,7 +960,7 @@ <h2 id="returns">Returns</h2>
     Returns:
         One of the entity types
     &#34;&#34;&#34;
-    _type, _ = self.split(&#39;:&#39;)
+    _type, _id, *_ = self.split(&#39;:&#39;)
     try:
         return EntityType(_type)
     except ValueError:
@@ -998,6 +996,8 @@ <h3>Subclasses</h3>
 <ul class="hlist">
 <li><a title="signals_notebook.entities.experiment.EntityCreationRequestPayload[_RequestBody]" href="entities/experiment.html#signals_notebook.entities.experiment.EntityCreationRequestPayload[_RequestBody]">EntityCreationRequestPayload[_RequestBody]</a></li>
 <li><a title="signals_notebook.entities.notebook.EntityCreationRequestPayload[_RequestBody]" href="entities/notebook.html#signals_notebook.entities.notebook.EntityCreationRequestPayload[_RequestBody]">EntityCreationRequestPayload[_RequestBody]</a></li>
+<li><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody]" href="entities/parallel_experiment/parallel_experiment.html#signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody]">EntityCreationRequestPayload[_RequestBody]</a></li>
+<li><a title="signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody]" href="entities/parallel_experiment/sub_experiment.html#signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody]">EntityCreationRequestPayload[_SubExperimentRequestBody]</a></li>
 <li><a title="signals_notebook.entities.samples.sample.EntityCreationRequestPayload[_SampleRequestBody]" href="entities/samples/sample.html#signals_notebook.entities.samples.sample.EntityCreationRequestPayload[_SampleRequestBody]">EntityCreationRequestPayload[_SampleRequestBody]</a></li>
 </ul>
 <h3>Class variables</h3>
@@ -1069,7 +1069,11 @@ <h3>Class variables</h3>
     TODO_LIST = &#39;linkedTaskContainer&#39;
     TASK = &#39;task&#39;
     PLATE_CONTAINER = &#39;plateContainer&#39;
-    MATERIAL_TABLE = &#39;materialsTable&#39;</code></pre>
+    MATERIAL_TABLE = &#39;materialsTable&#39;
+    PARALLEL_EXPERIMENT = &#39;paraexp&#39;
+    SUB_EXPERIMENT = &#39;parasubexp&#39;
+    SUB_EXPERIMENT_SUMMARY = &#39;paragrid&#39;
+    SUB_EXPERIMENT_LAYOUT = &#39;paraLayout&#39;</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -1114,6 +1118,10 @@ <h3>Class variables</h3>
 <dd>
 <div class="desc"></div>
 </dd>
+<dt id="signals_notebook.common_types.EntityType.PARALLEL_EXPERIMENT"><code class="name">var <span class="ident">PARALLEL_EXPERIMENT</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
 <dt id="signals_notebook.common_types.EntityType.PLATE_CONTAINER"><code class="name">var <span class="ident">PLATE_CONTAINER</span></code></dt>
 <dd>
 <div class="desc"></div>
@@ -1134,6 +1142,18 @@ <h3>Class variables</h3>
 <dd>
 <div class="desc"></div>
 </dd>
+<dt id="signals_notebook.common_types.EntityType.SUB_EXPERIMENT"><code class="name">var <span class="ident">SUB_EXPERIMENT</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.common_types.EntityType.SUB_EXPERIMENT_LAYOUT"><code class="name">var <span class="ident">SUB_EXPERIMENT_LAYOUT</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.common_types.EntityType.SUB_EXPERIMENT_SUMMARY"><code class="name">var <span class="ident">SUB_EXPERIMENT_SUMMARY</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
 <dt id="signals_notebook.common_types.EntityType.TASK"><code class="name">var <span class="ident">TASK</span></code></dt>
 <dd>
 <div class="desc"></div>
@@ -1454,9 +1474,7 @@ <h2 id="returns">Returns</h2>
 <span>Expand source code</span>
 </summary>
 <pre><code class="python">class MID(str):
-    &#34;&#34;&#34;Material ID
-
-    &#34;&#34;&#34;
+    &#34;&#34;&#34;Material ID&#34;&#34;&#34;
 
     _id_pattern = re.compile(&#39;[0-9a-f]+&#39;, flags=re.IGNORECASE)
 
@@ -1672,6 +1690,7 @@ <h3>Class variables</h3>
     PLATE_ROW = &#39;plateRow&#39;
     ATTRIBUTE_OPTION = &#39;option&#39;
     CHOICE = &#39;choice&#39;
+    SUB_EXPERIMENT = &#39;subexpSummaryRow&#39;
     CONTAINER = &#39;container&#39;</code></pre>
 </details>
 <h3>Ancestors</h3>
@@ -1741,6 +1760,10 @@ <h3>Class variables</h3>
 <dd>
 <div class="desc"></div>
 </dd>
+<dt id="signals_notebook.common_types.ObjectType.SUB_EXPERIMENT"><code class="name">var <span class="ident">SUB_EXPERIMENT</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
 <dt id="signals_notebook.common_types.ObjectType.USER"><code class="name">var <span class="ident">USER</span></code></dt>
 <dd>
 <div class="desc"></div>
@@ -1785,6 +1808,7 @@ <h3>Subclasses</h3>
 <li><a title="signals_notebook.attributes.attribute.Response[Attribute]" href="attributes/attribute.html#signals_notebook.attributes.attribute.Response[Attribute]">Response[Attribute]</a></li>
 <li><a title="signals_notebook.attributes.attribute.Response[_AttributeOption]" href="attributes/attribute.html#signals_notebook.attributes.attribute.Response[_AttributeOption]">Response[_AttributeOption]</a></li>
 <li><a title="signals_notebook.entities.entity.Response[Property]" href="entities/entity.html#signals_notebook.entities.entity.Response[Property]">Response[Property]</a></li>
+<li><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row]" href="entities/parallel_experiment/sub_experiment_summary.html#signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row]">Response[Row]</a></li>
 <li><a title="signals_notebook.entities.plates.plate_container.Response[PlateRow]" href="entities/plates/plate_container.html#signals_notebook.entities.plates.plate_container.Response[PlateRow]">Response[PlateRow]</a></li>
 <li><a title="signals_notebook.entities.samples.sample.Response[SampleCell]" href="entities/samples/sample.html#signals_notebook.entities.samples.sample.Response[SampleCell]">Response[SampleCell]</a></li>
 <li><a title="signals_notebook.entities.samples.samples_container.Response[Sample]" href="entities/samples/samples_container.html#signals_notebook.entities.samples.samples_container.Response[Sample]">Response[Sample]</a></li>
@@ -1862,6 +1886,7 @@ <h3>Subclasses</h3>
 <li>pydantic.generics.ResponseData[Property]</li>
 <li>pydantic.generics.ResponseData[Role]</li>
 <li>pydantic.generics.ResponseData[Row]</li>
+<li>pydantic.generics.ResponseData[Row]</li>
 <li>pydantic.generics.ResponseData[SampleCell]</li>
 <li>pydantic.generics.ResponseData[Sample]</li>
 <li>pydantic.generics.ResponseData[Table]</li>
@@ -2015,7 +2040,7 @@ <h4><code><a title="signals_notebook.common_types.EntityShortDescription" href="
 </li>
 <li>
 <h4><code><a title="signals_notebook.common_types.EntityType" href="#signals_notebook.common_types.EntityType">EntityType</a></code></h4>
-<ul class="two-column">
+<ul class="">
 <li><code><a title="signals_notebook.common_types.EntityType.ASSET" href="#signals_notebook.common_types.EntityType.ASSET">ASSET</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.BIO_SEQUENCE" href="#signals_notebook.common_types.EntityType.BIO_SEQUENCE">BIO_SEQUENCE</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.CHEMICAL_DRAWING" href="#signals_notebook.common_types.EntityType.CHEMICAL_DRAWING">CHEMICAL_DRAWING</a></code></li>
@@ -2025,11 +2050,15 @@ <h4><code><a title="signals_notebook.common_types.EntityType" href="#signals_not
 <li><code><a title="signals_notebook.common_types.EntityType.IMAGE_RESOURCE" href="#signals_notebook.common_types.EntityType.IMAGE_RESOURCE">IMAGE_RESOURCE</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.MATERIAL_TABLE" href="#signals_notebook.common_types.EntityType.MATERIAL_TABLE">MATERIAL_TABLE</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.NOTEBOOK" href="#signals_notebook.common_types.EntityType.NOTEBOOK">NOTEBOOK</a></code></li>
+<li><code><a title="signals_notebook.common_types.EntityType.PARALLEL_EXPERIMENT" href="#signals_notebook.common_types.EntityType.PARALLEL_EXPERIMENT">PARALLEL_EXPERIMENT</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.PLATE_CONTAINER" href="#signals_notebook.common_types.EntityType.PLATE_CONTAINER">PLATE_CONTAINER</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.POWER_POINT" href="#signals_notebook.common_types.EntityType.POWER_POINT">POWER_POINT</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.SAMPLE" href="#signals_notebook.common_types.EntityType.SAMPLE">SAMPLE</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.SAMPLES_CONTAINER" href="#signals_notebook.common_types.EntityType.SAMPLES_CONTAINER">SAMPLES_CONTAINER</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.SPOTFIRE" href="#signals_notebook.common_types.EntityType.SPOTFIRE">SPOTFIRE</a></code></li>
+<li><code><a title="signals_notebook.common_types.EntityType.SUB_EXPERIMENT" href="#signals_notebook.common_types.EntityType.SUB_EXPERIMENT">SUB_EXPERIMENT</a></code></li>
+<li><code><a title="signals_notebook.common_types.EntityType.SUB_EXPERIMENT_LAYOUT" href="#signals_notebook.common_types.EntityType.SUB_EXPERIMENT_LAYOUT">SUB_EXPERIMENT_LAYOUT</a></code></li>
+<li><code><a title="signals_notebook.common_types.EntityType.SUB_EXPERIMENT_SUMMARY" href="#signals_notebook.common_types.EntityType.SUB_EXPERIMENT_SUMMARY">SUB_EXPERIMENT_SUMMARY</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.TASK" href="#signals_notebook.common_types.EntityType.TASK">TASK</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.TEXT" href="#signals_notebook.common_types.EntityType.TEXT">TEXT</a></code></li>
 <li><code><a title="signals_notebook.common_types.EntityType.TODO_LIST" href="#signals_notebook.common_types.EntityType.TODO_LIST">TODO_LIST</a></code></li>
@@ -2093,6 +2122,7 @@ <h4><code><a title="signals_notebook.common_types.ObjectType" href="#signals_not
 <li><code><a title="signals_notebook.common_types.ObjectType.PROPERTY" href="#signals_notebook.common_types.ObjectType.PROPERTY">PROPERTY</a></code></li>
 <li><code><a title="signals_notebook.common_types.ObjectType.ROLE" href="#signals_notebook.common_types.ObjectType.ROLE">ROLE</a></code></li>
 <li><code><a title="signals_notebook.common_types.ObjectType.STOICHIOMETRY" href="#signals_notebook.common_types.ObjectType.STOICHIOMETRY">STOICHIOMETRY</a></code></li>
+<li><code><a title="signals_notebook.common_types.ObjectType.SUB_EXPERIMENT" href="#signals_notebook.common_types.ObjectType.SUB_EXPERIMENT">SUB_EXPERIMENT</a></code></li>
 <li><code><a title="signals_notebook.common_types.ObjectType.USER" href="#signals_notebook.common_types.ObjectType.USER">USER</a></code></li>
 </ul>
 </li>
diff --git a/docs/signals_notebook/entities/container.html b/docs/signals_notebook/entities/container.html
index d8d7fc7e..f05d7508 100644
--- a/docs/signals_notebook/entities/container.html
+++ b/docs/signals_notebook/entities/container.html
@@ -295,6 +295,8 @@ <h3>Subclasses</h3>
 <ul class="hlist">
 <li><a title="signals_notebook.entities.experiment.Experiment" href="experiment.html#signals_notebook.entities.experiment.Experiment">Experiment</a></li>
 <li><a title="signals_notebook.entities.notebook.Notebook" href="notebook.html#signals_notebook.entities.notebook.Notebook">Notebook</a></li>
+<li><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment" href="parallel_experiment/parallel_experiment.html#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment">ParallelExperiment</a></li>
+<li><a title="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment" href="parallel_experiment/sub_experiment.html#signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment">SubExperiment</a></li>
 </ul>
 <h3>Class variables</h3>
 <dl>
diff --git a/docs/signals_notebook/entities/contentful_entity.html b/docs/signals_notebook/entities/contentful_entity.html
index ef4f863b..34764570 100644
--- a/docs/signals_notebook/entities/contentful_entity.html
+++ b/docs/signals_notebook/entities/contentful_entity.html
@@ -286,6 +286,8 @@ <h3>Subclasses</h3>
 <li><a title="signals_notebook.entities.excel.Excel" href="excel.html#signals_notebook.entities.excel.Excel">Excel</a></li>
 <li><a title="signals_notebook.entities.image.Image" href="image.html#signals_notebook.entities.image.Image">Image</a></li>
 <li><a title="signals_notebook.entities.materials_table.MaterialsTable" href="materials_table.html#signals_notebook.entities.materials_table.MaterialsTable">MaterialsTable</a></li>
+<li><a title="signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout" href="parallel_experiment/sub_experiment_layout.html#signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout">SubExperimentLayout</a></li>
+<li><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary" href="parallel_experiment/sub_experiment_summary.html#signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary">SubExperimentSummary</a></li>
 <li><a title="signals_notebook.entities.plates.plate_container.PlateContainer" href="plates/plate_container.html#signals_notebook.entities.plates.plate_container.PlateContainer">PlateContainer</a></li>
 <li><a title="signals_notebook.entities.power_point.PowerPoint" href="power_point.html#signals_notebook.entities.power_point.PowerPoint">PowerPoint</a></li>
 <li><a title="signals_notebook.entities.samples.samples_container.SamplesContainer" href="samples/samples_container.html#signals_notebook.entities.samples.samples_container.SamplesContainer">SamplesContainer</a></li>
diff --git a/docs/signals_notebook/entities/experiment.html b/docs/signals_notebook/entities/experiment.html
index 1d4559c5..eeab6bc8 100644
--- a/docs/signals_notebook/entities/experiment.html
+++ b/docs/signals_notebook/entities/experiment.html
@@ -133,7 +133,7 @@ <h1 class="title">Module <code>signals_notebook.entities.experiment</code></h1>
 
     @cached_property
     def stoichiometry(self) -&gt; Union[Stoichiometry, list[Stoichiometry]]:
-        &#34;&#34;&#34;&#34;Fetch stoichiometry data of experiment
+        &#34;&#34;&#34; Fetch stoichiometry data of experiment
 
         Returns:
             Stoichiometry object or list of Stoichiometry objects
@@ -152,7 +152,7 @@ <h1 class="title">Module <code>signals_notebook.entities.experiment</code></h1>
             &#39;description&#39;: self.description,
             &#39;edited_at&#39;: self.edited_at,
             &#39;state&#39;: self.state,
-            &#39;children&#39;: self.get_children()
+            &#39;children&#39;: self.get_children(),
         }
 
         template = env.get_template(self._template_name)
@@ -293,7 +293,7 @@ <h3>Class variables</h3>
 
     @cached_property
     def stoichiometry(self) -&gt; Union[Stoichiometry, list[Stoichiometry]]:
-        &#34;&#34;&#34;&#34;Fetch stoichiometry data of experiment
+        &#34;&#34;&#34; Fetch stoichiometry data of experiment
 
         Returns:
             Stoichiometry object or list of Stoichiometry objects
@@ -312,7 +312,7 @@ <h3>Class variables</h3>
             &#39;description&#39;: self.description,
             &#39;edited_at&#39;: self.edited_at,
             &#39;state&#39;: self.state,
-            &#39;children&#39;: self.get_children()
+            &#39;children&#39;: self.get_children(),
         }
 
         template = env.get_template(self._template_name)
@@ -467,7 +467,7 @@ <h3>Instance variables</h3>
 <dl>
 <dt id="signals_notebook.entities.experiment.Experiment.stoichiometry"><code class="name">var <span class="ident">stoichiometry</span></code></dt>
 <dd>
-<div class="desc"><p>"Fetch stoichiometry data of experiment</p>
+<div class="desc"><p>Fetch stoichiometry data of experiment</p>
 <h2 id="returns">Returns</h2>
 <p>Stoichiometry object or list of Stoichiometry objects</p></div>
 <details class="source">
@@ -531,7 +531,7 @@ <h2 id="returns">Returns</h2>
         &#39;description&#39;: self.description,
         &#39;edited_at&#39;: self.edited_at,
         &#39;state&#39;: self.state,
-        &#39;children&#39;: self.get_children()
+        &#39;children&#39;: self.get_children(),
     }
 
     template = env.get_template(self._template_name)
diff --git a/docs/signals_notebook/entities/index.html b/docs/signals_notebook/entities/index.html
index 5c520801..4d8cc94b 100644
--- a/docs/signals_notebook/entities/index.html
+++ b/docs/signals_notebook/entities/index.html
@@ -46,7 +46,11 @@ <h1 class="title">Module <code>signals_notebook.entities</code></h1>
 from signals_notebook.entities.spotfire import Spotfire  # noqa
 from signals_notebook.entities.uploaded_resource import UploadedResource  # noqa
 from signals_notebook.entities.plates.plate_container import PlateContainer  # noqa
-from signals_notebook.entities.materials_table import MaterialsTable  # noqa</code></pre>
+from signals_notebook.entities.materials_table import MaterialsTable  # noqa
+from signals_notebook.entities.parallel_experiment.parallel_experiment import ParallelExperiment  # noqa
+from signals_notebook.entities.parallel_experiment.sub_experiment import SubExperiment  # noqa
+from signals_notebook.entities.parallel_experiment.sub_experiment_summary import SubExperimentSummary  # noqa
+from signals_notebook.entities.parallel_experiment.sub_experiment_layout import SubExperimentLayout  # noqa</code></pre>
 </details>
 </section>
 <section>
@@ -96,6 +100,10 @@ <h2 class="section-title" id="header-submodules">Sub-modules</h2>
 <dd>
 <div class="desc"></div>
 </dd>
+<dt><code class="name"><a title="signals_notebook.entities.parallel_experiment" href="parallel_experiment/index.html">signals_notebook.entities.parallel_experiment</a></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
 <dt><code class="name"><a title="signals_notebook.entities.plates" href="plates/index.html">signals_notebook.entities.plates</a></code></dt>
 <dd>
 <div class="desc"></div>
@@ -169,6 +177,7 @@ <h1>Index</h1>
 <li><code><a title="signals_notebook.entities.image" href="image.html">signals_notebook.entities.image</a></code></li>
 <li><code><a title="signals_notebook.entities.materials_table" href="materials_table.html">signals_notebook.entities.materials_table</a></code></li>
 <li><code><a title="signals_notebook.entities.notebook" href="notebook.html">signals_notebook.entities.notebook</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment" href="parallel_experiment/index.html">signals_notebook.entities.parallel_experiment</a></code></li>
 <li><code><a title="signals_notebook.entities.plates" href="plates/index.html">signals_notebook.entities.plates</a></code></li>
 <li><code><a title="signals_notebook.entities.power_point" href="power_point.html">signals_notebook.entities.power_point</a></code></li>
 <li><code><a title="signals_notebook.entities.samples" href="samples/index.html">signals_notebook.entities.samples</a></code></li>
diff --git a/docs/signals_notebook/entities/parallel_experiment/cell.html b/docs/signals_notebook/entities/parallel_experiment/cell.html
new file mode 100644
index 00000000..aafc1655
--- /dev/null
+++ b/docs/signals_notebook/entities/parallel_experiment/cell.html
@@ -0,0 +1,192 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.10.0" />
+<title>signals_notebook.entities.parallel_experiment.cell API documentation</title>
+<meta name="description" content="" />
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>signals_notebook.entities.parallel_experiment.cell</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">from typing import Optional, Union
+
+from pydantic import BaseModel, PrivateAttr
+
+
+class SubExperimentSummaryCell(BaseModel):
+    key: Optional[str]
+    display: Optional[str]
+    value: Optional[Union[str, int]]
+    _changed: bool = PrivateAttr(default=False)
+
+    def set_value(self, new_value: Optional[Union[str, int]]) -&gt; None:
+        self.value = new_value
+        self._changed = True
+
+    @property
+    def is_changed(self) -&gt; bool:
+        return self._changed
+
+    @property
+    def representation_for_update(self):
+        return {self.key: {&#39;content&#39;: {&#39;value&#39;: self.value}}}</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell"><code class="flex name class">
+<span>class <span class="ident">SubExperimentSummaryCell</span></span>
+<span>(</span><span>**data: Any)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class SubExperimentSummaryCell(BaseModel):
+    key: Optional[str]
+    display: Optional[str]
+    value: Optional[Union[str, int]]
+    _changed: bool = PrivateAttr(default=False)
+
+    def set_value(self, new_value: Optional[Union[str, int]]) -&gt; None:
+        self.value = new_value
+        self._changed = True
+
+    @property
+    def is_changed(self) -&gt; bool:
+        return self._changed
+
+    @property
+    def representation_for_update(self):
+        return {self.key: {&#39;content&#39;: {&#39;value&#39;: self.value}}}</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.display"><code class="name">var <span class="ident">display</span> : Optional[str]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.key"><code class="name">var <span class="ident">key</span> : Optional[str]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.value"><code class="name">var <span class="ident">value</span> : Union[str, int, ForwardRef(None)]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+<h3>Instance variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.is_changed"><code class="name">var <span class="ident">is_changed</span> : bool</code></dt>
+<dd>
+<div class="desc"></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">@property
+def is_changed(self) -&gt; bool:
+    return self._changed</code></pre>
+</details>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.representation_for_update"><code class="name">var <span class="ident">representation_for_update</span></code></dt>
+<dd>
+<div class="desc"></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">@property
+def representation_for_update(self):
+    return {self.key: {&#39;content&#39;: {&#39;value&#39;: self.value}}}</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Methods</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.set_value"><code class="name flex">
+<span>def <span class="ident">set_value</span></span>(<span>self, new_value: Union[str, int, ForwardRef(None)]) ‑> None</span>
+</code></dt>
+<dd>
+<div class="desc"></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def set_value(self, new_value: Optional[Union[str, int]]) -&gt; None:
+    self.value = new_value
+    self._changed = True</code></pre>
+</details>
+</dd>
+</dl>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="signals_notebook.entities.parallel_experiment" href="index.html">signals_notebook.entities.parallel_experiment</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell" href="#signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell">SubExperimentSummaryCell</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.display" href="#signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.display">display</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.is_changed" href="#signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.is_changed">is_changed</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.key" href="#signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.key">key</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.representation_for_update" href="#signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.representation_for_update">representation_for_update</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.set_value" href="#signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.set_value">set_value</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.value" href="#signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell.value">value</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
+</footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/signals_notebook/entities/parallel_experiment/index.html b/docs/signals_notebook/entities/parallel_experiment/index.html
new file mode 100644
index 00000000..8404cc28
--- /dev/null
+++ b/docs/signals_notebook/entities/parallel_experiment/index.html
@@ -0,0 +1,90 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.10.0" />
+<title>signals_notebook.entities.parallel_experiment API documentation</title>
+<meta name="description" content="" />
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>signals_notebook.entities.parallel_experiment</code></h1>
+</header>
+<section id="section-intro">
+</section>
+<section>
+<h2 class="section-title" id="header-submodules">Sub-modules</h2>
+<dl>
+<dt><code class="name"><a title="signals_notebook.entities.parallel_experiment.cell" href="cell.html">signals_notebook.entities.parallel_experiment.cell</a></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt><code class="name"><a title="signals_notebook.entities.parallel_experiment.parallel_experiment" href="parallel_experiment.html">signals_notebook.entities.parallel_experiment.parallel_experiment</a></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt><code class="name"><a title="signals_notebook.entities.parallel_experiment.row" href="row.html">signals_notebook.entities.parallel_experiment.row</a></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt><code class="name"><a title="signals_notebook.entities.parallel_experiment.sub_experiment" href="sub_experiment.html">signals_notebook.entities.parallel_experiment.sub_experiment</a></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt><code class="name"><a title="signals_notebook.entities.parallel_experiment.sub_experiment_layout" href="sub_experiment_layout.html">signals_notebook.entities.parallel_experiment.sub_experiment_layout</a></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt><code class="name"><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary" href="sub_experiment_summary.html">signals_notebook.entities.parallel_experiment.sub_experiment_summary</a></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="signals_notebook.entities" href="../index.html">signals_notebook.entities</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-submodules">Sub-modules</a></h3>
+<ul>
+<li><code><a title="signals_notebook.entities.parallel_experiment.cell" href="cell.html">signals_notebook.entities.parallel_experiment.cell</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment" href="parallel_experiment.html">signals_notebook.entities.parallel_experiment.parallel_experiment</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.row" href="row.html">signals_notebook.entities.parallel_experiment.row</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment" href="sub_experiment.html">signals_notebook.entities.parallel_experiment.sub_experiment</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_layout" href="sub_experiment_layout.html">signals_notebook.entities.parallel_experiment.sub_experiment_layout</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary" href="sub_experiment_summary.html">signals_notebook.entities.parallel_experiment.sub_experiment_summary</a></code></li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
+</footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/signals_notebook/entities/parallel_experiment/parallel_experiment.html b/docs/signals_notebook/entities/parallel_experiment/parallel_experiment.html
new file mode 100644
index 00000000..b1cbc293
--- /dev/null
+++ b/docs/signals_notebook/entities/parallel_experiment/parallel_experiment.html
@@ -0,0 +1,563 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.10.0" />
+<title>signals_notebook.entities.parallel_experiment.parallel_experiment API documentation</title>
+<meta name="description" content="" />
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>signals_notebook.entities.parallel_experiment.parallel_experiment</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">import logging
+from enum import Enum
+from functools import cached_property
+from typing import ClassVar, Generator, Literal, Optional
+
+from pydantic import BaseModel, Field
+
+from signals_notebook.common_types import (
+    Ancestors,
+    EntityCreationRequestPayload,
+    EntityType,
+    Template,
+)
+from signals_notebook.entities import Entity
+from signals_notebook.entities.container import Container
+from signals_notebook.entities.notebook import Notebook
+from signals_notebook.jinja_env import env
+
+log = logging.getLogger(__name__)
+
+
+class ParaExperimentState(str, Enum):
+    OPEN = &#39;open&#39;
+    CLOSED = &#39;closed&#39;
+
+
+class _Attributes(BaseModel):
+    name: str
+    description: Optional[str] = None
+
+
+class _Relationships(BaseModel):
+    template: Optional[Template] = None
+    ancestors: Optional[Ancestors] = None
+
+
+class _RequestBody(BaseModel):
+    type: EntityType
+    attributes: _Attributes
+    relationships: Optional[_Relationships] = None
+
+
+class _RequestPayload(EntityCreationRequestPayload[_RequestBody]):
+    pass
+
+
+class ParallelExperiment(Container):
+    type: Literal[EntityType.PARALLEL_EXPERIMENT] = Field(allow_mutation=False)
+    state: Optional[ParaExperimentState] = Field(allow_mutation=False, default=None)
+    _template_name: ClassVar = &#39;parallel_experiment.html&#39;
+
+    class Config:
+        keep_untouched = (cached_property,)
+
+    @classmethod
+    def _get_entity_type(cls) -&gt; EntityType:
+        return EntityType.PARALLEL_EXPERIMENT
+
+    @classmethod
+    def create(
+        cls,
+        *,
+        name: str,
+        description: Optional[str] = None,
+        template: Optional[&#39;ParallelExperiment&#39;] = None,
+        notebook: Optional[Notebook] = None,
+        digest: str = None,
+        force: bool = True,
+    ) -&gt; &#39;ParallelExperiment&#39;:
+        &#34;&#34;&#34;Create new Parallel Experiment in Signals Notebook
+
+        Args:
+            name: name of parallel experiment
+            description: description of parallel experiment
+            template: parallel experiment template
+            notebook: notebook where create parallel experiment
+            digest: Indicate digest
+            force: Force to create without doing digest check
+
+        Returns:
+            ParallelExperiment
+        &#34;&#34;&#34;
+
+        relationships = None
+        if template or notebook:
+            relationships = _Relationships(
+                ancestors=Ancestors(data=[notebook.short_description]) if notebook else None,
+                template=Template(data=template.short_description) if template else None,
+            )
+
+        request = _RequestPayload(
+            data=_RequestBody(
+                type=cls._get_entity_type(),
+                attributes=_Attributes(
+                    name=name,
+                    description=description,
+                ),
+                relationships=relationships,
+            )
+        )
+
+        log.debug(&#39;Creating Parallel Experiment for: %s&#39;, cls.__name__)
+        return super()._create(
+            digest=digest,
+            force=force,
+            request=request,
+        )
+
+    def get_children(self, order=&#39;&#39;) -&gt; Generator[Entity, None, None]:
+        &#34;&#34;&#34;Get children of SubExperiment.
+
+        Returns:
+            list of Entities
+        &#34;&#34;&#34;
+        return super().get_children(order=order)
+
+    def get_html(self) -&gt; str:
+        &#34;&#34;&#34;Get in HTML format
+
+        Returns:
+            Rendered template as a string
+        &#34;&#34;&#34;
+        data = {
+            &#39;title&#39;: self.name,
+            &#39;description&#39;: self.description,
+            &#39;edited_at&#39;: self.edited_at,
+            &#39;state&#39;: self.state,
+            &#39;children&#39;: self.get_children(),
+        }
+
+        template = env.get_template(self._template_name)
+        log.info(&#39;Html template for %s:%s has been rendered.&#39;, self.__class__.__name__, self.eid)
+
+        return template.render(data=data)</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody]"><code class="flex name class">
+<span>class <span class="ident">EntityCreationRequestPayload[_RequestBody]</span></span>
+<span>(</span><span>**data: Any)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="signals_notebook.common_types.EntityCreationRequestPayload" href="../../common_types.html#signals_notebook.common_types.EntityCreationRequestPayload">EntityCreationRequestPayload</a></li>
+<li>pydantic.generics.DataObject[_RequestBody]</li>
+<li><a title="signals_notebook.common_types.DataObject" href="../../common_types.html#signals_notebook.common_types.DataObject">DataObject</a></li>
+<li>pydantic.generics.GenericModel</li>
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+<li>typing.Generic</li>
+</ul>
+<h3>Subclasses</h3>
+<ul class="hlist">
+<li>signals_notebook.entities.parallel_experiment.parallel_experiment._RequestPayload</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody].Config"><code class="name">var <span class="ident">Config</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody].data"><code class="name">var <span class="ident">data</span> : signals_notebook.entities.parallel_experiment.parallel_experiment._RequestBody</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState"><code class="flex name class">
+<span>class <span class="ident">ParaExperimentState</span></span>
+<span>(</span><span>value, names=None, *, module=None, qualname=None, type=None, start=1)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>An enumeration.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class ParaExperimentState(str, Enum):
+    OPEN = &#39;open&#39;
+    CLOSED = &#39;closed&#39;</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li>builtins.str</li>
+<li>enum.Enum</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState.CLOSED"><code class="name">var <span class="ident">CLOSED</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState.OPEN"><code class="name">var <span class="ident">OPEN</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment"><code class="flex name class">
+<span>class <span class="ident">ParallelExperiment</span></span>
+<span>(</span><span>**data: Any)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class ParallelExperiment(Container):
+    type: Literal[EntityType.PARALLEL_EXPERIMENT] = Field(allow_mutation=False)
+    state: Optional[ParaExperimentState] = Field(allow_mutation=False, default=None)
+    _template_name: ClassVar = &#39;parallel_experiment.html&#39;
+
+    class Config:
+        keep_untouched = (cached_property,)
+
+    @classmethod
+    def _get_entity_type(cls) -&gt; EntityType:
+        return EntityType.PARALLEL_EXPERIMENT
+
+    @classmethod
+    def create(
+        cls,
+        *,
+        name: str,
+        description: Optional[str] = None,
+        template: Optional[&#39;ParallelExperiment&#39;] = None,
+        notebook: Optional[Notebook] = None,
+        digest: str = None,
+        force: bool = True,
+    ) -&gt; &#39;ParallelExperiment&#39;:
+        &#34;&#34;&#34;Create new Parallel Experiment in Signals Notebook
+
+        Args:
+            name: name of parallel experiment
+            description: description of parallel experiment
+            template: parallel experiment template
+            notebook: notebook where create parallel experiment
+            digest: Indicate digest
+            force: Force to create without doing digest check
+
+        Returns:
+            ParallelExperiment
+        &#34;&#34;&#34;
+
+        relationships = None
+        if template or notebook:
+            relationships = _Relationships(
+                ancestors=Ancestors(data=[notebook.short_description]) if notebook else None,
+                template=Template(data=template.short_description) if template else None,
+            )
+
+        request = _RequestPayload(
+            data=_RequestBody(
+                type=cls._get_entity_type(),
+                attributes=_Attributes(
+                    name=name,
+                    description=description,
+                ),
+                relationships=relationships,
+            )
+        )
+
+        log.debug(&#39;Creating Parallel Experiment for: %s&#39;, cls.__name__)
+        return super()._create(
+            digest=digest,
+            force=force,
+            request=request,
+        )
+
+    def get_children(self, order=&#39;&#39;) -&gt; Generator[Entity, None, None]:
+        &#34;&#34;&#34;Get children of SubExperiment.
+
+        Returns:
+            list of Entities
+        &#34;&#34;&#34;
+        return super().get_children(order=order)
+
+    def get_html(self) -&gt; str:
+        &#34;&#34;&#34;Get in HTML format
+
+        Returns:
+            Rendered template as a string
+        &#34;&#34;&#34;
+        data = {
+            &#39;title&#39;: self.name,
+            &#39;description&#39;: self.description,
+            &#39;edited_at&#39;: self.edited_at,
+            &#39;state&#39;: self.state,
+            &#39;children&#39;: self.get_children(),
+        }
+
+        template = env.get_template(self._template_name)
+        log.info(&#39;Html template for %s:%s has been rendered.&#39;, self.__class__.__name__, self.eid)
+
+        return template.render(data=data)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="signals_notebook.entities.container.Container" href="../container.html#signals_notebook.entities.container.Container">Container</a></li>
+<li><a title="signals_notebook.entities.entity.Entity" href="../entity.html#signals_notebook.entities.entity.Entity">Entity</a></li>
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+<li>abc.ABC</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.Config"><code class="name">var <span class="ident">Config</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.state"><code class="name">var <span class="ident">state</span> : Optional[<a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState">ParaExperimentState</a>]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.type"><code class="name">var <span class="ident">type</span> : Literal[<EntityType.PARALLEL_EXPERIMENT: 'paraexp'>]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+<h3>Static methods</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.create"><code class="name flex">
+<span>def <span class="ident">create</span></span>(<span>*, name: str, description: Optional[str] = None, template: Optional[ForwardRef('<a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment">ParallelExperiment</a>')] = None, notebook: Optional[<a title="signals_notebook.entities.notebook.Notebook" href="../notebook.html#signals_notebook.entities.notebook.Notebook">Notebook</a>] = None, digest: str = None, force: bool = True) ‑> <a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment">ParallelExperiment</a></span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create new Parallel Experiment in Signals Notebook</p>
+<h2 id="args">Args</h2>
+<dl>
+<dt><strong><code>name</code></strong></dt>
+<dd>name of parallel experiment</dd>
+<dt><strong><code>description</code></strong></dt>
+<dd>description of parallel experiment</dd>
+<dt><strong><code>template</code></strong></dt>
+<dd>parallel experiment template</dd>
+<dt><strong><code>notebook</code></strong></dt>
+<dd>notebook where create parallel experiment</dd>
+<dt><strong><code>digest</code></strong></dt>
+<dd>Indicate digest</dd>
+<dt><strong><code>force</code></strong></dt>
+<dd>Force to create without doing digest check</dd>
+</dl>
+<h2 id="returns">Returns</h2>
+<p>ParallelExperiment</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">@classmethod
+def create(
+    cls,
+    *,
+    name: str,
+    description: Optional[str] = None,
+    template: Optional[&#39;ParallelExperiment&#39;] = None,
+    notebook: Optional[Notebook] = None,
+    digest: str = None,
+    force: bool = True,
+) -&gt; &#39;ParallelExperiment&#39;:
+    &#34;&#34;&#34;Create new Parallel Experiment in Signals Notebook
+
+    Args:
+        name: name of parallel experiment
+        description: description of parallel experiment
+        template: parallel experiment template
+        notebook: notebook where create parallel experiment
+        digest: Indicate digest
+        force: Force to create without doing digest check
+
+    Returns:
+        ParallelExperiment
+    &#34;&#34;&#34;
+
+    relationships = None
+    if template or notebook:
+        relationships = _Relationships(
+            ancestors=Ancestors(data=[notebook.short_description]) if notebook else None,
+            template=Template(data=template.short_description) if template else None,
+        )
+
+    request = _RequestPayload(
+        data=_RequestBody(
+            type=cls._get_entity_type(),
+            attributes=_Attributes(
+                name=name,
+                description=description,
+            ),
+            relationships=relationships,
+        )
+    )
+
+    log.debug(&#39;Creating Parallel Experiment for: %s&#39;, cls.__name__)
+    return super()._create(
+        digest=digest,
+        force=force,
+        request=request,
+    )</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Methods</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.get_children"><code class="name flex">
+<span>def <span class="ident">get_children</span></span>(<span>self, order='') ‑> Generator[<a title="signals_notebook.entities.entity.Entity" href="../entity.html#signals_notebook.entities.entity.Entity">Entity</a>, None, None]</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Get children of SubExperiment.</p>
+<h2 id="returns">Returns</h2>
+<p>list of Entities</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def get_children(self, order=&#39;&#39;) -&gt; Generator[Entity, None, None]:
+    &#34;&#34;&#34;Get children of SubExperiment.
+
+    Returns:
+        list of Entities
+    &#34;&#34;&#34;
+    return super().get_children(order=order)</code></pre>
+</details>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.get_html"><code class="name flex">
+<span>def <span class="ident">get_html</span></span>(<span>self) ‑> str</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Get in HTML format</p>
+<h2 id="returns">Returns</h2>
+<p>Rendered template as a string</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def get_html(self) -&gt; str:
+    &#34;&#34;&#34;Get in HTML format
+
+    Returns:
+        Rendered template as a string
+    &#34;&#34;&#34;
+    data = {
+        &#39;title&#39;: self.name,
+        &#39;description&#39;: self.description,
+        &#39;edited_at&#39;: self.edited_at,
+        &#39;state&#39;: self.state,
+        &#39;children&#39;: self.get_children(),
+    }
+
+    template = env.get_template(self._template_name)
+    log.info(&#39;Html template for %s:%s has been rendered.&#39;, self.__class__.__name__, self.eid)
+
+    return template.render(data=data)</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="signals_notebook.entities.container.Container" href="../container.html#signals_notebook.entities.container.Container">Container</a></b></code>:
+<ul class="hlist">
+<li><code><a title="signals_notebook.entities.container.Container.add_child" href="../container.html#signals_notebook.entities.container.Container.add_child">add_child</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.delete" href="../entity.html#signals_notebook.entities.entity.Entity.delete">delete</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.dump_templates" href="../container.html#signals_notebook.entities.container.Container.dump_templates">dump_templates</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.get_list" href="../entity.html#signals_notebook.entities.entity.Entity.get_list">get_list</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.get_subclasses" href="../entity.html#signals_notebook.entities.entity.Entity.get_subclasses">get_subclasses</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.get_template_name" href="../entity.html#signals_notebook.entities.entity.Entity.get_template_name">get_template_name</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.refresh" href="../entity.html#signals_notebook.entities.entity.Entity.refresh">refresh</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.save" href="../entity.html#signals_notebook.entities.entity.Entity.save">save</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.set_template_name" href="../entity.html#signals_notebook.entities.entity.Entity.set_template_name">set_template_name</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.short_description" href="../entity.html#signals_notebook.entities.entity.Entity.short_description">short_description</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="signals_notebook.entities.parallel_experiment" href="index.html">signals_notebook.entities.parallel_experiment</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody]" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody]">EntityCreationRequestPayload[_RequestBody]</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody].Config" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody].Config">Config</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody].data" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.EntityCreationRequestPayload[_RequestBody].data">data</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState">ParaExperimentState</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState.CLOSED" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState.CLOSED">CLOSED</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState.OPEN" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParaExperimentState.OPEN">OPEN</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment">ParallelExperiment</a></code></h4>
+<ul class="two-column">
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.Config" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.Config">Config</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.create" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.create">create</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.get_children" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.get_children">get_children</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.get_html" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.get_html">get_html</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.state" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.state">state</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.type" href="#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment.type">type</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
+</footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/signals_notebook/entities/parallel_experiment/row.html b/docs/signals_notebook/entities/parallel_experiment/row.html
new file mode 100644
index 00000000..bb310b5a
--- /dev/null
+++ b/docs/signals_notebook/entities/parallel_experiment/row.html
@@ -0,0 +1,436 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.10.0" />
+<title>signals_notebook.entities.parallel_experiment.row API documentation</title>
+<meta name="description" content="" />
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>signals_notebook.entities.parallel_experiment.row</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">import logging
+from typing import Any, Dict, List, Literal, Optional, Union
+from uuid import UUID
+
+from pydantic import BaseModel, Field, PrivateAttr
+
+from signals_notebook.common_types import ObjectType
+from signals_notebook.entities.parallel_experiment.cell import SubExperimentSummaryCell
+
+log = logging.getLogger(__name__)
+
+
+class Content(BaseModel):
+    columns: Optional[dict]
+
+
+class RowRequestBody(BaseModel):
+    id: Optional[Union[UUID, str]]
+    type: Literal[ObjectType.SUB_EXPERIMENT] = Field(allow_mutation=False, default=ObjectType.SUB_EXPERIMENT)
+    attributes: Content
+
+    class Config:
+        validate_assignment = True
+
+
+class Row(BaseModel):
+    id: Optional[Union[UUID, str]]
+    cells: List[SubExperimentSummaryCell] = Field(alias=&#39;columns&#39;)
+    _cells_dict: Dict[Union[UUID, str], SubExperimentSummaryCell] = PrivateAttr(default={})
+
+    class Config:
+        validate_assignment = True
+
+    def __init__(self, **data):
+        super().__init__(**data)
+
+        for cell in self.cells:
+            self._cells_dict[cell.key] = cell
+
+    def get(self, value: str, default: Any = None) -&gt; Union[SubExperimentSummaryCell, Any]:
+        &#34;&#34;&#34;Get one of the cells
+
+        Args:
+            value: key to get one of the cells
+            default: default value if key doesn&#39;t exist
+
+        Returns:
+            Union[Cell, Any]
+        &#34;&#34;&#34;
+        try:
+            return self[value]
+        except KeyError:
+            log.debug(&#39;KeyError were caught. Default value returned&#39;)
+            return default
+
+    @property
+    def is_changed(self) -&gt; bool:
+        &#34;&#34;&#34;Get is_changed field
+
+        Returns:
+            bool: True/False
+        &#34;&#34;&#34;
+        return any([cell.is_changed for cell in self.cells])
+
+    def __getitem__(self, index: str) -&gt; SubExperimentSummaryCell:
+        if isinstance(index, str):
+            if index in self._cells_dict:
+                return self._cells_dict[index]
+
+        log.exception(&#39;IndexError were caught. Invalid index&#39;)
+        raise IndexError(&#39;Invalid index&#39;)
+
+    def __iter__(self):
+        return self.cells.__iter__()
+
+    @property
+    def representation_for_update(self) -&gt; List[Dict[str, str]]:
+        &#34;&#34;&#34;Present Row object as a request body to update values
+
+        Returns:
+            list of changed cells
+        &#34;&#34;&#34;
+        changed_cells = []
+        for cell in self.cells:
+            if cell.is_changed:
+                body = RowRequestBody(id=str(self.id), attributes=Content(columns=cell.representation_for_update))
+                changed_cells.append(body.dict())
+
+        return changed_cells</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.row.Content"><code class="flex name class">
+<span>class <span class="ident">Content</span></span>
+<span>(</span><span>**data: Any)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class Content(BaseModel):
+    columns: Optional[dict]</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.row.Content.columns"><code class="name">var <span class="ident">columns</span> : Optional[dict]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.row.Row"><code class="flex name class">
+<span>class <span class="ident">Row</span></span>
+<span>(</span><span>**data)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class Row(BaseModel):
+    id: Optional[Union[UUID, str]]
+    cells: List[SubExperimentSummaryCell] = Field(alias=&#39;columns&#39;)
+    _cells_dict: Dict[Union[UUID, str], SubExperimentSummaryCell] = PrivateAttr(default={})
+
+    class Config:
+        validate_assignment = True
+
+    def __init__(self, **data):
+        super().__init__(**data)
+
+        for cell in self.cells:
+            self._cells_dict[cell.key] = cell
+
+    def get(self, value: str, default: Any = None) -&gt; Union[SubExperimentSummaryCell, Any]:
+        &#34;&#34;&#34;Get one of the cells
+
+        Args:
+            value: key to get one of the cells
+            default: default value if key doesn&#39;t exist
+
+        Returns:
+            Union[Cell, Any]
+        &#34;&#34;&#34;
+        try:
+            return self[value]
+        except KeyError:
+            log.debug(&#39;KeyError were caught. Default value returned&#39;)
+            return default
+
+    @property
+    def is_changed(self) -&gt; bool:
+        &#34;&#34;&#34;Get is_changed field
+
+        Returns:
+            bool: True/False
+        &#34;&#34;&#34;
+        return any([cell.is_changed for cell in self.cells])
+
+    def __getitem__(self, index: str) -&gt; SubExperimentSummaryCell:
+        if isinstance(index, str):
+            if index in self._cells_dict:
+                return self._cells_dict[index]
+
+        log.exception(&#39;IndexError were caught. Invalid index&#39;)
+        raise IndexError(&#39;Invalid index&#39;)
+
+    def __iter__(self):
+        return self.cells.__iter__()
+
+    @property
+    def representation_for_update(self) -&gt; List[Dict[str, str]]:
+        &#34;&#34;&#34;Present Row object as a request body to update values
+
+        Returns:
+            list of changed cells
+        &#34;&#34;&#34;
+        changed_cells = []
+        for cell in self.cells:
+            if cell.is_changed:
+                body = RowRequestBody(id=str(self.id), attributes=Content(columns=cell.representation_for_update))
+                changed_cells.append(body.dict())
+
+        return changed_cells</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.row.Row.Config"><code class="name">var <span class="ident">Config</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.row.Row.cells"><code class="name">var <span class="ident">cells</span> : List[<a title="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell" href="cell.html#signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell">SubExperimentSummaryCell</a>]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.row.Row.id"><code class="name">var <span class="ident">id</span> : Union[uuid.UUID, str, ForwardRef(None)]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+<h3>Instance variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.row.Row.is_changed"><code class="name">var <span class="ident">is_changed</span> : bool</code></dt>
+<dd>
+<div class="desc"><p>Get is_changed field</p>
+<h2 id="returns">Returns</h2>
+<dl>
+<dt><code>bool</code></dt>
+<dd>True/False</dd>
+</dl></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">@property
+def is_changed(self) -&gt; bool:
+    &#34;&#34;&#34;Get is_changed field
+
+    Returns:
+        bool: True/False
+    &#34;&#34;&#34;
+    return any([cell.is_changed for cell in self.cells])</code></pre>
+</details>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.row.Row.representation_for_update"><code class="name">var <span class="ident">representation_for_update</span> : List[Dict[str, str]]</code></dt>
+<dd>
+<div class="desc"><p>Present Row object as a request body to update values</p>
+<h2 id="returns">Returns</h2>
+<p>list of changed cells</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">@property
+def representation_for_update(self) -&gt; List[Dict[str, str]]:
+    &#34;&#34;&#34;Present Row object as a request body to update values
+
+    Returns:
+        list of changed cells
+    &#34;&#34;&#34;
+    changed_cells = []
+    for cell in self.cells:
+        if cell.is_changed:
+            body = RowRequestBody(id=str(self.id), attributes=Content(columns=cell.representation_for_update))
+            changed_cells.append(body.dict())
+
+    return changed_cells</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Methods</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.row.Row.get"><code class="name flex">
+<span>def <span class="ident">get</span></span>(<span>self, value: str, default: Any = None) ‑> Union[<a title="signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell" href="cell.html#signals_notebook.entities.parallel_experiment.cell.SubExperimentSummaryCell">SubExperimentSummaryCell</a>, Any]</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Get one of the cells</p>
+<h2 id="args">Args</h2>
+<dl>
+<dt><strong><code>value</code></strong></dt>
+<dd>key to get one of the cells</dd>
+<dt><strong><code>default</code></strong></dt>
+<dd>default value if key doesn't exist</dd>
+</dl>
+<h2 id="returns">Returns</h2>
+<p>Union[Cell, Any]</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def get(self, value: str, default: Any = None) -&gt; Union[SubExperimentSummaryCell, Any]:
+    &#34;&#34;&#34;Get one of the cells
+
+    Args:
+        value: key to get one of the cells
+        default: default value if key doesn&#39;t exist
+
+    Returns:
+        Union[Cell, Any]
+    &#34;&#34;&#34;
+    try:
+        return self[value]
+    except KeyError:
+        log.debug(&#39;KeyError were caught. Default value returned&#39;)
+        return default</code></pre>
+</details>
+</dd>
+</dl>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.row.RowRequestBody"><code class="flex name class">
+<span>class <span class="ident">RowRequestBody</span></span>
+<span>(</span><span>**data: Any)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class RowRequestBody(BaseModel):
+    id: Optional[Union[UUID, str]]
+    type: Literal[ObjectType.SUB_EXPERIMENT] = Field(allow_mutation=False, default=ObjectType.SUB_EXPERIMENT)
+    attributes: Content
+
+    class Config:
+        validate_assignment = True</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.row.RowRequestBody.Config"><code class="name">var <span class="ident">Config</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.row.RowRequestBody.attributes"><code class="name">var <span class="ident">attributes</span> : <a title="signals_notebook.entities.parallel_experiment.row.Content" href="#signals_notebook.entities.parallel_experiment.row.Content">Content</a></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.row.RowRequestBody.id"><code class="name">var <span class="ident">id</span> : Union[uuid.UUID, str, ForwardRef(None)]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.row.RowRequestBody.type"><code class="name">var <span class="ident">type</span> : Literal[<ObjectType.SUB_EXPERIMENT: 'subexpSummaryRow'>]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="signals_notebook.entities.parallel_experiment" href="index.html">signals_notebook.entities.parallel_experiment</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.row.Content" href="#signals_notebook.entities.parallel_experiment.row.Content">Content</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.Content.columns" href="#signals_notebook.entities.parallel_experiment.row.Content.columns">columns</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.row.Row" href="#signals_notebook.entities.parallel_experiment.row.Row">Row</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.Row.Config" href="#signals_notebook.entities.parallel_experiment.row.Row.Config">Config</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.Row.cells" href="#signals_notebook.entities.parallel_experiment.row.Row.cells">cells</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.Row.get" href="#signals_notebook.entities.parallel_experiment.row.Row.get">get</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.Row.id" href="#signals_notebook.entities.parallel_experiment.row.Row.id">id</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.Row.is_changed" href="#signals_notebook.entities.parallel_experiment.row.Row.is_changed">is_changed</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.Row.representation_for_update" href="#signals_notebook.entities.parallel_experiment.row.Row.representation_for_update">representation_for_update</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.row.RowRequestBody" href="#signals_notebook.entities.parallel_experiment.row.RowRequestBody">RowRequestBody</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.RowRequestBody.Config" href="#signals_notebook.entities.parallel_experiment.row.RowRequestBody.Config">Config</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.RowRequestBody.attributes" href="#signals_notebook.entities.parallel_experiment.row.RowRequestBody.attributes">attributes</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.RowRequestBody.id" href="#signals_notebook.entities.parallel_experiment.row.RowRequestBody.id">id</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.row.RowRequestBody.type" href="#signals_notebook.entities.parallel_experiment.row.RowRequestBody.type">type</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
+</footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/signals_notebook/entities/parallel_experiment/sub_experiment.html b/docs/signals_notebook/entities/parallel_experiment/sub_experiment.html
new file mode 100644
index 00000000..1ac91971
--- /dev/null
+++ b/docs/signals_notebook/entities/parallel_experiment/sub_experiment.html
@@ -0,0 +1,437 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.10.0" />
+<title>signals_notebook.entities.parallel_experiment.sub_experiment API documentation</title>
+<meta name="description" content="" />
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>signals_notebook.entities.parallel_experiment.sub_experiment</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">import logging
+from functools import cached_property
+from typing import Generator, Literal, Optional
+
+from pydantic import BaseModel, Field
+
+from signals_notebook.common_types import (
+    Ancestors,
+    EntityCreationRequestPayload,
+    EntityType,
+    Template,
+)
+from signals_notebook.entities import Entity
+from signals_notebook.entities.container import Container
+from signals_notebook.entities.parallel_experiment.parallel_experiment import ParallelExperiment
+from signals_notebook.jinja_env import env
+
+log = logging.getLogger(__name__)
+
+
+class _SubExperimentAttributes(BaseModel):
+    description: Optional[str] = None
+
+
+class _SubExperimentRelationships(BaseModel):
+    template: Optional[Template] = None
+    ancestors: Optional[Ancestors] = None
+
+
+class _SubExperimentRequestBody(BaseModel):
+    type: EntityType
+    attributes: Optional[_SubExperimentAttributes]
+    relationships: Optional[_SubExperimentRelationships] = None
+
+
+class _SubExperimentRequestPayload(EntityCreationRequestPayload[_SubExperimentRequestBody]):
+    pass
+
+
+class SubExperiment(Container):
+    type: Literal[EntityType.SUB_EXPERIMENT] = Field(allow_mutation=False)
+    _template_name = &#39;sub_experiment.html&#39;
+
+    class Config:
+        keep_untouched = (cached_property,)
+
+    @classmethod
+    def _get_entity_type(cls) -&gt; EntityType:
+        return EntityType.SUB_EXPERIMENT
+
+    def get_children(self, order=&#39;&#39;) -&gt; Generator[Entity, None, None]:
+        &#34;&#34;&#34;Get children of SubExperiment.
+
+        Returns:
+            list of Entities
+        &#34;&#34;&#34;
+        return super().get_children(order=order)
+
+    @classmethod
+    def create(
+        cls,
+        *,
+        parallel_experiment: ParallelExperiment,
+        description: Optional[str] = None,
+        template: Optional[&#39;SubExperiment&#39;] = None,
+        digest: str = None,
+        force: bool = True,
+    ) -&gt; &#39;SubExperiment&#39;:
+
+        relationships = None
+        if template or parallel_experiment:
+            relationships = _SubExperimentRelationships(
+                ancestors=Ancestors(data=[parallel_experiment.short_description]) if parallel_experiment else None,
+                template=Template(data=template.short_description) if template else None,
+            )
+
+        request = _SubExperimentRequestPayload(
+            data=_SubExperimentRequestBody(
+                type=cls._get_entity_type(),
+                attributes=_SubExperimentAttributes(description=description),
+                relationships=relationships,
+            )
+        )
+
+        return super()._create(
+            digest=digest,
+            force=force,
+            request=request,
+        )
+
+    def get_html(self) -&gt; str:
+        &#34;&#34;&#34;Get in HTML format
+
+        Returns:
+            Rendered template as a string
+        &#34;&#34;&#34;
+        data = {
+            &#39;title&#39;: self.name,
+            &#39;description&#39;: self.description,
+            &#39;edited_at&#39;: self.edited_at,
+            &#39;children&#39;: self.get_children(),
+        }
+
+        template = env.get_template(self._template_name)
+        log.info(&#39;Html template for %s:%s has been rendered.&#39;, self.__class__.__name__, self.eid)
+
+        return template.render(data=data)</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody]"><code class="flex name class">
+<span>class <span class="ident">EntityCreationRequestPayload[_SubExperimentRequestBody]</span></span>
+<span>(</span><span>**data: Any)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="signals_notebook.common_types.EntityCreationRequestPayload" href="../../common_types.html#signals_notebook.common_types.EntityCreationRequestPayload">EntityCreationRequestPayload</a></li>
+<li>pydantic.generics.DataObject[_SubExperimentRequestBody]</li>
+<li><a title="signals_notebook.common_types.DataObject" href="../../common_types.html#signals_notebook.common_types.DataObject">DataObject</a></li>
+<li>pydantic.generics.GenericModel</li>
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+<li>typing.Generic</li>
+</ul>
+<h3>Subclasses</h3>
+<ul class="hlist">
+<li>signals_notebook.entities.parallel_experiment.sub_experiment._SubExperimentRequestPayload</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody].Config"><code class="name">var <span class="ident">Config</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody].data"><code class="name">var <span class="ident">data</span> : signals_notebook.entities.parallel_experiment.sub_experiment._SubExperimentRequestBody</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment"><code class="flex name class">
+<span>class <span class="ident">SubExperiment</span></span>
+<span>(</span><span>**data: Any)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class SubExperiment(Container):
+    type: Literal[EntityType.SUB_EXPERIMENT] = Field(allow_mutation=False)
+    _template_name = &#39;sub_experiment.html&#39;
+
+    class Config:
+        keep_untouched = (cached_property,)
+
+    @classmethod
+    def _get_entity_type(cls) -&gt; EntityType:
+        return EntityType.SUB_EXPERIMENT
+
+    def get_children(self, order=&#39;&#39;) -&gt; Generator[Entity, None, None]:
+        &#34;&#34;&#34;Get children of SubExperiment.
+
+        Returns:
+            list of Entities
+        &#34;&#34;&#34;
+        return super().get_children(order=order)
+
+    @classmethod
+    def create(
+        cls,
+        *,
+        parallel_experiment: ParallelExperiment,
+        description: Optional[str] = None,
+        template: Optional[&#39;SubExperiment&#39;] = None,
+        digest: str = None,
+        force: bool = True,
+    ) -&gt; &#39;SubExperiment&#39;:
+
+        relationships = None
+        if template or parallel_experiment:
+            relationships = _SubExperimentRelationships(
+                ancestors=Ancestors(data=[parallel_experiment.short_description]) if parallel_experiment else None,
+                template=Template(data=template.short_description) if template else None,
+            )
+
+        request = _SubExperimentRequestPayload(
+            data=_SubExperimentRequestBody(
+                type=cls._get_entity_type(),
+                attributes=_SubExperimentAttributes(description=description),
+                relationships=relationships,
+            )
+        )
+
+        return super()._create(
+            digest=digest,
+            force=force,
+            request=request,
+        )
+
+    def get_html(self) -&gt; str:
+        &#34;&#34;&#34;Get in HTML format
+
+        Returns:
+            Rendered template as a string
+        &#34;&#34;&#34;
+        data = {
+            &#39;title&#39;: self.name,
+            &#39;description&#39;: self.description,
+            &#39;edited_at&#39;: self.edited_at,
+            &#39;children&#39;: self.get_children(),
+        }
+
+        template = env.get_template(self._template_name)
+        log.info(&#39;Html template for %s:%s has been rendered.&#39;, self.__class__.__name__, self.eid)
+
+        return template.render(data=data)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="signals_notebook.entities.container.Container" href="../container.html#signals_notebook.entities.container.Container">Container</a></li>
+<li><a title="signals_notebook.entities.entity.Entity" href="../entity.html#signals_notebook.entities.entity.Entity">Entity</a></li>
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+<li>abc.ABC</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.Config"><code class="name">var <span class="ident">Config</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.type"><code class="name">var <span class="ident">type</span> : Literal[<EntityType.SUB_EXPERIMENT: 'parasubexp'>]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+<h3>Static methods</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.create"><code class="name flex">
+<span>def <span class="ident">create</span></span>(<span>*, parallel_experiment: <a title="signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment" href="parallel_experiment.html#signals_notebook.entities.parallel_experiment.parallel_experiment.ParallelExperiment">ParallelExperiment</a>, description: Optional[str] = None, template: Optional[ForwardRef('<a title="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment" href="#signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment">SubExperiment</a>')] = None, digest: str = None, force: bool = True) ‑> <a title="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment" href="#signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment">SubExperiment</a></span>
+</code></dt>
+<dd>
+<div class="desc"></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">@classmethod
+def create(
+    cls,
+    *,
+    parallel_experiment: ParallelExperiment,
+    description: Optional[str] = None,
+    template: Optional[&#39;SubExperiment&#39;] = None,
+    digest: str = None,
+    force: bool = True,
+) -&gt; &#39;SubExperiment&#39;:
+
+    relationships = None
+    if template or parallel_experiment:
+        relationships = _SubExperimentRelationships(
+            ancestors=Ancestors(data=[parallel_experiment.short_description]) if parallel_experiment else None,
+            template=Template(data=template.short_description) if template else None,
+        )
+
+    request = _SubExperimentRequestPayload(
+        data=_SubExperimentRequestBody(
+            type=cls._get_entity_type(),
+            attributes=_SubExperimentAttributes(description=description),
+            relationships=relationships,
+        )
+    )
+
+    return super()._create(
+        digest=digest,
+        force=force,
+        request=request,
+    )</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Methods</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.get_children"><code class="name flex">
+<span>def <span class="ident">get_children</span></span>(<span>self, order='') ‑> Generator[<a title="signals_notebook.entities.entity.Entity" href="../entity.html#signals_notebook.entities.entity.Entity">Entity</a>, None, None]</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Get children of SubExperiment.</p>
+<h2 id="returns">Returns</h2>
+<p>list of Entities</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def get_children(self, order=&#39;&#39;) -&gt; Generator[Entity, None, None]:
+    &#34;&#34;&#34;Get children of SubExperiment.
+
+    Returns:
+        list of Entities
+    &#34;&#34;&#34;
+    return super().get_children(order=order)</code></pre>
+</details>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.get_html"><code class="name flex">
+<span>def <span class="ident">get_html</span></span>(<span>self) ‑> str</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Get in HTML format</p>
+<h2 id="returns">Returns</h2>
+<p>Rendered template as a string</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def get_html(self) -&gt; str:
+    &#34;&#34;&#34;Get in HTML format
+
+    Returns:
+        Rendered template as a string
+    &#34;&#34;&#34;
+    data = {
+        &#39;title&#39;: self.name,
+        &#39;description&#39;: self.description,
+        &#39;edited_at&#39;: self.edited_at,
+        &#39;children&#39;: self.get_children(),
+    }
+
+    template = env.get_template(self._template_name)
+    log.info(&#39;Html template for %s:%s has been rendered.&#39;, self.__class__.__name__, self.eid)
+
+    return template.render(data=data)</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="signals_notebook.entities.container.Container" href="../container.html#signals_notebook.entities.container.Container">Container</a></b></code>:
+<ul class="hlist">
+<li><code><a title="signals_notebook.entities.container.Container.add_child" href="../container.html#signals_notebook.entities.container.Container.add_child">add_child</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.delete" href="../entity.html#signals_notebook.entities.entity.Entity.delete">delete</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.dump_templates" href="../container.html#signals_notebook.entities.container.Container.dump_templates">dump_templates</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.get_list" href="../entity.html#signals_notebook.entities.entity.Entity.get_list">get_list</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.get_subclasses" href="../entity.html#signals_notebook.entities.entity.Entity.get_subclasses">get_subclasses</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.get_template_name" href="../entity.html#signals_notebook.entities.entity.Entity.get_template_name">get_template_name</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.refresh" href="../entity.html#signals_notebook.entities.entity.Entity.refresh">refresh</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.save" href="../entity.html#signals_notebook.entities.entity.Entity.save">save</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.set_template_name" href="../entity.html#signals_notebook.entities.entity.Entity.set_template_name">set_template_name</a></code></li>
+<li><code><a title="signals_notebook.entities.container.Container.short_description" href="../entity.html#signals_notebook.entities.entity.Entity.short_description">short_description</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="signals_notebook.entities.parallel_experiment" href="index.html">signals_notebook.entities.parallel_experiment</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody]" href="#signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody]">EntityCreationRequestPayload[_SubExperimentRequestBody]</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody].Config" href="#signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody].Config">Config</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody].data" href="#signals_notebook.entities.parallel_experiment.sub_experiment.EntityCreationRequestPayload[_SubExperimentRequestBody].data">data</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment" href="#signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment">SubExperiment</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.Config" href="#signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.Config">Config</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.create" href="#signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.create">create</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.get_children" href="#signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.get_children">get_children</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.get_html" href="#signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.get_html">get_html</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.type" href="#signals_notebook.entities.parallel_experiment.sub_experiment.SubExperiment.type">type</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
+</footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/signals_notebook/entities/parallel_experiment/sub_experiment_layout.html b/docs/signals_notebook/entities/parallel_experiment/sub_experiment_layout.html
new file mode 100644
index 00000000..611bad0b
--- /dev/null
+++ b/docs/signals_notebook/entities/parallel_experiment/sub_experiment_layout.html
@@ -0,0 +1,167 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.10.0" />
+<title>signals_notebook.entities.parallel_experiment.sub_experiment_layout API documentation</title>
+<meta name="description" content="" />
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>signals_notebook.entities.parallel_experiment.sub_experiment_layout</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">import logging
+from typing import ClassVar, Literal
+
+from pydantic import Field
+
+from signals_notebook.common_types import EntityType, File
+from signals_notebook.entities.contentful_entity import ContentfulEntity
+
+log = logging.getLogger(__name__)
+
+
+class SubExperimentLayout(ContentfulEntity):
+    type: Literal[EntityType.SUB_EXPERIMENT_LAYOUT] = Field(allow_mutation=False)
+    _template_name: ClassVar = &#39;subexp_layout.html&#39;
+
+    @classmethod
+    def _get_entity_type(cls) -&gt; EntityType:
+        return EntityType.SUB_EXPERIMENT_LAYOUT
+
+    def get_content(self) -&gt; File:
+        return super()._get_content()</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout"><code class="flex name class">
+<span>class <span class="ident">SubExperimentLayout</span></span>
+<span>(</span><span>**data: Any)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class SubExperimentLayout(ContentfulEntity):
+    type: Literal[EntityType.SUB_EXPERIMENT_LAYOUT] = Field(allow_mutation=False)
+    _template_name: ClassVar = &#39;subexp_layout.html&#39;
+
+    @classmethod
+    def _get_entity_type(cls) -&gt; EntityType:
+        return EntityType.SUB_EXPERIMENT_LAYOUT
+
+    def get_content(self) -&gt; File:
+        return super()._get_content()</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="signals_notebook.entities.contentful_entity.ContentfulEntity" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity">ContentfulEntity</a></li>
+<li><a title="signals_notebook.entities.entity.Entity" href="../entity.html#signals_notebook.entities.entity.Entity">Entity</a></li>
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+<li>abc.ABC</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout.type"><code class="name">var <span class="ident">type</span> : Literal[<EntityType.SUB_EXPERIMENT_LAYOUT: 'paraLayout'>]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+<h3>Methods</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout.get_content"><code class="name flex">
+<span>def <span class="ident">get_content</span></span>(<span>self) ‑> <a title="signals_notebook.common_types.File" href="../../common_types.html#signals_notebook.common_types.File">File</a></span>
+</code></dt>
+<dd>
+<div class="desc"></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def get_content(self) -&gt; File:
+    return super()._get_content()</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="signals_notebook.entities.contentful_entity.ContentfulEntity" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity">ContentfulEntity</a></b></code>:
+<ul class="hlist">
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.ContentType" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity.ContentType">ContentType</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.delete" href="../entity.html#signals_notebook.entities.entity.Entity.delete">delete</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.dump" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity.dump">dump</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.dump_templates" href="../entity.html#signals_notebook.entities.entity.Entity.dump_templates">dump_templates</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.get_html" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity.get_html">get_html</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.get_list" href="../entity.html#signals_notebook.entities.entity.Entity.get_list">get_list</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.get_subclasses" href="../entity.html#signals_notebook.entities.entity.Entity.get_subclasses">get_subclasses</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.get_template_name" href="../entity.html#signals_notebook.entities.entity.Entity.get_template_name">get_template_name</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.load" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity.load">load</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.refresh" href="../entity.html#signals_notebook.entities.entity.Entity.refresh">refresh</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.save" href="../entity.html#signals_notebook.entities.entity.Entity.save">save</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.set_template_name" href="../entity.html#signals_notebook.entities.entity.Entity.set_template_name">set_template_name</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.short_description" href="../entity.html#signals_notebook.entities.entity.Entity.short_description">short_description</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="signals_notebook.entities.parallel_experiment" href="index.html">signals_notebook.entities.parallel_experiment</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout" href="#signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout">SubExperimentLayout</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout.get_content" href="#signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout.get_content">get_content</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout.type" href="#signals_notebook.entities.parallel_experiment.sub_experiment_layout.SubExperimentLayout.type">type</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
+</footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/signals_notebook/entities/parallel_experiment/sub_experiment_summary.html b/docs/signals_notebook/entities/parallel_experiment/sub_experiment_summary.html
new file mode 100644
index 00000000..c912f724
--- /dev/null
+++ b/docs/signals_notebook/entities/parallel_experiment/sub_experiment_summary.html
@@ -0,0 +1,588 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.10.0" />
+<title>signals_notebook.entities.parallel_experiment.sub_experiment_summary API documentation</title>
+<meta name="description" content="" />
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
+<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
+<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
+<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
+<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>signals_notebook.entities.parallel_experiment.sub_experiment_summary</code></h1>
+</header>
+<section id="section-intro">
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">import json
+import logging
+import time
+from typing import cast, Dict, List, Literal, Union
+from uuid import UUID
+
+from pydantic import Field, PrivateAttr
+
+from signals_notebook.api import SignalsNotebookApi
+from signals_notebook.common_types import EntityType, Response, ResponseData
+from signals_notebook.entities.contentful_entity import ContentfulEntity
+from signals_notebook.entities.parallel_experiment.row import Row
+from signals_notebook.jinja_env import env
+
+log = logging.getLogger(__name__)
+
+
+class SubExpSummaryResponse(Response[Row]):
+    pass
+
+
+class SubExperimentSummary(ContentfulEntity):
+    type: Literal[EntityType.SUB_EXPERIMENT_SUMMARY] = Field(allow_mutation=False)
+    _rows: List[Row] = PrivateAttr(default=[])
+    _rows_by_id: Dict[Union[str, UUID], Row] = PrivateAttr(default={})
+    _template_name = &#39;subexp_summary.html&#39;
+
+    @classmethod
+    def _get_entity_type(cls) -&gt; EntityType:
+        return EntityType.SUB_EXPERIMENT_SUMMARY
+
+    @classmethod
+    def _get_endpoint(cls) -&gt; str:
+        return &#39;subexpSummary&#39;
+
+    def __getitem__(self, index: Union[int, str, UUID]) -&gt; Row:
+        if not self._rows:
+            self._reload_cells()
+
+        if isinstance(index, int):
+            return self._rows[index]
+
+        if isinstance(index, str):
+            try:
+                return self._rows_by_id[UUID(index)]
+            except ValueError:
+                return self._rows_by_id[index]
+
+        if isinstance(index, UUID):
+            return self._rows_by_id[index]
+
+        raise IndexError(&#39;Invalid index&#39;)
+
+    def __iter__(self):
+        if not self._rows:
+            self._reload_cells()
+        return self._rows.__iter__()
+
+    def _reload_cells(self) -&gt; None:
+        api = SignalsNotebookApi.get_default_api()
+        log.debug(&#39;Reloading data in Table: %s...&#39;, self.eid)
+
+        response = api.call(
+            method=&#39;GET&#39;,
+            path=(self._get_endpoint(), self.eid, &#39;rows&#39;),
+        )
+
+        result = SubExpSummaryResponse(**response.json())  # type: ignore
+        cells = [cast(ResponseData, item).body for item in result.data]
+
+        self._rows = []
+        self._rows_by_id = {}
+
+        for item in cells:
+            subexp_row = cast(Row, item)
+            assert subexp_row.id
+
+            self._rows.append(subexp_row)
+            self._rows_by_id[subexp_row.id] = subexp_row
+
+    def _is_update_ready(self, update_id: str) -&gt; bool:
+        api = SignalsNotebookApi.get_default_api()
+        log.debug(&#39;Check job status for: %s| %s&#39;, self.__class__.__name__, self.eid)
+
+        response = api.call(
+            method=&#39;GET&#39;,
+            path=(self._get_endpoint(), self.eid, &#39;bulkUpdate&#39;, update_id),
+        )
+        return response.status_code == 200 and response.json()[&#39;data&#39;][&#39;attributes&#39;][&#39;jobStatus&#39;] == &#39;SUCCESS&#39;
+
+    def save(self, force: bool = True, timeout: int = 30, period: int = 5) -&gt; None:
+        &#34;&#34;&#34;Save all changes in the table
+
+        Args:
+            force: Force to update properties without digest check.
+            timeout: max available time(seconds) to update table
+            period: each n seconds(default value=5) api call
+
+        Returns:
+
+        &#34;&#34;&#34;
+        api = SignalsNotebookApi.get_default_api()
+
+        request_body = []
+        for item in self._rows:
+            if item.is_changed:
+                request_body.extend(item.representation_for_update)
+
+        if not request_body:
+            return
+
+        update_response = api.call(
+            method=&#39;PATCH&#39;,
+            path=(self._get_endpoint(), self.eid, &#39;bulkUpdate&#39;),
+            params={
+                &#39;force&#39;: json.dumps(force),
+            },
+            json={
+                &#39;data&#39;: request_body,
+            },
+        )
+        bulk_update_id = update_response.json()[&#39;data&#39;][&#39;attributes&#39;][&#39;bulkUpdateId&#39;]
+
+        response = None
+        initial_time = time.time()
+        while time.time() - initial_time &lt; timeout:
+            if self._is_update_ready(str(bulk_update_id)):
+                response = True
+                break
+            else:
+                time.sleep(period)
+
+        if not response:
+            log.debug(&#39;Time is over to update fields&#39;)
+
+        self._reload_cells()
+
+    def get_html(self) -&gt; str:
+        &#34;&#34;&#34;Get in HTML format
+
+        Returns:
+            Rendered HTML in string format
+        &#34;&#34;&#34;
+        if not self._rows:
+            self._reload_cells()
+
+        table_head = None
+        if self._rows:
+            table_head = self._rows[0]
+        template = env.get_template(self._template_name)
+        log.info(&#39;Html template for %s:%s has been rendered.&#39;, self.__class__.__name__, self.eid)
+
+        return template.render(name=self.name, table_head=table_head, rows=self._rows)</code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row]"><code class="flex name class">
+<span>class <span class="ident">Response[Row]</span></span>
+<span>(</span><span>**kwargs)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="signals_notebook.common_types.Response" href="../../common_types.html#signals_notebook.common_types.Response">Response</a></li>
+<li>pydantic.generics.GenericModel</li>
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+<li>typing.Generic</li>
+</ul>
+<h3>Subclasses</h3>
+<ul class="hlist">
+<li><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse">SubExpSummaryResponse</a></li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row].Config"><code class="name">var <span class="ident">Config</span></code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row].data"><code class="name">var <span class="ident">data</span> : Union[pydantic.generics.ResponseData[Row], List[pydantic.generics.ResponseData[Row]]]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row].links"><code class="name">var <span class="ident">links</span> : Optional[<a title="signals_notebook.common_types.Links" href="../../common_types.html#signals_notebook.common_types.Links">Links</a>]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse"><code class="flex name class">
+<span>class <span class="ident">SubExpSummaryResponse</span></span>
+<span>(</span><span>**kwargs)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class SubExpSummaryResponse(Response[Row]):
+    pass</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row]" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row]">Response[Row]</a></li>
+<li><a title="signals_notebook.common_types.Response" href="../../common_types.html#signals_notebook.common_types.Response">Response</a></li>
+<li>pydantic.generics.GenericModel</li>
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+<li>typing.Generic</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse.data"><code class="name">var <span class="ident">data</span> : Union[pydantic.generics.ResponseData[Row], List[pydantic.generics.ResponseData[Row]]]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse.links"><code class="name">var <span class="ident">links</span> : Optional[<a title="signals_notebook.common_types.Links" href="../../common_types.html#signals_notebook.common_types.Links">Links</a>]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary"><code class="flex name class">
+<span>class <span class="ident">SubExperimentSummary</span></span>
+<span>(</span><span>**data: Any)</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Create a new model by parsing and validating input data from keyword arguments.</p>
+<p>Raises ValidationError if the input data cannot be parsed to form a valid model.</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class SubExperimentSummary(ContentfulEntity):
+    type: Literal[EntityType.SUB_EXPERIMENT_SUMMARY] = Field(allow_mutation=False)
+    _rows: List[Row] = PrivateAttr(default=[])
+    _rows_by_id: Dict[Union[str, UUID], Row] = PrivateAttr(default={})
+    _template_name = &#39;subexp_summary.html&#39;
+
+    @classmethod
+    def _get_entity_type(cls) -&gt; EntityType:
+        return EntityType.SUB_EXPERIMENT_SUMMARY
+
+    @classmethod
+    def _get_endpoint(cls) -&gt; str:
+        return &#39;subexpSummary&#39;
+
+    def __getitem__(self, index: Union[int, str, UUID]) -&gt; Row:
+        if not self._rows:
+            self._reload_cells()
+
+        if isinstance(index, int):
+            return self._rows[index]
+
+        if isinstance(index, str):
+            try:
+                return self._rows_by_id[UUID(index)]
+            except ValueError:
+                return self._rows_by_id[index]
+
+        if isinstance(index, UUID):
+            return self._rows_by_id[index]
+
+        raise IndexError(&#39;Invalid index&#39;)
+
+    def __iter__(self):
+        if not self._rows:
+            self._reload_cells()
+        return self._rows.__iter__()
+
+    def _reload_cells(self) -&gt; None:
+        api = SignalsNotebookApi.get_default_api()
+        log.debug(&#39;Reloading data in Table: %s...&#39;, self.eid)
+
+        response = api.call(
+            method=&#39;GET&#39;,
+            path=(self._get_endpoint(), self.eid, &#39;rows&#39;),
+        )
+
+        result = SubExpSummaryResponse(**response.json())  # type: ignore
+        cells = [cast(ResponseData, item).body for item in result.data]
+
+        self._rows = []
+        self._rows_by_id = {}
+
+        for item in cells:
+            subexp_row = cast(Row, item)
+            assert subexp_row.id
+
+            self._rows.append(subexp_row)
+            self._rows_by_id[subexp_row.id] = subexp_row
+
+    def _is_update_ready(self, update_id: str) -&gt; bool:
+        api = SignalsNotebookApi.get_default_api()
+        log.debug(&#39;Check job status for: %s| %s&#39;, self.__class__.__name__, self.eid)
+
+        response = api.call(
+            method=&#39;GET&#39;,
+            path=(self._get_endpoint(), self.eid, &#39;bulkUpdate&#39;, update_id),
+        )
+        return response.status_code == 200 and response.json()[&#39;data&#39;][&#39;attributes&#39;][&#39;jobStatus&#39;] == &#39;SUCCESS&#39;
+
+    def save(self, force: bool = True, timeout: int = 30, period: int = 5) -&gt; None:
+        &#34;&#34;&#34;Save all changes in the table
+
+        Args:
+            force: Force to update properties without digest check.
+            timeout: max available time(seconds) to update table
+            period: each n seconds(default value=5) api call
+
+        Returns:
+
+        &#34;&#34;&#34;
+        api = SignalsNotebookApi.get_default_api()
+
+        request_body = []
+        for item in self._rows:
+            if item.is_changed:
+                request_body.extend(item.representation_for_update)
+
+        if not request_body:
+            return
+
+        update_response = api.call(
+            method=&#39;PATCH&#39;,
+            path=(self._get_endpoint(), self.eid, &#39;bulkUpdate&#39;),
+            params={
+                &#39;force&#39;: json.dumps(force),
+            },
+            json={
+                &#39;data&#39;: request_body,
+            },
+        )
+        bulk_update_id = update_response.json()[&#39;data&#39;][&#39;attributes&#39;][&#39;bulkUpdateId&#39;]
+
+        response = None
+        initial_time = time.time()
+        while time.time() - initial_time &lt; timeout:
+            if self._is_update_ready(str(bulk_update_id)):
+                response = True
+                break
+            else:
+                time.sleep(period)
+
+        if not response:
+            log.debug(&#39;Time is over to update fields&#39;)
+
+        self._reload_cells()
+
+    def get_html(self) -&gt; str:
+        &#34;&#34;&#34;Get in HTML format
+
+        Returns:
+            Rendered HTML in string format
+        &#34;&#34;&#34;
+        if not self._rows:
+            self._reload_cells()
+
+        table_head = None
+        if self._rows:
+            table_head = self._rows[0]
+        template = env.get_template(self._template_name)
+        log.info(&#39;Html template for %s:%s has been rendered.&#39;, self.__class__.__name__, self.eid)
+
+        return template.render(name=self.name, table_head=table_head, rows=self._rows)</code></pre>
+</details>
+<h3>Ancestors</h3>
+<ul class="hlist">
+<li><a title="signals_notebook.entities.contentful_entity.ContentfulEntity" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity">ContentfulEntity</a></li>
+<li><a title="signals_notebook.entities.entity.Entity" href="../entity.html#signals_notebook.entities.entity.Entity">Entity</a></li>
+<li>pydantic.main.BaseModel</li>
+<li>pydantic.utils.Representation</li>
+<li>abc.ABC</li>
+</ul>
+<h3>Class variables</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary.type"><code class="name">var <span class="ident">type</span> : Literal[<EntityType.SUB_EXPERIMENT_SUMMARY: 'paragrid'>]</code></dt>
+<dd>
+<div class="desc"></div>
+</dd>
+</dl>
+<h3>Methods</h3>
+<dl>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary.get_html"><code class="name flex">
+<span>def <span class="ident">get_html</span></span>(<span>self) ‑> str</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Get in HTML format</p>
+<h2 id="returns">Returns</h2>
+<p>Rendered HTML in string format</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def get_html(self) -&gt; str:
+    &#34;&#34;&#34;Get in HTML format
+
+    Returns:
+        Rendered HTML in string format
+    &#34;&#34;&#34;
+    if not self._rows:
+        self._reload_cells()
+
+    table_head = None
+    if self._rows:
+        table_head = self._rows[0]
+    template = env.get_template(self._template_name)
+    log.info(&#39;Html template for %s:%s has been rendered.&#39;, self.__class__.__name__, self.eid)
+
+    return template.render(name=self.name, table_head=table_head, rows=self._rows)</code></pre>
+</details>
+</dd>
+<dt id="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary.save"><code class="name flex">
+<span>def <span class="ident">save</span></span>(<span>self, force: bool = True, timeout: int = 30, period: int = 5) ‑> None</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Save all changes in the table</p>
+<h2 id="args">Args</h2>
+<dl>
+<dt><strong><code>force</code></strong></dt>
+<dd>Force to update properties without digest check.</dd>
+<dt><strong><code>timeout</code></strong></dt>
+<dd>max available time(seconds) to update table</dd>
+<dt><strong><code>period</code></strong></dt>
+<dd>each n seconds(default value=5) api call</dd>
+</dl>
+<p>Returns:</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def save(self, force: bool = True, timeout: int = 30, period: int = 5) -&gt; None:
+    &#34;&#34;&#34;Save all changes in the table
+
+    Args:
+        force: Force to update properties without digest check.
+        timeout: max available time(seconds) to update table
+        period: each n seconds(default value=5) api call
+
+    Returns:
+
+    &#34;&#34;&#34;
+    api = SignalsNotebookApi.get_default_api()
+
+    request_body = []
+    for item in self._rows:
+        if item.is_changed:
+            request_body.extend(item.representation_for_update)
+
+    if not request_body:
+        return
+
+    update_response = api.call(
+        method=&#39;PATCH&#39;,
+        path=(self._get_endpoint(), self.eid, &#39;bulkUpdate&#39;),
+        params={
+            &#39;force&#39;: json.dumps(force),
+        },
+        json={
+            &#39;data&#39;: request_body,
+        },
+    )
+    bulk_update_id = update_response.json()[&#39;data&#39;][&#39;attributes&#39;][&#39;bulkUpdateId&#39;]
+
+    response = None
+    initial_time = time.time()
+    while time.time() - initial_time &lt; timeout:
+        if self._is_update_ready(str(bulk_update_id)):
+            response = True
+            break
+        else:
+            time.sleep(period)
+
+    if not response:
+        log.debug(&#39;Time is over to update fields&#39;)
+
+    self._reload_cells()</code></pre>
+</details>
+</dd>
+</dl>
+<h3>Inherited members</h3>
+<ul class="hlist">
+<li><code><b><a title="signals_notebook.entities.contentful_entity.ContentfulEntity" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity">ContentfulEntity</a></b></code>:
+<ul class="hlist">
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.ContentType" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity.ContentType">ContentType</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.delete" href="../entity.html#signals_notebook.entities.entity.Entity.delete">delete</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.dump" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity.dump">dump</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.dump_templates" href="../entity.html#signals_notebook.entities.entity.Entity.dump_templates">dump_templates</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.get_list" href="../entity.html#signals_notebook.entities.entity.Entity.get_list">get_list</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.get_subclasses" href="../entity.html#signals_notebook.entities.entity.Entity.get_subclasses">get_subclasses</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.get_template_name" href="../entity.html#signals_notebook.entities.entity.Entity.get_template_name">get_template_name</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.load" href="../contentful_entity.html#signals_notebook.entities.contentful_entity.ContentfulEntity.load">load</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.refresh" href="../entity.html#signals_notebook.entities.entity.Entity.refresh">refresh</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.set_template_name" href="../entity.html#signals_notebook.entities.entity.Entity.set_template_name">set_template_name</a></code></li>
+<li><code><a title="signals_notebook.entities.contentful_entity.ContentfulEntity.short_description" href="../entity.html#signals_notebook.entities.entity.Entity.short_description">short_description</a></code></li>
+</ul>
+</li>
+</ul>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3>Super-module</h3>
+<ul>
+<li><code><a title="signals_notebook.entities.parallel_experiment" href="index.html">signals_notebook.entities.parallel_experiment</a></code></li>
+</ul>
+</li>
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row]" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row]">Response[Row]</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row].Config" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row].Config">Config</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row].data" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row].data">data</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row].links" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.Response[Row].links">links</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse">SubExpSummaryResponse</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse.data" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse.data">data</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse.links" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExpSummaryResponse.links">links</a></code></li>
+</ul>
+</li>
+<li>
+<h4><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary">SubExperimentSummary</a></code></h4>
+<ul class="">
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary.get_html" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary.get_html">get_html</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary.save" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary.save">save</a></code></li>
+<li><code><a title="signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary.type" href="#signals_notebook.entities.parallel_experiment.sub_experiment_summary.SubExperimentSummary.type">type</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
+</footer>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/signals_notebook/materials/asset.html b/docs/signals_notebook/materials/asset.html
index 1d3272b9..d0157529 100644
--- a/docs/signals_notebook/materials/asset.html
+++ b/docs/signals_notebook/materials/asset.html
@@ -199,6 +199,7 @@ <h3>Inherited members</h3>
 <ul class="hlist">
 <li><code><b><a title="signals_notebook.materials.material.Material" href="material.html#signals_notebook.materials.material.Material">Material</a></b></code>:
 <ul class="hlist">
+<li><code><a title="signals_notebook.materials.material.Material.delete" href="material.html#signals_notebook.materials.material.Material.delete">delete</a></code></li>
 <li><code><a title="signals_notebook.materials.material.Material.get_attachment" href="material.html#signals_notebook.materials.material.Material.get_attachment">get_attachment</a></code></li>
 <li><code><a title="signals_notebook.materials.material.Material.get_bio_sequence" href="material.html#signals_notebook.materials.material.Material.get_bio_sequence">get_bio_sequence</a></code></li>
 <li><code><a title="signals_notebook.materials.material.Material.get_chemical_drawing" href="material.html#signals_notebook.materials.material.Material.get_chemical_drawing">get_chemical_drawing</a></code></li>
diff --git a/docs/signals_notebook/materials/batch.html b/docs/signals_notebook/materials/batch.html
index c159deb0..0af59275 100644
--- a/docs/signals_notebook/materials/batch.html
+++ b/docs/signals_notebook/materials/batch.html
@@ -95,6 +95,7 @@ <h3>Inherited members</h3>
 <ul class="hlist">
 <li><code><b><a title="signals_notebook.materials.material.Material" href="material.html#signals_notebook.materials.material.Material">Material</a></b></code>:
 <ul class="hlist">
+<li><code><a title="signals_notebook.materials.material.Material.delete" href="material.html#signals_notebook.materials.material.Material.delete">delete</a></code></li>
 <li><code><a title="signals_notebook.materials.material.Material.get_attachment" href="material.html#signals_notebook.materials.material.Material.get_attachment">get_attachment</a></code></li>
 <li><code><a title="signals_notebook.materials.material.Material.get_bio_sequence" href="material.html#signals_notebook.materials.material.Material.get_bio_sequence">get_bio_sequence</a></code></li>
 <li><code><a title="signals_notebook.materials.material.Material.get_chemical_drawing" href="material.html#signals_notebook.materials.material.Material.get_chemical_drawing">get_chemical_drawing</a></code></li>
diff --git a/docs/signals_notebook/materials/material.html b/docs/signals_notebook/materials/material.html
index ec91b7ef..015467f6 100644
--- a/docs/signals_notebook/materials/material.html
+++ b/docs/signals_notebook/materials/material.html
@@ -202,7 +202,33 @@ <h1 class="title">Module <code>signals_notebook.materials.material</code></h1>
             json={
                 &#39;data&#39;: request_body,
             },
-        )</code></pre>
+        )
+
+    def delete(self, digest: str = None, force: bool = True) -&gt; None:
+        &#34;&#34;&#34;Delete Material by ID
+
+        Args:
+            eid: material ID
+            digest: Indicate digest of entity. It is used to avoid conflict while concurrent editing.
+                If the parameter &#39;force&#39; is true, this parameter is optional.
+                If the parameter &#39;force&#39; is false, this parameter is required.
+            force: Force to delete without doing digest check.
+
+        Returns:
+
+        &#34;&#34;&#34;
+        api = SignalsNotebookApi.get_default_api()
+        log.debug(&#39;Deleting Material: %s&#39;, self.eid)
+
+        api.call(
+            method=&#39;DELETE&#39;,
+            path=(&#39;entities&#39;, self.eid),
+            params={
+                &#39;digest&#39;: digest,
+                &#39;force&#39;: json.dumps(force),
+            },
+        )
+        log.debug(&#39;Library: %s was deleted successfully&#39;, self.eid)</code></pre>
 </details>
 </section>
 <section>
@@ -385,7 +411,33 @@ <h2 class="section-title" id="header-classes">Classes</h2>
             json={
                 &#39;data&#39;: request_body,
             },
-        )</code></pre>
+        )
+
+    def delete(self, digest: str = None, force: bool = True) -&gt; None:
+        &#34;&#34;&#34;Delete Material by ID
+
+        Args:
+            eid: material ID
+            digest: Indicate digest of entity. It is used to avoid conflict while concurrent editing.
+                If the parameter &#39;force&#39; is true, this parameter is optional.
+                If the parameter &#39;force&#39; is false, this parameter is required.
+            force: Force to delete without doing digest check.
+
+        Returns:
+
+        &#34;&#34;&#34;
+        api = SignalsNotebookApi.get_default_api()
+        log.debug(&#39;Deleting Material: %s&#39;, self.eid)
+
+        api.call(
+            method=&#39;DELETE&#39;,
+            path=(&#39;entities&#39;, self.eid),
+            params={
+                &#39;digest&#39;: digest,
+                &#39;force&#39;: json.dumps(force),
+            },
+        )
+        log.debug(&#39;Library: %s was deleted successfully&#39;, self.eid)</code></pre>
 </details>
 <h3>Ancestors</h3>
 <ul class="hlist">
@@ -429,6 +481,54 @@ <h2 id="returns">Returns</h2>
 </dl>
 <h3>Methods</h3>
 <dl>
+<dt id="signals_notebook.materials.material.Material.delete"><code class="name flex">
+<span>def <span class="ident">delete</span></span>(<span>self, digest: str = None, force: bool = True) ‑> None</span>
+</code></dt>
+<dd>
+<div class="desc"><p>Delete Material by ID</p>
+<h2 id="args">Args</h2>
+<dl>
+<dt><strong><code>eid</code></strong></dt>
+<dd>material ID</dd>
+<dt><strong><code>digest</code></strong></dt>
+<dd>Indicate digest of entity. It is used to avoid conflict while concurrent editing.
+If the parameter 'force' is true, this parameter is optional.
+If the parameter 'force' is false, this parameter is required.</dd>
+<dt><strong><code>force</code></strong></dt>
+<dd>Force to delete without doing digest check.</dd>
+</dl>
+<p>Returns:</p></div>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def delete(self, digest: str = None, force: bool = True) -&gt; None:
+    &#34;&#34;&#34;Delete Material by ID
+
+    Args:
+        eid: material ID
+        digest: Indicate digest of entity. It is used to avoid conflict while concurrent editing.
+            If the parameter &#39;force&#39; is true, this parameter is optional.
+            If the parameter &#39;force&#39; is false, this parameter is required.
+        force: Force to delete without doing digest check.
+
+    Returns:
+
+    &#34;&#34;&#34;
+    api = SignalsNotebookApi.get_default_api()
+    log.debug(&#39;Deleting Material: %s&#39;, self.eid)
+
+    api.call(
+        method=&#39;DELETE&#39;,
+        path=(&#39;entities&#39;, self.eid),
+        params={
+            &#39;digest&#39;: digest,
+            &#39;force&#39;: json.dumps(force),
+        },
+    )
+    log.debug(&#39;Library: %s was deleted successfully&#39;, self.eid)</code></pre>
+</details>
+</dd>
 <dt id="signals_notebook.materials.material.Material.get_attachment"><code class="name flex">
 <span>def <span class="ident">get_attachment</span></span>(<span>self, field_id: str) ‑> <a title="signals_notebook.common_types.File" href="../common_types.html#signals_notebook.common_types.File">File</a></span>
 </code></dt>
@@ -654,6 +754,7 @@ <h1>Index</h1>
 <li>
 <h4><code><a title="signals_notebook.materials.material.Material" href="#signals_notebook.materials.material.Material">Material</a></code></h4>
 <ul class="">
+<li><code><a title="signals_notebook.materials.material.Material.delete" href="#signals_notebook.materials.material.Material.delete">delete</a></code></li>
 <li><code><a title="signals_notebook.materials.material.Material.get_attachment" href="#signals_notebook.materials.material.Material.get_attachment">get_attachment</a></code></li>
 <li><code><a title="signals_notebook.materials.material.Material.get_bio_sequence" href="#signals_notebook.materials.material.Material.get_bio_sequence">get_bio_sequence</a></code></li>
 <li><code><a title="signals_notebook.materials.material.Material.get_chemical_drawing" href="#signals_notebook.materials.material.Material.get_chemical_drawing">get_chemical_drawing</a></code></li>
diff --git a/examples/Materials.ipynb b/examples/Materials.ipynb
index 35d0c103..0084a879 100644
--- a/examples/Materials.ipynb
+++ b/examples/Materials.ipynb
@@ -31,7 +31,7 @@
    "outputs": [
     {
      "data": {
-      "text/plain": "<signals_notebook.api.SignalsNotebookApi at 0x22f9ad33370>"
+      "text/plain": "<signals_notebook.api.SignalsNotebookApi at 0x162b3c80070>"
      },
      "execution_count": 2,
      "metadata": {},
@@ -93,7 +93,10 @@
       "assetType:620b971e9a486b3ddae61f4f Culture medias\n",
       "assetType:620dddad587d0c711fdd8862 Compound for OLED cell\n",
       "assetType:621701e99a486b3ddae63bc0 Brain photo\n",
-      "assetType:625436287e0e8f57cc5cd892 DNAMaterials\n"
+      "assetType:625436287e0e8f57cc5cd892 DNAMaterials\n",
+      "assetType:62da6564d33f8760ff9e8341 Compounds copy\n",
+      "assetType:62debcf9d33f8760ff9e8af5 Lab Animal 1 Restore\n",
+      "assetType:62dec178d33f8760ff9e8b01 Reagents (SNB) Copy2\n"
      ]
     }
    ],
@@ -578,7 +581,8 @@
     "text = EntityStore.get('text:dc023925-847c-4d25-9aa2-c9f58fa0fc8a')\n",
     "\n",
     "\n",
-    "unit_lib.create_batch(asset_name = 'UNT-0002', batch_fields={'Originating Experiment': text})\n"
+    "batch = unit_lib.create_batch(asset_name = 'UNT-0002', batch_fields={'Originating Experiment': text})\n",
+    "batch.delete()"
    ],
    "metadata": {
     "collapsed": false,
@@ -589,13 +593,14 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 6,
    "outputs": [],
    "source": [
-    "unit_lib.create_asset_with_batches(asset_with_batch_fields={\n",
+    "asset_with_batches = unit_lib.create_asset_with_batches(asset_with_batch_fields={\n",
     "    \"asset\":{\"Unit Name\": \"Created\"},\n",
     "    \"batch\":{'Originating Experiment': text}\n",
-    "})"
+    "})\n",
+    "asset_with_batches.delete()"
    ],
    "metadata": {
     "collapsed": false,
@@ -646,23 +651,8 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 9,
-   "outputs": [
-    {
-     "ename": "SignalsNotebookError",
-     "evalue": "<SignalsNotebookError status=400 code=BadRequest> title=The request parameters are in bad format. detail=Failed to bulk import materials (400): The uploaded .zip file must contains the 'summary.csv' in top level.>",
-     "output_type": "error",
-     "traceback": [
-      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
-      "\u001B[1;31mSignalsNotebookError\u001B[0m                      Traceback (most recent call last)",
-      "Input \u001B[1;32mIn [9]\u001B[0m, in \u001B[0;36m<cell line: 7>\u001B[1;34m()\u001B[0m\n\u001B[0;32m      3\u001B[0m units_lib \u001B[38;5;241m=\u001B[39m libraries_dict[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mUnits\u001B[39m\u001B[38;5;124m'\u001B[39m]\n\u001B[0;32m      5\u001B[0m materials_file \u001B[38;5;241m=\u001B[39m File(\u001B[38;5;28mopen\u001B[39m(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mfiles/Units-example.zip\u001B[39m\u001B[38;5;124m'\u001B[39m, mode\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mrb\u001B[39m\u001B[38;5;124m'\u001B[39m))\n\u001B[1;32m----> 7\u001B[0m \u001B[43munits_lib\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mbulk_import\u001B[49m\u001B[43m(\u001B[49m\u001B[43mmaterials_file\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mimport_type\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mzip\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m)\u001B[49m\n",
-      "File \u001B[1;32m~\\PycharmProjects\\pesn-python-sdk\\src\\signals_notebook\\materials\\library.py:503\u001B[0m, in \u001B[0;36mLibrary.bulk_import\u001B[1;34m(self, materials, rule, import_type, timeout, period)\u001B[0m\n\u001B[0;32m    479\u001B[0m \u001B[38;5;124;03m\"\"\"Bulk import materials into a specified material library. Support import data from json or zip file.\u001B[39;00m\n\u001B[0;32m    480\u001B[0m \u001B[38;5;124;03mZip file should contain the sdf file or csv file and attachments. T\u001B[39;00m\n\u001B[0;32m    481\u001B[0m \u001B[38;5;124;03mhe column name in each records of sdf/csv file should be match the asset field name.\u001B[39;00m\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    499\u001B[0m \u001B[38;5;124;03m    File or None\u001B[39;00m\n\u001B[0;32m    500\u001B[0m \u001B[38;5;124;03m\"\"\"\u001B[39;00m\n\u001B[0;32m    501\u001B[0m api \u001B[38;5;241m=\u001B[39m SignalsNotebookApi\u001B[38;5;241m.\u001B[39mget_default_api()\n\u001B[1;32m--> 503\u001B[0m bulk_import_response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_import_materials\u001B[49m\u001B[43m(\u001B[49m\u001B[43mmaterials\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mrule\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mimport_type\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    505\u001B[0m job_id \u001B[38;5;241m=\u001B[39m bulk_import_response\u001B[38;5;241m.\u001B[39mjson()[\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mdata\u001B[39m\u001B[38;5;124m'\u001B[39m][\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mid\u001B[39m\u001B[38;5;124m'\u001B[39m]\n\u001B[0;32m    507\u001B[0m initial_time \u001B[38;5;241m=\u001B[39m time\u001B[38;5;241m.\u001B[39mtime()\n",
-      "File \u001B[1;32m~\\PycharmProjects\\pesn-python-sdk\\src\\signals_notebook\\materials\\library.py:446\u001B[0m, in \u001B[0;36mLibrary._import_materials\u001B[1;34m(self, materials, rule, import_type)\u001B[0m\n\u001B[0;32m    443\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m materials\u001B[38;5;241m.\u001B[39msize \u001B[38;5;241m>\u001B[39m MAX_MATERIAL_FILE_SIZE:\n\u001B[0;32m    444\u001B[0m         \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mAvailable file size is 50Mb\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[1;32m--> 446\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mapi\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mcall\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    447\u001B[0m \u001B[43m        \u001B[49m\u001B[43mmethod\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mPOST\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m,\u001B[49m\n\u001B[0;32m    448\u001B[0m \u001B[43m        \u001B[49m\u001B[43mpath\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43m(\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_get_endpoint\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mname\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mbulkImport\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    449\u001B[0m \u001B[43m        \u001B[49m\u001B[43mparams\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43m{\u001B[49m\n\u001B[0;32m    450\u001B[0m \u001B[43m            \u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mrule\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mrule\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    451\u001B[0m \u001B[43m            \u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mimportType\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mimport_type\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    452\u001B[0m \u001B[43m        \u001B[49m\u001B[43m}\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    453\u001B[0m \u001B[43m        \u001B[49m\u001B[43mheaders\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43m{\u001B[49m\n\u001B[0;32m    454\u001B[0m \u001B[43m            \u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mContent-Type\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mapplication/octet-stream\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m,\u001B[49m\n\u001B[0;32m    455\u001B[0m \u001B[43m        \u001B[49m\u001B[43m}\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    456\u001B[0m \u001B[43m        \u001B[49m\u001B[43mdata\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmaterials\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mcontent\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    457\u001B[0m \u001B[43m    \u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m    459\u001B[0m request_body \u001B[38;5;241m=\u001B[39m [{\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mdata\u001B[39m\u001B[38;5;124m'\u001B[39m: \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_process_asset_with_batch_fields(material)\u001B[38;5;241m.\u001B[39mdict()} \u001B[38;5;28;01mfor\u001B[39;00m material \u001B[38;5;129;01min\u001B[39;00m materials]\n\u001B[0;32m    461\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m api\u001B[38;5;241m.\u001B[39mcall(\n\u001B[0;32m    462\u001B[0m     method\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mPOST\u001B[39m\u001B[38;5;124m'\u001B[39m,\n\u001B[0;32m    463\u001B[0m     path\u001B[38;5;241m=\u001B[39m(\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_get_endpoint(), \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mname, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mbulkImport\u001B[39m\u001B[38;5;124m'\u001B[39m),\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    468\u001B[0m     json\u001B[38;5;241m=\u001B[39mrequest_body,\n\u001B[0;32m    469\u001B[0m )\n",
-      "File \u001B[1;32m~\\PycharmProjects\\pesn-python-sdk\\src\\signals_notebook\\api.py:152\u001B[0m, in \u001B[0;36mSignalsNotebookApi.call\u001B[1;34m(self, method, path, params, data, json, headers)\u001B[0m\n\u001B[0;32m    146\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m response\u001B[38;5;241m.\u001B[39mok:\n\u001B[0;32m    147\u001B[0m     log\u001B[38;5;241m.\u001B[39merror(\n\u001B[0;32m    148\u001B[0m         \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mError has been occurred while getting response, status code: \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m'\u001B[39m,\n\u001B[0;32m    149\u001B[0m         response\u001B[38;5;241m.\u001B[39mstatus_code,\n\u001B[0;32m    150\u001B[0m         extra\u001B[38;5;241m=\u001B[39m{\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mresponse\u001B[39m\u001B[38;5;124m'\u001B[39m: response},\n\u001B[0;32m    151\u001B[0m     )\n\u001B[1;32m--> 152\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m SignalsNotebookError(response)\n\u001B[0;32m    153\u001B[0m log\u001B[38;5;241m.\u001B[39minfo(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mSuccessful request - HTTP url: \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m, status code: \u001B[39m\u001B[38;5;132;01m%s\u001B[39;00m\u001B[38;5;124m'\u001B[39m, response\u001B[38;5;241m.\u001B[39murl, response\u001B[38;5;241m.\u001B[39mstatus_code)\n\u001B[0;32m    155\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m response\n",
-      "\u001B[1;31mSignalsNotebookError\u001B[0m: <SignalsNotebookError status=400 code=BadRequest> title=The request parameters are in bad format. detail=Failed to bulk import materials (400): The uploaded .zip file must contains the 'summary.csv' in top level.>"
-     ]
-    }
-   ],
+   "execution_count": 5,
+   "outputs": [],
    "source": [
     "from signals_notebook.common_types import File\n",
     "\n",
@@ -681,7 +671,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": null,
    "outputs": [],
    "source": [
     "from signals_notebook.common_types import MID\n",
diff --git a/examples/ParallelExperiment.ipynb b/examples/ParallelExperiment.ipynb
new file mode 100644
index 00000000..c745f307
--- /dev/null
+++ b/examples/ParallelExperiment.ipynb
@@ -0,0 +1,196 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "outputs": [],
+   "source": [
+    "%load_ext dotenv\n",
+    "%dotenv\n",
+    "import os\n",
+    "\n",
+    "SN_API_HOST = os.getenv('SN_API_HOST')\n",
+    "SN_API_KEY = os.getenv('SN_API_KEY')"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "<signals_notebook.api.SignalsNotebookApi at 0x210c1d79490>"
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from signals_notebook.api import SignalsNotebookApi\n",
+    "\n",
+    "SignalsNotebookApi.init(SN_API_HOST, SN_API_KEY)"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "ParallelExperiment(type=<EntityType.PARALLEL_EXPERIMENT: 'paraexp'>, eid='paraexp:44160144-1f14-4b7c-892d-95e7faec7776', digest='63301648', name='Example parallel experiment created by SDK', description='Delete if you see this in UI', created_at=datetime.datetime(2022, 8, 3, 8, 10, 39, 559000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 10, 39, 559000, tzinfo=datetime.timezone.utc), state=<ParaExperimentState.OPEN: 'open'>)"
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from signals_notebook.entities import ParallelExperiment\n",
+    "from signals_notebook.entities import EntityStore\n",
+    "\n",
+    "notebook = EntityStore.get('journal:9801ad65-9869-404f-80e8-5139a8d9ce03')\n",
+    "\n",
+    "parallel_experiment = ParallelExperiment.create(\n",
+    "    name='Example parallel experiment created by SDK',\n",
+    "    description='Delete if you see this in UI',\n",
+    "    notebook=notebook,\n",
+    ")\n",
+    "parallel_experiment"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "outputs": [],
+   "source": [
+    "EntityStore.delete(parallel_experiment.eid)"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "ParallelExperiment(type=<EntityType.PARALLEL_EXPERIMENT: 'paraexp'>, eid='paraexp:c62e2c5e-952c-45d1-8f8d-bfa9ed786754', digest='30196081', name='SDK', description='', created_at=datetime.datetime(2022, 8, 3, 8, 3, 37, 313000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 4, 11, 979000, tzinfo=datetime.timezone.utc), state=<ParaExperimentState.OPEN: 'open'>)"
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from signals_notebook.entities import EntityStore\n",
+    "\n",
+    "parallel_experiment = EntityStore.get(\"paraexp:c62e2c5e-952c-45d1-8f8d-bfa9ed786754\")\n",
+    "\n",
+    "parallel_experiment"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "[ChemicalDrawing(type=<EntityType.CHEMICAL_DRAWING: 'chemicalDrawing'>, eid='chemicalDrawing:1fda851b-00bc-4e61-8296-aadb348f75cd', digest='97427732', name='Generic Reaction', description='', created_at=datetime.datetime(2022, 8, 3, 8, 3, 37, 313000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 4, 5, 393000, tzinfo=datetime.timezone.utc)),\n Text(type=<EntityType.TEXT: 'text'>, eid='text:6b7c14c3-0aad-4b23-81c0-fb78c3f23b3d', digest='10885783', name='Procedure', description='', created_at=datetime.datetime(2022, 8, 3, 8, 3, 37, 313000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 4, 9, 932000, tzinfo=datetime.timezone.utc)),\n SubExperimentSummary(type=<EntityType.SUB_EXPERIMENT_SUMMARY: 'paragrid'>, eid='paragrid:29995c6f-f573-4c8e-876d-4247453ca988', digest='89319865', name='Subexperiment Summary', description='', created_at=datetime.datetime(2022, 8, 3, 8, 3, 37, 313000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 4, 40, 202000, tzinfo=datetime.timezone.utc)),\n SubExperimentSummary(type=<EntityType.SUB_EXPERIMENT_SUMMARY: 'paragrid'>, eid='paragrid:de6fd6ee-5f11-494a-a830-ca4e4f050422', digest='82295398', name='Products', description='', created_at=datetime.datetime(2022, 8, 3, 8, 3, 37, 313000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 4, 40, 202000, tzinfo=datetime.timezone.utc)),\n SubExperimentSummary(type=<EntityType.SUB_EXPERIMENT_SUMMARY: 'paragrid'>, eid='paragrid:47d1f074-b2c1-48a6-b132-c0c5667611a3', digest='56540482', name='Reactions', description='', created_at=datetime.datetime(2022, 8, 3, 8, 3, 37, 313000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 4, 40, 202000, tzinfo=datetime.timezone.utc)),\n SubExperimentSummary(type=<EntityType.SUB_EXPERIMENT_SUMMARY: 'paragrid'>, eid='paragrid:7ecac92e-ec30-4bb4-a9bd-96b7397d1376', digest='20208510', name='Reactants', description='', created_at=datetime.datetime(2022, 8, 3, 8, 3, 37, 313000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 4, 40, 202000, tzinfo=datetime.timezone.utc)),\n SubExperiment(type=<EntityType.SUB_EXPERIMENT: 'parasubexp'>, eid='parasubexp:76214b4c-f21a-4904-aac5-0b1fd9380c6c', digest='93411093', name='Sub-experiment-1', description='', created_at=datetime.datetime(2022, 8, 3, 8, 4, 23, 967000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 4, 23, 967000, tzinfo=datetime.timezone.utc))]"
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "list(parallel_experiment.get_children())"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "<IPython.core.display.HTML object>",
+      "text/html": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <link rel=\"icon\" href=\"data:;base64,iVBORw0KGgo=\">\n    <title>SDK</title>\n    <style>\n        h1 {\n            margin-top: 1.7rem;\n            margin-bottom: 0.3rem;\n            font-size: 1.6rem;\n        }\n\n        h2 {\n            margin-top: 1.2rem;\n            margin-bottom: 0.3rem;\n            font-size: 1.2rem;\n            color: #00A0E1;\n        }\n\n        table.props th, table.props td {\n            text-align: left;\n            padding: 3px;\n        }\n        .table-scroll {\n            overflow:auto;\n        }\n        .table-wrapper {\n            position:relative;\n        }\n        table, th, td {\n            border: 1px solid #cccccc;\n            border-collapse: collapse;\n            table-layout: fixed;\n        }\n        .table-wrapper th, td {\n            padding: 10px 20px;\n        }\n        .table-wrapper table td {\n            text-align: center;\n            vertical-align: middle;\n            padding: 5px;\n        }\n        .parent {\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            width: 100%;\n            aspect-ratio: auto;\n        }\n        .image-container {\n            width: 60%;\n            height: 60%;\n            overflow: hidden;\n        }\n\n        .image-container img {\n            width: 100%;\n            min-height: 100%;\n            object-fit: cover;\n        }\n\n    </style>\n</head>\n<body>\n<table class=\"props\" style=\"margin: 10px 10px; padding: 6px 10px;\">\n    <tr>\n        <th>Experiment name:</th>\n        <td>SDK</td>\n    </tr>\n    <tr>\n        <th>Description:</th>\n        <td></td>\n    </tr>\n    <tr>\n        <th>Last edited at:</th>\n        <td>08:04:11 2022-08-03</td>\n    </tr>\n    <tr>\n        <th>State:</th>\n        <td>open</td>\n    </tr>\n</table>\n\n\n<div style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <h2>Generic Reaction</h2>\n\n    \n    <div class=\"parent\">\n        <div class=\"image-container\">\n            <img src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyIgPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMjE4cHgiIGhlaWdodD0iMzZweCIgdmlld0JveD0iMCAwIDIxOCAzNiIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmZmZmZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiA+CjxwYXRoIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAtMjcyIC05OCkiIGQ9Ik0gNzYwMy44NCwyMTczLjQgTCA3MTU2LjQsMjE3My40IEwgNzE1Ni40LDIxNjEuNCBMIDc2MDMuODQsMjE2MS40IFogIiAvPgo8cGF0aCBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgLTI3MiAtOTgpIiBkPSJNIDc3NjAuNCwyMTY3LjQgQyA3NzYwLjQsMjE2Ny40IDc1ODAuNCwyMjEzLjQgNzU4MC40LDIyMTMuNCBDIDc1ODAuNCwyMjEzLjQgNzYwMi44NCwyMTg3LjUzIDc2MDIuODQsMjE2Ny40IEMgNzYwMi44NCwyMTQ2LjgzIDc1ODAuNCwyMTIwLjQgNzU4MC40LDIxMjAuNCBDIDc1ODAuNCwyMTIwLjQgNzc2MC40LDIxNjcuNCA3NzYwLjQsMjE2Ny40IEMgNzc2MC40LDIxNjcuNCA3NzYwLjQsMjE2Ny40IDc3NjAuNCwyMTY3LjQgIiAvPgo8cGF0aCBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAtMjcyIC05OCkiIGQ9Ik0gNzc2MC40LDIxNjcuNCBDIDc3NjAuNCwyMTY3LjQgNzU4MC40LDIyMTMuNCA3NTgwLjQsMjIxMy40IEMgNzU4MC40LDIyMTMuNCA3NjAyLjg0LDIxODcuNTMgNzYwMi44NCwyMTY3LjQgQyA3NjAyLjg0LDIxNDYuODMgNzU4MC40LDIxMjAuNCA3NTgwLjQsMjEyMC40IEMgNzU4MC40LDIxMjAuNCA3NzYwLjQsMjE2Ny40IDc3NjAuNCwyMTY3LjQgQyA3NzYwLjQsMjE2Ny40IDc3NjAuNCwyMTY3LjQgNzc2MC40LDIxNjcuNCAiIC8+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwODA4MCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSA1Ny45NSAxNC40MikiIGZvbnQtc3R5bGU9Im5vcm1hbCIgZm9udC13ZWlnaHQ9Im5vcm1hbCIgZm9udC1zaXplPSIyMDBweCIgZm9udC1mYW1pbHk9IkFyaWFsIiA+Ck5hPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMzcgMTEuOTUpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMTk5cHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgorPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMi43NDc0OSAxMy42NCkiIGZvbnQtc3R5bGU9Im5vcm1hbCIgZm9udC13ZWlnaHQ9Im5vcm1hbCIgZm9udC1zaXplPSIyMDBweCIgZm9udC1mYW1pbHk9IkFyaWFsIiA+Ckg8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSA5Ljk0NzQ5IDE1Ljc5KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjE1MHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KMjwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDE0LjExIDEzLjY0KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KTzwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDEzMS4xMyAxNC40MikiIGZvbnQtc3R5bGU9Im5vcm1hbCIgZm9udC13ZWlnaHQ9Im5vcm1hbCIgZm9udC1zaXplPSIyMDBweCIgZm9udC1mYW1pbHk9IkFyaWFsIiA+CkhIPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMTYwLjY3IDExLjk1KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjE5OXB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KKzwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDE4MS42MiAxNC44KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KTmE8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAxOTQuMzcgMTEuMzUpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMTUwcHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgorPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMTk3LjU3IDE0LjkxKSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KT0g8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAyMTIuNTcgMTEuNDYpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMTUwcHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgotPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgOC4xMSAzMS4zNykiIGZvbnQtc3R5bGU9Im5vcm1hbCIgZm9udC13ZWlnaHQ9Im5vcm1hbCIgZm9udC1zaXplPSIyMDBweCIgZm9udC1mYW1pbHk9IkFyaWFsIiA+CltJXTwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDU4LjczIDMwLjYpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMjAwcHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgpbSUldPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMTMxLjM0IDMwLjYpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMjAwcHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgpbSUlJXTwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDE5MC44MTUgMzEuMDkpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMjAwcHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgpbSVZdPC90ZXh0Pgo8L3N2Zz4K\" alt=\"Reaction preview\" style=\"width:100%\"/>\n        </div>\n    </div>\n    \n\n    <div style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    \n        <div style=\"width: 100%;color: #999;padding: 2px 10px;\">Reactants</div>\n        \n<div class=\"table-wrapper\">\n    <div class=\"table-scroll\">\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>Rxn ID</th>\n                \n                    <th>Reactant</th>\n                \n                    <th>MF</th>\n                \n                    <th>FM</th>\n                \n                    <th>MW</th>\n                \n                    <th>EM</th>\n                \n                    <th>Limit?</th>\n                \n                    <th>Eq</th>\n                \n                    <th>Sample Mass</th>\n                \n                    <th>Moles</th>\n                \n                    <th>Molarity</th>\n                \n                    <th>Vol</th>\n                \n                    <th>d</th>\n                \n                    <th>% Wt</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n            \n                <tr>\n                \n                    <td>I</td>\n                \n                    <td>water</td>\n                \n                    <td>H<sub>2</sub>O</td>\n                \n                    <td>18.02 g/mol</td>\n                \n                    <td>18.02 g/mol</td>\n                \n                    <td>18.01056</td>\n                \n                    <td>True</td>\n                \n                    <td>1</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n                <tr>\n                \n                    <td>II</td>\n                \n                    <td>sodium</td>\n                \n                    <td>Na</td>\n                \n                    <td>22.99 g/mol</td>\n                \n                    <td>22.99 g/mol</td>\n                \n                    <td>22.98977</td>\n                \n                    <td></td>\n                \n                    <td>1</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n            </tbody>\n        </table>\n    </div>\n</div>\n\n    \n\n    \n        <div style=\"width: 100%;color: #999;padding: 2px 10px;\">Products</div>\n        \n<div class=\"table-wrapper\">\n    <div class=\"table-scroll\">\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>Rxn ID</th>\n                \n                    <th>Product</th>\n                \n                    <th>MF</th>\n                \n                    <th>FM</th>\n                \n                    <th>MW</th>\n                \n                    <th>EM</th>\n                \n                    <th>Purity</th>\n                \n                    <th>d</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n            \n                <tr>\n                \n                    <td>III</td>\n                \n                    <td>dihydrogen</td>\n                \n                    <td>H<sub>2</sub></td>\n                \n                    <td>2.02 g/mol</td>\n                \n                    <td>2.02 g/mol</td>\n                \n                    <td>2.01565</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n                <tr>\n                \n                    <td>IV</td>\n                \n                    <td>sodium hydroxide</td>\n                \n                    <td>HNaO</td>\n                \n                    <td>40 g/mol</td>\n                \n                    <td>40.00 g/mol</td>\n                \n                    <td>39.99251</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n            </tbody>\n        </table>\n    </div>\n</div>\n\n    \n\n    \n\n    \n</div>\n\n</div>\n\n<div style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <h2>Procedure</h2>\n    <div>\n        <span><p>pp</p></span>\n    </div>\n</div>\n\n\n<div class=\"table-wrapper\" style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <div class=\"table-scroll\">\n        <h2>Subexperiment Summary</h2>\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>2</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n                \n                <tr>\n                    \n                        \n                            <td>parasubexp:76214b4c-f21a-4904-aac5-0b1fd9380c6c</td>\n                        \n                    \n                </tr>\n                \n            </tbody>\n        </table>\n    </div>\n</div>\n\n\n\n<div class=\"table-wrapper\" style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <div class=\"table-scroll\">\n        <h2>Products</h2>\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>2</th>\n                \n                    <th>p1:productid</th>\n                \n                    <th>p1:name</th>\n                \n                    <th>p1:mf</th>\n                \n                    <th>p1:formula</th>\n                \n                    <th>p1:mw</th>\n                \n                    <th>p1:em</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n                \n                <tr>\n                    \n                        \n                            <td>parasubexp:76214b4c-f21a-4904-aac5-0b1fd9380c6c</td>\n                        \n                    \n                        \n                            <td>P1</td>\n                        \n                    \n                        \n                            <td>dihydrogen</td>\n                        \n                    \n                        \n                            <td>2.02</td>\n                        \n                    \n                        \n                            <td>H<sub>2</sub></td>\n                        \n                    \n                        \n                            <td>2.02</td>\n                        \n                    \n                        \n                            <td>2.01565</td>\n                        \n                    \n                </tr>\n                \n            </tbody>\n        </table>\n    </div>\n</div>\n\n\n\n<div class=\"table-wrapper\" style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <div class=\"table-scroll\">\n        <h2>Reactions</h2>\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>2</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n                \n                <tr>\n                    \n                        \n                            <td>parasubexp:76214b4c-f21a-4904-aac5-0b1fd9380c6c</td>\n                        \n                    \n                </tr>\n                \n            </tbody>\n        </table>\n    </div>\n</div>\n\n\n\n<div class=\"table-wrapper\" style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <div class=\"table-scroll\">\n        <h2>Reactants</h2>\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>2</th>\n                \n                    <th>r1:name</th>\n                \n                    <th>r1:mf</th>\n                \n                    <th>r1:formula</th>\n                \n                    <th>r1:mw</th>\n                \n                    <th>r2:name</th>\n                \n                    <th>r2:mf</th>\n                \n                    <th>r2:formula</th>\n                \n                    <th>r2:mw</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n                \n                <tr>\n                    \n                        \n                            <td>parasubexp:76214b4c-f21a-4904-aac5-0b1fd9380c6c</td>\n                        \n                    \n                        \n                            <td>water</td>\n                        \n                    \n                        \n                            <td>18.02</td>\n                        \n                    \n                        \n                            <td>H<sub>2</sub>O</td>\n                        \n                    \n                        \n                            <td>18.02</td>\n                        \n                    \n                        \n                            <td>sodium</td>\n                        \n                    \n                        \n                            <td>22.99</td>\n                        \n                    \n                        \n                            <td>Na</td>\n                        \n                    \n                        \n                            <td>22.99</td>\n                        \n                    \n                </tr>\n                \n            </tbody>\n        </table>\n    </div>\n</div>\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <link rel=\"icon\" href=\"data:;base64,iVBORw0KGgo=\">\n    <title>Sub-experiment-1</title>\n    <style>\n        h1 {\n            margin-top: 1.7rem;\n            margin-bottom: 0.3rem;\n            font-size: 1.6rem;\n        }\n\n        h2 {\n            margin-top: 1.2rem;\n            margin-bottom: 0.3rem;\n            font-size: 1.2rem;\n            color: #00A0E1;\n        }\n\n        table.props th, table.props td {\n            text-align: left;\n            padding: 3px;\n        }\n        .table-scroll {\n            overflow:auto;\n        }\n        .table-wrapper {\n            position:relative;\n        }\n        table, th, td {\n            border: 1px solid #cccccc;\n            border-collapse: collapse;\n            table-layout: fixed;\n        }\n        .table-wrapper th, td {\n            padding: 10px 20px;\n        }\n        .table-wrapper table td {\n            text-align: center;\n            vertical-align: middle;\n            padding: 5px;\n        }\n        .parent {\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            width: 100%;\n            aspect-ratio: auto;\n        }\n        .image-container {\n            width: 60%;\n            height: 60%;\n            overflow: hidden;\n        }\n\n        .image-container img {\n            width: 100%;\n            min-height: 100%;\n            object-fit: cover;\n        }\n\n    </style>\n</head>\n<body>\n<table class=\"props\" style=\"margin: 10px 10px; padding: 6px 10px;\">\n    <tr>\n        <th>Experiment name:</th>\n        <td>Sub-experiment-1</td>\n    </tr>\n    <tr>\n        <th>Description:</th>\n        <td></td>\n    </tr>\n    <tr>\n        <th>Last edited at:</th>\n        <td>08:04:23 2022-08-03</td>\n    </tr>\n</table>\n\n\n<div style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <h2>Chemical Drawing</h2>\n\n    \n    <div class=\"parent\">\n        <div class=\"image-container\">\n            <img src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyIgPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMjc3cHgiIGhlaWdodD0iNDdweCIgdmlld0JveD0iMCAwIDI3NyA0NyIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmZmZmZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiA+CjxwYXRoIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAtMzcyIC0xNTMpIiBkPSJNIDExNjE2LjgsMzQzNS44IEwgMTA2MjAsMzQzNS44IEwgMTA2MjAsMzQxNS44IEwgMTE2MTYuOCwzNDE1LjggWiAiIC8+CjxwYXRoIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAtMzcyIC0xNTMpIiBkPSJNIDExODc4LjQsMzQyNS44IEMgMTE4NzguNCwzNDI1LjggMTE1NzguNCwzNTAxLjggMTE1NzguNCwzNTAxLjggQyAxMTU3OC40LDM1MDEuOCAxMTYxNS44LDM0NTkuMDYgMTE2MTUuOCwzNDI1LjggQyAxMTYxNS44LDMzOTIuMSAxMTU3OC40LDMzNDguOCAxMTU3OC40LDMzNDguOCBDIDExNTc4LjQsMzM0OC44IDExODc4LjQsMzQyNS44IDExODc4LjQsMzQyNS44IEMgMTE4NzguNCwzNDI1LjggMTE4NzguNCwzNDI1LjggMTE4NzguNCwzNDI1LjggIiAvPgo8cGF0aCBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAtMzcyIC0xNTMpIiBkPSJNIDExODc4LjQsMzQyNS44IEMgMTE4NzguNCwzNDI1LjggMTE1NzguNCwzNTAxLjggMTE1NzguNCwzNTAxLjggQyAxMTU3OC40LDM1MDEuOCAxMTYxNS44LDM0NTkuMDYgMTE2MTUuOCwzNDI1LjggQyAxMTYxNS44LDMzOTIuMSAxMTU3OC40LDMzNDguOCAxMTU3OC40LDMzNDguOCBDIDExNTc4LjQsMzM0OC44IDExODc4LjQsMzQyNS44IDExODc4LjQsMzQyNS44IEMgMTE4NzguNCwzNDI1LjggMTE4NzguNCwzNDI1LjggMTE4NzguNCwzNDI1LjggIiAvPgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDgwODAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMTA0Ljg0IDIyLjk5KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KTmE8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSA1Ny4yOSAyMS41OCkiIGZvbnQtc3R5bGU9Im5vcm1hbCIgZm9udC13ZWlnaHQ9Im5vcm1hbCIgZm9udC1zaXplPSI0MTZweCIgZm9udC1mYW1pbHk9IkFyaWFsIiA+Cis8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAyLjQ2NzUgMjEuMzcpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMjAwcHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgpIPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgOS42Njc1IDIzLjUyKSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjE1MHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KMjwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDEzLjgzIDIxLjM3KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KTzwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDI1Ny4zIDIyLjk5KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KSEg8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSA2LjAzIDQxLjUzKSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjI0MHB4IiBmb250LWZhbWlseT0iVGltZXMiID4KW0ldPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMTAzLjIyIDQxLjYpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMjQwcHgiIGZvbnQtZmFtaWx5PSJUaW1lcyIgPgpbSUldPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMjU0LjUxIDQxLjYpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMjQwcHgiIGZvbnQtZmFtaWx5PSJUaW1lcyIgPgpbSUlJXTwvdGV4dD4KPC9zdmc+Cg==\" alt=\"Reaction preview\" style=\"width:100%\"/>\n        </div>\n    </div>\n    \n\n    <div style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    \n        <div style=\"width: 100%;color: #999;padding: 2px 10px;\">Reactants</div>\n        \n<div class=\"table-wrapper\">\n    <div class=\"table-scroll\">\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>Rxn ID</th>\n                \n                    <th>Reactant</th>\n                \n                    <th>MF</th>\n                \n                    <th>FM</th>\n                \n                    <th>MW</th>\n                \n                    <th>EM</th>\n                \n                    <th>Limit?</th>\n                \n                    <th>Eq</th>\n                \n                    <th>Sample Mass</th>\n                \n                    <th>Moles</th>\n                \n                    <th>Molarity</th>\n                \n                    <th>Vol</th>\n                \n                    <th>d</th>\n                \n                    <th>% Wt</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n            \n                <tr>\n                \n                    <td>I</td>\n                \n                    <td>water</td>\n                \n                    <td>H<sub>2</sub>O</td>\n                \n                    <td>18.02 g/mol</td>\n                \n                    <td>18.02 g/mol</td>\n                \n                    <td>18.01056</td>\n                \n                    <td>True</td>\n                \n                    <td>1</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n                <tr>\n                \n                    <td>II</td>\n                \n                    <td>sodium</td>\n                \n                    <td>Na</td>\n                \n                    <td>22.99 g/mol</td>\n                \n                    <td>22.99 g/mol</td>\n                \n                    <td>22.98977</td>\n                \n                    <td></td>\n                \n                    <td>1</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n            </tbody>\n        </table>\n    </div>\n</div>\n\n    \n\n    \n        <div style=\"width: 100%;color: #999;padding: 2px 10px;\">Products</div>\n        \n<div class=\"table-wrapper\">\n    <div class=\"table-scroll\">\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>Rxn ID</th>\n                \n                    <th>Product</th>\n                \n                    <th>MF</th>\n                \n                    <th>FM</th>\n                \n                    <th>MW</th>\n                \n                    <th>EM</th>\n                \n                    <th>Purity</th>\n                \n                    <th>d</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n            \n                <tr>\n                \n                    <td>III</td>\n                \n                    <td>dihydrogen</td>\n                \n                    <td>H<sub>2</sub></td>\n                \n                    <td>2.02 g/mol</td>\n                \n                    <td>2.02 g/mol</td>\n                \n                    <td>2.01565</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n            </tbody>\n        </table>\n    </div>\n</div>\n\n    \n\n    \n\n    \n</div>\n\n</div>\n\n\n\n</body>\n</html>\n\n\n\n</body>\n</html>"
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import warnings  # added to ignore deprecation warnings\n",
+    "\n",
+    "warnings.filterwarnings('ignore')\n",
+    "\n",
+    "from IPython.core.display import display, HTML\n",
+    "\n",
+    "experiment_html = parallel_experiment.get_html()\n",
+    "display(HTML(data=experiment_html))  # pycharm cannot display html correctly. Use web version to see html response."
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 2
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython2",
+   "version": "2.7.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
diff --git a/examples/SubExperiment.ipynb b/examples/SubExperiment.ipynb
new file mode 100644
index 00000000..5cd4057b
--- /dev/null
+++ b/examples/SubExperiment.ipynb
@@ -0,0 +1,167 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "outputs": [],
+   "source": [
+    "%load_ext dotenv\n",
+    "%dotenv\n",
+    "import os\n",
+    "\n",
+    "SN_API_HOST = os.getenv('SN_API_HOST')\n",
+    "SN_API_KEY = os.getenv('SN_API_KEY')"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "<signals_notebook.api.SignalsNotebookApi at 0x231c69db5e0>"
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from signals_notebook.api import SignalsNotebookApi\n",
+    "\n",
+    "SignalsNotebookApi.init(SN_API_HOST, SN_API_KEY)"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "SubExperiment(type=<EntityType.SUB_EXPERIMENT: 'parasubexp'>, eid='parasubexp:f4117cf4-b470-40c9-989f-1b465fcf6f74', digest='25430036', name='Sub-experiment-6', description='Test SubExperiment', created_at=datetime.datetime(2022, 8, 3, 8, 40, 54, 989000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 40, 54, 989000, tzinfo=datetime.timezone.utc))"
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from signals_notebook.entities import SubExperiment\n",
+    "from signals_notebook.entities import EntityStore\n",
+    "\n",
+    "parallel_experiment = EntityStore.get('paraexp:c62e2c5e-952c-45d1-8f8d-bfa9ed786754')\n",
+    "\n",
+    "sub_experiment = SubExperiment.create(\n",
+    "    description='Test SubExperiment',\n",
+    "    parallel_experiment=parallel_experiment,\n",
+    ")\n",
+    "sub_experiment"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "[ChemicalDrawing(type=<EntityType.CHEMICAL_DRAWING: 'chemicalDrawing'>, eid='chemicalDrawing:4b076f5b-66e2-4361-9d36-3c6ee0c7213e', digest='0', name='Chemical Drawing', description='', created_at=datetime.datetime(2022, 8, 3, 8, 40, 54, 989000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 40, 54, 989000, tzinfo=datetime.timezone.utc))]"
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "list(sub_experiment.get_children())"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "outputs": [],
+   "source": [
+    "sub_experiment = EntityStore.get('parasubexp:76214b4c-f21a-4904-aac5-0b1fd9380c6c')"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "<IPython.core.display.HTML object>",
+      "text/html": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <link rel=\"icon\" href=\"data:;base64,iVBORw0KGgo=\">\n    <title>Sub-experiment-1</title>\n    <style>\n        h1 {\n            margin-top: 1.7rem;\n            margin-bottom: 0.3rem;\n            font-size: 1.6rem;\n        }\n\n        h2 {\n            margin-top: 1.2rem;\n            margin-bottom: 0.3rem;\n            font-size: 1.2rem;\n            color: #00A0E1;\n        }\n\n        table.props th, table.props td {\n            text-align: left;\n            padding: 3px;\n        }\n        .table-scroll {\n            overflow:auto;\n        }\n        .table-wrapper {\n            position:relative;\n        }\n        table, th, td {\n            border: 1px solid #cccccc;\n            border-collapse: collapse;\n            table-layout: fixed;\n        }\n        .table-wrapper th, td {\n            padding: 10px 20px;\n        }\n        .table-wrapper table td {\n            text-align: center;\n            vertical-align: middle;\n            padding: 5px;\n        }\n        .parent {\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            width: 100%;\n            aspect-ratio: auto;\n        }\n        .image-container {\n            width: 60%;\n            height: 60%;\n            overflow: hidden;\n        }\n\n        .image-container img {\n            width: 100%;\n            min-height: 100%;\n            object-fit: cover;\n        }\n\n    </style>\n</head>\n<body>\n<table class=\"props\" style=\"margin: 10px 10px; padding: 6px 10px;\">\n    <tr>\n        <th>Experiment name:</th>\n        <td>Sub-experiment-1</td>\n    </tr>\n    <tr>\n        <th>Description:</th>\n        <td></td>\n    </tr>\n    <tr>\n        <th>Last edited at:</th>\n        <td>08:04:23 2022-08-03</td>\n    </tr>\n</table>\n\n\n<div style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <h2>Chemical Drawing</h2>\n\n    \n    <div class=\"parent\">\n        <div class=\"image-container\">\n            <img src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyIgPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iNDE2cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQxNiA0OCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmZmZmZmZiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiA+CjxwYXRoIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAtMzcyIC0xMjApIiBkPSJNIDExNjE2LjgsMjc3NS44IEwgMTA2MjAsMjc3NS44IEwgMTA2MjAsMjc1NS44IEwgMTE2MTYuOCwyNzU1LjggWiAiIC8+CjxwYXRoIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAtMzcyIC0xMjApIiBkPSJNIDExODc4LjQsMjc2NS44IEMgMTE4NzguNCwyNzY1LjggMTE1NzguNCwyODQxLjggMTE1NzguNCwyODQxLjggQyAxMTU3OC40LDI4NDEuOCAxMTYxNS44LDI3OTkuMDYgMTE2MTUuOCwyNzY1LjggQyAxMTYxNS44LDI3MzIuMSAxMTU3OC40LDI2ODguOCAxMTU3OC40LDI2ODguOCBDIDExNTc4LjQsMjY4OC44IDExODc4LjQsMjc2NS44IDExODc4LjQsMjc2NS44IEMgMTE4NzguNCwyNzY1LjggMTE4NzguNCwyNzY1LjggMTE4NzguNCwyNzY1LjggIiAvPgo8cGF0aCBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAtMzcyIC0xMjApIiBkPSJNIDExODc4LjQsMjc2NS44IEMgMTE4NzguNCwyNzY1LjggMTE1NzguNCwyODQxLjggMTE1NzguNCwyODQxLjggQyAxMTU3OC40LDI4NDEuOCAxMTYxNS44LDI3OTkuMDYgMTE2MTUuOCwyNzY1LjggQyAxMTYxNS44LDI3MzIuMSAxMTU3OC40LDI2ODguOCAxMTU3OC40LDI2ODguOCBDIDExNTc4LjQsMjY4OC44IDExODc4LjQsMjc2NS44IDExODc4LjQsMjc2NS44IEMgMTE4NzguNCwyNzY1LjggMTE4NzguNCwyNzY1LjggMTE4NzguNCwyNzY1LjggIiAvPgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDgwODAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMTA0Ljg0IDIyLjk5KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KTmE8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSA1Ny4yOSAyMS41OCkiIGZvbnQtc3R5bGU9Im5vcm1hbCIgZm9udC13ZWlnaHQ9Im5vcm1hbCIgZm9udC1zaXplPSI0MTZweCIgZm9udC1mYW1pbHk9IkFyaWFsIiA+Cis8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAyLjQ2NzUgMjEuMzcpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMjAwcHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgpIPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgOS42Njc1IDIzLjUyKSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjE1MHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KMjwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDEzLjgzIDIxLjM3KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KTzwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDI1Ny4zIDIyLjk5KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KSEg8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAzMTQuOTQgMjEuNTgpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iNDE2cHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgorPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMzYyLjQ4IDIzLjc4KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KTmE8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAzNzUuMjMgMjAuMzMpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMTUwcHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgorPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgMzk2LjA0IDI0LjAxKSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjIwMHB4IiBmb250LWZhbWlseT0iQXJpYWwiID4KT0g8L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSA0MTEuMDQgMjAuNTYpIiBmb250LXN0eWxlPSJub3JtYWwiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIGZvbnQtc2l6ZT0iMTUwcHgiIGZvbnQtZmFtaWx5PSJBcmlhbCIgPgotPC90ZXh0Pgo8dGV4dCB4PSIwIiB5PSIwIiBzdHJva2U9Im5vbmUiIGZpbGw9IiMwMDAwMDAiIHRyYW5zZm9ybT0ibWF0cml4KDAuMDUgMCAwIDAuMDUgNi4wMyA0MS41MykiIGZvbnQtc3R5bGU9Im5vcm1hbCIgZm9udC13ZWlnaHQ9Im5vcm1hbCIgZm9udC1zaXplPSIyNDBweCIgZm9udC1mYW1pbHk9IlRpbWVzIiA+CltJXTwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDEwMy4yMiA0MS42KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjI0MHB4IiBmb250LWZhbWlseT0iVGltZXMiID4KW0lJXTwvdGV4dD4KPHRleHQgeD0iMCIgeT0iMCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjMDAwMDAwIiB0cmFuc2Zvcm09Im1hdHJpeCgwLjA1IDAgMCAwLjA1IDI1NC41MSA0MS42KSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjI0MHB4IiBmb250LWZhbWlseT0iVGltZXMiID4KW0lJSV08L3RleHQ+Cjx0ZXh0IHg9IjAiIHk9IjAiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzAwMDAwMCIgdHJhbnNmb3JtPSJtYXRyaXgoMC4wNSAwIDAgMC4wNSAzNzcuNjg1IDQyLjYyKSIgZm9udC1zdHlsZT0ibm9ybWFsIiBmb250LXdlaWdodD0ibm9ybWFsIiBmb250LXNpemU9IjI0MHB4IiBmb250LWZhbWlseT0iVGltZXMiID4KW0lWXTwvdGV4dD4KPC9zdmc+Cg==\" alt=\"Reaction preview\" style=\"width:100%\"/>\n        </div>\n    </div>\n    \n\n    <div style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    \n        <div style=\"width: 100%;color: #999;padding: 2px 10px;\">Reactants</div>\n        \n<div class=\"table-wrapper\">\n    <div class=\"table-scroll\">\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>Rxn ID</th>\n                \n                    <th>Reactant</th>\n                \n                    <th>MF</th>\n                \n                    <th>FM</th>\n                \n                    <th>MW</th>\n                \n                    <th>EM</th>\n                \n                    <th>Limit?</th>\n                \n                    <th>Eq</th>\n                \n                    <th>Sample Mass</th>\n                \n                    <th>Moles</th>\n                \n                    <th>Molarity</th>\n                \n                    <th>Vol</th>\n                \n                    <th>d</th>\n                \n                    <th>% Wt</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n            \n                <tr>\n                \n                    <td>I</td>\n                \n                    <td>water</td>\n                \n                    <td>H<sub>2</sub>O</td>\n                \n                    <td>18.02 g/mol</td>\n                \n                    <td>18.02 g/mol</td>\n                \n                    <td>18.01056</td>\n                \n                    <td>True</td>\n                \n                    <td>1</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n                <tr>\n                \n                    <td>II</td>\n                \n                    <td>sodium</td>\n                \n                    <td>Na</td>\n                \n                    <td>22.99 g/mol</td>\n                \n                    <td>22.99 g/mol</td>\n                \n                    <td>22.98977</td>\n                \n                    <td></td>\n                \n                    <td>1</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n            </tbody>\n        </table>\n    </div>\n</div>\n\n    \n\n    \n        <div style=\"width: 100%;color: #999;padding: 2px 10px;\">Products</div>\n        \n<div class=\"table-wrapper\">\n    <div class=\"table-scroll\">\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>Rxn ID</th>\n                \n                    <th>Product</th>\n                \n                    <th>MF</th>\n                \n                    <th>FM</th>\n                \n                    <th>MW</th>\n                \n                    <th>EM</th>\n                \n                    <th>Purity</th>\n                \n                    <th>d</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n            \n                <tr>\n                \n                    <td>III</td>\n                \n                    <td>test</td>\n                \n                    <td>H<sub>2</sub></td>\n                \n                    <td>2.02 g/mol</td>\n                \n                    <td>2.02 g/mol</td>\n                \n                    <td>2.01565</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n                <tr>\n                \n                    <td>IV</td>\n                \n                    <td>sodium hydroxide</td>\n                \n                    <td>HNaO</td>\n                \n                    <td>40 g/mol</td>\n                \n                    <td>40.00 g/mol</td>\n                \n                    <td>39.99251</td>\n                \n                    <td></td>\n                \n                    <td></td>\n                \n                </tr>\n            \n            </tbody>\n        </table>\n    </div>\n</div>\n\n    \n\n    \n\n    \n</div>\n\n</div>\n\n\n\n</body>\n</html>"
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import warnings # added to ignore deprecation warnings\n",
+    "warnings.filterwarnings('ignore')\n",
+    "\n",
+    "from IPython.core.display import display, HTML\n",
+    "\n",
+    "sub_experiment_html = sub_experiment.get_html()\n",
+    "display(HTML(data=sub_experiment_html))"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 2
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython2",
+   "version": "2.7.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
diff --git a/examples/SubExperimentLayout.ipynb b/examples/SubExperimentLayout.ipynb
new file mode 100644
index 00000000..7154a8d6
--- /dev/null
+++ b/examples/SubExperimentLayout.ipynb
@@ -0,0 +1,131 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "outputs": [],
+   "source": [
+    "%load_ext dotenv\n",
+    "%dotenv\n",
+    "import os\n",
+    "\n",
+    "SN_API_HOST = os.getenv('SN_API_HOST')\n",
+    "SN_API_KEY = os.getenv('SN_API_KEY')"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "<signals_notebook.api.SignalsNotebookApi at 0x1932318a3a0>"
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from signals_notebook.api import SignalsNotebookApi\n",
+    "\n",
+    "SignalsNotebookApi.init(SN_API_HOST, SN_API_KEY)"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "outputs": [],
+   "source": [
+    "from signals_notebook.entities import EntityStore\n",
+    "\n",
+    "sub_exp_layout = EntityStore.get(\"paraLayout:b61de763-cb71-4f80-9bf5-1454e49c2b4b\")"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "File(name='Subexperiment+Layout.csv', content=b'Plate,Well,Row,Column,Name\\r\\n', content_type='text/csv')"
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "sub_exp_layout.get_content()"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "<IPython.core.display.HTML object>",
+      "text/html": "<div style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <h2>Subexperiment Layout</h2>\n    \n    \n    <a href=\"data:text/csv;base64,UGxhdGUsV2VsbCxSb3csQ29sdW1uLE5hbWUNCg==\" download=\"Subexperiment Layout.csv\">DOWNLOAD .CSV FILE</a>\n    \n    \n</div>"
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "sub_exp_layout.get_html()"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 2
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython2",
+   "version": "2.7.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
diff --git a/examples/SubExperimentSummary.ipynb b/examples/SubExperimentSummary.ipynb
new file mode 100644
index 00000000..9b1632cc
--- /dev/null
+++ b/examples/SubExperimentSummary.ipynb
@@ -0,0 +1,175 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "The dotenv extension is already loaded. To reload it, use:\n",
+      "  %reload_ext dotenv\n"
+     ]
+    }
+   ],
+   "source": [
+    "%load_ext dotenv\n",
+    "%dotenv\n",
+    "import os\n",
+    "\n",
+    "SN_API_HOST = os.getenv('SN_API_HOST')\n",
+    "SN_API_KEY = os.getenv('SN_API_KEY')"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "<signals_notebook.api.SignalsNotebookApi at 0x2b802af2f70>"
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from signals_notebook.api import SignalsNotebookApi\n",
+    "\n",
+    "SignalsNotebookApi.init(SN_API_HOST, SN_API_KEY)"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "SubExperimentSummary(type=<EntityType.SUB_EXPERIMENT_SUMMARY: 'paragrid'>, eid='paragrid:de6fd6ee-5f11-494a-a830-ca4e4f050422', digest='91265042', name='Products', description='', created_at=datetime.datetime(2022, 8, 3, 8, 3, 37, 313000, tzinfo=datetime.timezone.utc), edited_at=datetime.datetime(2022, 8, 3, 8, 13, 10, 691000, tzinfo=datetime.timezone.utc))"
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "from signals_notebook.entities import EntityStore\n",
+    "\n",
+    "sub_experiment_summary = EntityStore.get('paragrid:de6fd6ee-5f11-494a-a830-ca4e4f050422')\n",
+    "\n",
+    "sub_experiment_summary"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "outputs": [],
+   "source": [
+    "sub_experiment_summary[0]['p1:name'].set_value('test')\n",
+    "sub_experiment_summary.save()\n",
+    "\n",
+    "assert sub_experiment_summary[0]['p1:name'].value=='test'"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "id='chemicalDrawing:cd26d662-ed6e-405b-9ad5-1414f8c2a431' cells=[SubExperimentSummaryCell(key='2', display='Sub-experiment-1', value='parasubexp:76214b4c-f21a-4904-aac5-0b1fd9380c6c'), SubExperimentSummaryCell(key='p1:productid', display=None, value='P1'), SubExperimentSummaryCell(key='p1:name', display=None, value='test'), SubExperimentSummaryCell(key='p1:mf', display='2.02 g/mol', value='2.02'), SubExperimentSummaryCell(key='p1:formula', display=None, value='H<sub>2</sub>'), SubExperimentSummaryCell(key='p1:mw', display='2.02 g/mol', value='2.02'), SubExperimentSummaryCell(key='p1:em', display='2.01565', value='2.01565'), SubExperimentSummaryCell(key='p2:productid', display=None, value='P2'), SubExperimentSummaryCell(key='p2:name', display=None, value='sodium hydroxide'), SubExperimentSummaryCell(key='p2:mf', display='40.00 g/mol', value='40.0'), SubExperimentSummaryCell(key='p2:formula', display=None, value='HNaO'), SubExperimentSummaryCell(key='p2:mw', display='40.00 g/mol', value='40.0'), SubExperimentSummaryCell(key='p2:em', display='39.99251', value='39.99251')]\n",
+      "id='chemicalDrawing:179bd301-9921-403a-81f9-454e2e348e60' cells=[SubExperimentSummaryCell(key='2', display='Sub-experiment-2', value='parasubexp:1a7ec78d-6602-4e75-807c-8db3b74c8701')]\n"
+     ]
+    }
+   ],
+   "source": [
+    "for item in sub_experiment_summary:\n",
+    "    print(item)"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "outputs": [
+    {
+     "data": {
+      "text/plain": "<IPython.core.display.HTML object>",
+      "text/html": "\n<div class=\"table-wrapper\" style=\"margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;\">\n    <div class=\"table-scroll\">\n        <h2>Products</h2>\n        <table>\n            <thead>\n                <tr>\n                \n                    <th>2</th>\n                \n                    <th>p1:productid</th>\n                \n                    <th>p1:name</th>\n                \n                    <th>p1:mf</th>\n                \n                    <th>p1:formula</th>\n                \n                    <th>p1:mw</th>\n                \n                    <th>p1:em</th>\n                \n                    <th>p2:productid</th>\n                \n                    <th>p2:name</th>\n                \n                    <th>p2:mf</th>\n                \n                    <th>p2:formula</th>\n                \n                    <th>p2:mw</th>\n                \n                    <th>p2:em</th>\n                \n                </tr>\n            </thead>\n            <tbody>\n                \n                <tr>\n                    \n                        \n                            <td>parasubexp:76214b4c-f21a-4904-aac5-0b1fd9380c6c</td>\n                        \n                    \n                        \n                            <td>P1</td>\n                        \n                    \n                        \n                            <td>test</td>\n                        \n                    \n                        \n                            <td>2.02</td>\n                        \n                    \n                        \n                            <td>H<sub>2</sub></td>\n                        \n                    \n                        \n                            <td>2.02</td>\n                        \n                    \n                        \n                            <td>2.01565</td>\n                        \n                    \n                        \n                            <td>P2</td>\n                        \n                    \n                        \n                            <td>sodium hydroxide</td>\n                        \n                    \n                        \n                            <td>40.0</td>\n                        \n                    \n                        \n                            <td>HNaO</td>\n                        \n                    \n                        \n                            <td>40.0</td>\n                        \n                    \n                        \n                            <td>39.99251</td>\n                        \n                    \n                </tr>\n                \n                <tr>\n                    \n                        \n                            <td>parasubexp:1a7ec78d-6602-4e75-807c-8db3b74c8701</td>\n                        \n                    \n                </tr>\n                \n            </tbody>\n        </table>\n    </div>\n</div>\n"
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import warnings # added to ignore deprecation warnings\n",
+    "warnings.filterwarnings('ignore')\n",
+    "\n",
+    "from IPython.core.display import display, HTML\n",
+    "\n",
+    "experiment_html = sub_experiment_summary.get_html()\n",
+    "display(HTML(data=experiment_html))  # pycharm cannot display html correctly. Use web version to see html response.\n"
+   ],
+   "metadata": {
+    "collapsed": false,
+    "pycharm": {
+     "name": "#%%\n"
+    }
+   }
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 2
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython2",
+   "version": "2.7.6"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
diff --git a/src/signals_notebook/common_types.py b/src/signals_notebook/common_types.py
index 1b4ef082..951f8b8c 100644
--- a/src/signals_notebook/common_types.py
+++ b/src/signals_notebook/common_types.py
@@ -42,6 +42,7 @@ class ObjectType(str, Enum):
     PLATE_ROW = 'plateRow'
     ATTRIBUTE_OPTION = 'option'
     CHOICE = 'choice'
+    SUB_EXPERIMENT = 'subexpSummaryRow'
     CONTAINER = 'container'
 
 
@@ -65,6 +66,10 @@ class EntityType(str, Enum):
     TASK = 'task'
     PLATE_CONTAINER = 'plateContainer'
     MATERIAL_TABLE = 'materialsTable'
+    PARALLEL_EXPERIMENT = 'paraexp'
+    SUB_EXPERIMENT = 'parasubexp'
+    SUB_EXPERIMENT_SUMMARY = 'paragrid'
+    SUB_EXPERIMENT_LAYOUT = 'paraLayout'
 
 
 class MaterialType(str, Enum):
diff --git a/src/signals_notebook/entities/__init__.py b/src/signals_notebook/entities/__init__.py
index 330d1949..62420c41 100644
--- a/src/signals_notebook/entities/__init__.py
+++ b/src/signals_notebook/entities/__init__.py
@@ -19,3 +19,7 @@
 from signals_notebook.entities.uploaded_resource import UploadedResource  # noqa
 from signals_notebook.entities.plates.plate_container import PlateContainer  # noqa
 from signals_notebook.entities.materials_table import MaterialsTable  # noqa
+from signals_notebook.entities.parallel_experiment.parallel_experiment import ParallelExperiment  # noqa
+from signals_notebook.entities.parallel_experiment.sub_experiment import SubExperiment  # noqa
+from signals_notebook.entities.parallel_experiment.sub_experiment_summary import SubExperimentSummary  # noqa
+from signals_notebook.entities.parallel_experiment.sub_experiment_layout import SubExperimentLayout  # noqa
diff --git a/src/signals_notebook/entities/experiment.py b/src/signals_notebook/entities/experiment.py
index 1bb8d6a3..5fa5344e 100644
--- a/src/signals_notebook/entities/experiment.py
+++ b/src/signals_notebook/entities/experiment.py
@@ -105,7 +105,7 @@ def create(
 
     @cached_property
     def stoichiometry(self) -> Union[Stoichiometry, list[Stoichiometry]]:
-        """"Fetch stoichiometry data of experiment
+        """ Fetch stoichiometry data of experiment
 
         Returns:
             Stoichiometry object or list of Stoichiometry objects
@@ -124,7 +124,7 @@ def get_html(self) -> str:
             'description': self.description,
             'edited_at': self.edited_at,
             'state': self.state,
-            'children': self.get_children()
+            'children': self.get_children(),
         }
 
         template = env.get_template(self._template_name)
diff --git a/src/signals_notebook/entities/parallel_experiment/__init__.py b/src/signals_notebook/entities/parallel_experiment/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/signals_notebook/entities/parallel_experiment/cell.py b/src/signals_notebook/entities/parallel_experiment/cell.py
new file mode 100644
index 00000000..8f3172df
--- /dev/null
+++ b/src/signals_notebook/entities/parallel_experiment/cell.py
@@ -0,0 +1,22 @@
+from typing import Optional, Union
+
+from pydantic import BaseModel, PrivateAttr
+
+
+class SubExperimentSummaryCell(BaseModel):
+    key: Optional[str]
+    display: Optional[str]
+    value: Optional[Union[str, int]]
+    _changed: bool = PrivateAttr(default=False)
+
+    def set_value(self, new_value: Optional[Union[str, int]]) -> None:
+        self.value = new_value
+        self._changed = True
+
+    @property
+    def is_changed(self) -> bool:
+        return self._changed
+
+    @property
+    def representation_for_update(self):
+        return {self.key: {'content': {'value': self.value}}}
diff --git a/src/signals_notebook/entities/parallel_experiment/parallel_experiment.py b/src/signals_notebook/entities/parallel_experiment/parallel_experiment.py
new file mode 100644
index 00000000..4cd84e06
--- /dev/null
+++ b/src/signals_notebook/entities/parallel_experiment/parallel_experiment.py
@@ -0,0 +1,134 @@
+import logging
+from enum import Enum
+from functools import cached_property
+from typing import ClassVar, Generator, Literal, Optional
+
+from pydantic import BaseModel, Field
+
+from signals_notebook.common_types import (
+    Ancestors,
+    EntityCreationRequestPayload,
+    EntityType,
+    Template,
+)
+from signals_notebook.entities import Entity
+from signals_notebook.entities.container import Container
+from signals_notebook.entities.notebook import Notebook
+from signals_notebook.jinja_env import env
+
+log = logging.getLogger(__name__)
+
+
+class ParaExperimentState(str, Enum):
+    OPEN = 'open'
+    CLOSED = 'closed'
+
+
+class _Attributes(BaseModel):
+    name: str
+    description: Optional[str] = None
+
+
+class _Relationships(BaseModel):
+    template: Optional[Template] = None
+    ancestors: Optional[Ancestors] = None
+
+
+class _RequestBody(BaseModel):
+    type: EntityType
+    attributes: _Attributes
+    relationships: Optional[_Relationships] = None
+
+
+class _RequestPayload(EntityCreationRequestPayload[_RequestBody]):
+    pass
+
+
+class ParallelExperiment(Container):
+    type: Literal[EntityType.PARALLEL_EXPERIMENT] = Field(allow_mutation=False)
+    state: Optional[ParaExperimentState] = Field(allow_mutation=False, default=None)
+    _template_name: ClassVar = 'parallel_experiment.html'
+
+    class Config:
+        keep_untouched = (cached_property,)
+
+    @classmethod
+    def _get_entity_type(cls) -> EntityType:
+        return EntityType.PARALLEL_EXPERIMENT
+
+    @classmethod
+    def create(
+        cls,
+        *,
+        name: str,
+        description: Optional[str] = None,
+        template: Optional['ParallelExperiment'] = None,
+        notebook: Optional[Notebook] = None,
+        digest: str = None,
+        force: bool = True,
+    ) -> 'ParallelExperiment':
+        """Create new Parallel Experiment in Signals Notebook
+
+        Args:
+            name: name of parallel experiment
+            description: description of parallel experiment
+            template: parallel experiment template
+            notebook: notebook where create parallel experiment
+            digest: Indicate digest
+            force: Force to create without doing digest check
+
+        Returns:
+            ParallelExperiment
+        """
+
+        relationships = None
+        if template or notebook:
+            relationships = _Relationships(
+                ancestors=Ancestors(data=[notebook.short_description]) if notebook else None,
+                template=Template(data=template.short_description) if template else None,
+            )
+
+        request = _RequestPayload(
+            data=_RequestBody(
+                type=cls._get_entity_type(),
+                attributes=_Attributes(
+                    name=name,
+                    description=description,
+                ),
+                relationships=relationships,
+            )
+        )
+
+        log.debug('Creating Parallel Experiment for: %s', cls.__name__)
+        return super()._create(
+            digest=digest,
+            force=force,
+            request=request,
+        )
+
+    def get_children(self, order='') -> Generator[Entity, None, None]:
+        """Get children of SubExperiment.
+
+        Returns:
+            list of Entities
+        """
+        return super().get_children(order=order)
+
+    def get_html(self) -> str:
+        """Get in HTML format
+
+        Returns:
+            Rendered template as a string
+        """
+        data = {
+            'title': self.name,
+            'description': self.description,
+            'edited_at': self.edited_at,
+            'state': self.state,
+            'children': self.get_children(),
+        }
+
+        template = env.get_template(self._template_name)
+        log.info('Html template for %s:%s has been rendered.', self.__class__.__name__, self.eid)
+
+        return template.render(data=data)
diff --git a/src/signals_notebook/entities/parallel_experiment/row.py b/src/signals_notebook/entities/parallel_experiment/row.py
new file mode 100644
index 00000000..21f0b4b6
--- /dev/null
+++ b/src/signals_notebook/entities/parallel_experiment/row.py
@@ -0,0 +1,89 @@
+import logging
+from typing import Any, Dict, List, Literal, Optional, Union
+from uuid import UUID
+
+from pydantic import BaseModel, Field, PrivateAttr
+
+from signals_notebook.common_types import ObjectType
+from signals_notebook.entities.parallel_experiment.cell import SubExperimentSummaryCell
+
+log = logging.getLogger(__name__)
+
+
+class Content(BaseModel):
+    columns: Optional[dict]
+
+
+class RowRequestBody(BaseModel):
+    id: Optional[Union[UUID, str]]
+    type: Literal[ObjectType.SUB_EXPERIMENT] = Field(allow_mutation=False, default=ObjectType.SUB_EXPERIMENT)
+    attributes: Content
+
+    class Config:
+        validate_assignment = True
+
+
+class Row(BaseModel):
+    id: Optional[Union[UUID, str]]
+    cells: List[SubExperimentSummaryCell] = Field(alias='columns')
+    _cells_dict: Dict[Union[UUID, str], SubExperimentSummaryCell] = PrivateAttr(default={})
+
+    class Config:
+        validate_assignment = True
+
+    def __init__(self, **data):
+        super().__init__(**data)
+
+        for cell in self.cells:
+            self._cells_dict[cell.key] = cell
+
+    def get(self, value: str, default: Any = None) -> Union[SubExperimentSummaryCell, Any]:
+        """Get one of the cells
+
+        Args:
+            value: key to get one of the cells
+            default: default value if key doesn't exist
+
+        Returns:
+            Union[Cell, Any]
+        """
+        try:
+            return self[value]
+        except KeyError:
+            log.debug('KeyError were caught. Default value returned')
+            return default
+
+    @property
+    def is_changed(self) -> bool:
+        """Get is_changed field
+
+        Returns:
+            bool: True/False
+        """
+        return any([cell.is_changed for cell in self.cells])
+
+    def __getitem__(self, index: str) -> SubExperimentSummaryCell:
+        if isinstance(index, str):
+            if index in self._cells_dict:
+                return self._cells_dict[index]
+
+        log.exception('IndexError were caught. Invalid index')
+        raise IndexError('Invalid index')
+
+    def __iter__(self):
+        return self.cells.__iter__()
+
+    @property
+    def representation_for_update(self) -> List[Dict[str, str]]:
+        """Present Row object as a request body to update values
+
+        Returns:
+            list of changed cells
+        """
+        changed_cells = []
+        for cell in self.cells:
+            if cell.is_changed:
+                body = RowRequestBody(id=str(self.id), attributes=Content(columns=cell.representation_for_update))
+                changed_cells.append(body.dict())
+
+        return changed_cells
diff --git a/src/signals_notebook/entities/parallel_experiment/sub_experiment.py b/src/signals_notebook/entities/parallel_experiment/sub_experiment.py
new file mode 100644
index 00000000..31e69c79
--- /dev/null
+++ b/src/signals_notebook/entities/parallel_experiment/sub_experiment.py
@@ -0,0 +1,107 @@
+import logging
+from functools import cached_property
+from typing import Generator, Literal, Optional
+
+from pydantic import BaseModel, Field
+
+from signals_notebook.common_types import (
+    Ancestors,
+    EntityCreationRequestPayload,
+    EntityType,
+    Template,
+)
+from signals_notebook.entities import Entity
+from signals_notebook.entities.container import Container
+from signals_notebook.entities.parallel_experiment.parallel_experiment import ParallelExperiment
+from signals_notebook.jinja_env import env
+
+log = logging.getLogger(__name__)
+
+
+class _SubExperimentAttributes(BaseModel):
+    description: Optional[str] = None
+
+
+class _SubExperimentRelationships(BaseModel):
+    template: Optional[Template] = None
+    ancestors: Optional[Ancestors] = None
+
+
+class _SubExperimentRequestBody(BaseModel):
+    type: EntityType
+    attributes: Optional[_SubExperimentAttributes]
+    relationships: Optional[_SubExperimentRelationships] = None
+
+
+class _SubExperimentRequestPayload(EntityCreationRequestPayload[_SubExperimentRequestBody]):
+    pass
+
+
+class SubExperiment(Container):
+    type: Literal[EntityType.SUB_EXPERIMENT] = Field(allow_mutation=False)
+    _template_name = 'sub_experiment.html'
+
+    class Config:
+        keep_untouched = (cached_property,)
+
+    @classmethod
+    def _get_entity_type(cls) -> EntityType:
+        return EntityType.SUB_EXPERIMENT
+
+    def get_children(self, order='') -> Generator[Entity, None, None]:
+        """Get children of SubExperiment.
+
+        Returns:
+            list of Entities
+        """
+        return super().get_children(order=order)
+
+    @classmethod
+    def create(
+        cls,
+        *,
+        parallel_experiment: ParallelExperiment,
+        description: Optional[str] = None,
+        template: Optional['SubExperiment'] = None,
+        digest: str = None,
+        force: bool = True,
+    ) -> 'SubExperiment':
+
+        relationships = None
+        if template or parallel_experiment:
+            relationships = _SubExperimentRelationships(
+                ancestors=Ancestors(data=[parallel_experiment.short_description]) if parallel_experiment else None,
+                template=Template(data=template.short_description) if template else None,
+            )
+
+        request = _SubExperimentRequestPayload(
+            data=_SubExperimentRequestBody(
+                type=cls._get_entity_type(),
+                attributes=_SubExperimentAttributes(description=description),
+                relationships=relationships,
+            )
+        )
+
+        return super()._create(
+            digest=digest,
+            force=force,
+            request=request,
+        )
+
+    def get_html(self) -> str:
+        """Get in HTML format
+
+        Returns:
+            Rendered template as a string
+        """
+        data = {
+            'title': self.name,
+            'description': self.description,
+            'edited_at': self.edited_at,
+            'children': self.get_children(),
+        }
+
+        template = env.get_template(self._template_name)
+        log.info('Html template for %s:%s has been rendered.', self.__class__.__name__, self.eid)
+
+        return template.render(data=data)
diff --git a/src/signals_notebook/entities/parallel_experiment/sub_experiment_layout.py b/src/signals_notebook/entities/parallel_experiment/sub_experiment_layout.py
new file mode 100644
index 00000000..1171a530
--- /dev/null
+++ b/src/signals_notebook/entities/parallel_experiment/sub_experiment_layout.py
@@ -0,0 +1,21 @@
+import logging
+from typing import ClassVar, Literal
+
+from pydantic import Field
+
+from signals_notebook.common_types import EntityType, File
+from signals_notebook.entities.contentful_entity import ContentfulEntity
+
+log = logging.getLogger(__name__)
+
+
+class SubExperimentLayout(ContentfulEntity):
+    type: Literal[EntityType.SUB_EXPERIMENT_LAYOUT] = Field(allow_mutation=False)
+    _template_name: ClassVar = 'subexp_layout.html'
+
+    @classmethod
+    def _get_entity_type(cls) -> EntityType:
+        return EntityType.SUB_EXPERIMENT_LAYOUT
+
+    def get_content(self) -> File:
+        return super()._get_content()
diff --git a/src/signals_notebook/entities/parallel_experiment/sub_experiment_summary.py b/src/signals_notebook/entities/parallel_experiment/sub_experiment_summary.py
new file mode 100644
index 00000000..448d7135
--- /dev/null
+++ b/src/signals_notebook/entities/parallel_experiment/sub_experiment_summary.py
@@ -0,0 +1,153 @@
+import json
+import logging
+import time
+from typing import cast, Dict, List, Literal, Union
+from uuid import UUID
+
+from pydantic import Field, PrivateAttr
+
+from signals_notebook.api import SignalsNotebookApi
+from signals_notebook.common_types import EntityType, Response, ResponseData
+from signals_notebook.entities.contentful_entity import ContentfulEntity
+from signals_notebook.entities.parallel_experiment.row import Row
+from signals_notebook.jinja_env import env
+
+log = logging.getLogger(__name__)
+
+
+class SubExpSummaryResponse(Response[Row]):
+    pass
+
+
+class SubExperimentSummary(ContentfulEntity):
+    type: Literal[EntityType.SUB_EXPERIMENT_SUMMARY] = Field(allow_mutation=False)
+    _rows: List[Row] = PrivateAttr(default=[])
+    _rows_by_id: Dict[Union[str, UUID], Row] = PrivateAttr(default={})
+    _template_name = 'subexp_summary.html'
+
+    @classmethod
+    def _get_entity_type(cls) -> EntityType:
+        return EntityType.SUB_EXPERIMENT_SUMMARY
+
+    @classmethod
+    def _get_endpoint(cls) -> str:
+        return 'subexpSummary'
+
+    def __getitem__(self, index: Union[int, str, UUID]) -> Row:
+        if not self._rows:
+            self._reload_cells()
+
+        if isinstance(index, int):
+            return self._rows[index]
+
+        if isinstance(index, str):
+            try:
+                return self._rows_by_id[UUID(index)]
+            except ValueError:
+                return self._rows_by_id[index]
+
+        if isinstance(index, UUID):
+            return self._rows_by_id[index]
+
+        raise IndexError('Invalid index')
+
+    def __iter__(self):
+        if not self._rows:
+            self._reload_cells()
+        return self._rows.__iter__()
+
+    def _reload_cells(self) -> None:
+        api = SignalsNotebookApi.get_default_api()
+        log.debug('Reloading data in Table: %s...', self.eid)
+
+        response = api.call(
+            method='GET',
+            path=(self._get_endpoint(), self.eid, 'rows'),
+        )
+
+        result = SubExpSummaryResponse(**response.json())  # type: ignore
+        cells = [cast(ResponseData, item).body for item in result.data]
+
+        self._rows = []
+        self._rows_by_id = {}
+
+        for item in cells:
+            subexp_row = cast(Row, item)
+            assert subexp_row.id
+
+            self._rows.append(subexp_row)
+            self._rows_by_id[subexp_row.id] = subexp_row
+
+    def _is_update_ready(self, update_id: str) -> bool:
+        api = SignalsNotebookApi.get_default_api()
+        log.debug('Check job status for: %s| %s', self.__class__.__name__, self.eid)
+
+        response = api.call(
+            method='GET',
+            path=(self._get_endpoint(), self.eid, 'bulkUpdate', update_id),
+        )
+        return response.status_code == 200 and response.json()['data']['attributes']['jobStatus'] == 'SUCCESS'
+
+    def save(self, force: bool = True, timeout: int = 30, period: int = 5) -> None:
+        """Save all changes in the table
+
+        Args:
+            force: Force to update properties without digest check.
+            timeout: max available time(seconds) to update table
+            period: each n seconds(default value=5) api call
+
+        Returns:
+
+        """
+        api = SignalsNotebookApi.get_default_api()
+
+        request_body = []
+        for item in self._rows:
+            if item.is_changed:
+                request_body.extend(item.representation_for_update)
+
+        if not request_body:
+            return
+
+        update_response = api.call(
+            method='PATCH',
+            path=(self._get_endpoint(), self.eid, 'bulkUpdate'),
+            params={
+                'force': json.dumps(force),
+            },
+            json={
+                'data': request_body,
+            },
+        )
+        bulk_update_id = update_response.json()['data']['attributes']['bulkUpdateId']
+
+        response = None
+        initial_time = time.time()
+        while time.time() - initial_time < timeout:
+            if self._is_update_ready(str(bulk_update_id)):
+                response = True
+                break
+            else:
+                time.sleep(period)
+
+        if not response:
+            log.debug('Time is over to update fields')
+
+        self._reload_cells()
+
+    def get_html(self) -> str:
+        """Get in HTML format
+
+        Returns:
+            Rendered HTML in string format
+        """
+        if not self._rows:
+            self._reload_cells()
+
+        table_head = None
+        if self._rows:
+            table_head = self._rows[0]
+        template = env.get_template(self._template_name)
+        log.info('Html template for %s:%s has been rendered.', self.__class__.__name__, self.eid)
+
+        return template.render(name=self.name, table_head=table_head, rows=self._rows)
diff --git a/src/signals_notebook/materials/material.py b/src/signals_notebook/materials/material.py
index fb8cce16..88f8f108 100644
--- a/src/signals_notebook/materials/material.py
+++ b/src/signals_notebook/materials/material.py
@@ -175,3 +175,29 @@ def save(self, force: bool = True) -> None:
                 'data': request_body,
             },
         )
+
+    def delete(self, digest: str = None, force: bool = True) -> None:
+        """Delete Material by ID
+
+        Args:
+            eid: material ID
+            digest: Indicate digest of entity. It is used to avoid conflict while concurrent editing.
+                If the parameter 'force' is true, this parameter is optional.
+                If the parameter 'force' is false, this parameter is required.
+            force: Force to delete without doing digest check.
+
+        Returns:
+
+        """
+        api = SignalsNotebookApi.get_default_api()
+        log.debug('Deleting Material: %s', self.eid)
+
+        api.call(
+            method='DELETE',
+            path=('entities', self.eid),
+            params={
+                'digest': digest,
+                'force': json.dumps(force),
+            },
+        )
+        log.debug('Library: %s was deleted successfully', self.eid)
diff --git a/src/signals_notebook/mime.types b/src/signals_notebook/mime.types
index d02b6078..0c9bb450 100644
--- a/src/signals_notebook/mime.types
+++ b/src/signals_notebook/mime.types
@@ -6,8 +6,9 @@ biosequence/fasta                       fa faa fasta
 biosequence/genbank                     gb gbk gp
 chemical/x-cdx                          cdx
 chemical/x-cdxml                        cdxml
-chemical/x-daylight-smiles              smi
+chemical/x-daylight-smiles              smiles
 chemical/x-mdl-molfile                  mol
 chemical/x-mdl-rxnfile                  rxn
 chemical/x-mdl-sdfile                   sdf
 chemical/x-swissprot                    sw
+chemical/x-mdl-molfile-v3000            mol
diff --git a/src/signals_notebook/templates/parallel_experiment.html b/src/signals_notebook/templates/parallel_experiment.html
new file mode 100644
index 00000000..897609bd
--- /dev/null
+++ b/src/signals_notebook/templates/parallel_experiment.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link rel="icon" href="data:;base64,iVBORw0KGgo=">
+    <title>{% block title %}{{ data['title'] }}{% endblock %}</title>
+    <style>
+        h1 {
+            margin-top: 1.7rem;
+            margin-bottom: 0.3rem;
+            font-size: 1.6rem;
+        }
+
+        h2 {
+            margin-top: 1.2rem;
+            margin-bottom: 0.3rem;
+            font-size: 1.2rem;
+            color: #00A0E1;
+        }
+
+        table.props th, table.props td {
+            text-align: left;
+            padding: 3px;
+        }
+        .table-scroll {
+            overflow:auto;
+        }
+        .table-wrapper {
+            position:relative;
+        }
+        table, th, td {
+            border: 1px solid #cccccc;
+            border-collapse: collapse;
+            table-layout: fixed;
+        }
+        .table-wrapper th, td {
+            padding: 10px 20px;
+        }
+        .table-wrapper table td {
+            text-align: center;
+            vertical-align: middle;
+            padding: 5px;
+        }
+        .parent {
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            width: 100%;
+            aspect-ratio: auto;
+        }
+        .image-container {
+            width: 60%;
+            height: 60%;
+            overflow: hidden;
+        }
+
+        .image-container img {
+            width: 100%;
+            min-height: 100%;
+            object-fit: cover;
+        }
+
+    </style>
+</head>
+<body>
+<table class="props" style="margin: 10px 10px; padding: 6px 10px;">
+    <tr>
+        <th>Experiment name:</th>
+        <td>{{ data['title']|e }}</td>
+    </tr>
+    <tr>
+        <th>Description:</th>
+        <td>{{ data['description']|e }}</td>
+    </tr>
+    <tr>
+        <th>Last edited at:</th>
+        <td>{{ data['edited_at'].strftime('%H:%M:%S %Y-%m-%d') }}</td>
+    </tr>
+    <tr>
+        <th>State:</th>
+        <td>{{ data['state'].value |e }}</td>
+    </tr>
+</table>
+
+{% for item in data['children'] %}
+{{ item.get_html() | safe }}
+{% endfor %}
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/src/signals_notebook/templates/sub_experiment.html b/src/signals_notebook/templates/sub_experiment.html
new file mode 100644
index 00000000..dffda219
--- /dev/null
+++ b/src/signals_notebook/templates/sub_experiment.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link rel="icon" href="data:;base64,iVBORw0KGgo=">
+    <title>{% block title %}{{ data['title'] }}{% endblock %}</title>
+    <style>
+        h1 {
+            margin-top: 1.7rem;
+            margin-bottom: 0.3rem;
+            font-size: 1.6rem;
+        }
+
+        h2 {
+            margin-top: 1.2rem;
+            margin-bottom: 0.3rem;
+            font-size: 1.2rem;
+            color: #00A0E1;
+        }
+
+        table.props th, table.props td {
+            text-align: left;
+            padding: 3px;
+        }
+        .table-scroll {
+            overflow:auto;
+        }
+        .table-wrapper {
+            position:relative;
+        }
+        table, th, td {
+            border: 1px solid #cccccc;
+            border-collapse: collapse;
+            table-layout: fixed;
+        }
+        .table-wrapper th, td {
+            padding: 10px 20px;
+        }
+        .table-wrapper table td {
+            text-align: center;
+            vertical-align: middle;
+            padding: 5px;
+        }
+        .parent {
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            width: 100%;
+            aspect-ratio: auto;
+        }
+        .image-container {
+            width: 60%;
+            height: 60%;
+            overflow: hidden;
+        }
+
+        .image-container img {
+            width: 100%;
+            min-height: 100%;
+            object-fit: cover;
+        }
+
+    </style>
+</head>
+<body>
+<table class="props" style="margin: 10px 10px; padding: 6px 10px;">
+    <tr>
+        <th>Experiment name:</th>
+        <td>{{ data['title']|e }}</td>
+    </tr>
+    <tr>
+        <th>Description:</th>
+        <td>{{ data['description']|e }}</td>
+    </tr>
+    <tr>
+        <th>Last edited at:</th>
+        <td>{{ data['edited_at'].strftime('%H:%M:%S %Y-%m-%d') }}</td>
+    </tr>
+</table>
+
+{% for item in data['children'] %}
+{{ item.get_html() | safe }}
+{% endfor %}
+
+
+</body>
+</html>
\ No newline at end of file
diff --git a/src/signals_notebook/templates/subexp_layout.html b/src/signals_notebook/templates/subexp_layout.html
new file mode 100644
index 00000000..d24159bd
--- /dev/null
+++ b/src/signals_notebook/templates/subexp_layout.html
@@ -0,0 +1,10 @@
+<div style="margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;">
+    <h2>{{ data['name'] }}</h2>
+    {% if data['content'] %}
+    {% if data['name'].endswith('.csv') %}
+    <a href="{{ data['content'] }}" download="{{ data['name'] }}">DOWNLOAD .CSV FILE</a>
+    {% else %}
+    <a href="{{ data['content'] }}" download="{{ data['name'] }}.csv">DOWNLOAD .CSV FILE</a>
+    {% endif %}
+    {% endif %}
+</div>
\ No newline at end of file
diff --git a/src/signals_notebook/templates/subexp_summary.html b/src/signals_notebook/templates/subexp_summary.html
new file mode 100644
index 00000000..0b45d1e3
--- /dev/null
+++ b/src/signals_notebook/templates/subexp_summary.html
@@ -0,0 +1,29 @@
+{% if rows %}
+<div class="table-wrapper" style="margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;">
+    <div class="table-scroll">
+        <h2>{{ name }}</h2>
+        <table>
+            <thead>
+                <tr>
+                {% for cell in table_head %}
+                    <th>{{ cell.key | safe }}</th>
+                {% endfor %}
+                </tr>
+            </thead>
+            <tbody>
+                {% for row in rows %}
+                <tr>
+                    {% for cell in row %}
+                        {% if cell.value == None %}
+                            <td></td>
+                        {% else %}
+                            <td>{{ cell.value | safe }}</td>
+                        {% endif %}
+                    {% endfor %}
+                </tr>
+                {% endfor %}
+            </tbody>
+        </table>
+    </div>
+</div>
+{% endif %}
\ No newline at end of file


Test patch:
diff --git a/tests/entities/conftest.py b/tests/entities/conftest.py
index 20713ae4..a42bda43 100644
--- a/tests/entities/conftest.py
+++ b/tests/entities/conftest.py
@@ -17,6 +17,14 @@
     UploadedResourceFactory,
     WordFactory,
 )
+from tests.entities.parallel_experiment.factories import (
+    ParallelExperimentFactory,
+    SubExperimentFactory,
+    SubExperimentLayoutFactory,
+    SubExperimentSummaryCellFactory,
+    SubExperimentSummaryFactory,
+    SubExperimentSummaryRowFactory,
+)
 from tests.entities.plates.factories import PlateContainerFactory
 from tests.entities.samples.factories import (
     SampleCellFactory,
@@ -51,6 +59,12 @@
 register(UploadedResourceFactory)
 register(PlateContainerFactory)
 register(MaterialTableFactory)
+register(ParallelExperimentFactory)
+register(SubExperimentFactory)
+register(SubExperimentSummaryFactory)
+register(SubExperimentSummaryRowFactory)
+register(SubExperimentSummaryCellFactory)
+register(SubExperimentLayoutFactory)
 
 
 @pytest.fixture()
diff --git a/tests/entities/parallel_experiment/__init__.py b/tests/entities/parallel_experiment/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/entities/parallel_experiment/factories.py b/tests/entities/parallel_experiment/factories.py
new file mode 100644
index 00000000..3a784490
--- /dev/null
+++ b/tests/entities/parallel_experiment/factories.py
@@ -0,0 +1,46 @@
+from signals_notebook.common_types import EntityType
+from signals_notebook.entities.parallel_experiment.cell import SubExperimentSummaryCell
+from signals_notebook.entities.parallel_experiment.parallel_experiment import ParallelExperiment
+from signals_notebook.entities.parallel_experiment.row import Row
+from signals_notebook.entities.parallel_experiment.sub_experiment import SubExperiment
+from signals_notebook.entities.parallel_experiment.sub_experiment_layout import SubExperimentLayout
+from signals_notebook.entities.parallel_experiment.sub_experiment_summary import SubExperimentSummary
+from tests.entities.factories import EntityFactory
+
+
+class ParallelExperimentFactory(EntityFactory):
+    class Meta:
+        model = ParallelExperiment
+
+    type = EntityType.PARALLEL_EXPERIMENT
+
+
+class SubExperimentFactory(EntityFactory):
+    class Meta:
+        model = SubExperiment
+
+    type = EntityType.SUB_EXPERIMENT
+
+
+class SubExperimentSummaryFactory(EntityFactory):
+    class Meta:
+        model = SubExperimentSummary
+
+    type = EntityType.SUB_EXPERIMENT_SUMMARY
+
+
+class SubExperimentSummaryCellFactory(EntityFactory):
+    class Meta:
+        model = SubExperimentSummaryCell
+
+
+class SubExperimentSummaryRowFactory(EntityFactory):
+    class Meta:
+        model = Row
+
+
+class SubExperimentLayoutFactory(EntityFactory):
+    class Meta:
+        model = SubExperimentLayout
+
+    type = EntityType.SUB_EXPERIMENT_LAYOUT
diff --git a/tests/entities/parallel_experiment/reload_data_response.json b/tests/entities/parallel_experiment/reload_data_response.json
new file mode 100644
index 00000000..c2b0b700
--- /dev/null
+++ b/tests/entities/parallel_experiment/reload_data_response.json
@@ -0,0 +1,157 @@
+{
+  "links": {
+    "self": "https://quantori.signalsnotebook.perkinelmer.cloud/api/rest/v1.0/subexpSummary/paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715/rows"
+  },
+  "data": [
+    {
+      "type": "subexpSummaryRow",
+      "id": "1",
+      "attributes": {
+        "id": "1",
+        "columns": [
+          {
+            "key": "2",
+            "display": "Sub-experiment-1",
+            "value": "parasubexp:ea4b04cb-c262-4d4a-bd84-2321030c4af1",
+            "linkedEntityType": "parasubexp"
+          },
+          {
+            "key": "p1:productid",
+            "value": "P1"
+          },
+          {
+            "key": "p1:name",
+            "value": "NEW"
+          },
+          {
+            "key": "p1:mf",
+            "display": "2.02 g/mol",
+            "value": 2.02,
+            "units": "g/mol"
+          },
+          {
+            "key": "p1:formula",
+            "value": "H<sub>2</sub>"
+          },
+          {
+            "key": "p1:mw",
+            "display": "2.02 g/mol",
+            "value": 2.02,
+            "units": "g/mol"
+          },
+          {
+            "key": "p1:em",
+            "display": "2.01565",
+            "value": 2.01565
+          },
+          {
+            "key": "p2:productid",
+            "value": "P2"
+          },
+          {
+            "key": "p2:name",
+            "value": "sodium hydroxide"
+          },
+          {
+            "key": "p2:mf",
+            "display": "40.00 g/mol",
+            "value": 40,
+            "units": "g/mol"
+          },
+          {
+            "key": "p2:formula",
+            "value": "HNaO"
+          },
+          {
+            "key": "p2:mw",
+            "display": "40.00 g/mol",
+            "value": 40,
+            "units": "g/mol"
+          },
+          {
+            "key": "p2:em",
+            "display": "39.99251",
+            "value": 39.99251
+          }
+        ]
+      },
+      "relationships": {
+        "columnDefinition": {
+          "data": {
+            "type": "columnDefinition",
+            "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715"
+          }
+        }
+      }
+    },
+    {
+      "type": "subexpSummaryRow",
+      "id": "2",
+      "attributes": {
+        "id": "2",
+        "columns": [
+          {
+            "key": "2",
+            "display": "Sub-experiment-2",
+            "value": "parasubexp:50865f97-f858-4d33-bcf0-4f1455ad68a8",
+            "linkedEntityType": "parasubexp"
+          }
+        ]
+      },
+      "relationships": {
+        "columnDefinition": {
+          "data": {
+            "type": "columnDefinition",
+            "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715"
+          }
+        }
+      }
+    },
+    {
+      "type": "subexpSummaryRow",
+      "id": "3",
+      "attributes": {
+        "id": "3",
+        "columns": [
+          {
+            "key": "2",
+            "display": "Sub-experiment-3",
+            "value": "parasubexp:782d4af3-a17a-4bbc-b039-cfb7a6e6a215",
+            "linkedEntityType": "parasubexp"
+          }
+        ]
+      },
+      "relationships": {
+        "columnDefinition": {
+          "data": {
+            "type": "columnDefinition",
+            "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715"
+          }
+        }
+      }
+    },
+    {
+      "type": "subexpSummaryRow",
+      "id": "ee8f5e33-aaea-44f0-b429-aef793807585",
+      "attributes": {
+        "id": "ee8f5e33-aaea-44f0-b429-aef793807585",
+        "columns": [
+          {
+            "key": "2",
+            "display": "Sub-experiment-7",
+            "value": "parasubexp:d386a052-f0be-4633-acac-635375cea1f6",
+            "linkedEntityType": "parasubexp"
+          }
+        ]
+      },
+      "relationships": {
+        "columnDefinition": {
+          "data": {
+            "type": "columnDefinition",
+            "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715"
+          }
+        }
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/tests/entities/parallel_experiment/snapshots/__init__.py b/tests/entities/parallel_experiment/snapshots/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/entities/parallel_experiment/snapshots/snap_test_parallel_experiment.py b/tests/entities/parallel_experiment/snapshots/snap_test_parallel_experiment.py
new file mode 100644
index 00000000..22053acd
--- /dev/null
+++ b/tests/entities/parallel_experiment/snapshots/snap_test_parallel_experiment.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+# snapshottest: v1 - https://goo.gl/zC4yUc
+from __future__ import unicode_literals
+
+from snapshottest import Snapshot
+
+
+snapshots = Snapshot()
+
+snapshots['test_get_html 1'] = '''<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link rel="icon" href="data:;base64,iVBORw0KGgo=">
+    <title>name</title>
+    <style>
+        h1 {
+            margin-top: 1.7rem;
+            margin-bottom: 0.3rem;
+            font-size: 1.6rem;
+        }
+
+        h2 {
+            margin-top: 1.2rem;
+            margin-bottom: 0.3rem;
+            font-size: 1.2rem;
+            color: #00A0E1;
+        }
+
+        table.props th, table.props td {
+            text-align: left;
+            padding: 3px;
+        }
+        .table-scroll {
+            overflow:auto;
+        }
+        .table-wrapper {
+            position:relative;
+        }
+        table, th, td {
+            border: 1px solid #cccccc;
+            border-collapse: collapse;
+            table-layout: fixed;
+        }
+        .table-wrapper th, td {
+            padding: 10px 20px;
+        }
+        .table-wrapper table td {
+            text-align: center;
+            vertical-align: middle;
+            padding: 5px;
+        }
+        .parent {
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            width: 100%;
+            aspect-ratio: auto;
+        }
+        .image-container {
+            width: 60%;
+            height: 60%;
+            overflow: hidden;
+        }
+
+        .image-container img {
+            width: 100%;
+            min-height: 100%;
+            object-fit: cover;
+        }
+
+    </style>
+</head>
+<body>
+<table class="props" style="margin: 10px 10px; padding: 6px 10px;">
+    <tr>
+        <th>Experiment name:</th>
+        <td>name</td>
+    </tr>
+    <tr>
+        <th>Description:</th>
+        <td>text</td>
+    </tr>
+    <tr>
+        <th>Last edited at:</th>
+        <td>01:01:01 2018-06-01</td>
+    </tr>
+    <tr>
+        <th>State:</th>
+        <td></td>
+    </tr>
+</table>
+
+
+
+
+</body>
+</html>'''
diff --git a/tests/entities/parallel_experiment/snapshots/snap_test_sub_experiment.py b/tests/entities/parallel_experiment/snapshots/snap_test_sub_experiment.py
new file mode 100644
index 00000000..ddee35f4
--- /dev/null
+++ b/tests/entities/parallel_experiment/snapshots/snap_test_sub_experiment.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+# snapshottest: v1 - https://goo.gl/zC4yUc
+from __future__ import unicode_literals
+
+from snapshottest import Snapshot
+
+
+snapshots = Snapshot()
+
+snapshots['test_get_html 1'] = '''<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link rel="icon" href="data:;base64,iVBORw0KGgo=">
+    <title>name</title>
+    <style>
+        h1 {
+            margin-top: 1.7rem;
+            margin-bottom: 0.3rem;
+            font-size: 1.6rem;
+        }
+
+        h2 {
+            margin-top: 1.2rem;
+            margin-bottom: 0.3rem;
+            font-size: 1.2rem;
+            color: #00A0E1;
+        }
+
+        table.props th, table.props td {
+            text-align: left;
+            padding: 3px;
+        }
+        .table-scroll {
+            overflow:auto;
+        }
+        .table-wrapper {
+            position:relative;
+        }
+        table, th, td {
+            border: 1px solid #cccccc;
+            border-collapse: collapse;
+            table-layout: fixed;
+        }
+        .table-wrapper th, td {
+            padding: 10px 20px;
+        }
+        .table-wrapper table td {
+            text-align: center;
+            vertical-align: middle;
+            padding: 5px;
+        }
+        .parent {
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            width: 100%;
+            aspect-ratio: auto;
+        }
+        .image-container {
+            width: 60%;
+            height: 60%;
+            overflow: hidden;
+        }
+
+        .image-container img {
+            width: 100%;
+            min-height: 100%;
+            object-fit: cover;
+        }
+
+    </style>
+</head>
+<body>
+<table class="props" style="margin: 10px 10px; padding: 6px 10px;">
+    <tr>
+        <th>Experiment name:</th>
+        <td>name</td>
+    </tr>
+    <tr>
+        <th>Description:</th>
+        <td>text</td>
+    </tr>
+    <tr>
+        <th>Last edited at:</th>
+        <td>01:01:01 2018-06-01</td>
+    </tr>
+</table>
+
+
+
+
+</body>
+</html>'''
diff --git a/tests/entities/parallel_experiment/snapshots/snap_test_subexp_layout.py b/tests/entities/parallel_experiment/snapshots/snap_test_subexp_layout.py
new file mode 100644
index 00000000..98ba2b22
--- /dev/null
+++ b/tests/entities/parallel_experiment/snapshots/snap_test_subexp_layout.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+# snapshottest: v1 - https://goo.gl/zC4yUc
+from __future__ import unicode_literals
+
+from snapshottest import Snapshot
+
+
+snapshots = Snapshot()
+
+snapshots['test_get_html 1'] = '''<div style="margin: 10px 10px; padding: 6px 10px; border: solid 1px #f5f5f5;">
+    <h2>test</h2>
+    
+    
+    <a href="data:text/csv;base64,UGxhdGUsV2VsbCxSb3csQ29sdW1uLE5hbWUNCg==" download="test.csv">DOWNLOAD .CSV FILE</a>
+    
+    
+</div>'''
diff --git a/tests/entities/parallel_experiment/test_parallel_experiment.py b/tests/entities/parallel_experiment/test_parallel_experiment.py
new file mode 100644
index 00000000..8ae3e729
--- /dev/null
+++ b/tests/entities/parallel_experiment/test_parallel_experiment.py
@@ -0,0 +1,273 @@
+import datetime
+
+import arrow
+import pytest
+
+from signals_notebook.common_types import EntityType, ObjectType
+from signals_notebook.entities import ChemicalDrawing, SubExperimentSummary, Text
+from signals_notebook.entities.parallel_experiment.parallel_experiment import ParallelExperiment
+
+
+@pytest.fixture()
+def get_response_experiment(mocker):
+    def _f(response):
+        mock = mocker.Mock()
+        mock.json.return_value = response
+        return mock
+
+    return _f
+
+
+@pytest.mark.parametrize('digest, force', [('111', False), (None, True)])
+def test_create(api_mock, notebook_factory, eid_factory, digest, force):
+    notebook = notebook_factory()
+    eid = eid_factory(type=EntityType.EXPERIMENT)
+    response = {
+        'links': {'self': f'https://example.com/{eid}'},
+        'data': {
+            'type': ObjectType.ENTITY,
+            'id': eid,
+            'links': {'self': f'https://example.com/{eid}'},
+            'attributes': {
+                'eid': eid,
+                'name': 'My experiment',
+                'description': 'Some description',
+                'type': EntityType.PARALLEL_EXPERIMENT,
+                'createdAt': '2019-09-06T03:12:35.129Z',
+                'editedAt': '2019-09-06T15:22:47.309Z',
+                'digest': '123144',
+            },
+        },
+    }
+    api_mock.call.return_value.json.return_value = response
+
+    result = ParallelExperiment.create(name='My experiment', description='Some description', notebook=notebook)
+
+    request_body = {
+        'data': {
+            'type': EntityType.PARALLEL_EXPERIMENT,
+            'attributes': {
+                'name': response['data']['attributes']['name'],
+                'description': response['data']['attributes']['description'],
+            },
+            'relationships': {
+                'ancestors': {
+                    'data': [
+                        {
+                            'id': notebook.eid,
+                            'type': EntityType.NOTEBOOK,
+                        }
+                    ]
+                }
+            },
+        }
+    }
+
+    api_mock.call.assert_called_once_with(
+        method='POST',
+        path=('entities',),
+        params={
+            'digest': None,
+            'force': 'true',
+        },
+        json=request_body,
+    )
+
+    assert isinstance(result, ParallelExperiment)
+    assert result.eid == eid
+    assert result.digest == response['data']['attributes']['digest']
+    assert result.name == response['data']['attributes']['name']
+    assert result.description == response['data']['attributes']['description']
+    assert result.created_at == arrow.get(response['data']['attributes']['createdAt'])
+    assert result.edited_at == arrow.get(response['data']['attributes']['editedAt'])
+
+
+def test_get_children_one_page(api_mock, parallel_experiment_factory, eid_factory):
+    experiment = parallel_experiment_factory()
+
+    text_eid = eid_factory(type=EntityType.TEXT)
+    chem_draw_eid = eid_factory(type=EntityType.CHEMICAL_DRAWING)
+    subexp_sum_eid = eid_factory(type=EntityType.SUB_EXPERIMENT_SUMMARY)
+
+    response = {
+        'links': {'self': f'https://example.com/{experiment.eid}/children'},
+        'data': [
+            {
+                'type': ObjectType.ENTITY,
+                'id': text_eid,
+                'links': {'self': f'https://example.com/{text_eid}'},
+                'attributes': {
+                    'eid': text_eid,
+                    'name': 'My text',
+                    'description': '',
+                    'type': EntityType.TEXT,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+            {
+                'type': ObjectType.ENTITY,
+                'id': chem_draw_eid,
+                'links': {'self': f'https://example.com/{chem_draw_eid}'},
+                'attributes': {
+                    'eid': chem_draw_eid,
+                    'name': 'Some reactions',
+                    'description': '',
+                    'type': EntityType.CHEMICAL_DRAWING,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+            {
+                'type': ObjectType.ENTITY,
+                'id': subexp_sum_eid,
+                'links': {'self': f'https://example.com/{subexp_sum_eid}'},
+                'attributes': {
+                    'eid': subexp_sum_eid,
+                    'name': 'Some reactions',
+                    'description': '',
+                    'type': EntityType.SUB_EXPERIMENT_SUMMARY,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+        ],
+    }
+    api_mock.call.return_value.json.return_value = response
+
+    result = list(experiment.get_children())
+
+    api_mock.call.assert_called_once_with(
+        method='GET',
+        path=('entities', experiment.eid, 'children'),
+        params={},
+    )
+
+    assert isinstance(result[0], Text)
+    assert result[0].eid == text_eid
+
+    assert isinstance(result[1], ChemicalDrawing)
+    assert result[1].eid == chem_draw_eid
+
+    assert isinstance(result[2], SubExperimentSummary)
+    assert result[2].eid == subexp_sum_eid
+
+
+def test_get_children_several_pages(
+    mocker, api_mock, parallel_experiment_factory, eid_factory, get_response_experiment
+):
+    experiment = parallel_experiment_factory()
+    text_eid = eid_factory(type=EntityType.TEXT)
+    chem_draw_eid = eid_factory(type=EntityType.CHEMICAL_DRAWING)
+    subexp_sum_eid = eid_factory(type=EntityType.SUB_EXPERIMENT_SUMMARY)
+
+    response_1 = {
+        'links': {
+            'self': f'https://example.com/{experiment.eid}/children?page[offset]=0&page[limit]=20',
+            'next': f'https://example.com/{experiment.eid}/children?page[offset]=20&page[limit]=20',
+        },
+        'data': [
+            {
+                'type': ObjectType.ENTITY,
+                'id': chem_draw_eid,
+                'links': {'self': f'https://example.com/{chem_draw_eid}'},
+                'attributes': {
+                    'eid': chem_draw_eid,
+                    'name': 'Some reactions',
+                    'description': '',
+                    'type': EntityType.CHEMICAL_DRAWING,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+            {
+                'type': ObjectType.ENTITY,
+                'id': subexp_sum_eid,
+                'links': {'self': f'https://example.com/{subexp_sum_eid}'},
+                'attributes': {
+                    'eid': subexp_sum_eid,
+                    'name': 'Some reactions',
+                    'description': '',
+                    'type': EntityType.SUB_EXPERIMENT_SUMMARY,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+        ],
+    }
+    response_2 = {
+        'links': {
+            'prev': f'https://example.com/{experiment.eid}/children?page[offset]=0&page[limit]=20',
+            'self': f'https://example.com/{experiment.eid}/children?page[offset]=20&page[limit]=20',
+        },
+        'data': [
+            {
+                'type': ObjectType.ENTITY,
+                'id': text_eid,
+                'links': {'self': f'https://example.com/{text_eid}'},
+                'attributes': {
+                    'eid': text_eid,
+                    'name': 'My text',
+                    'description': '',
+                    'type': EntityType.TEXT,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+        ],
+    }
+
+    api_mock.call.side_effect = [get_response_experiment(response_1), get_response_experiment(response_2)]
+
+    result_generator = experiment.get_children()
+
+    api_mock.call.assert_not_called()
+
+    result = list(result_generator)
+
+    api_mock.call.assert_has_calls(
+        [
+            mocker.call(
+                method='GET',
+                path=('entities', experiment.eid, 'children'),
+                params={},
+            ),
+            mocker.call(
+                method='GET',
+                path=response_1['links']['next'],
+            ),
+        ]
+    )
+
+    assert isinstance(result[0], ChemicalDrawing)
+    assert result[0].eid == chem_draw_eid
+
+    assert isinstance(result[1], SubExperimentSummary)
+    assert result[1].eid == subexp_sum_eid
+
+    assert isinstance(result[2], Text)
+    assert result[2].eid == text_eid
+
+
+def test_get_html(api_mock, parallel_experiment_factory, snapshot):
+    experiment = parallel_experiment_factory(
+        name='name',
+        description='text',
+        edited_at=datetime.datetime(2018, 6, 1, 1, 1, 1),
+        children=[],
+    )
+    response = {
+        'links': {'self': f'https://example.com/{experiment.eid}/children'},
+        'data': [],
+    }
+    api_mock.call.return_value.json.return_value = response
+
+    experiment_html = experiment.get_html()
+
+    snapshot.assert_match(experiment_html)
diff --git a/tests/entities/parallel_experiment/test_sub_experiment.py b/tests/entities/parallel_experiment/test_sub_experiment.py
new file mode 100644
index 00000000..30488f63
--- /dev/null
+++ b/tests/entities/parallel_experiment/test_sub_experiment.py
@@ -0,0 +1,232 @@
+import datetime
+
+import arrow
+import pytest
+
+from signals_notebook.common_types import EntityType, ObjectType
+from signals_notebook.entities import ChemicalDrawing, Text
+from signals_notebook.entities.parallel_experiment.sub_experiment import SubExperiment
+
+
+@pytest.fixture()
+def get_response_experiment(mocker):
+    def _f(response):
+        mock = mocker.Mock()
+        mock.json.return_value = response
+        return mock
+
+    return _f
+
+
+@pytest.mark.parametrize('digest, force', [('111', False), (None, True)])
+def test_create(api_mock, parallel_experiment_factory, eid_factory, digest, force):
+    parallel_experiment = parallel_experiment_factory()
+    eid = eid_factory(type=EntityType.EXPERIMENT)
+    response = {
+        'links': {'self': f'https://example.com/{eid}'},
+        'data': {
+            'type': ObjectType.ENTITY,
+            'id': eid,
+            'links': {'self': f'https://example.com/{eid}'},
+            'attributes': {
+                'eid': eid,
+                'name': 'My experiment',
+                'description': 'Some description',
+                'type': EntityType.SUB_EXPERIMENT,
+                'createdAt': '2019-09-06T03:12:35.129Z',
+                'editedAt': '2019-09-06T15:22:47.309Z',
+                'digest': '123144',
+            },
+        },
+    }
+    api_mock.call.return_value.json.return_value = response
+
+    result = SubExperiment.create(description='Some description', parallel_experiment=parallel_experiment)
+
+    request_body = {
+        'data': {
+            'type': EntityType.SUB_EXPERIMENT,
+            'attributes': {'description': response['data']['attributes']['description']},
+            'relationships': {
+                'ancestors': {
+                    'data': [
+                        {
+                            'id': parallel_experiment.eid,
+                            'type': EntityType.PARALLEL_EXPERIMENT,
+                        }
+                    ]
+                }
+            },
+        }
+    }
+
+    api_mock.call.assert_called_once_with(
+        method='POST',
+        path=('entities',),
+        params={
+            'digest': None,
+            'force': 'true',
+        },
+        json=request_body,
+    )
+
+    assert isinstance(result, SubExperiment)
+    assert result.eid == eid
+    assert result.digest == response['data']['attributes']['digest']
+    assert result.name == response['data']['attributes']['name']
+    assert result.description == response['data']['attributes']['description']
+    assert result.created_at == arrow.get(response['data']['attributes']['createdAt'])
+    assert result.edited_at == arrow.get(response['data']['attributes']['editedAt'])
+
+
+def test_get_children_one_page(api_mock, sub_experiment_factory, eid_factory):
+    experiment = sub_experiment_factory()
+
+    text_eid = eid_factory(type=EntityType.TEXT)
+    chem_draw_eid = eid_factory(type=EntityType.CHEMICAL_DRAWING)
+
+    response = {
+        'links': {'self': f'https://example.com/{experiment.eid}/children'},
+        'data': [
+            {
+                'type': ObjectType.ENTITY,
+                'id': text_eid,
+                'links': {'self': f'https://example.com/{text_eid}'},
+                'attributes': {
+                    'eid': text_eid,
+                    'name': 'My text',
+                    'description': '',
+                    'type': EntityType.TEXT,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+            {
+                'type': ObjectType.ENTITY,
+                'id': chem_draw_eid,
+                'links': {'self': f'https://example.com/{chem_draw_eid}'},
+                'attributes': {
+                    'eid': chem_draw_eid,
+                    'name': 'Some reactions',
+                    'description': '',
+                    'type': EntityType.CHEMICAL_DRAWING,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+        ],
+    }
+    api_mock.call.return_value.json.return_value = response
+
+    result = list(experiment.get_children())
+
+    api_mock.call.assert_called_once_with(
+        method='GET',
+        path=('entities', experiment.eid, 'children'),
+        params={},
+    )
+
+    assert isinstance(result[0], Text)
+    assert result[0].eid == text_eid
+
+    assert isinstance(result[1], ChemicalDrawing)
+    assert result[1].eid == chem_draw_eid
+
+
+def test_get_children_several_pages(mocker, api_mock, sub_experiment_factory, eid_factory, get_response_experiment):
+    experiment = sub_experiment_factory()
+    text_eid = eid_factory(type=EntityType.TEXT)
+    chem_draw_eid = eid_factory(type=EntityType.CHEMICAL_DRAWING)
+
+    response_1 = {
+        'links': {
+            'self': f'https://example.com/{experiment.eid}/children?page[offset]=0&page[limit]=20',
+            'next': f'https://example.com/{experiment.eid}/children?page[offset]=20&page[limit]=20',
+        },
+        'data': [
+            {
+                'type': ObjectType.ENTITY,
+                'id': chem_draw_eid,
+                'links': {'self': f'https://example.com/{chem_draw_eid}'},
+                'attributes': {
+                    'eid': chem_draw_eid,
+                    'name': 'Some reactions',
+                    'description': '',
+                    'type': EntityType.CHEMICAL_DRAWING,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+        ],
+    }
+    response_2 = {
+        'links': {
+            'prev': f'https://example.com/{experiment.eid}/children?page[offset]=0&page[limit]=20',
+            'self': f'https://example.com/{experiment.eid}/children?page[offset]=20&page[limit]=20',
+        },
+        'data': [
+            {
+                'type': ObjectType.ENTITY,
+                'id': text_eid,
+                'links': {'self': f'https://example.com/{text_eid}'},
+                'attributes': {
+                    'eid': text_eid,
+                    'name': 'My text',
+                    'description': '',
+                    'type': EntityType.TEXT,
+                    'createdAt': '2019-09-06T03:12:35.129Z',
+                    'editedAt': '2019-09-06T15:22:47.309Z',
+                    'digest': '123144',
+                },
+            },
+        ],
+    }
+
+    api_mock.call.side_effect = [get_response_experiment(response_1), get_response_experiment(response_2)]
+
+    result_generator = experiment.get_children()
+
+    api_mock.call.assert_not_called()
+
+    result = list(result_generator)
+
+    api_mock.call.assert_has_calls(
+        [
+            mocker.call(
+                method='GET',
+                path=('entities', experiment.eid, 'children'),
+                params={},
+            ),
+            mocker.call(
+                method='GET',
+                path=response_1['links']['next'],
+            ),
+        ]
+    )
+
+    assert isinstance(result[0], ChemicalDrawing)
+    assert result[0].eid == chem_draw_eid
+
+    assert isinstance(result[1], Text)
+    assert result[1].eid == text_eid
+
+
+def test_get_html(api_mock, sub_experiment_factory, snapshot):
+    experiment = sub_experiment_factory(
+        name='name',
+        description='text',
+        edited_at=datetime.datetime(2018, 6, 1, 1, 1, 1),
+        children=[],
+    )
+    response = {
+        'links': {'self': f'https://example.com/{experiment.eid}/children'},
+        'data': [],
+    }
+    api_mock.call.return_value.json.return_value = response
+
+    experiment_html = experiment.get_html()
+
+    snapshot.assert_match(experiment_html)
diff --git a/tests/entities/parallel_experiment/test_sub_experiment_summary.py b/tests/entities/parallel_experiment/test_sub_experiment_summary.py
new file mode 100644
index 00000000..9f779886
--- /dev/null
+++ b/tests/entities/parallel_experiment/test_sub_experiment_summary.py
@@ -0,0 +1,180 @@
+import json
+import os
+from uuid import UUID
+
+import pytest
+
+from signals_notebook.common_types import EntityType
+from signals_notebook.entities.parallel_experiment.row import Row
+
+
+@pytest.fixture()
+def get_response(mocker):
+    def _f(response):
+        mock = mocker.Mock()
+        mock.status_code = 200
+        mock.json.return_value = response
+        return mock
+
+    return _f
+
+
+@pytest.fixture()
+def reload_data_response():
+    path = os.path.join(os.path.dirname(__file__), 'reload_data_response.json')
+    with open(path, 'r') as f:
+        response = json.load(f)
+
+    return response
+
+
+@pytest.fixture()
+def updated_reload_data_response():
+    path = os.path.join(os.path.dirname(__file__), 'updated_reload_data_response.json')
+    with open(path, 'r') as f:
+        response = json.load(f)
+
+    return response
+
+
+def test_reload_properties(api_mock, reload_data_response, sub_experiment_summary_factory):
+    sub_experiment_summary = sub_experiment_summary_factory()
+
+    assert sub_experiment_summary._rows == []
+
+    api_mock.call.return_value.json.return_value = reload_data_response
+
+    for item in sub_experiment_summary:
+        assert isinstance(item, Row)
+
+    assert sub_experiment_summary._rows != []
+
+    api_mock.call.assert_called_once_with(
+        method='GET',
+        path=(sub_experiment_summary._get_endpoint(), sub_experiment_summary.eid, 'rows'),
+    )
+
+
+def test_save(
+    api_mock,
+    reload_data_response,
+    updated_reload_data_response,
+    sub_experiment_summary_factory,
+    mocker,
+    eid_factory,
+    get_response,
+):
+    subexp_sum_eid = eid_factory(type=EntityType.SUB_EXPERIMENT_SUMMARY)
+
+    update_response = {
+        'links': {'self': 'https://example.com/subexpSummary/paragrid:3f46e915-cf66-4957-abb0-1566861c7760/bulkUpdate'},
+        'data': {
+            'type': 'bulkUpdateParagrid',
+            'id': subexp_sum_eid,
+            'attributes': {
+                'subexpSummaryId': subexp_sum_eid,
+                'bulkUpdateId': 20,
+                'description': 'We have created a job to execute it. Follow the status link to check the status.',
+            },
+            'relationships': {
+                'status': {
+                    'links': {'self': f'https://example.com/subexpSummary/{subexp_sum_eid}/bulkUpdate/20'},
+                    'data': {'type': 'subexpSummaryBulkUpdateReport', 'id': '20'},
+                }
+            },
+        },
+    }
+    update_status_response = {
+        'links': {'self': f'https://example.com/subexpSummary/{subexp_sum_eid}/20'},
+        'data': {
+            'type': 'subexpSummaryBulkUpdateReport',
+            'id': '20',
+            'links': {'self': f'https://example.com/subexpSummary/{subexp_sum_eid}/bulkUpdate/20'},
+            'attributes': {
+                'bulkUpdateId': 20,
+                'subexpSummaryId': subexp_sum_eid,
+                'jobType': 'ASYNC_TASK',
+                'state': 'SCHEDULED',
+                'jobStatus': 'SUCCESS',
+                'digest': 'B7wcvn7GJZFeXh9APOvdhnutfnP9fWufdIlyhDX/GmWBC/dztZMTsXXLthSF2sB8BNQ80q63Tgj0s6HeOBSX1A==',
+            },
+        },
+    }
+    sub_experiment_summary = sub_experiment_summary_factory()
+
+    assert sub_experiment_summary._rows == []
+
+    api_mock.call.return_value.json.return_value = reload_data_response
+
+    sub_experiment_summary[0]['p1:name'].set_value('Updated Text 1')
+
+    api_mock.call.side_effect = [
+        get_response(update_response),
+        get_response(update_status_response),
+        get_response(updated_reload_data_response),
+    ]
+
+    request_body = []
+    for item in sub_experiment_summary._rows:
+        if item.is_changed:
+            request_body.extend(item.representation_for_update)
+
+    sub_experiment_summary.save()
+
+    update_id = update_response['data']['attributes']['bulkUpdateId']
+    api_mock.call.assert_has_calls(
+        [
+            mocker.call(
+                method='GET',
+                path=(sub_experiment_summary._get_endpoint(), sub_experiment_summary.eid, 'rows'),
+            ),
+            mocker.call(
+                method='PATCH',
+                path=(sub_experiment_summary._get_endpoint(), sub_experiment_summary.eid, 'bulkUpdate'),
+                params={
+                    'force': 'true',
+                },
+                json={
+                    'data': request_body,
+                },
+            ),
+            mocker.call(
+                method='GET',
+                path=(sub_experiment_summary._get_endpoint(), sub_experiment_summary.eid, 'bulkUpdate', str(update_id)),
+            ),
+            mocker.call(
+                method='GET',
+                path=(sub_experiment_summary._get_endpoint(), sub_experiment_summary.eid, 'rows'),
+            ),
+        ],
+        any_order=True,
+    )
+
+
+@pytest.mark.parametrize(
+    'index', [0, 'ee8f5e33-aaea-44f0-b429-aef793807585', UUID('ee8f5e33-aaea-44f0-b429-aef793807585')]
+)
+def test_getitem(api_mock, reload_data_response, sub_experiment_summary_factory, index):
+    api_mock.call.return_value.json.return_value = reload_data_response
+    sub_experiment_summary = sub_experiment_summary_factory()
+    assert isinstance(sub_experiment_summary[index], Row)
+
+
+def test_getitem_with_invalid_index(api_mock, reload_data_response, sub_experiment_summary_factory):
+    api_mock.call.return_value.json.return_value = reload_data_response
+
+    sub_experiment_summary = sub_experiment_summary_factory()
+
+    with pytest.raises(IndexError) as e:
+        sub_experiment_summary[1.5]
+
+    assert str(e.value) == 'Invalid index'
+
+
+def test_iter(api_mock, reload_data_response, sub_experiment_summary_factory):
+    sub_experiment_summary = sub_experiment_summary_factory()
+
+    api_mock.call.return_value.json.return_value = reload_data_response
+
+    for row in sub_experiment_summary:
+        assert isinstance(row, Row)
diff --git a/tests/entities/parallel_experiment/test_subexp_layout.py b/tests/entities/parallel_experiment/test_subexp_layout.py
new file mode 100644
index 00000000..dfc69baa
--- /dev/null
+++ b/tests/entities/parallel_experiment/test_subexp_layout.py
@@ -0,0 +1,46 @@
+from signals_notebook.common_types import File
+
+
+def test_get_content(sub_experiment_layout_factory, api_mock):
+    sub_experiment_layout = sub_experiment_layout_factory()
+    file_name = 'Test.csv'
+    content = b'Plate,Well,Row,Column,Name\r\n'
+    content_type = 'text/csv'
+
+    api_mock.call.return_value.headers = {
+        'content-type': content_type,
+        'content-disposition': f'attachment; filename={file_name}',
+    }
+    api_mock.call.return_value.content = content
+
+    result = sub_experiment_layout.get_content()
+
+    api_mock.call.assert_called_once_with(
+        method='GET',
+        path=('entities', sub_experiment_layout.eid, 'export'),
+        params={
+            'format': None,
+        },
+    )
+
+    assert isinstance(result, File)
+    assert result.name == file_name
+    assert result.content == content
+    assert result.content_type == content_type
+
+
+def test_get_html(sub_experiment_layout_factory, snapshot, api_mock):
+    sub_experiment_layout = sub_experiment_layout_factory(name='test')
+    file_name = 'Test.csv'
+    content = b'Plate,Well,Row,Column,Name\r\n'
+    content_type = 'text/csv'
+
+    api_mock.call.return_value.headers = {
+        'content-type': content_type,
+        'content-disposition': f'attachment; filename={file_name}',
+    }
+    api_mock.call.return_value.content = content
+
+    material_table_html = sub_experiment_layout.get_html()
+
+    snapshot.assert_match(material_table_html)
diff --git a/tests/entities/parallel_experiment/updated_reload_data_response.json b/tests/entities/parallel_experiment/updated_reload_data_response.json
new file mode 100644
index 00000000..a263ee19
--- /dev/null
+++ b/tests/entities/parallel_experiment/updated_reload_data_response.json
@@ -0,0 +1,398 @@
+{
+  "links": {
+    "self": "https://quantori.signalsnotebook.perkinelmer.cloud/api/rest/v1.0/subexpSummary/paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715/rows"
+  },
+  "data": [
+    {
+      "type": "subexpSummaryRow",
+      "id": "1",
+      "attributes": {
+        "id": "1",
+        "columns": [
+          {
+            "key": "2",
+            "display": "Sub-experiment-1",
+            "value": "parasubexp:ea4b04cb-c262-4d4a-bd84-2321030c4af1",
+            "linkedEntityType": "parasubexp"
+          },
+          {
+            "key": "p1:productid",
+            "value": "P1"
+          },
+          {
+            "key": "p1:name",
+            "value": "Updated Text 1"
+          },
+          {
+            "key": "p1:mf",
+            "display": "2.02 g/mol",
+            "value": 2.02,
+            "units": "g/mol"
+          },
+          {
+            "key": "p1:formula",
+            "value": "H<sub>2</sub>"
+          },
+          {
+            "key": "p1:mw",
+            "display": "2.02 g/mol",
+            "value": 2.02,
+            "units": "g/mol"
+          },
+          {
+            "key": "p1:em",
+            "display": "2.01565",
+            "value": 2.01565
+          },
+          {
+            "key": "p2:productid",
+            "value": "P2"
+          },
+          {
+            "key": "p2:name",
+            "value": "sodium hydroxide"
+          },
+          {
+            "key": "p2:mf",
+            "display": "40.00 g/mol",
+            "value": 40,
+            "units": "g/mol"
+          },
+          {
+            "key": "p2:formula",
+            "value": "HNaO"
+          },
+          {
+            "key": "p2:mw",
+            "display": "40.00 g/mol",
+            "value": 40,
+            "units": "g/mol"
+          },
+          {
+            "key": "p2:em",
+            "display": "39.99251",
+            "value": 39.99251
+          }
+        ]
+      },
+      "relationships": {
+        "columnDefinition": {
+          "data": {
+            "type": "columnDefinition",
+            "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715"
+          }
+        }
+      }
+    },
+    {
+      "type": "subexpSummaryRow",
+      "id": "2",
+      "attributes": {
+        "id": "2",
+        "columns": [
+          {
+            "key": "2",
+            "display": "Sub-experiment-2",
+            "value": "parasubexp:50865f97-f858-4d33-bcf0-4f1455ad68a8",
+            "linkedEntityType": "parasubexp"
+          }
+        ]
+      },
+      "relationships": {
+        "columnDefinition": {
+          "data": {
+            "type": "columnDefinition",
+            "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715"
+          }
+        }
+      }
+    },
+    {
+      "type": "subexpSummaryRow",
+      "id": "3",
+      "attributes": {
+        "id": "3",
+        "columns": [
+          {
+            "key": "2",
+            "display": "Sub-experiment-3",
+            "value": "parasubexp:782d4af3-a17a-4bbc-b039-cfb7a6e6a215",
+            "linkedEntityType": "parasubexp"
+          }
+        ]
+      },
+      "relationships": {
+        "columnDefinition": {
+          "data": {
+            "type": "columnDefinition",
+            "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715"
+          }
+        }
+      }
+    },
+    {
+      "type": "subexpSummaryRow",
+      "id": "4",
+      "attributes": {
+        "id": "4",
+        "columns": [
+          {
+            "key": "2",
+            "display": "Sub-experiment-7",
+            "value": "parasubexp:d386a052-f0be-4633-acac-635375cea1f6",
+            "linkedEntityType": "parasubexp"
+          }
+        ]
+      },
+      "relationships": {
+        "columnDefinition": {
+          "data": {
+            "type": "columnDefinition",
+            "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715"
+          }
+        }
+      }
+    }
+  ],
+  "included": [
+    {
+      "type": "columnDefinition",
+      "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715",
+      "attributes": {
+        "id": "paragrid:634f5577-e435-4a10-b4a9-e20cb87d5715",
+        "cols": [
+          {
+            "key": "2",
+            "title": "Name",
+            "type": "link",
+            "isUserDefined": false,
+            "readOnly": true
+          },
+          {
+            "key": "4",
+            "title": "Preview",
+            "type": "preview",
+            "isUserDefined": false,
+            "readOnly": true
+          },
+          {
+            "key": "p1:preview",
+            "title": "P1:Preview",
+            "type": "preview",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "preview"
+          },
+          {
+            "key": "p1:productid",
+            "title": "P1:Product ID",
+            "type": "text",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "productid"
+          },
+          {
+            "key": "p1:name",
+            "title": "P1:Product",
+            "type": "text",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "name"
+          },
+          {
+            "key": "p1:mf",
+            "title": "P1:FM",
+            "type": "unit",
+            "measure": "molecular mass",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "mf"
+          },
+          {
+            "key": "p1:formula",
+            "title": "P1:MF",
+            "type": "html",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "formula"
+          },
+          {
+            "key": "p1:mw",
+            "title": "P1:MW",
+            "type": "unit",
+            "measure": "molecular mass",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "mw"
+          },
+          {
+            "key": "p1:em",
+            "title": "P1:EM",
+            "type": "number",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "em"
+          },
+          {
+            "key": "p1:theomass",
+            "title": "P1:Theo Mass",
+            "type": "unit",
+            "measure": "mass",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "theomass"
+          },
+          {
+            "key": "p1:actualmass",
+            "title": "P1:Actual Mass",
+            "type": "unit",
+            "measure": "mass",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "actualmass"
+          },
+          {
+            "key": "p1:yield",
+            "title": "P1:Yield",
+            "type": "unit",
+            "measure": "fraction",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "yield"
+          },
+          {
+            "key": "p1:theomol",
+            "title": "P1:Theo Mol",
+            "type": "unit",
+            "measure": "amount of substance",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "theomol"
+          },
+          {
+            "key": "p1:actualmol",
+            "title": "P1:Actual Mol",
+            "type": "unit",
+            "measure": "amount of substance",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "actualmol"
+          },
+          {
+            "key": "p2:preview",
+            "title": "P2:Preview",
+            "type": "preview",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "preview"
+          },
+          {
+            "key": "p2:productid",
+            "title": "P2:Product ID",
+            "type": "text",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "productid"
+          },
+          {
+            "key": "p2:name",
+            "title": "P2:Product",
+            "type": "text",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "name"
+          },
+          {
+            "key": "p2:mf",
+            "title": "P2:FM",
+            "type": "unit",
+            "measure": "molecular mass",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "mf"
+          },
+          {
+            "key": "p2:formula",
+            "title": "P2:MF",
+            "type": "html",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "formula"
+          },
+          {
+            "key": "p2:mw",
+            "title": "P2:MW",
+            "type": "unit",
+            "measure": "molecular mass",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "mw"
+          },
+          {
+            "key": "p2:em",
+            "title": "P2:EM",
+            "type": "number",
+            "isUserDefined": true,
+            "readOnly": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "em"
+          },
+          {
+            "key": "p2:theomass",
+            "title": "P2:Theo Mass",
+            "type": "unit",
+            "measure": "mass",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "theomass"
+          },
+          {
+            "key": "p2:actualmass",
+            "title": "P2:Actual Mass",
+            "type": "unit",
+            "measure": "mass",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "actualmass"
+          },
+          {
+            "key": "p2:yield",
+            "title": "P2:Yield",
+            "type": "unit",
+            "measure": "fraction",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "yield"
+          },
+          {
+            "key": "p2:theomol",
+            "title": "P2:Theo Mol",
+            "type": "unit",
+            "measure": "amount of substance",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "theomol"
+          },
+          {
+            "key": "p2:actualmol",
+            "title": "P2:Actual Mol",
+            "type": "unit",
+            "measure": "amount of substance",
+            "isUserDefined": true,
+            "section": "PRODUCTS",
+            "templateColumnKey": "actualmol"
+          }
+        ]
+      }
+    }
+  ]
+}
\ No newline at end of file
diff --git a/tests/entities/test_parallel_experiment.py b/tests/entities/test_parallel_experiment.py
new file mode 100644
index 00000000..00410207
--- /dev/null
+++ b/tests/entities/test_parallel_experiment.py
@@ -0,0 +1,6 @@
+def test_create():
+    pass
+
+
+def test_get_html():
+    pass
diff --git a/tests/materials/test_asset.py b/tests/materials/test_asset.py
index c2c8fa42..251f0830 100644
--- a/tests/materials/test_asset.py
+++ b/tests/materials/test_asset.py
@@ -325,3 +325,19 @@ def test_save_changes(asset_factory, api_mock, force):
             ],
         },
     )
+
+
+@pytest.mark.parametrize('digest, force', [('1234234', False), (None, True)])
+def test_delete(api_mock, digest, force, asset_factory):
+    asset = asset_factory(digest='1234')
+
+    asset.delete(digest, force)
+
+    api_mock.call.assert_called_once_with(
+        method='DELETE',
+        path=('entities', asset.eid),
+        params={
+            'digest': digest,
+            'force': 'true' if force else 'false',
+        },
+    )
diff --git a/tests/materials/test_batch.py b/tests/materials/test_batch.py
index c227379c..70cc1102 100644
--- a/tests/materials/test_batch.py
+++ b/tests/materials/test_batch.py
@@ -153,3 +153,19 @@ def test_save_changes(batch_factory, api_mock, force):
             ],
         },
     )
+
+
+@pytest.mark.parametrize('digest, force', [('1234234', False), (None, True)])
+def test_delete(api_mock, digest, force, batch_factory):
+    batch = batch_factory(digest='1234')
+
+    batch.delete(digest, force)
+
+    api_mock.call.assert_called_once_with(
+        method='DELETE',
+        path=('entities', batch.eid),
+        params={
+            'digest': digest,
+            'force': 'true' if force else 'false',
+        },
+    )