diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1f3ca80e578787a123e4322f8111f00b7b332a01..fbb7e408f49da9f3f8979404ce25ab0aa6ee7ba2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -24,82 +24,116 @@ lint:
   script:
       - make lint
 
-# ⚠️ To make the following jobs work, please have a look at the `climate-change-profile` plugin at the link below:
-# https://gitlab.dkrz.de/ch1187/plugins4freva/climate-change-profile/-/blob/main/.gitlab-ci.yml?ref_type=heads#L53
 
-.config_freva: &config_freva
-  image: ghcr.io/freva-clint/freva-dev:latest
+
+prod-test:
+  id_tokens:
+    SITE_ID_TOKEN:
+      aud: https://gitlab.dkrz.de
   tags:
-    - docker-any-image
-  before_script:
-    - make dep-install
-    # ⚠️ Due to complex bashrc setup in `freva-dev` image, we need to reinit conda manually
-    - source /opt/evaluation_system/etc/profile.d/conda.sh
-    - export PATH="$CI_PROJECT_DIR/plugin_env/bin:$PATH"
-    - conda activate ./plugin_env
-    - pip install .[test]
-    - pip install pytest
-    - conda install -y pandoc graphviz wget zip git git-lfs
-    - git lfs install
-    - conda config --add channels conda-forge
-    - conda config --set channel_priority strict
-    - conda install -y freva
-    # ensure freva is up
-    - freva --version
-    # configure the freva plugin
-    - export EVALUATION_SYSTEM_CONFIG_FILE=$CI_PROJECT_DIR/plugin_env/freva/evaluation_system.conf
-    - export EVALUATION_SYSTEM_CONFIG_DIR=$CI_PROJECT_DIR/plugin_env/freva/
-    - wget https://swift.dkrz.de/v1/dkrz_6681fd49-d4e5-44f6-bf39-307a187ed22e/data-crawler/data-crawler-linux64 -O data-crawler
-    - chmod +x data-crawler
-
-func-test:
-  <<: *config_freva
-  stage: test
+    - levante
+  variables:
+    ACCOUNT: "ch1187"
+    SCHEDULER_PARAMETERS: "--account=$ACCOUNT --partition=shared --mem=16G"
   script:
-  # ⚠️ To make the following jobs work, please have a look at the `climate-change-profile` plugin at the link below:
-  # https://gitlab.dkrz.de/ch1187/plugins4freva/climate-change-profile/-/blob/main/.gitlab-ci.yml?ref_type=heads#L53
-    - mkdir -p /home/freva/work
-    - cd /home/freva
-    # TODO: extract the data tarballs
-    - cd $CI_PROJECT_DIR
-    - make prepare-freva # This command prepares the configuration files for the plugin
-    # TODO: Crawl the data into the solr
-    # TODO: Plug the plugin into the evaluation system
-    # it ensures that your plugin is listed in the evaluation system
+    - module load clint regiklim-ces
+    - make mamba-dep-install
+    - export EVALUATION_SYSTEM_PLUGINS=$CI_PROJECT_DIR,wrapper
     - freva-plugin --list
-    # TODO: add you test freva-plugin command here
-    - mkdir -p public/func_test
-    # TODO: Compy whole output directory to public/func_test
-    # - FREVA_JOB_ID=$(ls plugin_env/freva_output/freva/freva/output/climatechangeprofile/ | head -n 1)
-    # - cd plugin_env/freva_output/freva/freva/output/climatechangeprofile/$FREVA_JOB_ID
-    # - cp -r * $CI_PROJECT_DIR/public/func_test
+    - freva-plugin heat2urbanimpact region=Hamburg experiment=ssp245-gwl2k models=ec-earth-consortium-ec-earth3-veg-clmcom-btu-icon-2-6-5-rc-nukleus-x2yn2-v1 output_units=true output_file_type=nc mask_type=none mask_method=centres plot_map=true pre_process_function=pre_proc caption="Heat2UrbanImpact production test from CI piepline https://gitlab.dkrz.de/ch1187/plugins4freva/heat2urbanimpact/-/jobs/$CI_JOB_ID" -vvv
+    - mkdir -p build/prod_test
+    - REGIKLIM_JOB_ID=$(ls -t /work/$ACCOUNT/regiklim-work/$GITLAB_USER_LOGIN/regiklim-ces/output/heat2urbanimpact/ | head -n 1)
+    - cd /work/$ACCOUNT/regiklim-work/$GITLAB_USER_LOGIN/regiklim-ces/output/heat2urbanimpact/$REGIKLIM_JOB_ID
+    - echo "<!DOCTYPE html><html><head>" >> index.html
+    - echo "<meta http-equiv=\"refresh\" content=\"0; url=https://www-regiklim.dkrz.de/history/$REGIKLIM_JOB_ID/results/\">" >> index.html
+    - echo "<title>Redirecting...</title>" >> index.html
+    - echo "</head><body>" >> index.html
+    - echo "<p>If you are not redirected, <a href=\"https://www-regiklim.dkrz.de/history/$REGIKLIM_JOB_ID/results/\">click here</a>.</p>" >> index.html
+    - echo "</body></html>" >> index.html
+    - ls -la
+    - cp -r * $CI_PROJECT_DIR/build/prod_test
   artifacts:
     when: always
     paths:
-      - public/func_test
+      - build/prod_test
 
