diff --git a/.gitmodules b/.gitmodules
index 933225395b9fb75ad88699373f2726896e270351..2844502cadde658fb947887114120927ffd4badc 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -82,3 +82,9 @@
 [submodule "tutorials/analytics-sgd-propylene-oxidation-hte"]
 	path = tutorials/analytics-sgd-propylene-oxidation-hte
 	url = https://gitlab.mpcdf.mpg.de/nomad-lab/analytics-sgd-propylene-oxidation-hte.git
+[submodule "tutorials/analytics-dos-similarity-search"]
+	path = tutorials/analytics-dos-similarity-search
+	url = https://gitlab.mpcdf.mpg.de/nomad-lab/analytics-dos-similarity-search.git
+[submodule "3rdparty/cmlkit"]
+	path = 3rdparty/cmlkit
+	url = https://gitlab.mpcdf.mpg.de/nomad-lab/cmlkit.git
diff --git a/3rdparty/cmlkit b/3rdparty/cmlkit
new file mode 160000
index 0000000000000000000000000000000000000000..ccdde6e67dc441c3d84e2f95c607e5018000f4cb
--- /dev/null
+++ b/3rdparty/cmlkit
@@ -0,0 +1 @@
+Subproject commit ccdde6e67dc441c3d84e2f95c607e5018000f4cb
diff --git a/Dockerfile b/Dockerfile
index 68da72e50ad1dd8d77086e91556015ada09cda75..2fa6d904b34d42d1237cd0fec1ee3e3ded8c411d 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -184,6 +184,16 @@ COPY 3rdparty/atomic-features-package ./atomic-features-package
 USER root
 RUN pip install ./atomic-features-package
 
+# ================================================================================
+#  CMLKIT
+# ================================================================================
+
+WORKDIR /opt/cmlkit
+
+COPY 3rdparty/cmlkit ./cmlkit
+USER root
+RUN pip install ./cmlkit
+
 # ================================================================================
 # Install all of the package dependencies of the tutorials
 # ================================================================================
@@ -204,6 +214,7 @@ RUN pip install ./analytics-convolutional-nn
 RUN pip install ./analytics-decision-tree
 RUN pip install ./analytics-descriptor-role
 RUN pip install ./analytics-domain-of-applicability
+RUN pip install ./analytics-dos-similarity-search
 RUN pip install ./analytics-error-estimates
 RUN pip install ./analytics-exploratory-analysis
 RUN pip install ./analytics-gap-si-surface
@@ -264,30 +275,31 @@ WORKDIR $HOME
 RUN  cp -r tutorials test_tutorials
 
 WORKDIR $HOME/test_tutorials
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "ARISE.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "atomic_features.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "clustering_tutorial.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "cmlkit.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "ARISE.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "atomic_features.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "clustering_tutorial.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "cmlkit.ipynb" 
 # RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "CO2_SGD.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "compressed_sensing.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "convolutional_nn.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "decision_tree.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "descriptor_role.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "compressed_sensing.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "convolutional_nn.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "decision_tree.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "descriptor_role.ipynb" 
 # RUN jupyter nbconvert --ExecutePreprocessor.timeout=20000 --to notebook --execute "domain_of_applicability.ipynb" 
+# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "dos_similarity_search.ipynb" 
 # RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "error_estimates.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "exploratory_analysis.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "exploratory_analysis.ipynb" 
 # RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "gap_si_surface.ipynb"
 # RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "grain_boundaries.ipynb" 
 # RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "kaggle_competition.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "krr4mat.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "nn_regression.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "perovskites_tolerance_factor.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "krr4mat.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "nn_regression.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "perovskites_tolerance_factor.ipynb" 
 RUN jupyter nbconvert --ExecutePreprocessor.timeout=5000 --to notebook --execute "query_nomad_archive.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "sgd_alloys_oxygen_reduction_evolution.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "sgd_propylene_oxidation_hte.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "sgd_alloys_oxygen_reduction_evolution.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "sgd_propylene_oxidation_hte.ipynb" 
 # RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "soap_atomic_charges.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "tcmi.ipynb" 
-# RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "tetradymite_PRM2020.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "tcmi.ipynb" 
+RUN jupyter nbconvert --ExecutePreprocessor.timeout=1000 --to notebook --execute "tetradymite_PRM2020.ipynb" 
 
 WORKDIR $HOME
 RUN rm -r test_tutorials    
diff --git a/tutorials/analytics-cmlkit b/tutorials/analytics-cmlkit
index 7cd1e606cf31c0972299138cc6df6239ae008c7f..d3da19e7b75469509efd2d589f354ec2689d353a 160000
--- a/tutorials/analytics-cmlkit
+++ b/tutorials/analytics-cmlkit
@@ -1 +1 @@
-Subproject commit 7cd1e606cf31c0972299138cc6df6239ae008c7f
+Subproject commit d3da19e7b75469509efd2d589f354ec2689d353a
diff --git a/tutorials/analytics-dos-similarity-search b/tutorials/analytics-dos-similarity-search
new file mode 160000
index 0000000000000000000000000000000000000000..bf282d257decc68d53b7a8e56545982fee7470ef
--- /dev/null
+++ b/tutorials/analytics-dos-similarity-search
@@ -0,0 +1 @@
+Subproject commit bf282d257decc68d53b7a8e56545982fee7470ef
diff --git a/tutorials/analytics-krr4mat b/tutorials/analytics-krr4mat
index 22ce1054d4e226235300c66a58c9eecd265a9e50..fb9857873fdc015467ce9b28f4e8c8dad4cb41d9 160000
--- a/tutorials/analytics-krr4mat
+++ b/tutorials/analytics-krr4mat
@@ -1 +1 @@
-Subproject commit 22ce1054d4e226235300c66a58c9eecd265a9e50
+Subproject commit fb9857873fdc015467ce9b28f4e8c8dad4cb41d9