-unit-test:
-  stage: test
-  tags:
-    - conda
-  before_script:
-    - apt-get update -y && apt-get install -y pandoc graphviz make
-    - make dep-install
-    - conda init
-    - source ~/.bashrc
-    - conda activate ./plugin_env
-    - pip install .[testsite]
-  script:
-    - make test
-    - make coverage
-  after_script:
-    - mkdir -p public/htmlcov
-    - cp -r htmlcov/* public/htmlcov/
-  coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
-  artifacts:
-    when: always
-    paths:
-      - public/htmlcov
+
+# ⚠️ To make the following jobs work, please have a look at the `climate-change-profile` plugin at the link below:
+# https://gitlab.dkrz.de/ch1187/plugins4freva/climate-change-profile/-/blob/main/.gitlab-ci.yml?ref_type=heads#L53
+
+# .config_freva: &config_freva
+#   image: ghcr.io/freva-clint/freva-dev:latest
+#   tags:
+#     - docker-any-image
+#   before_script:
+#     - make dep-install
+#     # ⚠️ Due to complex bashrc setup in `freva-dev` image, we need to reinit conda manually
+#     - source /opt/evaluation_system/etc/profile.d/conda.sh
+#     - export PATH="$CI_PROJECT_DIR/plugin_env/bin:$PATH"
+#     - conda activate ./plugin_env
+#     - pip install .[test]
+#     - pip install pytest
+#     - conda install -y pandoc graphviz wget zip git git-lfs
+#     - git lfs install
+#     - conda config --add channels conda-forge
+#     - conda config --set channel_priority strict
+#     - conda install -y freva
+#     # ensure freva is up
+#     - freva --version
+#     # configure the freva plugin
+#     - export EVALUATION_SYSTEM_CONFIG_FILE=$CI_PROJECT_DIR/plugin_env/freva/evaluation_system.conf
+#     - export EVALUATION_SYSTEM_CONFIG_DIR=$CI_PROJECT_DIR/plugin_env/freva/
+#     - wget https://swift.dkrz.de/v1/dkrz_6681fd49-d4e5-44f6-bf39-307a187ed22e/data-crawler/data-crawler-linux64 -O data-crawler
+#     - chmod +x data-crawler
+
+# func-test:
+#   <<: *config_freva
+#   stage: test
+#   script:
+#   # ⚠️ To make the following jobs work, please have a look at the `climate-change-profile` plugin at the link below:
+#   # https://gitlab.dkrz.de/ch1187/plugins4freva/climate-change-profile/-/blob/main/.gitlab-ci.yml?ref_type=heads#L53
+#     - mkdir -p /home/freva/work
+#     - cd /home/freva
+#     # TODO: extract the data tarballs
+#     - cd $CI_PROJECT_DIR
+#     - make prepare-freva # This command prepares the configuration files for the plugin
+#     # TODO: Crawl the data into the solr
+#     # TODO: Plug the plugin into the evaluation system
+#     # it ensures that your plugin is listed in the evaluation system
+#     - freva-plugin --list
+#     # TODO: add you test freva-plugin command here
+#     - mkdir -p public/func_test
+#     # TODO: Compy whole output directory to public/func_test
+#     # - FREVA_JOB_ID=$(ls plugin_env/freva_output/freva/freva/output/climatechangeprofile/ | head -n 1)
+#     # - cd plugin_env/freva_output/freva/freva/output/climatechangeprofile/$FREVA_JOB_ID
+#     # - cp -r * $CI_PROJECT_DIR/public/func_test
+#   artifacts:
+#     when: always
+#     paths:
+#       - public/func_test
+
+# unit-test:
+#   stage: test
+#   tags:
+#     - conda
+#   before_script:
+#     - apt-get update -y && apt-get install -y pandoc graphviz make
+#     - make dep-install
+#     - conda init
+#     - source ~/.bashrc
+#     - conda activate ./plugin_env
+#     - pip install .[testsite]
+#   script:
+#     - make test
+#     - make coverage
+#   after_script:
+#     - mkdir -p public/htmlcov
+#     - cp -r htmlcov/* public/htmlcov/
+#   coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
+#   artifacts:
+#     when: always
+#     paths:
+#       - public/htmlcov
 
 
 test-docs:
diff --git a/Makefile b/Makefile
index dce75d561b64b8209d556ea4a938353b60e499c2..73c60fe43c1d7938abf113b817104ca3a43dbb67 100644
--- a/Makefile
+++ b/Makefile
@@ -126,10 +126,13 @@ venv-install: clean  ## install the package in a virtual environment
 prepare-freva: clean ## prepare the configuration files for FREVA
 	pytest src/tests/test_config_updates.py::test_prepare_freva -s
 
-dep-install: clean ## install a conda environment so-called plugin_env
+conda-dep-install: clean ## install a conda environment so-called plugin_env
 	conda init bash
 	conda env create --prefix ./plugin_env -f heat2urbanimpact-env.yml
 	echo $(PATH)
+mamba-dep-install: clean ## install a conda environment so-called plugin_env
+	mamba env create --prefix ./plugin_env -f heat2urbanimpact-env.yml
+	echo $(PATH)
 # Important: Makefile cannot activate the conda environment. We have to do it manually.
 dep-remove: clean ## remove the conda plugin_env environment
 	conda env remove --name ./plugin_env
@@ -139,5 +142,5 @@ dep-update: clean ## update the conda plugin_env environment
 cartopy:
 	# Use this if cartopy was installed and additional maps are downloaded.
 	$(eval DATA_DIR =  $(shell plugin_env/bin/python -c 'from cartopy import config;print(config["repo_data_dir"])'))
-	./plugin_env/bin/cartopy_feature_download.py gshhs physical cultural \
+	./plugin_env/bin/cartopy_feature_download gshhs physical cultural \
 		cultural-extra -o $(DATA_DIR) --no-warn --ignore-repo-data
diff --git a/README.md b/README.md
index f9be5bb4756f81071c1ad5dd096aaa1327357e93..f6165fd890dc90c30454babe125048776ce20058 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,7 @@ SPDX-License-Identifier: BSD-3-Clause
 [![CI](https://gitlab.dkrz.de/ch1187/plugins4freva/heat2urbanimpact/badges/main/pipeline.svg)](https://gitlab.dkrz.de/ch1187/plugins4freva/heat2urbanimpact/-/pipelines?page=1&scope=all&ref=main)
 [![Code coverage](https://gitlab.dkrz.de/ch1187/plugins4freva/heat2urbanimpact/badges/main/coverage.svg)](https://gitlab.dkrz.de/ch1187/plugins4freva/heat2urbanimpact/-/graphs/main/charts)
 [![Latest Release](https://gitlab.dkrz.de/ch1187/plugins4freva/heat2urbanimpact/-/badges/release.svg)](https://gitlab.dkrz.de/ch1187/plugins4freva/heat2urbanimpact)
+[![Production](https://img.shields.io/badge/Production-Test-ff33fc.svg)](https://ch1187.gitlab-pages.dkrz.de/plugins4freva/heat2urbanimpact/prod_test/)
 [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
 [![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/)
 [![PEP8](https://img.shields.io/badge/code%20style-pep8-orange.svg)](https://www.python.org/dev/peps/pep-0008/)
@@ -97,7 +98,7 @@ To integrate Heat2UrbanImpact into your Freva instance, follow these steps:
 
     ```bash
     cd heat2urbanimpact
-    make dep-install
+    make mamba-dep-install
     conda activate plugin_env
     ```
 
@@ -115,7 +116,7 @@ To integrate Heat2UrbanImpact into your Freva instance, follow these steps:
     Use the following export command to make the plugin available in your Freva instance:
 
     ```bash
-    export EVALUATION_SYSTEM_PLUGINS=<project-dir>/heat2urbanimpact,heat2urbanimpact-wrapper-api
+    export EVALUATION_SYSTEM_PLUGINS=<project-dir>/heat2urbanimpact,wrapper
     ```
     For example, in RegiKlim, `<project-dir>` is set to `/work/ch1187/regiklim-work/<username>/plugins/`. You
     can adjust this path based on the specific project you want to plug it into.
diff --git a/assets/GER.shp.license b/assets/GER.shp.license
index 2754c205ea96b3a764915b86888eacf68ecadf60..c049ae533d6c9dceeb4d8240684e59d7a787a834 100644
--- a/assets/GER.shp.license
+++ b/assets/GER.shp.license
@@ -1,3 +1,3 @@
-SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
-
-SPDX-License-Identifier: CC0-1.0
+# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
+#
+# SPDX-License-Identifier: CC0-1.0
diff --git a/assets/Heat2UrbanImpact.ipynb b/assets/Heat2UrbanImpact.ipynb
deleted file mode 100644
index 003d493823f4e9b6d5564a0be6a797da43c38482..0000000000000000000000000000000000000000
--- a/assets/Heat2UrbanImpact.ipynb
+++ /dev/null
@@ -1,166 +0,0 @@
-{
- "cells": [
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## Heat2Urban Impact Plugin:\n",
-    "This notebook is part of the `freva` plugin that analyzes heat impacts on urban areas. This notebook has been automatically executed. You can continue your (more in depth) analysis by executing the cells below."
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "from heat2urbanimpact import Heat2UrbanImpactEnsemble"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {
-    "tags": [
-     "injected-parameters"
-    ]
-   },
-   "outputs": [],
-   "source": [
-    "config_file = ''\n",
-    "path = ''"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# Create the ensemble for heat impact analysis\n",
-    "heat_ensemble = Heat2UrbanImpactEnsemble.from_dict(config_file)"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "The Heat2UrbanImpactEnsemble instance contains information about the loaded data and heat impact analysis. Below we can see the basic configuration and ensemble parameters:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "heat_ensemble"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "We can view the statistical summary of heat events for different variables and atmospheric levels:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "heat_ensemble.statistical_summary"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Generate plots showing heat event characteristics and impacts:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "%matplotlib inline\n",
-    "heat_ensemble.plot_analysis()"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "The plots can be accessed through the following properties:\n",
-    "- `.event_maps`: Maps showing spatial distribution of heat events\n",
-    "- `.time_series`: Time series of temperature variables\n",
-    "- `.impact_plots`: Visualizations of urban impact metrics\n",
-    "\n",
-    "The underlying data is stored in xarray.Dataset format and is readily available for further analysis:"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# Access the processed data\n",
-    "heat_ensemble.data"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# View impact analysis results\n",
-    "heat_ensemble.impact_results"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "You can perform additional analysis by accessing the following components:\n",
-    "- Raw temperature data at different levels\n",
-    "- Event detection results\n",
-    "- Impact calculations\n",
-    "- Regional statistics"
-   ]
-  }
- ],
- "metadata": {
-  "celltoolbar": "Tags",
-  "kernelspec": {
-   "display_name": "freva-h2ui",
-   "language": "python",
-   "name": "freva-h2ui"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.10.5"
-  },
-  "widgets": {
-   "application/vnd.jupyter.widget-state+json": {
-    "state": {},
-    "version_major": 2,
-    "version_minor": 0
-   }
-  }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/assets/PostPorcessing.ipynb b/assets/PostPorcessing.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..ce5820f02addb4cd58ff6d60cd314056508c0cd4
--- /dev/null
+++ b/assets/PostPorcessing.ipynb
@@ -0,0 +1,803 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "e3563516",
+   "metadata": {},
+   "source": [
+    "# Post-Processing the Plugin  output data\n",
+    "\n",
+    "This notebook servers as an entry point for data post-processing of the heat2UrbanImpact freva plugin using the Climpact plugin. In a first processing step the data has been processed and stored in the cloud by the freva plugin. It is very likely that this data hasn't been processed sufficiently, e.g unit conversion of the variables is necessary. This step, which is highly individual, can be done in this notebook with just a few commands.\n",
+    "\n",
+    "The data which has been produced by the freva plugin is stored in the cloud. For working with this data the plugin also comes with a library which creates so called data-containers allowing for easy access of the data in the cloud. \n",
+    "\n",
+    "The first step in accessing the data is importing this library:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "2483b572",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "%matplotlib inline\n",
+    "from climpact import DataContainer"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "526d74d6",
+   "metadata": {},
+   "source": [
+    "The plugin has uploaded the output data to a particular cloud storage location which is given below:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "0ef59f63",
+   "metadata": {
+    "tags": [
+     "injected-parameters"
+    ]
+   },
+   "outputs": [],
+   "source": [
+    "data_file = \"https://swift.dkrz.de/v1/dkrz_3d3c7abc-1681-4012-b656-3cc1058c52a9/heat2urbanimpact/k202187/ProcessedModelData-cordex-eur-11-pr_tas-20220128_135323T.zip\""
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a4249e7b",
+   "metadata": {},
+   "source": [
+    "To create the above mentioned data-container the `from_zipfile` method can be applied. \n",
+    "\n",
+    "_**Note**_: The data does not have to be stored on a cloud location, you can also open files on your local disk."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "a8f20d5c",
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Downloading: 100%|██████████████████████████████████████████████████| 59.3k/59.3k [00:00<00:00, 1.38MB/s]\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>model name</th>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>index</th>\n",
+       "      <th></th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>mohc-hadgem2-es-gerics-remo2015-v1_r1i1p1</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                      model name\n",
+       "index                                           \n",
+       "0      mohc-hadgem2-es-gerics-remo2015-v1_r1i1p1"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "dc = DataContainer.from_zipfile(data_file)\n",
+    "dc"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f3216403",
+   "metadata": {},
+   "source": [
+    "## Basic usage tutorial\n",
+    "\n",
+    "### Data access:\n",
+    "The convenient html representation of the data-containers shows the model member(s) belonging to this data container. The individual model datasets can be accessed by index or model names according to table above, using the `select` method.\n",
+    "For example:\n",
+    "\n",
+    "```\n",
+    "dset = dc.select(by_name=\"foo_bar\")\n",
+    "\n",
+    "```\n",
+    "\n",
+    "or \n",
+    "\n",
+    "```\n",
+    "dset = dc.select(by_index=0)\n",
+    "```\n",
+    "\n",
+    "it is also possible to loop through the datasets:\n",
+    "\n",
+    "```\n",
+    "for dset in dc:\n",
+    "   print(dset)\n",
+    "```\n",
+    "\n",
+    "This datasets are [`xarray` dataset](https://xarray.pydata.org/en/stable/index.html). Xarray is a very powerful library that lets you handle multi-dimensional labeled data arrays. It allows for easy manipulation, visualisation of the underlying data. For example:\n",
+    "\n",
+    "```\n",
+    "dset = dc.select(by_index=0)\n",
+    "dset[\"pr\"].plot()\n",
+    "```\n",
+    "to plot precipitation.\n",
+    "\n",
+    "After manipulating the data you can use the `.replace` method replace the manipulated data in the data-container. The example below creates seasonal averages and replaces them with the data in the container.\n",
+    "\n",
+    "```\n",
+    "for index, dset in dc:\n",
+    "   seas_mean = dset.groupby(time=\"season\").mean()\n",
+    "   dc.replace(dset, index=index)\n",
+    "```\n",
+    "\n",
+    "### Variable unit conversion:\n",
+    "One important aspect of data processing is having the right variable units. The data-container offers a `.convert` method to conveniently convert between different variables. By default the data units are stored according to cf-conventions - like `kg/m^2/s` for precipitation. Most of the time it is more useful to have precipitation stored in a unit like `mm/h` or `mm/day`. This can be easily achieved:\n",
+    "\n",
+    "```\n",
+    "dc.convert(\"pr\", \"mm/day\")\n",
+    "```\n",
+    "\n",
+    "### Saving the data\n",
+    "Once all final processing is done the data can be saved to the cloud again - where it is ready for download and sharing with others:\n",
+    "\n",
+    "```\n",
+    "dc.save()\n",
+    "```\n",
+    "__*Note*__: Supported file-name extension are: `nc` for netcdf4 files,  `h5` for hdf5 files and `csv` for text based csv files.\n",
+    "\n",
+    "This concludes the tutorial in the cell below you find an example that actually plots your data. You can continue doing your in depth analysis now."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "f7e5142f",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "['pr', 'tas']"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Inspect the variable names in the data container\n",
+    "dc.variables"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "edc68f2c",
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
+       "<defs>\n",
+       "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
+       "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
+       "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
+       "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
+       "</symbol>\n",
+       "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
+       "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
+       "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
+       "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
+       "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
+       "</symbol>\n",
+       "</defs>\n",
+       "</svg>\n",
+       "<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
+       " *\n",
+       " */\n",
+       "\n",
+       ":root {\n",
+       "  --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
+       "  --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
+       "  --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
+       "  --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
+       "  --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
+       "  --xr-background-color: var(--jp-layout-color0, white);\n",
+       "  --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
+       "  --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
+       "}\n",
+       "\n",
+       "html[theme=dark],\n",
+       "body.vscode-dark {\n",
+       "  --xr-font-color0: rgba(255, 255, 255, 1);\n",
+       "  --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
+       "  --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
+       "  --xr-border-color: #1F1F1F;\n",
+       "  --xr-disabled-color: #515151;\n",
+       "  --xr-background-color: #111111;\n",
+       "  --xr-background-color-row-even: #111111;\n",
+       "  --xr-background-color-row-odd: #313131;\n",
+       "}\n",
+       "\n",
+       ".xr-wrap {\n",
+       "  display: block !important;\n",
+       "  min-width: 300px;\n",
+       "  max-width: 700px;\n",
+       "}\n",
+       "\n",
+       ".xr-text-repr-fallback {\n",
+       "  /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
+       "  display: none;\n",
+       "}\n",
+       "\n",
+       ".xr-header {\n",
+       "  padding-top: 6px;\n",
+       "  padding-bottom: 6px;\n",
+       "  margin-bottom: 4px;\n",
+       "  border-bottom: solid 1px var(--xr-border-color);\n",
+       "}\n",
+       "\n",
+       ".xr-header > div,\n",
+       ".xr-header > ul {\n",
+       "  display: inline;\n",
+       "  margin-top: 0;\n",
+       "  margin-bottom: 0;\n",
+       "}\n",
+       "\n",
+       ".xr-obj-type,\n",
+       ".xr-array-name {\n",
+       "  margin-left: 2px;\n",
+       "  margin-right: 10px;\n",
+       "}\n",
+       "\n",
+       ".xr-obj-type {\n",
+       "  color: var(--xr-font-color2);\n",
+       "}\n",
+       "\n",
+       ".xr-sections {\n",
+       "  padding-left: 0 !important;\n",
+       "  display: grid;\n",
+       "  grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
+       "}\n",
+       "\n",
+       ".xr-section-item {\n",
+       "  display: contents;\n",
+       "}\n",
+       "\n",
+       ".xr-section-item input {\n",
+       "  display: none;\n",
+       "}\n",
+       "\n",
+       ".xr-section-item input + label {\n",
+       "  color: var(--xr-disabled-color);\n",
+       "}\n",
+       "\n",
+       ".xr-section-item input:enabled + label {\n",
+       "  cursor: pointer;\n",
+       "  color: var(--xr-font-color2);\n",
+       "}\n",
+       "\n",
+       ".xr-section-item input:enabled + label:hover {\n",
+       "  color: var(--xr-font-color0);\n",
+       "}\n",
+       "\n",
+       ".xr-section-summary {\n",
+       "  grid-column: 1;\n",
+       "  color: var(--xr-font-color2);\n",
+       "  font-weight: 500;\n",
+       "}\n",
+       "\n",
+       ".xr-section-summary > span {\n",
+       "  display: inline-block;\n",
+       "  padding-left: 0.5em;\n",
+       "}\n",
+       "\n",
+       ".xr-section-summary-in:disabled + label {\n",
+       "  color: var(--xr-font-color2);\n",
+       "}\n",
+       "\n",
+       ".xr-section-summary-in + label:before {\n",
+       "  display: inline-block;\n",
+       "  content: 'â–º';\n",
+       "  font-size: 11px;\n",
+       "  width: 15px;\n",
+       "  text-align: center;\n",
+       "}\n",
+       "\n",
+       ".xr-section-summary-in:disabled + label:before {\n",
+       "  color: var(--xr-disabled-color);\n",
+       "}\n",
+       "\n",
+       ".xr-section-summary-in:checked + label:before {\n",
+       "  content: 'â–¼';\n",
+       "}\n",
+       "\n",
+       ".xr-section-summary-in:checked + label > span {\n",
+       "  display: none;\n",
+       "}\n",
+       "\n",
+       ".xr-section-summary,\n",
+       ".xr-section-inline-details {\n",
+       "  padding-top: 4px;\n",
+       "  padding-bottom: 4px;\n",
+       "}\n",
+       "\n",
+       ".xr-section-inline-details {\n",
+       "  grid-column: 2 / -1;\n",
+       "}\n",
+       "\n",
+       ".xr-section-details {\n",
+       "  display: none;\n",
+       "  grid-column: 1 / -1;\n",
+       "  margin-bottom: 5px;\n",
+       "}\n",
+       "\n",
+       ".xr-section-summary-in:checked ~ .xr-section-details {\n",
+       "  display: contents;\n",
+       "}\n",
+       "\n",
+       ".xr-array-wrap {\n",
+       "  grid-column: 1 / -1;\n",
+       "  display: grid;\n",
+       "  grid-template-columns: 20px auto;\n",
+       "}\n",
+       "\n",
+       ".xr-array-wrap > label {\n",
+       "  grid-column: 1;\n",
+       "  vertical-align: top;\n",
+       "}\n",
+       "\n",
+       ".xr-preview {\n",
+       "  color: var(--xr-font-color3);\n",
+       "}\n",
+       "\n",
+       ".xr-array-preview,\n",
+       ".xr-array-data {\n",
+       "  padding: 0 5px !important;\n",
+       "  grid-column: 2;\n",
+       "}\n",
+       "\n",
+       ".xr-array-data,\n",
+       ".xr-array-in:checked ~ .xr-array-preview {\n",
+       "  display: none;\n",
+       "}\n",
+       "\n",
+       ".xr-array-in:checked ~ .xr-array-data,\n",
+       ".xr-array-preview {\n",
+       "  display: inline-block;\n",
+       "}\n",
+       "\n",
+       ".xr-dim-list {\n",
+       "  display: inline-block !important;\n",
+       "  list-style: none;\n",
+       "  padding: 0 !important;\n",
+       "  margin: 0;\n",
+       "}\n",
+       "\n",
+       ".xr-dim-list li {\n",
+       "  display: inline-block;\n",
+       "  padding: 0;\n",
+       "  margin: 0;\n",
+       "}\n",
+       "\n",
+       ".xr-dim-list:before {\n",
+       "  content: '(';\n",
+       "}\n",
+       "\n",
+       ".xr-dim-list:after {\n",
+       "  content: ')';\n",
+       "}\n",
+       "\n",
+       ".xr-dim-list li:not(:last-child):after {\n",
+       "  content: ',';\n",
+       "  padding-right: 5px;\n",
+       "}\n",
+       "\n",
+       ".xr-has-index {\n",
+       "  font-weight: bold;\n",
+       "}\n",
+       "\n",
+       ".xr-var-list,\n",
+       ".xr-var-item {\n",
+       "  display: contents;\n",
+       "}\n",
+       "\n",
+       ".xr-var-item > div,\n",
+       ".xr-var-item label,\n",
+       ".xr-var-item > .xr-var-name span {\n",
+       "  background-color: var(--xr-background-color-row-even);\n",
+       "  margin-bottom: 0;\n",
+       "}\n",
+       "\n",
+       ".xr-var-item > .xr-var-name:hover span {\n",
+       "  padding-right: 5px;\n",
+       "}\n",
+       "\n",
+       ".xr-var-list > li:nth-child(odd) > div,\n",
+       ".xr-var-list > li:nth-child(odd) > label,\n",
+       ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
+       "  background-color: var(--xr-background-color-row-odd);\n",
+       "}\n",
+       "\n",
+       ".xr-var-name {\n",
+       "  grid-column: 1;\n",
+       "}\n",
+       "\n",
+       ".xr-var-dims {\n",
+       "  grid-column: 2;\n",
+       "}\n",
+       "\n",
+       ".xr-var-dtype {\n",
+       "  grid-column: 3;\n",
+       "  text-align: right;\n",
+       "  color: var(--xr-font-color2);\n",
+       "}\n",
+       "\n",
+       ".xr-var-preview {\n",
+       "  grid-column: 4;\n",
+       "}\n",
+       "\n",
+       ".xr-var-name,\n",
+       ".xr-var-dims,\n",
+       ".xr-var-dtype,\n",
+       ".xr-preview,\n",
+       ".xr-attrs dt {\n",
+       "  white-space: nowrap;\n",
+       "  overflow: hidden;\n",
+       "  text-overflow: ellipsis;\n",
+       "  padding-right: 10px;\n",
+       "}\n",
+       "\n",
+       ".xr-var-name:hover,\n",
+       ".xr-var-dims:hover,\n",
+       ".xr-var-dtype:hover,\n",
+       ".xr-attrs dt:hover {\n",
+       "  overflow: visible;\n",
+       "  width: auto;\n",
+       "  z-index: 1;\n",
+       "}\n",
+       "\n",
+       ".xr-var-attrs,\n",
+       ".xr-var-data {\n",
+       "  display: none;\n",
+       "  background-color: var(--xr-background-color) !important;\n",
+       "  padding-bottom: 5px !important;\n",
+       "}\n",
+       "\n",
+       ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
+       ".xr-var-data-in:checked ~ .xr-var-data {\n",
+       "  display: block;\n",
+       "}\n",
+       "\n",
+       ".xr-var-data > table {\n",
+       "  float: right;\n",
+       "}\n",
+       "\n",
+       ".xr-var-name span,\n",
+       ".xr-var-data,\n",
+       ".xr-attrs {\n",
+       "  padding-left: 25px !important;\n",
+       "}\n",
+       "\n",
+       ".xr-attrs,\n",
+       ".xr-var-attrs,\n",
+       ".xr-var-data {\n",
+       "  grid-column: 1 / -1;\n",
+       "}\n",
+       "\n",
+       "dl.xr-attrs {\n",
+       "  padding: 0;\n",
+       "  margin: 0;\n",
+       "  display: grid;\n",
+       "  grid-template-columns: 125px auto;\n",
+       "}\n",
+       "\n",
+       ".xr-attrs dt,\n",
+       ".xr-attrs dd {\n",
+       "  padding: 0;\n",
+       "  margin: 0;\n",
+       "  float: left;\n",
+       "  padding-right: 10px;\n",
+       "  width: auto;\n",
+       "}\n",
+       "\n",
+       ".xr-attrs dt {\n",
+       "  font-weight: normal;\n",
+       "  grid-column: 1;\n",
+       "}\n",
+       "\n",
+       ".xr-attrs dt:hover span {\n",
+       "  display: inline-block;\n",
+       "  background: var(--xr-background-color);\n",
+       "  padding-right: 10px;\n",
+       "}\n",
+       "\n",
+       ".xr-attrs dd {\n",
+       "  grid-column: 2;\n",
+       "  white-space: pre-wrap;\n",
+       "  word-break: break-all;\n",
+       "}\n",
+       "\n",
+       ".xr-icon-database,\n",
+       ".xr-icon-file-text2 {\n",
+       "  display: inline-block;\n",
+       "  vertical-align: middle;\n",
+       "  width: 1em;\n",
+       "  height: 1.5em !important;\n",
+       "  stroke-width: 0;\n",
+       "  stroke: currentColor;\n",
+       "  fill: currentColor;\n",
+       "}\n",
+       "</style><pre class='xr-text-repr-fallback'>&lt;xarray.DataArray &#x27;pr&#x27; (time: 721)&gt;\n",
+       "array([5.66856148e-08, 4.81402021e-08, 4.03495916e-08, 4.76610235e-08,\n",
+       "       5.24978451e-08, 4.88191435e-08, 4.84948486e-08, 7.45690843e-08,\n",
+       "       7.23917748e-08, 6.47374743e-08, 3.67875833e-08, 4.33341398e-08,\n",
+       "       6.70532603e-08, 6.89232741e-08, 1.29457338e-07, 1.08465527e-07,\n",
+       "       1.03759966e-07, 1.06560610e-07, 1.22834350e-07, 7.92903195e-08,\n",
+       "       7.04738432e-08, 8.66802227e-08, 1.02524511e-07, 1.22683485e-07,\n",
+       "       1.31083846e-07, 1.04844473e-07, 1.40975422e-07, 1.27106338e-07,\n",
+       "       1.81304033e-07, 1.92430203e-07, 2.03634272e-07, 3.27540666e-07,\n",
+       "       2.04422194e-07, 2.03609550e-07, 1.90650088e-07, 2.34277181e-07,\n",
+       "       2.12181303e-07, 1.35030811e-07, 1.29894736e-07, 1.12784086e-07,\n",
+       "       1.57203402e-07, 1.99542083e-07, 2.87070289e-07, 4.78794130e-07,\n",
+       "       5.72046487e-07, 4.83533114e-07, 4.62975291e-07, 5.32919119e-07,\n",
+       "       6.01657264e-07, 8.56930037e-07, 7.16433516e-07, 9.16739064e-07,\n",
+       "       9.35673695e-07, 6.47497374e-07, 3.96801469e-07, 4.17669196e-07,\n",
+       "       3.75020340e-07, 3.64047565e-07, 3.08828494e-07, 3.07783180e-07,\n",
+       "       3.66254526e-07, 4.58102044e-07, 2.39302080e-07, 2.63588368e-07,\n",
+       "       2.61531258e-07, 2.64518784e-07, 4.32937793e-07, 3.53225688e-07,\n",
+       "       5.45189007e-07, 8.71109154e-07, 1.52759817e-06, 1.81061278e-06,\n",
+       "       2.28724823e-06, 2.50419941e-06, 2.44132176e-06, 3.35765418e-06,\n",
+       "       6.32397601e-06, 9.55746013e-06, 1.00034997e-05, 8.91384801e-06,\n",
+       "...\n",
+       "       1.10919524e-05, 1.07423044e-05, 8.63359736e-06, 7.27864223e-06,\n",
+       "       7.45183807e-06, 6.32993117e-06, 5.01768590e-06, 3.96297196e-06,\n",
+       "       3.16000414e-06, 2.25149031e-06, 2.09160732e-06, 2.11936530e-06,\n",
+       "       1.78043489e-06, 1.29668392e-06, 1.09806030e-06, 8.14623815e-07,\n",
+       "       1.00806023e-06, 1.13898778e-06, 1.54146169e-06, 2.47984623e-06,\n",
+       "       2.71418236e-06, 2.40302189e-06, 2.38851201e-06, 2.39789775e-06,\n",
+       "       2.47241792e-06, 2.18818257e-06, 2.15327697e-06, 2.51602440e-06,\n",
+       "       2.22230443e-06, 1.78275029e-06, 2.09578930e-06, 1.60074310e-06,\n",
+       "       1.62584185e-06, 1.23166623e-06, 9.18074306e-07, 5.82573776e-07,\n",
+       "       3.67299865e-07, 3.48721021e-07, 1.59834124e-07, 3.71484707e-08,\n",
+       "       2.63946207e-08, 3.41843870e-08, 7.22529429e-09, 3.58542408e-09,\n",
+       "       3.79014510e-09, 1.41168452e-09, 2.38683933e-09, 6.81474086e-09,\n",
+       "       2.37188031e-09, 5.67153003e-09, 8.61354968e-08, 4.50141389e-08,\n",
+       "       9.19123888e-08, 1.54842174e-07, 2.28661474e-07, 2.37043539e-07,\n",
+       "       2.00341715e-07, 1.55334081e-07, 1.37639871e-07, 1.51979635e-07,\n",
+       "       1.91758784e-07, 1.74428544e-07, 1.15889907e-07, 7.61054770e-08,\n",
+       "       2.89307381e-07, 8.00737716e-07, 6.88715363e-07, 8.33471561e-07,\n",
+       "       1.46109179e-06, 1.01679167e-06, 4.59868731e-07, 5.48092193e-07,\n",
+       "       1.25730442e-07, 1.26997326e-07, 1.18149074e-07, 5.39720466e-08,\n",
+       "       7.68960424e-08])\n",
+       "Coordinates:\n",
+       "  * time     (time) object 2005-02-01 00:00:00 ... 2005-03-01 00:00:00\n",
+       "Attributes:\n",
+       "    standard_name:     precipitation_flux\n",
+       "    long_name:         Precipitation\n",
+       "    units:             kg m-2 s-1\n",
+       "    grid_mapping:      rotated_latitude_longitude\n",
+       "    comment:           at surface; includes both liquid and solid phases from...\n",
+       "    original_name:     pr\n",
+       "    original_units:    kg m-2 h-1\n",
+       "    history:           2021-03-04T10:16:38Z altered by CMOR: Converted units ...\n",
+       "    cell_methods:      time: mean\n",
+       "    associated_files:  gridspecFile: gridspec_atmos_fx_GERICS-REMO2015_histor...</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.DataArray</div><div class='xr-array-name'>'pr'</div><ul class='xr-dim-list'><li><span class='xr-has-index'>time</span>: 721</li></ul></div><ul class='xr-sections'><li class='xr-section-item'><div class='xr-array-wrap'><input id='section-ea5ab427-1ab6-48ea-af44-639a69902acc' class='xr-array-in' type='checkbox' checked><label for='section-ea5ab427-1ab6-48ea-af44-639a69902acc' title='Show/hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-array-preview xr-preview'><span>5.669e-08 4.814e-08 4.035e-08 ... 1.181e-07 5.397e-08 7.69e-08</span></div><div class='xr-array-data'><pre>array([5.66856148e-08, 4.81402021e-08, 4.03495916e-08, 4.76610235e-08,\n",
+       "       5.24978451e-08, 4.88191435e-08, 4.84948486e-08, 7.45690843e-08,\n",
+       "       7.23917748e-08, 6.47374743e-08, 3.67875833e-08, 4.33341398e-08,\n",
+       "       6.70532603e-08, 6.89232741e-08, 1.29457338e-07, 1.08465527e-07,\n",
+       "       1.03759966e-07, 1.06560610e-07, 1.22834350e-07, 7.92903195e-08,\n",
+       "       7.04738432e-08, 8.66802227e-08, 1.02524511e-07, 1.22683485e-07,\n",
+       "       1.31083846e-07, 1.04844473e-07, 1.40975422e-07, 1.27106338e-07,\n",
+       "       1.81304033e-07, 1.92430203e-07, 2.03634272e-07, 3.27540666e-07,\n",
+       "       2.04422194e-07, 2.03609550e-07, 1.90650088e-07, 2.34277181e-07,\n",
+       "       2.12181303e-07, 1.35030811e-07, 1.29894736e-07, 1.12784086e-07,\n",
+       "       1.57203402e-07, 1.99542083e-07, 2.87070289e-07, 4.78794130e-07,\n",
+       "       5.72046487e-07, 4.83533114e-07, 4.62975291e-07, 5.32919119e-07,\n",
+       "       6.01657264e-07, 8.56930037e-07, 7.16433516e-07, 9.16739064e-07,\n",
+       "       9.35673695e-07, 6.47497374e-07, 3.96801469e-07, 4.17669196e-07,\n",
+       "       3.75020340e-07, 3.64047565e-07, 3.08828494e-07, 3.07783180e-07,\n",
+       "       3.66254526e-07, 4.58102044e-07, 2.39302080e-07, 2.63588368e-07,\n",
+       "       2.61531258e-07, 2.64518784e-07, 4.32937793e-07, 3.53225688e-07,\n",
+       "       5.45189007e-07, 8.71109154e-07, 1.52759817e-06, 1.81061278e-06,\n",
+       "       2.28724823e-06, 2.50419941e-06, 2.44132176e-06, 3.35765418e-06,\n",
+       "       6.32397601e-06, 9.55746013e-06, 1.00034997e-05, 8.91384801e-06,\n",
+       "...\n",
+       "       1.10919524e-05, 1.07423044e-05, 8.63359736e-06, 7.27864223e-06,\n",
+       "       7.45183807e-06, 6.32993117e-06, 5.01768590e-06, 3.96297196e-06,\n",
+       "       3.16000414e-06, 2.25149031e-06, 2.09160732e-06, 2.11936530e-06,\n",
+       "       1.78043489e-06, 1.29668392e-06, 1.09806030e-06, 8.14623815e-07,\n",
+       "       1.00806023e-06, 1.13898778e-06, 1.54146169e-06, 2.47984623e-06,\n",
+       "       2.71418236e-06, 2.40302189e-06, 2.38851201e-06, 2.39789775e-06,\n",
+       "       2.47241792e-06, 2.18818257e-06, 2.15327697e-06, 2.51602440e-06,\n",
+       "       2.22230443e-06, 1.78275029e-06, 2.09578930e-06, 1.60074310e-06,\n",
+       "       1.62584185e-06, 1.23166623e-06, 9.18074306e-07, 5.82573776e-07,\n",
+       "       3.67299865e-07, 3.48721021e-07, 1.59834124e-07, 3.71484707e-08,\n",
+       "       2.63946207e-08, 3.41843870e-08, 7.22529429e-09, 3.58542408e-09,\n",
+       "       3.79014510e-09, 1.41168452e-09, 2.38683933e-09, 6.81474086e-09,\n",
+       "       2.37188031e-09, 5.67153003e-09, 8.61354968e-08, 4.50141389e-08,\n",
+       "       9.19123888e-08, 1.54842174e-07, 2.28661474e-07, 2.37043539e-07,\n",
+       "       2.00341715e-07, 1.55334081e-07, 1.37639871e-07, 1.51979635e-07,\n",
+       "       1.91758784e-07, 1.74428544e-07, 1.15889907e-07, 7.61054770e-08,\n",
+       "       2.89307381e-07, 8.00737716e-07, 6.88715363e-07, 8.33471561e-07,\n",
+       "       1.46109179e-06, 1.01679167e-06, 4.59868731e-07, 5.48092193e-07,\n",
+       "       1.25730442e-07, 1.26997326e-07, 1.18149074e-07, 5.39720466e-08,\n",
+       "       7.68960424e-08])</pre></div></div></li><li class='xr-section-item'><input id='section-ee9c0933-2717-4ad0-8a0e-151209356e7a' class='xr-section-summary-in' type='checkbox'  checked><label for='section-ee9c0933-2717-4ad0-8a0e-151209356e7a' class='xr-section-summary' >Coordinates: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>object</div><div class='xr-var-preview xr-preview'>2005-02-01 00:00:00 ... 2005-03-...</div><input id='attrs-1f45e05c-1d41-4b98-ac21-01eb91f5986c' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-1f45e05c-1d41-4b98-ac21-01eb91f5986c' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-a370c24f-cea3-4de7-bddd-6806bd34ddd9' class='xr-var-data-in' type='checkbox'><label for='data-a370c24f-cea3-4de7-bddd-6806bd34ddd9' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>dtype :</span></dt><dd>&lt;class &#x27;cftime._cftime.Datetime360Day&#x27;&gt;</dd></dl></div><div class='xr-var-data'><pre>array([cftime.Datetime360Day(2005, 2, 1, 0, 0, 0, 0, has_year_zero=True),\n",
+       "       cftime.Datetime360Day(2005, 2, 1, 1, 0, 0, 0, has_year_zero=True),\n",
+       "       cftime.Datetime360Day(2005, 2, 1, 2, 0, 0, 0, has_year_zero=True), ...,\n",
+       "       cftime.Datetime360Day(2005, 2, 30, 22, 0, 0, 0, has_year_zero=True),\n",
+       "       cftime.Datetime360Day(2005, 2, 30, 23, 0, 0, 0, has_year_zero=True),\n",
+       "       cftime.Datetime360Day(2005, 3, 1, 0, 0, 0, 0, has_year_zero=True)],\n",
+       "      dtype=object)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-8a0efcb1-5e93-4aab-875f-45c09047c3e3' class='xr-section-summary-in' type='checkbox'  ><label for='section-8a0efcb1-5e93-4aab-875f-45c09047c3e3' class='xr-section-summary' >Attributes: <span>(10)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>precipitation_flux</dd><dt><span>long_name :</span></dt><dd>Precipitation</dd><dt><span>units :</span></dt><dd>kg m-2 s-1</dd><dt><span>grid_mapping :</span></dt><dd>rotated_latitude_longitude</dd><dt><span>comment :</span></dt><dd>at surface; includes both liquid and solid phases from all types of clouds (both large-scale and convective)</dd><dt><span>original_name :</span></dt><dd>pr</dd><dt><span>original_units :</span></dt><dd>kg m-2 h-1</dd><dt><span>history :</span></dt><dd>2021-03-04T10:16:38Z altered by CMOR: Converted units from &#x27;kg m-2 h-1&#x27; to &#x27;kg m-2 s-1&#x27;. 2021-03-04T10:16:38Z altered by CMOR: replaced missing value flag (-9e+33) with standard missing value (1e+20).</dd><dt><span>cell_methods :</span></dt><dd>time: mean</dd><dt><span>associated_files :</span></dt><dd>gridspecFile: gridspec_atmos_fx_GERICS-REMO2015_historical_r0i0p0.nc</dd></dl></div></li></ul></div></div>"
+      ],
+      "text/plain": [
+       "<xarray.DataArray 'pr' (time: 721)>\n",
+       "array([5.66856148e-08, 4.81402021e-08, 4.03495916e-08, 4.76610235e-08,\n",
+       "       5.24978451e-08, 4.88191435e-08, 4.84948486e-08, 7.45690843e-08,\n",
+       "       7.23917748e-08, 6.47374743e-08, 3.67875833e-08, 4.33341398e-08,\n",
+       "       6.70532603e-08, 6.89232741e-08, 1.29457338e-07, 1.08465527e-07,\n",
+       "       1.03759966e-07, 1.06560610e-07, 1.22834350e-07, 7.92903195e-08,\n",
+       "       7.04738432e-08, 8.66802227e-08, 1.02524511e-07, 1.22683485e-07,\n",
+       "       1.31083846e-07, 1.04844473e-07, 1.40975422e-07, 1.27106338e-07,\n",
+       "       1.81304033e-07, 1.92430203e-07, 2.03634272e-07, 3.27540666e-07,\n",
+       "       2.04422194e-07, 2.03609550e-07, 1.90650088e-07, 2.34277181e-07,\n",
+       "       2.12181303e-07, 1.35030811e-07, 1.29894736e-07, 1.12784086e-07,\n",
+       "       1.57203402e-07, 1.99542083e-07, 2.87070289e-07, 4.78794130e-07,\n",
+       "       5.72046487e-07, 4.83533114e-07, 4.62975291e-07, 5.32919119e-07,\n",
+       "       6.01657264e-07, 8.56930037e-07, 7.16433516e-07, 9.16739064e-07,\n",
+       "       9.35673695e-07, 6.47497374e-07, 3.96801469e-07, 4.17669196e-07,\n",
+       "       3.75020340e-07, 3.64047565e-07, 3.08828494e-07, 3.07783180e-07,\n",
+       "       3.66254526e-07, 4.58102044e-07, 2.39302080e-07, 2.63588368e-07,\n",
+       "       2.61531258e-07, 2.64518784e-07, 4.32937793e-07, 3.53225688e-07,\n",
+       "       5.45189007e-07, 8.71109154e-07, 1.52759817e-06, 1.81061278e-06,\n",
+       "       2.28724823e-06, 2.50419941e-06, 2.44132176e-06, 3.35765418e-06,\n",
+       "       6.32397601e-06, 9.55746013e-06, 1.00034997e-05, 8.91384801e-06,\n",
+       "...\n",
+       "       1.10919524e-05, 1.07423044e-05, 8.63359736e-06, 7.27864223e-06,\n",
+       "       7.45183807e-06, 6.32993117e-06, 5.01768590e-06, 3.96297196e-06,\n",
+       "       3.16000414e-06, 2.25149031e-06, 2.09160732e-06, 2.11936530e-06,\n",
+       "       1.78043489e-06, 1.29668392e-06, 1.09806030e-06, 8.14623815e-07,\n",
+       "       1.00806023e-06, 1.13898778e-06, 1.54146169e-06, 2.47984623e-06,\n",
+       "       2.71418236e-06, 2.40302189e-06, 2.38851201e-06, 2.39789775e-06,\n",
+       "       2.47241792e-06, 2.18818257e-06, 2.15327697e-06, 2.51602440e-06,\n",
+       "       2.22230443e-06, 1.78275029e-06, 2.09578930e-06, 1.60074310e-06,\n",
+       "       1.62584185e-06, 1.23166623e-06, 9.18074306e-07, 5.82573776e-07,\n",
+       "       3.67299865e-07, 3.48721021e-07, 1.59834124e-07, 3.71484707e-08,\n",
+       "       2.63946207e-08, 3.41843870e-08, 7.22529429e-09, 3.58542408e-09,\n",
+       "       3.79014510e-09, 1.41168452e-09, 2.38683933e-09, 6.81474086e-09,\n",
+       "       2.37188031e-09, 5.67153003e-09, 8.61354968e-08, 4.50141389e-08,\n",
+       "       9.19123888e-08, 1.54842174e-07, 2.28661474e-07, 2.37043539e-07,\n",
+       "       2.00341715e-07, 1.55334081e-07, 1.37639871e-07, 1.51979635e-07,\n",
+       "       1.91758784e-07, 1.74428544e-07, 1.15889907e-07, 7.61054770e-08,\n",
+       "       2.89307381e-07, 8.00737716e-07, 6.88715363e-07, 8.33471561e-07,\n",
+       "       1.46109179e-06, 1.01679167e-06, 4.59868731e-07, 5.48092193e-07,\n",
+       "       1.25730442e-07, 1.26997326e-07, 1.18149074e-07, 5.39720466e-08,\n",
+       "       7.68960424e-08])\n",
+       "Coordinates:\n",
+       "  * time     (time) object 2005-02-01 00:00:00 ... 2005-03-01 00:00:00\n",
+       "Attributes:\n",
+       "    standard_name:     precipitation_flux\n",
+       "    long_name:         Precipitation\n",
+       "    units:             kg m-2 s-1\n",
+       "    grid_mapping:      rotated_latitude_longitude\n",
+       "    comment:           at surface; includes both liquid and solid phases from...\n",
+       "    original_name:     pr\n",
+       "    original_units:    kg m-2 h-1\n",
+       "    history:           2021-03-04T10:16:38Z altered by CMOR: Converted units ...\n",
+       "    cell_methods:      time: mean\n",
+       "    associated_files:  gridspecFile: gridspec_atmos_fx_GERICS-REMO2015_histor..."
+      ]
+     },
+     "execution_count": 8,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Select a variable to plot\n",
+    "plot_var = dc.variables[0]\n",
+    "dset = dc.select(by_index=0)\n",
+    "dset[plot_var]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "315ad9b5",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[<matplotlib.lines.Line2D at 0x7f0c8177e6b0>]"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "%matplotlib inline\n",
+    "dset[plot_var].plot()"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Climpact jupyter kernel",
+   "language": "python",
+   "name": "climpact"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.10.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/assets/PostPorcessing.ipynb.license b/assets/PostPorcessing.ipynb.license
new file mode 100644
index 0000000000000000000000000000000000000000..c049ae533d6c9dceeb4d8240684e59d7a787a834
--- /dev/null
+++ b/assets/PostPorcessing.ipynb.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
+#
+# SPDX-License-Identifier: CC0-1.0
diff --git a/assets/cartopy_download.py b/assets/cartopy_download.py
index b67701c930247bdfaf15aba4408cb6f251c42217..c462b55dd1968a3400fe2f58b220b0e9b0e2902e 100644
--- a/assets/cartopy_download.py
+++ b/assets/cartopy_download.py
@@ -1,8 +1,8 @@
 #!/mnt/lustre01/pf/k/k204230/workspace/freva_plugins/climpact/conda/bin/python
+# Copyright Cartopy Contributors
 # SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
 #
-# SPDX-License-Identifier: BSD-3-Clause
-# Copyright Cartopy Contributors
+# SPDX-License-Identifier: CC0-1.0
 # This file is part of Cartopy and is released under the LGPL license.
 # See COPYING and COPYING.LESSER in the root of the repository for full
 # licensing details.
diff --git a/setup_info.py b/assets/climpact_assets.py
similarity index 87%
rename from setup_info.py
rename to assets/climpact_assets.py
index d77a1dc18d6783a15fc299ab4f68d44c11484a75..088736520de884c72de2b8db4b5cd3188b5d778f 100644
--- a/setup_info.py
+++ b/assets/climpact_assets.py
@@ -1,7 +1,6 @@
 # SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
 #
 # SPDX-License-Identifier: BSD-3-Clause
-
 MUNICIPALITIES = [
     "Schwerin",
     "Helmstedt",
@@ -406,32 +405,3 @@ MUNICIPALITIES = [
     "Mayen-Koblenz",
     "Ennepe-Ruhr-Kreis",
 ]
-FIVE_BY_FIVE = sorted(
-    (
-        "cnrm-cerfacs-cnrm-cm5-clmcom-cclm4-8-17-v1",
-        "cnrm-cerfacs-cnrm-cm5-dmi-hirham5-v2",
-        "cnrm-cerfacs-cnrm-cm5-knmi-racmo22e-v2",
-        "cnrm-cerfacs-cnrm-cm5-smhi-rca4-v1",
-        "cnrm-cerfacs-cnrm-cm5-gerics-remo2015-v2",
-        "ichec-ec-earth-clmcom-cclm4-8-17-v1",
-        "ichec-ec-earth-dmi-hirham5-v2",
-        "ichec-ec-earth-knmi-racmo22e-v1",
-        "ichec-ec-earth-smhi-rca4-v1",
-        "ichec-ec-earth-gerics-remo2015-v1",
-        "mohc-hadgem2-es-clmcom-cclm4-8-17-v1",
-        "mohc-hadgem2-es-dmi-hirham5-v2",
-        "mohc-hadgem2-es-knmi-racmo22e-v2",
-        "mohc-hadgem2-es-smhi-rca4-v1",
-        "mohc-hadgem2-es-gerics-remo2015-v1",
-        "mpi-m-mpi-esm-lr-clmcom-cclm4-8-17-v1",
-        "mpi-m-mpi-esm-lr-dmi-hirham5-v1",
-        "mpi-m-mpi-esm-lr-knmi-racmo22e-v1",
-        "mpi-m-mpi-esm-lr-smhi-rca4-v1a",
-        "mpi-m-mpi-esm-lr-gerics-remo2015-v1",
-        "ncc-noresm1-m-clmcom-eth-cosmo-crclim-v1-1-v1",
-        "ncc-noresm1-m-dmi-hirham5-v2",
-        "ncc-noresm1-m-knmi-racmo22e-v1",
-        "ncc-noresm1-m-smhi-rca4-v1",
-        "ncc-noresm1-m-gerics-remo2015-v1",
-    )
-)
diff --git a/assets/landkreise.json.license b/assets/landkreise.json.license
index 2754c205ea96b3a764915b86888eacf68ecadf60..c049ae533d6c9dceeb4d8240684e59d7a787a834 100644
--- a/assets/landkreise.json.license
+++ b/assets/landkreise.json.license
@@ -1,3 +1,3 @@
-SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
-
-SPDX-License-Identifier: CC0-1.0
+# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
+#
+# SPDX-License-Identifier: CC0-1.0
diff --git a/assets/preproc.py b/assets/preproc.py
new file mode 100644
index 0000000000000000000000000000000000000000..49731b19bd173694c18c9fa7c86b45e60f124284
--- /dev/null
+++ b/assets/preproc.py
@@ -0,0 +1,12 @@
+# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+import xarray as xr
+
+
+def pre_proc(dset: xr.Dataset, **kwargs) -> xr.Dataset:
+    """Create a simple field mean of a given dataset."""
+
+    dims = [d for d in dset.dims.keys() if "lat" in d or "lon" in d]
+    return dset.mean(dim=dims)
diff --git a/assets/run.py b/assets/run.py
deleted file mode 100644
index 8350b5ab7a5839420e238d95d66311ca47cec8d5..0000000000000000000000000000000000000000
--- a/assets/run.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
-#
-# SPDX-License-Identifier: BSD-3-Clause
-
-import json
-import logging
-import traceback
-from pathlib import Path
-from tempfile import TemporaryDirectory
-
-import papermill as pm
-from ipykernel.kernelspec import install as install_kernel
-
-def parse_config(argv=None):
-    """Parse command line arguments."""
-    import argparse
-
-    ap = argparse.ArgumentParser(
-        prog="heat2urbanimpact",
-        description="Analyze heat impacts on urban areas",
-        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
-    )
-    ap.add_argument(
-        "configfile",
-        metavar="configfile",
-        type=Path,
-        help="Configuration file path",
-    )
-    args = ap.parse_args()
-    config_file = args.configfile.expanduser().absolute()
-    
-    with config_file.open() as f:
-        return config_file, json.load(f)
-
-def install_jupyter_kernel(kernel_name="freva-h2ui"):
-    """Install Jupyter kernel if needed."""
-    kernel_dir = Path("~/.local/share/jupyter/kernels").expanduser()
-    if not (kernel_dir / kernel_name).is_dir():
-        install_kernel(
-            user=True,
-            kernel_name=kernel_name,
-            display_name=kernel_name
-        )
-
-def main(config_file, cfg):
-    """Main execution function."""
-    # Install kernel if needed
-    install_jupyter_kernel()
-
-    # Setup logging
-    logging.basicConfig(
-        level=logging.INFO,
-        format="%(name)s - %(levelname)s - %(message)s"
-    )
-    pm.log.logger.setLevel(logging.INFO)
-    logger = logging.getLogger("Heat2UrbanImpact")
-
-    # Prepare paths
-    out_dir = Path(cfg["output_dir"])
-    this_path = Path(__file__).parent
-    nb_out = out_dir / "Heat2UrbanImpact.ipynb"
-    nb_in = this_path / "Heat2UrbanImpact.ipynb"
-
-    # Save updated configuration
-    with config_file.open("w") as f:
-        json.dump(cfg, f)
-
-    # Execute notebook
-    with TemporaryDirectory() as td:
-        try:
-            pm.execute_notebook(
-                str(nb_in),
-                str(nb_out),
-                cwd=str(out_dir),
-                parameters={
-                    "config_file": str(config_file),
-                    "path": str(out_dir),
-                },
-                progress_bar=False,
-                kernel_name="freva-h2ui",
-                log_output=True,
-                prepare_only=False,
-                stdout_file=sys.stdout,
-                stderr_file=sys.stderr,
-            )
-            success = True
-        except Exception as error:
-            traceback.print_exception(error, limit=1)
-            success = False
-
-    if not success:
-        raise ValueError(
-            f"Notebook execution failed. Check the notebook at: {nb_out}"
-        )
-
-    # Update configuration
-    _ = cfg.pop("write", None)
-    with config_file.open("w") as f:
-        json.dump(cfg, f)
-
-    # Set permissions
-    for file in out_dir.rglob("*"):
-        file.chmod(0o755)
-    out_dir.chmod(0o755)
-
-if __name__ == "__main__":
-    import sys
-    import dask
-    from distributed.utils import logger as dask_logger
-
-    with dask.config.set({"logging.distributed": "critical"}):
-        dask_logger.setLevel(logging.ERROR)
-        main(*parse_config(sys.argv))
\ No newline at end of file
diff --git a/builder.py b/builder.py
new file mode 100644
index 0000000000000000000000000000000000000000..22f3c187299225ba1ae523f2d96fd1cecccf79e1
--- /dev/null
+++ b/builder.py
@@ -0,0 +1,496 @@
+# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
+#
+# SPDX-License-Identifier: BSD-3-Clause
+###############################################
+# This is the section to get the clipped data using
+# the shape file from Climpact
+# !! NO NEED TO CHANGE ANYTHING IN THIS SECTION !!
+###############################################
+
+import base64
+import json
+import logging
+import os
+import sys
+from concurrent.futures import (
+    ProcessPoolExecutor,
+    ThreadPoolExecutor,
+    as_completed,
+)
+from datetime import datetime
+from functools import partial
+from getpass import getuser
+from pathlib import Path
+from tempfile import TemporaryDirectory
+from typing import Callable, Dict, List, Optional, Tuple, Union
+
+import dask
+
+# import geopandas as gp
+import humanize
+import numpy as np
+import pandas as pd
+import papermill as pm
+
+# import pyproj
+# import regionmask
+import xarray as xr
+
+# from cartopy import crs
+from ipykernel.kernelspec import install as install_kernel
+
+from climpact import RunDirectory, Swift, UnitConverter
+from climpact.utils import save_file
+
+# from zipfile import ZipFile
+
+
+logging.basicConfig(
+    level=logging.INFO, format="%(name)s-%(levelname)s - %(message)s"
+)
+logger = logging.getLogger("Heat2UrbanImpact")
+
+
+def parse_config(argv: List[str] = []) -> Path:
+    """
+    Construct command line argument parser.
+
+    This is a stage in that parses the configuration JSON file
+    from wrapper and returns the configuration dictionary.
+
+    Example:
+    ========
+    >>> parse_config(["config.json"])
+    {'output_dir': '/home/user/output', 'files': {'model': {'ensemble': ['file1', 'file2']}}, 'variable': ['tas'], 'mask': ('land_sea_mask.nc', 0), 'pre_process_module': 'preproc.py', 'pre_process_function': 'pre_proc', 'mask_method': 'mean', 'experiment': 'historical', 'product': 'tas', 'project': 'CMIP6', 'region': 'Europe', 'start': '2010-01-01', 'end': '2010-12-31', 'time_frequency': 'day', 'output_units': {'tas': 'K'}, 'output_file_type': 'zarr', 'account': 'swift_account'}
+    """
+    import argparse
+
+    argp = argparse.ArgumentParser
+    ap = argp(
+        prog="heat2urbanimpact",
+        description="Calculate the imapct of heat on urban areas.",
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+    )
+    ap.add_argument(
+        "configfile",
+        metavar="configfile",
+        type=Path,
+        help="The configuration file.",
+    )
+    args = ap.parse_args(argv)
+    config_file = args.configfile.expanduser().absolute()
+    with config_file.open() as f:
+        config = json.load(f)
+    # Destroy the potentially sensitive information in the config
+    with config_file.open("w") as f:
+        json.dump({}, f)
+    return config
+
+
+def install_jupyter_kernel(kernel_name: str) -> None:
+    """Install a jupyter python kernel into the userspace."""
+
+    install_kernel(
+        user=True, kernel_name=kernel_name, display_name=kernel_name
+    )
+
+
+def get_datetime(
+    da: Union[np.array, xr.DataArray], time: Union[list, np.array], **kwargs
+) -> tuple:
+    """Match a list time timestamps to the timeobject in a given data array.
+
+    Parameters:
+    ===========
+    da : numpy.array
+        time array as xarray.DataArray that contains the target time object
+    time: collection
+        collection of datetime objects that will be matched
+    kwargs:
+        Additional keyword arguments that can be used to overwrite,
+        certain timestamp attributes e.g. year=2020
+    Returns:
+    ========
+     list: list of timestamps with of the same type as da
+    """
+    try:
+        da = pd.DatetimeIndex(da)
+    except Exception:
+        pass
+    typ = np.asarray(da)[0]
+    if isinstance(typ, np.datetime64):
+        time = [datetime.utcfromtimestamp(t) for t in time.astype("O") / 1e9]
+        typ = datetime
+    else:
+        typ = type(typ)
+    add_kwargs = {}
+    try:
+        add_kwargs["has_year_zero"] = typ.has_year_zero
+    except AttributeError:
+        pass
+    return [
+        typ(
+            kwargs.get("year", None) or t.year,
+            kwargs.get("month", None) or t.month,
+            kwargs.get("day", None) or t.day,
+            kwargs.get("hour", None) or t.hour,
+            kwargs.get("minute", None) or t.minute,
+            kwargs.get("second", None) or t.second,
+            **add_kwargs,
+        )
+        for t in time
+    ], repr(typ)
+
+
+def get_regions(geodata, key, region):
+    if region:  # Region already selected
+        yield None, "all"
+    elif key is None:  # No split key was given
+        yield None, "all"
+    elif geodata is None:
+        yield None, "all"
+    else:
+        try:
+            col = [c for c in geodata.columns if c.lower() == key.lower()][0]
+        except IndexError as error:
+            raise ValueError("split key not in geo data.") from error
+        for idx in geodata.index:
+            region = str(geodata.loc[idx][col]).replace(" ", "-")
+            yield geodata.loc[geodata.index == idx], region.replace("_", "-")
+
+
+def process_run(
+    files: List[str],
+    variables: List[str],
+    mask: Optional[Tuple[str, int]] = None,
+    abort_on_error: bool = True,
+    plot_map: bool = True,
+    **metadata,
+) -> xr.Dataset:
+    """Process a model run.
+
+    Parameters:
+    ==========
+    files:
+        Output file names belonging to this run.
+    variables:
+        Variable names that are processed.
+    abort_on_error:
+        Exit if something goes wrong while loading the dataset
+    mask:
+        Tuple of file to land-sea mask and which type to mask (0: land, 1: sea)
+    plot_mape:
+        Indicate whether a map of the data should be plotted
+    **metadata:
+        Additional information on that run.
+    """
+
+    out_dir = Path(metadata.pop("out_dir"))
+    pre_proc = metadata.pop("pre_proc")
+    units = metadata.pop("output_units", {})
+    split_by = metadata.pop("split_by", None) or None
+    rd = RunDirectory(files, variables, abort_on_error, mask, **metadata)
+    if rd.dataset is None:
+        raise ValueError("Reading data failed, check error log.")
+    coords = rd.dataset.coords
+    attrs = rd.dataset.attrs.copy()
+    large_dset = rd.dataset[rd.variables]
+    data_groups = {}
+    for geodata, region in get_regions(rd.georefdata, split_by, rd.region):
+        if geodata is None:
+            mask = rd.mask
+        else:
+            geodata = geodata.to_crs(rd.proj)
+            mask = rd.get_mask(
+                large_dset[rd.variables[0]],
+                rd.mask_method,
+                shape_data=geodata,
+            )
+            geodata = geodata["geometry"]
+        dset = large_dset * mask.data
+        extent = rd.get_extent(dset[rd.variables[0]], shape_data=geodata)
+        if extent:
+            dset = dset.sel(**extent)
+        dset.attrs = attrs
+        data_to_save = pre_proc(dset)
+        try:
+            for var in "X", "Y":
+                data_to_save[var] = coords[var]
+                data_to_save = data_to_save.set_coords(var)
+        except xr.core.merge.MergeError:
+            pass
+        data_to_save.attrs = dset.attrs = attrs
+        for var in data_to_save.data_vars:
+            if var in rd.variables:
+                old_attrs = rd.dataset[var].attrs
+                data_attrs = data_to_save[var].attrs
+                old_attrs |= data_attrs
+                data_to_save[var].attrs = old_attrs
+            if var in units:
+                if isinstance(units[var], str):
+                    data_to_save[var] = UnitConverter.convert(
+                        data_to_save[var], units[var]
+                    )
+                else:
+                    data_to_save[var].data *= units[var]
+                    data_to_save[var].attrs["units"] += f" * {units[var]}"
+        for var in rd.variables:
+            dset[var].attrs = rd.dataset[var].attrs
+            if var in units:
+                if isinstance(units[var], str):
+                    dset[var] = UnitConverter.convert(dset[var], units[var])
+                else:
+                    dset[var].data *= units[var]
+                    dset[var].attrs["units"] += f" * {units[var]}"
+        data_to_save.attrs = attrs
+        fn = f"{metadata['model']}_{metadata['exp']}_{metadata['time_frequency']}_{region}"
+        data_to_save.attrs[
+            "filename"
+        ] = f"Time_series_{metadata['product']}_{fn}"
+        data_to_save.attrs["ensemble_member"] = metadata["model"]
+        data_to_save.attrs["region"] = region or metadata["region"]
+        data_to_save.attrs["experiment"] = metadata["exp"]
+        data_to_save.attrs["output_freqeuncy"] = metadata["time_frequency"]
+        data_to_save.attrs["shape_file"] = metadata.get("shape_file", "")
+        data_to_save.attrs["swift_group"] = metadata["swift_group"]
+        # Map plotting smoke test if rquested
+        if plot_map:
+            rd.plot_maps(dset, out_dir / f"MapPlot_{fn}", shape_data=geodata)
+        data_groups[region] = data_to_save
+    return data_groups
+
+
+def load_method(
+    file_path: str, method_name: str
+) -> Callable[xr.Dataset, xr.Dataset]:  # noqa: F821
+    """Try to load a method for pre-processing."""
+
+    file_path = file_path or Path(__file__).parent / "assets" / "preproc.py"
+    method_name = method_name or "pre_proc"
+    module_path = Path(file_path).expanduser().absolute()
+    sys.path.insert(0, str(module_path.parent))
+    module = __import__(f"{module_path.with_suffix('').name}")
+    return getattr(module, method_name)
+
+
+def create_notebook(inp: str, out_dir: str, kernel_name: str) -> str:
+    """Create a jupyter-notebook."""
+    nb_in = Path(__file__).parent / "assets" / "PostPorcessing.ipynb"
+    nb_out = Path(out_dir) / nb_in.name
+    try:
+        pm.execute_notebook(
+            str(nb_in),
+            str(nb_out),
+            cwd=out_dir,
+            parameters={
+                "data_file": inp,
+            },
+            progress_bar=False,
+            kernel_name=kernel_name,
+            log_output=True,
+            prepare_only=False,
+            stdout_file=sys.stdout,
+            stderr_file=sys.stderr,
+        )
+    except Exception:
+        logger.error(
+            f"Notebook execution failed. Find the notebook in: {nb_out}"
+        )
+        raise
+    return str(nb_out)
+
+
+def write_info_html(
+    nb_file: Path, url: str, hpc_system: str = "levante", within: str = ""
+):
+    """Write information to html file."""
+
+    out_dir = nb_file.parent
+    out_file = out_dir / "01A_Information.html"
+    run_time_info = ""
+    if within:
+        run_time_info = (
+            f"The heat2urbanimpact plugin was successfully applied within {within}"
+        )
+    link = (
+        f"https://jupyterhub.dkrz.de/user/{getuser()}/"
+        f"{hpc_system}-spawner-preset/lab/tree/{nb_file}"
+    )
+    href = f"""<html>
+    <body>
+    <h3>Your data is ready for download the swift cloud object store.</h3>
+    <p>{run_time_info}<br>
+    To download the data follow <a href="{url}" target=_blank>this link</a></p>
+    <h3>Additional data processing</h3>
+    <p>Most certainly more data processing is needed for your impact model.
+       you can spawn a jupyter notebook server with the link below:<br>
+     <a href="{link}" target=_blank>{nb_file}</a><br>
+     This approach is recommended if additional adaptations are needed.
+     The notebook also offers a mini tutorial on how to use the library herin.
+     </p>
+     </body>
+     </html>"""
+    with out_file.open("w") as f:
+        f.write(href)
+
+
+def apply(config: Dict[str, str], tmp_dir: str) -> None:
+    """Main function that applies the pre-processing.
+
+    Parameters:
+    -----------
+    config: dict
+        dictionary holding the configuration to apply the data processing.
+    tmp_dir: str
+        temporary working directory
+    """
+    start_time = datetime.now()
+    key = config.pop("swift_key", None)
+    config["kernel_name"] = "heat2urbanimpact"
+    install_jupyter_kernel(config["kernel_name"])
+    config["output_dir"] = Path(config["output_dir"])
+    config.setdefault("abort_on_error", False)
+    config.setdefault("plot_map", True)
+    config.setdefault("output_units", {})
+    debug = config.get("debug", False)
+    if debug:
+        logger.setLevel(10)
+    logger.debug(config)
+    pre_proc = load_method(
+        config["pre_process_module"], config["pre_process_function"]
+    )
+    # Define the metadata that is needed to process the model runs
+    metadata = dict(
+        mask_method=config["mask_method"],
+        exp=config["experiment"],
+        product=config["product"],
+        project=config["project"],
+        out_dir=str(config["output_dir"]),
+        shape_file=config["shape_file"] or "",
+        region=config["region"] or "",
+        start=config["start"] or "",
+        end=config["end"] or "",
+        swift_group=config["account"],
+        pre_proc=pre_proc,
+        time_frequency=config["time_frequency"],
+        output_units=config["output_units"],
+        split_by=config.get("split_by", "") or "",
+        parallel=debug is False,
+    )
+    # Read the netcdf-files in parallel using a multi-threading
+    logger.info("Reading netcdf files")
+    variables = config["variable"]
+    # models = []
+    results = []
+    with ThreadPoolExecutor(thread_name_prefix="heat2urbanimpact") as tp:
+        futures = []
+        for model, ensembles in config.pop("files").items():
+            for ensemble, files in ensembles.items():
+                if not files:
+                    logger.critical(
+                        "No files found for %s", f"{model}_{ensemble}"
+                    )
+                metadata["model"] = f"{model}_{ensemble}"
+                proc_func = partial(
+                    process_run,
+                    sorted(files),
+                    variables,
+                    config["mask"] or None,
+                    config["abort_on_error"],
+                    config["plot_map"],
+                    **metadata.copy(),
+                )
+                if debug is False:
+                    futures.append(tp.submit(proc_func))
+                else:
+                    results.append(proc_func())
+        if debug is False:
+            results = [f.result() for f in as_completed(futures)]
+        total = 0
+        for res in results:
+            total += len(res)
+        if not results:
+            raise ValueError("No files found")
+        now = datetime.now().strftime("%Y%m%d_%H%M%ST")
+        var = "_".join(variables)
+        file_name = (
+            f"ProcessedModelData-{config['project']}-{config['product']}-{var}"
+        )
+        username = getuser()
+
+        logger.info(f"Writing time-series data - {total} files")
+        if config["output_file_type"] == "zarr":
+            data_file = Path(tmp_dir) / username / f"{file_name}-{now}.zarr"
+        else:
+            data_file = Path(tmp_dir) / username / f"{file_name}-{now}.zip"
+        logger.info("data file: %s", data_file)
+        data_file.parent.mkdir(exist_ok=True, parents=True)
+        with dask.config.set(pool=ProcessPoolExecutor()):
+            for nn, groups in enumerate(results):
+                for region, result in groups.items():
+                    result.attrs["path_prefix"] = file_name + region
+                    results[nn][region] = result.compute(scheduler="processes")
+        with save_file(data_file, "w") as s_file:
+            nn = 1
+            for groups in results:
+                for region, result in groups.items():
+                    logger.info(f"{nn} of {total} saved ({nn/total:02.01%})")
+                    RunDirectory.save_data(
+                        s_file, result, config["output_file_type"]
+                    )
+                    nn += 1
+        logger.info("Uploading data to swift object store")
+        try:
+            passwd = base64.b64decode(key).decode()
+        except TypeError:
+            passwd = None
+        passwd = passwd or None
+        swift = Swift(config["account"], username=username, password=passwd)
+        url = swift.upload(data_file.parent, "heat2urbanimpact")
+    nb_file = create_notebook(
+        f"{url}/{data_file.name}",
+        str(config["output_dir"]),
+        config["kernel_name"],
+    )
+    for file in config["output_dir"].rglob("*"):
+        file.chmod(0o755)
+    config["output_dir"].chmod(0o755)
+    nb_file = Path(nb_file)
+    within = humanize.naturaldelta(datetime.now() - start_time)
+    write_info_html(nb_file, f"{url}/{data_file.name}", within=within)
+    logger.info(f"A notebook for post-processing is ready at {nb_file}")
+    logger.info(
+        f"Data was uploaded. To access the data use the url: {url}/{data_file.name}"
+    )
+
+###############################################
+
+
+
+###############################################
+# Sanitize the input data to use in the 
+# statistical processing
+###############################################
+
+
+###############################################
+# Trigger the StatisticalProcessor methods to 
+# get the results
+###############################################
+
+
+###############################################
+# Get the results and save them in the output 
+# folder via ResultAggregator
+###############################################
+
+
+
+
+
+
+if __name__ == "__main__":
+    username = getuser()
+    scratch = os.getenv("SCRATCH_DIR", f"/scratch/{getuser()[0]}/{getuser()}")
+    with TemporaryDirectory(dir=scratch) as td:
+        cfg = apply(parse_config(sys.argv[1:]), td)
\ No newline at end of file
diff --git a/heat2urbanimpact-env.yml b/heat2urbanimpact-env.yml
index 107030ce6ee5f28aa397e1f025b50eb8c5ac5e80..489018a40b87dc70749e5ffc17943f281af3947e 100644
--- a/heat2urbanimpact-env.yml
+++ b/heat2urbanimpact-env.yml
@@ -8,9 +8,36 @@ channels:
 dependencies:
     - python=3.10
     - pip
+    - freva
     - git-lfs
     - pip:
         - setuptools
         - wheel
         - asciitree
         - git+https://gitlab.dkrz.de/ch1187/plugins4freva/climpact.git
+        - .
+    - python-swiftclient
+    - cdo
+    - conda
+    - ipykernel
+    - cftime
+    - nbconvert
+    - mamba
+    - cartopy
+    - geopandas
+    - matplotlib
+    - xarray
+    - pandas
+    - pint
+    - pint-xarray
+    - papermill
+    - metpy
+    - nc-time-axis
+    - cf_xarray
+    - dask
+    - regionmask
+    - shapely
+    - fiona
+    - h5netcdf
+    - netcdf4
+    - zarr
diff --git a/heat2urbanimpact-wrapper-api.py b/heat2urbanimpact-wrapper-api.py
deleted file mode 100644
index 57396477368b9c1b15378f13be0dc67fd49b632c..0000000000000000000000000000000000000000
--- a/heat2urbanimpact-wrapper-api.py
+++ /dev/null
@@ -1,248 +0,0 @@
-# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
-#
-# SPDX-License-Identifier: BSD-3-Clause
-
-"""
-Heat2UrbanImpact plugin API wrapper.
-"""
-
-######################################################
-# import commonly used libraries. You can add/remove
-# libraries as needed
-######################################################
-
-import json
-from pathlib import Path
-from typing import List, Optional
-
-import freva
-from evaluation_system.api import plugin
-from evaluation_system.api.parameters import (
-    Bool,
-    File,
-    ParameterDictionary,
-    SelectField,
-    SolrField,
-    String,
-)
-from evaluation_system.misc import config, logger
-from evaluation_system.model.solr import SolrFindFiles
-from setup_info import MUNICIPALITIES
-
-from heat2urbanimpact import Heat2UrbanImpact
-
-
-class Heat2UrbanImpactPlugin(plugin.PluginAbstract):
-    ######################################################
-    # Define the details for the plugin
-    ######################################################
-
-    # Version of the Heat2UrbanImpact plugin (major, minor, patch) * Mandatory
-    __version__ = (2024, 11, 0)
-    # Short Description of the Heat2UrbanImpact plugin * Mandatory
-    __short_description__: str = "Barrier-free RCM data, representative for heat events, for urban impact models."
-    # Optional category this plugin belongs to
-    __category__: Optional[str] = "Time Series"
-    # Optional tags, that are the plugin can be described with and found by
-    __tags__: Optional[List[str]] = ["heat events", "urban impact model"]
-    # Optional author of the plugin
-    tool_developer = {
-        "name": "Bente Tiedje, Astrid Ziemann",
-        "email": "bente.tiedje@hereon.de, astrid.ziemann@tu-dresden.de",
-    }
-    # Optional long description of the author of the plugin
-    __long_description__: Optional[
-        str
-    ] = "Extension or composition of various existing plugins or program parts for the barrier-free transfer of meteorological data (representative of certain climatological heat events) into an urban climate model"
-
-    ######################################################
-    # Define the parameters for the plugin * Mandatory
-    ######################################################
-
-    __parameters__ = ParamDict(
-        File(
-            name="shape_file",
-            file_extension="geojson",
-            help=(
-                "Enter a geo reference data file defining your region of interest. "
-                "You can either enter a path on the HPC system or provide a web URL."
-            ),
-            default=None,
-        ),
-        SelectField(
-            name="region",
-            default="Germany",
-            options={mun: mun for mun in ["Germany"] + sorted(MUNICIPALITIES)},
-            help="Select your region of interest from the available options.",
-        ),
-        SelectField(
-            name="split_by",
-            default="none",
-            options={"none": "none", "region": "region"},
-            help="Select how to split the analysis.",
-        ),
-        SelectField(
-            name="experiment",
-            default="historical",
-            options={
-                "historical": "historical",
-                "2K": "2K warming",
-                "3K": "3K warming"
-            },
-            help="Select the experiment scenario to analyze.",
-        ),
-        SelectField(
-            name="event",
-            default="heat_wave",
-            options={
-                "heat_wave": "Heat Wave",
-                "extreme_heat": "Extreme Heat"
-            },
-            help="Select the type of heat event to analyze.",
-        ),
-        Integer(
-            name="length_of_event",
-            default=3,
-            help="Duration of the heat event in days.",
-        ),
-        SelectField(
-            name="months_of_event",
-            default="JJA",
-            options={
-                "JJA": "Summer (Jun-Aug)",
-                "DJF": "Winter (Dec-Feb)",
-                "MAM": "Spring (Mar-May)",
-                "SON": "Autumn (Sep-Nov)"
-            },
-            help="Select the season for the analysis.",
-        ),
-        SelectField(
-            name="impact_model",
-            default="basic",
-            options={
-                "basic": "Basic Impact Model",
-                "advanced": "Advanced Impact Model"
-            },
-            help="Select the impact model to use for analysis.",
-        ),
-        Bool(
-            name="use_dask",
-            default=True,
-            help=(
-                "Use dask distributed computing for faster processing. "
-                "Set to False for debugging."
-            ),
-        ),
-    )
-
-    # @staticmethod
-    # def _drs_search(**search_kw):
-    #     kw = search_kw.copy()
-    #     files = sorted(freva.databrowser(**kw))
-    #     if files:
-    #         return files
-
-    # def _get_files(
-    #     self, variable, experiment, model, product, project, freq, start, end
-    # ):
-    #     files = {}
-    #     time = {}
-    #     if start and end:
-    #         time = {"time": f"{start}to{end}"}
-    #     elif start:
-    #         time = {"time": f"{start}to9999"}
-    #     elif end:
-    #         time = {"time": f"0to{end}"}
-
-    #     search_kw = dict(
-    #         variable=variable,
-    #         experiment=experiment,
-    #         model=model,
-    #         time_frequency=freq,
-    #     )
-    #     search_kw.update(time)
-    #     if product:
-    #         search_kw["product"] = product
-    #     if project:
-    #         search_kw["project"] = project
-    #     experiment_facets = freva.facet_search(facet=["ensemble"], **search_kw)
-    #     for ens in experiment_facets["ensemble"]:
-    #         search_kw["ensemble"] = ens
-    #         files_found = self._drs_search(**search_kw)
-    #         if not files_found:
-    #             logger.warning("No files found for %s", ens)
-    #         else:
-    #             files[ens] = files_found
-    #     return files
-
-    # def get_mask(self, mask_type, **kwargs):
-    #     """Get the land-sea mask for a setup."""
-    #     setup = kwargs.copy()
-    #     if mask_type is None or mask_type == "none":
-    #         return
-    #     setup["variable"] = "sftlf"
-    #     files = self._drs_search(**setup)
-    #     if files:
-    #         return str(files[0]), mask_type
-    #     logger.warning(
-    #         "No land-sea mask found for setup, searching for alternatives"
-    #     )
-    #     # Get rid of the model contraint
-    #     setup.pop("model")
-    #     files = self._drs_search(**setup)
-    #     if files:
-    #         return str(files[0]), mask_type
-    #     raise ValueError("No land-sea mask found for setup")
-
-    def run_tool(self, config_dict=None):
-        # This part is about the ourput and cache directory.
-        config_dict.update({
-            "project": "nukleus",
-            "product": "ceu-3",
-            "time_frequency": "1hr",
-            "variable": ["tas", "ta300", "ta500", "ta700", "ta950"],
-            "output_units": True,
-            "output_file_type": "nc",
-            "mask_type": "none",
-            "mask_method": "centers",
-            "plot_map": True,
-            "pre_process_module": "none",
-            "pre_process_function": "pre_proc"
-        })
-
-        # Create output directory
-        out_dir = self._special_variables.substitute({"d": "$USER_OUTPUT_DIR"})
-        out_dir = Path(out_dir["d"]) / str(self.rowid)
-        out_dir.mkdir(exist_ok=True, parents=True)
-        config_dict["output_dir"] = str(out_dir)
-
-        cache_dir = self._special_variables.substitute(
-            {"d": "$USER_CACHE_DIR"}
-        )
-        cache_dir = Path(cache_dir["d"]) / str(self.rowid)
-        cache_dir.mkdir(exist_ok=True, parents=True)
-        config_dict["cache_directory"] = str(cache_dir)
-
-        # Set computation account
-        comp = config.get_section("scheduler_options").get("project", "")
-        config_dict["account"] = comp or "ch1187"
-
-        # Save configuration
-        config_file = Path(config_dict["output_dir"]) / "heat2urbanimpact.json"
-        with open(str(config_file), "w") as f:
-            json.dump(config_dict, f, indent=4)
-
-        # Execute analysis notebook
-        python_env = Path(__file__).parent / "plugin_env" / "bin" / "python"
-        tool_path = Path(__file__).parent / "assets" / "run.py"
-        cmd = f"{python_env} -B {tool_path} {config_file}"
-        env = os.environ.copy()
-
-        self.call(cmd, env=env)
-        # Cleanup temporary files
-        for path in ("dask-worker-space", "__pycache__"):
-            rmpath = Path(config_dict["output_dir"]) / path
-            if rmpath.is_dir():
-                os.system(f"rm -r {str(rmpath)}")
-
-        return self.prepare_output(config_dict["output_dir"])
diff --git a/pyproject.toml b/pyproject.toml
index 260bbd13041c63c5ecc3d8cad151dcec71d7fed3..a8fd7d3d9d9daacaaf8563f1d1c493d5fdde9aba 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -101,6 +101,7 @@ heat2urbanimpact = ["py.typed"]
 
 [tool.setuptools.packages.find]
 namespaces = false
+where = ["src"]
 exclude = [
     'docs',
     'tests*',
diff --git a/setup.py b/setup.py
index cc638d22cd686dd498d401044eb04f5469d3f574..523210507d51b61f8860b2b2a7ebfc5736ca3415 100644
--- a/setup.py
+++ b/setup.py
@@ -8,7 +8,6 @@ from setuptools import find_packages, setup
 
 setup(
     version=versioneer.get_version(),
-    cmdclass=versioneer.get_cmdclass(),
     packages=find_packages("src"),
     package_dir={"": "src"},
 )
diff --git a/src/heat2urbanimpact/InputSanitizer.py b/src/heat2urbanimpact/InputSanitizer.py
new file mode 100644
index 0000000000000000000000000000000000000000..ee7fba856999e5ea59be2b48463a487c8cfe310f
--- /dev/null
+++ b/src/heat2urbanimpact/InputSanitizer.py
@@ -0,0 +1,8 @@
+# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+######################################################
+# Here is the next stage after clipping the data
+# via Climpact
+######################################################
\ No newline at end of file
diff --git a/src/heat2urbanimpact/ResultAggregator.py b/src/heat2urbanimpact/ResultAggregator.py
new file mode 100644
index 0000000000000000000000000000000000000000..4a13939964e12a94f1297d755f4fa370faf2e5de
--- /dev/null
+++ b/src/heat2urbanimpact/ResultAggregator.py
@@ -0,0 +1,8 @@
+# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+######################################################
+# Here is the next stage after Sanitizing the clipped data
+# and making it ready for operating the statistical analysis
+######################################################
\ No newline at end of file
diff --git a/src/heat2urbanimpact/StatisticalProcessor.py b/src/heat2urbanimpact/StatisticalProcessor.py
new file mode 100644
index 0000000000000000000000000000000000000000..be4c26dad86051e69503db3fbfa9ccb836e92379
--- /dev/null
+++ b/src/heat2urbanimpact/StatisticalProcessor.py
@@ -0,0 +1,10 @@
+# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+######################################################
+# Here is the next stage to aggreate the results
+# from the statistical analysis
+# WE MIGHT NOT NEED THIS STAGE AT ALL AND EVERYTHING CAN BE
+# DONE IN THE STATISTICAL ANALYSIS STAGE
+######################################################
\ No newline at end of file
diff --git a/src/heat2urbanimpact/__init__.py b/src/heat2urbanimpact/__init__.py
index 5833f74468635e1a399da35642de3d572009cf0e..d4e33dfb2108efe9a02c726390f68bc1c61b59c6 100644
--- a/src/heat2urbanimpact/__init__.py
+++ b/src/heat2urbanimpact/__init__.py
@@ -12,7 +12,6 @@ from __future__ import annotations
 import heat2urbanimpact  # noqa: F401
 
 from . import _version
-from .ensemble_climpact import Heat2UrbanImpactEnsemble
 
 __version__ = _version.get_versions()["version"]
 
@@ -32,4 +31,4 @@ __email__ = "bente.tiedje@hereon.de, astrid.ziemann@tu-dresden.de"
 __status__ = "Pre-Alpha"
 
 
-__all__ = ["__version__", "heat2urbanimpact", "Heat2UrbanImpact"]
+__all__ = ["__version__"]
diff --git a/src/heat2urbanimpact/climpact_call.py b/src/heat2urbanimpact/climpact_call.py
deleted file mode 100644
index 01f98e186df2d9b5e39d9cf1391998ea955c9836..0000000000000000000000000000000000000000
--- a/src/heat2urbanimpact/climpact_call.py
+++ /dev/null
@@ -1,87 +0,0 @@
-# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
-#
-# SPDX-License-Identifier: BSD-3-Clause
-
-import logging
-
-from climpact import RunDirectory
-
-logger = logging.getLogger("Heat2UrbanImpact")
-logger.setLevel(logging.DEBUG)
-ch = logging.StreamHandler()
-formatter = logging.Formatter(
-    "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
-)
-ch.setFormatter(formatter)
-logger.addHandler(ch)
-
-
-class Heat2UrbanImpact:
-    def __init__(self):
-        logger.info(
-            "I'm a simple class to show you functionality of Climact hier in Heat2UrbanImpact plugin - buckle up, things are about to get warm... 🔥"
-        )
-
-    def run_directory_simulation(
-        self,
-        files,
-        variables,
-        shape_file=None,
-        region=None,
-        mask=None,
-        mask_method="centres",
-        abort_on_error=False,
-        save_path=None,
-    ):
-        logger.debug(
-            f"Running simulation on files: {files}. Variables considered: {variables}."
-        )
-        if shape_file:
-            logger.debug(
-                f"Applying mask from shape file: {shape_file}. Region selected: {region or 'whole geometry'}."
-            )
-        if mask:
-            logger.debug(
-                f"Using land-sea mask: {mask[0]} with type: {'land' if mask[1] == 0 else 'sea'}."
-            )
-
-        try:
-            rd = RunDirectory(
-                files=files,
-                variables=variables,
-                shape_file=shape_file,
-                region=region,
-                mask=mask,
-                mask_method=mask_method,
-                abort_on_error=abort_on_error,
-            )
-            logger.info(
-                "Simulation initialized successfully. Processing data... 🌍"
-            )
-            dataset = rd.dataset
-
-            if dataset is None:
-                logger.warning("No data available in the selected region")
-
-            bounding_box = rd.bounding_box
-            if bounding_box:
-                logger.debug(
-                    f"Bounding box of selected region: {bounding_box}."
-                )
-
-            if save_path:
-                logger.debug(f"Saving dataset to {save_path}")
-                rd.save_data(file=save_path, dset=dataset, filetype="nc")
-                logger.info(
-                    f"Data saved successfully to {save_path}. Time to celebrate, let's toast with some ice-cream! 🍦"
-                )
-
-            logger.info(
-                f"Proccess completed. data processed for {len(files)} files."
-            )
-            return dataset
-
-        except Exception as e:
-            logger.error(f"Error during simulation: {e}. Abort mission! 🚨")
-            if abort_on_error:
-                raise
diff --git a/src/heat2urbanimpact/ensemble_climpact.py b/src/heat2urbanimpact/ensemble_climpact.py
deleted file mode 100644
index 4f07e28c4811ca2daeb2c86939e328e82864e657..0000000000000000000000000000000000000000
--- a/src/heat2urbanimpact/ensemble_climpact.py
+++ /dev/null
@@ -1,195 +0,0 @@
-# SPDX-FileCopyrightText: 2024 Deutsche Klimarechenzentrum
-#
-# SPDX-License-Identifier: BSD-3-Clause
-
-from __future__ import annotations
-
-import json
-import logging
-from pathlib import Path
-from typing import Any, Dict, List, Optional, Union
-
-import numpy as np
-import pandas as pd
-import xarray as xr
-from climpact import Averager, RunDirectory, UnitConverter
-from dask.distributed import Client
-from dask_jobqueue import SLURMCluster
-
-logger = logging.getLogger("Heat2UrbanImpact")
-
-class Heat2UrbanImpactEnsemble:
-    """Process and analyze heat impact data for urban areas using climpact."""
-
-    @staticmethod
-    def create_dask_cluster(
-        account: str,
-        workers: int,
-        queue: str = "compute",
-        memory: str = "256GiB",
-        interface: str = "ib0",
-        cores: int = 256,
-        use_dask: bool = True,
-    ) -> Optional[Client]:
-        """Initialize a dask distributed cluster for parallel processing."""
-        if not use_dask:
-            return None
-
-        cluster = SLURMCluster(
-            account=account,
-            queue=queue,
-            memory=memory,
-            interface=interface,
-            cores=cores,
-        )
-        cluster.scale(n=workers)
-        client = Client(cluster)
-        logger.info(f"Scaling distributed client to {workers} workers")
-        client.wait_for_workers(workers)
-        return client
-
-    @classmethod
-    def from_dict(cls, config_file: Union[str, Path]) -> Heat2UrbanImpactEnsemble:
-        """Create an ensemble instance from configuration file."""
-        with open(config_file) as f:
-            cfg = json.load(f)
-
-        # Initialize dask cluster if needed
-        client = cls.create_dask_cluster(
-            cfg.get("account", "ch1187"),
-            workers=9,  # One per ensemble member
-            use_dask=cfg.get("use_dask", True)
-        )
-
-        try:
-            # Use climpact's RunDirectory to load and process data
-            run_dir = RunDirectory(
-                variables=["tas", "ta300", "ta500", "ta700", "ta950"],
-                shape_file=cfg.get("shape_file"),
-                region=cfg["region"],
-                model="nukleus",  # Fixed for prototype
-                parallel=True,
-                exp=cfg["experiment"]
-            )
-
-            # Process data based on event parameters
-            processed_data = cls._process_heat_events(
-                run_dir.dataset,
-                event_type=cfg["event"],
-                event_length=cfg["length_of_event"],
-                months=cfg["months_of_event"]
-            )
-
-            # Apply unit conversions using climpact's UnitConverter
-            processed_data = cls._convert_units(processed_data)
-
-            return cls(
-                processed_data,
-                cfg["impact_model"],
-                output_dir=cfg["output_dir"]
-            )
-
-        finally:
-            if client:
-                client.close()
-
-    @staticmethod
-    def _convert_units(dataset: xr.Dataset) -> xr.Dataset:
-        """Convert units using climpact's UnitConverter."""
-        # Convert temperature to Celsius
-        for var in ["tas", "ta300", "ta500", "ta700", "ta950"]:
-            if var in dataset:
-                dataset[var] = UnitConverter.convert(dataset[var], "degC")
-                dataset[var].attrs["units"] = "°C"
-        return dataset
-
-    @staticmethod
-    def _process_heat_events(
-        data: xr.Dataset,
-        event_type: str,
-        event_length: int,
-        months: str
-    ) -> xr.Dataset:
-        """Process data to identify and analyze heat events using climpact's Averager."""
-        # Filter for specified season
-        season_map = {
-            "DJF": [12, 1, 2],
-            "MAM": [3, 4, 5],
-            "JJA": [6, 7, 8],
-            "SON": [9, 10, 11]
-        }
-        
-        season_months = season_map.get(months, [6, 7, 8])  # Default to JJA
-        seasonal_data = data.sel(time=data.time.dt.month.isin(season_months))
-
-        # Use climpact's Averager for temporal averaging
-        averaged_data = Averager.moving_average(
-            seasonal_data,
-            window=event_length,
-            dim="time",
-            keep_attrs=True
-        )
-
-        # Apply event-specific processing
-        if event_type == "heat_wave":
-            # Define heat wave as periods where temperature exceeds 95th percentile
-            threshold = averaged_data.tas.quantile(0.95, dim=("time", "member"))
-            heat_mask = averaged_data.tas > threshold
-            averaged_data = averaged_data.where(heat_mask)
-        elif event_type == "extreme_heat":
-            # Define extreme heat as periods where temperature exceeds 99th percentile
-            threshold = averaged_data.tas.quantile(0.99, dim=("time", "member"))
-            heat_mask = averaged_data.tas > threshold
-            averaged_data = averaged_data.where(heat_mask)
-
-        return averaged_data
-
-    def __init__(
-        self,
-        data: xr.Dataset,
-        impact_model: str,
-        output_dir: Optional[Union[str, Path]] = None
-    ):
-        """Initialize the Heat2UrbanImpact ensemble."""
-        self.data = data
-        self.impact_model = impact_model
-        self.output_dir = Path(output_dir or ".").expanduser().absolute()
-        
-    def analyze_impacts(self) -> Dict[str, Any]:
-        """Analyze heat impacts using the specified impact model."""
-        impact_results = {}
-        
-        # Calculate basic impact metrics
-        for var in self.data.data_vars:
-            # Calculate mean intensity of heat events
-            impact_results[f"{var}_mean_intensity"] = float(
-                self.data[var].mean().values
-            )
-            
-            # Calculate frequency of heat events
-            valid_times = (~np.isnan(self.data[var])).sum(dim="time")
-            total_times = len(self.data.time)
-            impact_results[f"{var}_frequency"] = float(
-                (valid_times / total_times).mean().values
-            )
-            
-            # Calculate maximum intensity
-            impact_results[f"{var}_max_intensity"] = float(
-                self.data[var].max().values
-            )
-
-        return impact_results
-
-    def save_results(self):
-        """Save analysis results to NetCDF and JSON files."""
-        results_dir = self.output_dir / "results"
-        results_dir.mkdir(exist_ok=True, parents=True)
-        
-        # Save processed data
-        self.data.to_netcdf(results_dir / "processed_data.nc")
-
-        # Save impact analysis
-        with open(results_dir / "impact_analysis.json", "w") as f:
-            json.dump(self.analyze_impacts(), f, indent=4)
-
-        logger.info(f"Results saved to {results_dir}")
\ No newline at end of file
diff --git a/src/tests/conftest.py b/src/tests/conftest.py
index 00defee00a8fcdfcbe158984e15dc3815e8770f8..7aa520b4fc4224713011c99e92f9d9082639b807 100644
--- a/src/tests/conftest.py
+++ b/src/tests/conftest.py
@@ -11,6 +11,7 @@ import pytest
 
 def update_evaluation_system_config():
     import configparser
+
     evaluation_system_config_file = "plugin_env/freva/evaluation_system.conf"
     config = configparser.ConfigParser()
     config.read(evaluation_system_config_file)
diff --git a/wrapper.py b/wrapper.py
new file mode 100644
index 0000000000000000000000000000000000000000..4909c3d2cf78a1f8ea02de975b707178f53bce71
--- /dev/null
+++ b/wrapper.py
@@ -0,0 +1,370 @@
+# SPDX-FileCopyrightText: 2024 Climate Service Center Germany, Technische Universität Dresden
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+"""
+Heat2UrbanImpact plugin API wrapper.
+"""
+
+######################################################
+# import commonly used libraries. You can add/remove
+# libraries as needed
+######################################################
+
+import json
+import logging
+import os
+from getpass import getuser
+from pathlib import Path
+from tempfile import NamedTemporaryFile
+from typing import List, Optional
+import freva
+from assets.climpact_assets import MUNICIPALITIES
+from evaluation_system.api import plugin
+from evaluation_system.api.parameters import Bool, File, Integer
+from evaluation_system.api.parameters import ParameterDictionary as ParamDict
+from evaluation_system.api.parameters import SelectField, SolrField, String
+from evaluation_system.misc import config, logger
+from evaluation_system.model.solr import SolrFindFiles
+
+
+
+class Heat2UrbanImpact(plugin.PluginAbstract):
+    ######################################################
+    # Define the details for the plugin
+    ######################################################
+
+    # Version of the Heat2UrbanImpact plugin (major, minor, patch) * Mandatory
+    __version__ = (2024, 11, 0)
+    # Short Description of the Heat2UrbanImpact plugin * Mandatory
+    __short_description__: str = "Barrier-free RCM data, representative for heat events, for urban impact models."
+    # Optional category this plugin belongs to
+    __category__: Optional[str] = "Time Series"
+    # Optional tags, that are the plugin can be described with and found by
+    __tags__: Optional[List[str]] = ["heat events", "urban impact model"]
+    # Optional author of the plugin
+    tool_developer = {
+        "name": "Bente Tiedje, Astrid Ziemann",
+        "email": "bente.tiedje@hereon.de, astrid.ziemann@tu-dresden.de",
+    }
+    # Optional long description of the author of the plugin
+    __long_description__: Optional[
+        str
+    ] = "Extension or composition of various existing plugins or program parts for the barrier-free transfer of meteorological data (representative of certain climatological heat events) into an urban climate model"
+
+    ######################################################
+    # Define the parameters for the plugin * Mandatory
+    ######################################################
+
+    __parameters__ = ParamDict(
+        File(
+            name="shape_file",
+            file_extension="geojson",
+            help=(
+                "Select a geo reference file defining your region of interest. If None (default), "
+                "the whole region defined in the climate data will be taken. Note: Either select a "
+                "path on the HPC system or a web URL."
+            ),
+            default=None,
+        ),
+        SelectField(
+            name="region",
+            options={mun: mun for mun in [""] + sorted(MUNICIPALITIES)},
+            help=(
+                "Select a pre-defined German municipality. Only applies if no shape file chosen."
+            ),
+        ),
+        String(
+            name="split_by",
+            help=(
+                "Key to split multiple geometries in geo reference file into sub-regions. Values "
+                "will be used to distinguish between different sub-regions."
+            ),
+        ),
+        SolrField(
+            name="experiment",
+            mandatory=True,
+            facet="experiment",
+            help="Select a climate model experiment.",
+            max_items=1,
+            predefined_facets={
+                "project": ["nukleus"],
+                "product": ["ceu-3"],
+                "time_frequency": ["1hr"],
+                "variable": ["tas", "ta300", "ta500", "ta700", "ta950"],
+            },
+        ),
+        SolrField(
+            name="models",
+            mandatory=True,
+            facet="model",
+            multiple=True,
+            max_items=100,
+            predefined_facets={
+                "project": ["nukleus"],
+                "product": ["ceu-3"],
+                "time_frequency": ["1hr"],
+                "variable": ["tas", "ta300", "ta500", "ta700", "ta950"],
+            },
+            help=(
+                "Select climate model(s). Multiple models can be chosen for simultaneous output."
+            ),
+        ),
+        SelectField(
+            name="event",
+            default="Heat Wave",
+            options={
+                "heat_wave": "Heat Wave",
+                "extreme_heat": "Extreme Heat"
+            },
+            help="Select the type of heat event to analyze. IT'S NOT IMPLEMENTED YET.",
+        ),
+        Integer(
+            name="length_of_event",
+            default=3,
+            help="Duration of the heat event in days. IT'S NOT IMPLEMENTED YET.",
+        ),
+        SelectField(
+            name="months_of_event",
+            default="Summer (Jun-Aug)",
+            options={
+                "JJA": "Summer (Jun-Aug)",
+                "DJF": "Winter (Dec-Feb)",
+                "MAM": "Spring (Mar-May)",
+                "SON": "Autumn (Sep-Nov)"
+            },
+            help="Select the season for the analysis. IT'S NOT IMPLEMENTED YET.",
+        ),
+        SelectField(
+            name="impact_model",
+            default="Basic Impact Model",
+            options={
+                "basic": "Basic Impact Model",
+                "advanced": "Advanced Impact Model"
+            },
+            help="Select the impact model to use for analysis. IT'S NOT IMPLEMENTED YET.",
+        ),
+        String(
+            name="start",
+            help=(
+                "First timestep to process. If empty (default), uses first available timestep."
+            ),
+            default=None,
+        ),
+        String(
+            name="end",
+            help=(
+                "Last timestep to process. If empty (default), uses last available timestep."
+            ),
+            default=None,
+        ),
+        String(
+            name="output_units",
+            default="",
+            help=(
+                "Unit conversion specification. Format: variable:unit/multiplier. Examples: "
+                "'pr:mm/h' or 'pr:3600' for precipitation. Multiple: 'pr:3600,tas:degC'."
+            ),
+        ),
+        SelectField(
+            name="output_file_type",
+            default="nc",
+            options={"nc": "nc", "csv": "csv", "h5": "hdf5", "zarr": "zarr"},
+            help="Select output file format.",
+        ),
+        SelectField(
+            name="mask_type",
+            default="none",
+            options={"none": "none", "land": "land", "sea": "sea"},
+            help=(
+                "Surface type to mask. none: no mask, land: mask land, sea: mask water areas."
+            ),
+        ),
+        SelectField(
+            name="mask_method",
+            default="centres",
+            options={"centres": "centres", "corners": "corners"},
+            help=(
+                "How to determine masked region. centres: only grid-cell centres within polygon. "
+                "corners: any grid-cell corner within polygon (less restrictive)."
+            ),
+        ),
+        Bool(
+            name="plot_map",
+            default=True,
+            help=(
+                "Generate maps for each variable/model to verify projection and masking."
+            ),
+        ),
+        File(
+            name="pre_process_module",
+            file_extension="py",
+            help=(
+                "Python file with custom processing routines. If not set, calculates time series "
+                "of selected variables."
+            ),
+            default=None,
+        ),
+        String(
+            name="pre_process_function",
+            help=(
+                "Name of pre-processing function in pre_process_module. Only used if module set."
+            ),
+            default="pre_proc",
+        ),
+    )
+    ######################################################
+    # a couple of functions to collect the files
+    # !! THERE IS NO NEED TO CHANGE ANYTHING HERE !!
+    ######################################################
+    @staticmethod
+    def _drs_search(**search_kw):
+        kw = search_kw.copy()
+        files = sorted(freva.databrowser(**kw))
+        if files:
+            return files
+
+    def _get_files(
+        self, variable, experiment, model, product, project, freq, start, end
+    ):
+        files = {}
+        time = {}
+        if start and end:
+            time = {"time": f"{start}to{end}"}
+        elif start:
+            time = {"time": f"{start}to9999"}
+        elif end:
+            time = {"time": f"0to{end}"}
+
+        search_kw = dict(
+            variable=variable,
+            experiment=experiment,
+            model=model,
+            time_frequency=freq,
+        )
+        search_kw.update(time)
+        if product:
+            search_kw["product"] = product
+        if project:
+            search_kw["project"] = project
+        experiment_facets = freva.facet_search(facet=["ensemble"], **search_kw)
+        for ens in experiment_facets["ensemble"]:
+            search_kw["ensemble"] = ens
+            files_found = self._drs_search(**search_kw)
+            if not files_found:
+                logger.warning("No files found for %s", ens)
+            else:
+                files[ens] = files_found
+        return files
+
+    def get_mask(self, mask_type, **kwargs):
+        """Get the land-sea mask for a setup."""
+        setup = kwargs.copy()
+        if mask_type is None or mask_type == "none":
+            return
+        setup["variable"] = "sftlf"
+        files = self._drs_search(**setup)
+        if files:
+            return str(files[0]), mask_type
+        logger.warning(
+            "No land-sea mask found for setup, searching for alternatives"
+        )
+        # Get rid of the model contraint
+        setup.pop("model")
+        files = self._drs_search(**setup)
+        if files:
+            return str(files[0]), mask_type
+        raise ValueError("No land-sea mask found for setup")
+    ######################################################
+
+    def run_tool(self, config_dict):
+        # Define pre-defined facets for the plugin
+        config_dict["project"] = "nukleus"
+        config_dict["product"] = "ceu-3"
+        config_dict["time_frequency"] = "1hr"
+        config_dict["variable"] = ["tas", "ta300", "ta500", "ta700", "ta950"]
+
+        out_dir = self._special_variables.substitute({"d": "$USER_OUTPUT_DIR"})
+        out_dir = Path(out_dir["d"]) / str(self.rowid)
+        debug = logger.getEffectiveLevel() <= logging.DEBUG
+        config_dict["output_dir"] = str(out_dir)
+        out_dir.mkdir(exist_ok=True, parents=True)
+        models = config_dict.pop("models")
+        units = {}
+        for string in (
+            config_dict.pop("output_units").strip("{").strip("}").split(",")
+        ):
+            var, _, unit = string.strip().partition(":")
+            if var:
+                try:
+                    units[var.strip()] = float(unit.strip())
+                except ValueError:
+                    units[var.strip()] = unit.strip()
+        config_dict["output_units"] = units
+        files = {}
+        search_kw = dict(
+            model=models,
+            experiment=config_dict["experiment"],
+            variable=config_dict["variable"],
+        )
+        for key in ("project", "product"):
+            if config_dict[key] is not None:
+                search_kw[key] = config_dict[key]
+        config_dict["mask"] = self.get_mask(
+            config_dict.pop("mask_type"), **search_kw
+        )
+        if config_dict["project"] is None:
+            config_dict["project"] = [
+                project
+                for project in SolrFindFiles.facets(**search_kw)["project"][
+                    ::2
+                ]
+                if project
+            ]
+        if isinstance(models, str):
+            models = [models]
+        for model in models:
+            files[model] = self._get_files(
+                config_dict["variable"],
+                config_dict["experiment"],
+                model,
+                config_dict["product"],
+                config_dict["project"],
+                config_dict["time_frequency"],
+                config_dict["start"],
+                config_dict["end"],
+            )
+        config_dict["swift_key"] = os.environ.get("LC_TELEPHONE", None)
+        options = config.get_section("scheduler_options")
+        config_dict["account"] = options.get("project") or getuser()
+        config_dict["files"] = files
+        config.reloadConfiguration()
+        this_dir = Path(__file__).parent.absolute()
+        config_dict["kernel_name"] = config.get("project_name", "freva")
+        python_env = this_dir / "plugin_env" / "bin" / "python"
+        tool_path = this_dir / "builder.py"
+        if not config_dict["shape_file"]:
+            config_dict["shape_file"] = str(this_dir / "assets" / "GER.shp")
+            for num, mun in enumerate(MUNICIPALITIES):
+                if mun.lower() == config_dict["region"].lower():
+                    config_dict["region"] = str(num)
+                    break
+        else:
+            config_dict["region"] = ""
+        config_dict["debug"] = False
+        for key, value in config_dict.items():
+            if value is None:
+                config_dict[key] = ""
+        if debug:
+            config_dict["abort_on_error"] = True
+        config_dict["debug"] = debug
+        with NamedTemporaryFile(suffix=".json") as tf:
+            with open(tf.name, "w") as f:
+                json.dump(config_dict, f, indent=3)
+            cmd = "{} -B {} {}".format(python_env, tool_path, tf.name)
+            _ = self.call(cmd)
+        for path in ("dask-worker-space", "__pycache__"):
+            rmpath = Path(config_dict["output_dir"]) / path
+            if rmpath.is_dir():
+                os.system("rm -r %s" % str(rmpath))
+        return self.prepare_output(config_dict["output_dir"])