diff --git a/.gitignore b/.gitignore
index e109cec7c7622cee9d9a635cc458b9c662fc4761..9ac8bb7635bb12d5e3bc32182a90d0f3ba985c58 100644
--- a/.gitignore
+++ b/.gitignore
@@ -73,7 +73,7 @@ report.html
 
 # secret variables #
 ####################
-/src/configuration/join_settings.py
+/mlair/configuration/join_settings.py
 
 # ignore locally build documentation #
 ######################################
diff --git a/README.md b/README.md
index baae0af91036da10ba70f154ac875c18908858c3..7696415b9d9ad2168ad54b2d45b2b1606d39d89f 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,25 @@
-# MachineLearningTools
-
-This is a collection of all relevant functions used for ML stuff in the ESDE group
-
-## Inception Model
-
-See a description [here](https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-network-7fc52b863202)
-or take a look on the papers [Going Deeper with Convolutions (Szegedy et al., 2014)](https://arxiv.org/abs/1409.4842)
-and [Network In Network (Lin et al., 2014)](https://arxiv.org/abs/1312.4400).
+# MLAir - Machine Learning on Air Data
 
+MLAir (Machine Learning on Air data) is an environment that simplifies and accelerates the creation of new machine 
+learning (ML) models for the analysis and forecasting of meteorological and air quality time series.
 
 # Installation
 
 * Install __proj__ on your machine using the console. E.g. for opensuse / leap `zypper install proj`
-* c++ compiler required for cartopy installation
-
-## HPC - JUWELS and HDFML setup
-The following instruction guide you throug the installation on JUWELS and HDFML. 
-* Clone the repo to HPC system (we recommend to place it in `/p/projects/<project name>`.
+* A c++ compiler is required for the installation of the program __cartopy__
+* Install all requirements from `requirements.txt` preferably in a virtual environment
+* Installation of MLAir:
+    * Either clone MLAir from its repository in gitlab (link??) and use it without installation 
+    * or download the distribution file (?? .whl) and install it via `pip install <??>`. In this case, you can simply
+    import MLAir in any python script inside your virtual environment using `import mlair`.
+    
+## Special instructions for installation on Jülich HPC systems
+
+_Please note, that the HPC setup is customised for JUWELS and HDFML. When using another HPC system, you can use the HPC 
+setup files as a skeleton and customise it to your needs._
+
+The following instruction guide you through the installation on JUWELS and HDFML. 
+* Clone the repo to HPC system (we recommend to place it in `/p/projects/<project name>`).
 * Setup venv by executing `source setupHPC.sh`. This script loads all pre-installed modules and creates a venv for 
 all other packages. Furthermore, it creates slurm/batch scripts to execute code on compute nodes. <br> 
 You have to enter the HPC project's budget name (--account flag).
@@ -27,9 +30,6 @@ You have to enter the HPC project's budget name (--account flag).
 * Execute either `sbatch run_juwels_develgpus.bash` or `sbatch run_hdfml_batch.bash` to verify that the setup went well.
 * Currently cartopy is not working on our HPC system, therefore PlotStations does not create any output.
 
-### HPC JUWELS and HDFML remarks 
-Please note, that the HPC setup is customised for JUWELS and HDFML. When using another HPC system, you can use the HPC setup files as a skeleton and customise it to your needs. 
-
 Note: The method `PartitionCheck` currently only checks if the hostname starts with `ju` or `hdfmll`. 
 Therefore, it might be necessary to adopt the `if` statement in `PartitionCheck._run`.
 
@@ -39,8 +39,7 @@ Therefore, it might be necessary to adopt the `if` statement in `PartitionCheck.
 * To use hourly data from ToarDB via JOIN interface, a private token is required. Request your personal access token and
 add it to `src/join_settings.py` in the hourly data section. Replace the `TOAR_SERVICE_URL` and the `Authorization` 
 value. To make sure, that this **sensitive** data is not uploaded to the remote server, use the following command to
-prevent git from tracking this file: `git update-index --assume-unchanged src/join_settings.py
-`
+prevent git from tracking this file: `git update-index --assume-unchanged src/join_settings.py`
 
 # Customise your experiment
 
@@ -97,3 +96,10 @@ station-wise std is a decent estimate of the true std.
 scaling values instead of the calculation method. For method *centre*, std can still be None, but is required for the
 *standardise* method. **Important**: Format of given values **must** match internal data format of DataPreparation 
 class: `xr.DataArray` with `dims=["variables"]` and one value for each variable.
+
+
+## Inception Model
+
+See a description [here](https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-network-7fc52b863202)
+or take a look on the papers [Going Deeper with Convolutions (Szegedy et al., 2014)](https://arxiv.org/abs/1409.4842)
+and [Network In Network (Lin et al., 2014)](https://arxiv.org/abs/1312.4400).
diff --git a/docs/_source/conf.py b/docs/_source/conf.py
index 6363f57eb45e686f6f2ef8ab07806e4feba0fe2d..ac1131a008f5c95a62718def6046085294f6efba 100644
--- a/docs/_source/conf.py
+++ b/docs/_source/conf.py
@@ -55,7 +55,7 @@ extensions = [
 autosummary_generate = True
 
 autoapi_type = 'python'
-autoapi_dirs = ['../../src/.']
+autoapi_dirs = ['../../mlair/.']
 
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
diff --git a/src/__init__.py b/mlair/__init__.py
similarity index 79%
rename from src/__init__.py
rename to mlair/__init__.py
index 5b7073ff042f6173fd78362f55d698eb6745552f..8ff82e6c3457922927fa637579935a172a64bb7b 100644
--- a/src/__init__.py
+++ b/mlair/__init__.py
@@ -4,9 +4,9 @@ __version_info__ = {
     'micro': 0,
 }
 
-from src.run_modules import *
-from src.workflows import DefaultWorkflow, Workflow
-
+from mlair.run_modules import *
+from mlair.workflows import DefaultWorkflow, Workflow
+from mlair.run_script import run
 
 
 def get_version():
diff --git a/src/configuration/.gitignore b/mlair/configuration/.gitignore
similarity index 100%
rename from src/configuration/.gitignore
rename to mlair/configuration/.gitignore
diff --git a/src/configuration/__init__.py b/mlair/configuration/__init__.py
similarity index 100%
rename from src/configuration/__init__.py
rename to mlair/configuration/__init__.py
diff --git a/src/configuration/defaults.py b/mlair/configuration/defaults.py
similarity index 100%
rename from src/configuration/defaults.py
rename to mlair/configuration/defaults.py
diff --git a/src/configuration/join_settings.py b/mlair/configuration/join_settings.py
similarity index 100%
rename from src/configuration/join_settings.py
rename to mlair/configuration/join_settings.py
diff --git a/src/configuration/path_config.py b/mlair/configuration/path_config.py
similarity index 68%
rename from src/configuration/path_config.py
rename to mlair/configuration/path_config.py
index 7af25875eea58de081012fc6040a76a04f001d54..0ef082b58cf7028ea4f71e86b6d0c4ecad6ff54d 100644
--- a/src/configuration/path_config.py
+++ b/mlair/configuration/path_config.py
@@ -6,7 +6,8 @@ import re
 import socket
 from typing import Tuple
 
-ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
+# ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
+ROOT_PATH = os.getcwd()
 
 
 def prepare_host(create_new=True, data_path=None, sampling="daily") -> str:
@@ -23,35 +24,38 @@ def prepare_host(create_new=True, data_path=None, sampling="daily") -> str:
 
     :return: full path to data
     """
-    hostname = get_host()
-    user = getpass.getuser()
-    runner_regex = re.compile(r"runner-.*-project-2411-concurrent-\d+")
-    if hostname == "ZAM144":
-        path = f"/home/{user}/Data/toar_{sampling}/"
-    elif hostname == "zam347":
-        path = f"/home/{user}/Data/toar_{sampling}/"
-    elif hostname == "linux-aa9b":
-        path = f"/home/{user}/machinelearningtools/data/toar_{sampling}/"
-    elif (len(hostname) > 2) and (hostname[:2] == "jr"):
-        path = f"/p/project/cjjsc42/{user}/DATA/toar_{sampling}/"
-    elif (len(hostname) > 2) and (hostname[:2] in ['jw', 'ju'] or hostname[:5] in ['hdfml']):
-        path = f"/p/project/deepacf/intelliaq/{user}/DATA/toar_{sampling}/"
-    elif runner_regex.match(hostname) is not None:
-        path = f"/home/{user}/machinelearningtools/data/toar_{sampling}/"
-    else:
-        raise OSError(f"unknown host '{hostname}'")
-    if not os.path.exists(path):
+    if data_path is None:
+        hostname = get_host()
+        user = getpass.getuser()
+        runner_regex = re.compile(r"runner-.*-project-2411-concurrent-\d+")
+        if hostname == "ZAM144":
+            data_path = f"/home/{user}/Data/toar_{sampling}/"
+        elif hostname == "zam347":
+            data_path = f"/home/{user}/Data/toar_{sampling}/"
+        elif hostname == "linux-aa9b":
+            data_path = f"/home/{user}/machinelearningtools/data/toar_{sampling}/"
+        elif (len(hostname) > 2) and (hostname[:2] == "jr"):
+            data_path = f"/p/project/cjjsc42/{user}/DATA/toar_{sampling}/"
+        elif (len(hostname) > 2) and (hostname[:2] in ['jw', 'ju'] or hostname[:5] in ['hdfml']):
+            data_path = f"/p/project/deepacf/intelliaq/{user}/DATA/toar_{sampling}/"
+        elif runner_regex.match(hostname) is not None:
+            data_path = f"/home/{user}/machinelearningtools/data/toar_{sampling}/"
+        else:
+            data_path = os.path.join(os.getcwd(), "data", sampling)
+            # raise OSError(f"unknown host '{hostname}'")
+
+    if not os.path.exists(data_path):
         try:
             if create_new:
-                check_path_and_create(path)
-                return path
+                check_path_and_create(data_path)
+                return data_path
             else:
                 raise PermissionError
         except PermissionError:
-            raise NotADirectoryError(f"path '{path}' does not exist for host '{hostname}'.")
+            raise NotADirectoryError(f"path '{data_path}' does not exist for host '{hostname}'.")
     else:
-        logging.debug(f"set path to: {path}")
-        return path
+        logging.debug(f"set path to: {data_path}")
+        return data_path
 
 
 def set_experiment_path(name: str, path: str = None) -> str:
diff --git a/src/data_handling/__init__.py b/mlair/data_handling/__init__.py
similarity index 100%
rename from src/data_handling/__init__.py
rename to mlair/data_handling/__init__.py
diff --git a/src/data_handling/bootstraps.py b/mlair/data_handling/bootstraps.py
similarity index 98%
rename from src/data_handling/bootstraps.py
rename to mlair/data_handling/bootstraps.py
index f50775900c053cbef0c94e6a3e2743c9a017bf88..4e72b2b81476d04aec819cc6be0fdfd585e5eaf9 100644
--- a/src/data_handling/bootstraps.py
+++ b/mlair/data_handling/bootstraps.py
@@ -22,8 +22,8 @@ import keras
 import numpy as np
 import xarray as xr
 
-from src import helpers
-from src.data_handling.data_generator import DataGenerator
+from mlair import helpers
+from mlair.data_handling.data_generator import DataGenerator
 
 
 class BootStrapGenerator(keras.utils.Sequence):
@@ -361,9 +361,9 @@ class BootStraps:
 
 if __name__ == "__main__":
 
-    from src.run_modules.experiment_setup import ExperimentSetup
-    from src.run_modules.run_environment import RunEnvironment
-    from src.run_modules.pre_processing import PreProcessing
+    from mlair.run_modules.experiment_setup import ExperimentSetup
+    from mlair.run_modules.run_environment import RunEnvironment
+    from mlair.run_modules.pre_processing import PreProcessing
 
     formatter = '%(asctime)s - %(levelname)s: %(message)s  [%(filename)s:%(funcName)s:%(lineno)s]'
     logging.basicConfig(format=formatter, level=logging.INFO)
diff --git a/src/data_handling/data_distributor.py b/mlair/data_handling/data_distributor.py
similarity index 98%
rename from src/data_handling/data_distributor.py
rename to mlair/data_handling/data_distributor.py
index 2600afcbd8948c26a2b4cf37329b424cac69f40a..bba5f2636f802e2d6843ef4a5ba5e6537c70dd61 100644
--- a/src/data_handling/data_distributor.py
+++ b/mlair/data_handling/data_distributor.py
@@ -29,7 +29,7 @@ import math
 import keras
 import numpy as np
 
-from src.data_handling.data_generator import DataGenerator
+from mlair.data_handling.data_generator import DataGenerator
 
 
 class Distributor(keras.utils.Sequence):
diff --git a/src/data_handling/data_generator.py b/mlair/data_handling/data_generator.py
similarity index 99%
rename from src/data_handling/data_generator.py
rename to mlair/data_handling/data_generator.py
index 6747e82e0da2d1a68c99a09d75c76cdcd53a05ba..4c61454b0c751eeb6338f6f4e9072cabe14379a1 100644
--- a/src/data_handling/data_generator.py
+++ b/mlair/data_handling/data_generator.py
@@ -12,9 +12,9 @@ import dask.array as da
 import keras
 import xarray as xr
 
-from src import helpers
-from src.data_handling.data_preparation import DataPrep
-from src.helpers.join import EmptyQueryResult
+from mlair import helpers
+from mlair.data_handling.data_preparation import DataPrep
+from mlair.helpers.join import EmptyQueryResult
 
 number = Union[float, int]
 num_or_list = Union[number, List[number]]
diff --git a/src/data_handling/data_preparation.py b/mlair/data_handling/data_preparation.py
similarity index 99%
rename from src/data_handling/data_preparation.py
rename to mlair/data_handling/data_preparation.py
index fa7388e7d5510eae71a65ebc108f9a6dc3b0a2ff..f500adec5c7a2d7fac67f3e6e9ba2fc61079c115 100644
--- a/src/data_handling/data_preparation.py
+++ b/mlair/data_handling/data_preparation.py
@@ -13,9 +13,9 @@ import numpy as np
 import pandas as pd
 import xarray as xr
 
-from src.configuration import check_path_and_create
-from src import helpers
-from src.helpers import join, statistics
+from mlair.configuration import check_path_and_create
+from mlair import helpers
+from mlair.helpers import join, statistics
 
 # define a more general date type for type hinting
 date = Union[dt.date, dt.datetime]
diff --git a/src/helpers/__init__.py b/mlair/helpers/__init__.py
similarity index 100%
rename from src/helpers/__init__.py
rename to mlair/helpers/__init__.py
diff --git a/src/helpers/datastore.py b/mlair/helpers/datastore.py
similarity index 100%
rename from src/helpers/datastore.py
rename to mlair/helpers/datastore.py
diff --git a/src/helpers/helpers.py b/mlair/helpers/helpers.py
similarity index 100%
rename from src/helpers/helpers.py
rename to mlair/helpers/helpers.py
diff --git a/src/helpers/join.py b/mlair/helpers/join.py
similarity index 98%
rename from src/helpers/join.py
rename to mlair/helpers/join.py
index 7d9c3aad23c402ae63f26bdf998074a86e35ffbf..a3c6876e3ea43ff4d03243430cf6cd791d62dec2 100644
--- a/src/helpers/join.py
+++ b/mlair/helpers/join.py
@@ -9,8 +9,8 @@ from typing import Iterator, Union, List, Dict
 import pandas as pd
 import requests
 
-from src import helpers
-from src.configuration.join_settings import join_settings
+from mlair import helpers
+from mlair.configuration.join_settings import join_settings
 
 # join_url_base = 'https://join.fz-juelich.de/services/rest/surfacedata/'
 str_or_none = Union[str, None]
diff --git a/src/helpers/logger.py b/mlair/helpers/logger.py
similarity index 100%
rename from src/helpers/logger.py
rename to mlair/helpers/logger.py
diff --git a/src/helpers/statistics.py b/mlair/helpers/statistics.py
similarity index 100%
rename from src/helpers/statistics.py
rename to mlair/helpers/statistics.py
diff --git a/src/helpers/testing.py b/mlair/helpers/testing.py
similarity index 100%
rename from src/helpers/testing.py
rename to mlair/helpers/testing.py
diff --git a/src/helpers/time_tracking.py b/mlair/helpers/time_tracking.py
similarity index 100%
rename from src/helpers/time_tracking.py
rename to mlair/helpers/time_tracking.py
diff --git a/src/model_modules/__init__.py b/mlair/model_modules/__init__.py
similarity index 100%
rename from src/model_modules/__init__.py
rename to mlair/model_modules/__init__.py
diff --git a/src/model_modules/advanced_paddings.py b/mlair/model_modules/advanced_paddings.py
similarity index 100%
rename from src/model_modules/advanced_paddings.py
rename to mlair/model_modules/advanced_paddings.py
diff --git a/src/model_modules/flatten.py b/mlair/model_modules/flatten.py
similarity index 100%
rename from src/model_modules/flatten.py
rename to mlair/model_modules/flatten.py
diff --git a/src/model_modules/inception_model.py b/mlair/model_modules/inception_model.py
similarity index 99%
rename from src/model_modules/inception_model.py
rename to mlair/model_modules/inception_model.py
index 74cd4d806f706a70d554adae468e7fa8c5de153e..d7354c37899bbb7d8f80bc76b4cd9237c7df96dc 100644
--- a/src/model_modules/inception_model.py
+++ b/mlair/model_modules/inception_model.py
@@ -6,7 +6,7 @@ import logging
 import keras
 import keras.layers as layers
 
-from src.model_modules.advanced_paddings import PadUtils, ReflectionPadding2D, Padding2D
+from mlair.model_modules.advanced_paddings import PadUtils, ReflectionPadding2D, Padding2D
 
 
 class InceptionModelBase:
diff --git a/src/model_modules/keras_extensions.py b/mlair/model_modules/keras_extensions.py
similarity index 99%
rename from src/model_modules/keras_extensions.py
rename to mlair/model_modules/keras_extensions.py
index 479913811a668d8330a389b2876360f096f57dbf..33358e566ef80f28ee7740531b71d1a83abde115 100644
--- a/src/model_modules/keras_extensions.py
+++ b/mlair/model_modules/keras_extensions.py
@@ -13,7 +13,7 @@ import numpy as np
 from keras import backend as K
 from keras.callbacks import History, ModelCheckpoint, Callback
 
-from src import helpers
+from mlair import helpers
 
 
 class HistoryAdvanced(History):
diff --git a/src/model_modules/linear_model.py b/mlair/model_modules/linear_model.py
similarity index 100%
rename from src/model_modules/linear_model.py
rename to mlair/model_modules/linear_model.py
diff --git a/src/model_modules/loss.py b/mlair/model_modules/loss.py
similarity index 100%
rename from src/model_modules/loss.py
rename to mlair/model_modules/loss.py
diff --git a/src/model_modules/model_class.py b/mlair/model_modules/model_class.py
similarity index 97%
rename from src/model_modules/model_class.py
rename to mlair/model_modules/model_class.py
index dab2e168c5a9f87d4aee42fc94489fd0fa67772a..dbf7771e376d9bd68f594ecad319554c984dc974 100644
--- a/src/model_modules/model_class.py
+++ b/mlair/model_modules/model_class.py
@@ -108,7 +108,7 @@ True
 
 """
 
-import src.model_modules.keras_extensions
+import mlair.model_modules.keras_extensions
 
 __author__ = "Lukas Leufen, Felix Kleinert"
 # __date__ = '2019-12-12'
@@ -119,9 +119,9 @@ from typing import Any, Callable, Dict
 
 import keras
 import tensorflow as tf
-from src.model_modules.inception_model import InceptionModelBase
-from src.model_modules.flatten import flatten_tail
-from src.model_modules.advanced_paddings import PadUtils, Padding2D
+from mlair.model_modules.inception_model import InceptionModelBase
+from mlair.model_modules.flatten import flatten_tail
+from mlair.model_modules.advanced_paddings import PadUtils, Padding2D
 
 
 class AbstractModelClass(ABC):
@@ -392,8 +392,8 @@ class MyLittleModel(AbstractModelClass):
     def set_compile_options(self):
         self.initial_lr = 1e-2
         self.optimizer = keras.optimizers.SGD(lr=self.initial_lr, momentum=0.9)
-        self.lr_decay = src.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr, drop=.94,
-                                                                             epochs_drop=10)
+        self.lr_decay = mlair.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr, drop=.94,
+                                                                               epochs_drop=10)
         self.compile_options = {"loss": keras.losses.mean_squared_error, "metrics": ["mse", "mae"]}
 
 
@@ -468,8 +468,8 @@ class MyBranchedModel(AbstractModelClass):
     def set_compile_options(self):
         self.initial_lr = 1e-2
         self.optimizer = keras.optimizers.SGD(lr=self.initial_lr, momentum=0.9)
-        self.lr_decay = src.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr, drop=.94,
-                                                                             epochs_drop=10)
+        self.lr_decay = mlair.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr, drop=.94,
+                                                                               epochs_drop=10)
         self.compile_options = {"loss": [keras.losses.mean_absolute_error] + [keras.losses.mean_squared_error] + [
             keras.losses.mean_squared_error], "metrics": ["mse", "mae"]}
 
@@ -497,8 +497,8 @@ class MyTowerModel(AbstractModelClass):
         self.dropout_rate = 1e-2
         self.regularizer = keras.regularizers.l2(0.1)
         self.initial_lr = 1e-2
-        self.lr_decay = src.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr, drop=.94,
-                                                                             epochs_drop=10)
+        self.lr_decay = mlair.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr, drop=.94,
+                                                                               epochs_drop=10)
         self.activation = keras.layers.PReLU
 
         # apply to model
@@ -609,8 +609,8 @@ class MyPaperModel(AbstractModelClass):
         self.dropout_rate = .3
         self.regularizer = keras.regularizers.l2(0.001)
         self.initial_lr = 1e-3
-        self.lr_decay = src.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr, drop=.94,
-                                                                             epochs_drop=10)
+        self.lr_decay = mlair.model_modules.keras_extensions.LearningRateDecay(base_lr=self.initial_lr, drop=.94,
+                                                                               epochs_drop=10)
         self.activation = keras.layers.ELU
         self.padding = "SymPad2D"
 
diff --git a/src/plotting/__init__.py b/mlair/plotting/__init__.py
similarity index 100%
rename from src/plotting/__init__.py
rename to mlair/plotting/__init__.py
diff --git a/src/plotting/postprocessing_plotting.py b/mlair/plotting/postprocessing_plotting.py
similarity index 99%
rename from src/plotting/postprocessing_plotting.py
rename to mlair/plotting/postprocessing_plotting.py
index 4b7f15219ee5506f34e4fc2d76c15fb0e569394d..cf96948035d4e6da497c2f9502cdb467ee3ba9c0 100644
--- a/src/plotting/postprocessing_plotting.py
+++ b/mlair/plotting/postprocessing_plotting.py
@@ -18,9 +18,9 @@ import seaborn as sns
 import xarray as xr
 from matplotlib.backends.backend_pdf import PdfPages
 
-from src import helpers
-from src.data_handling import DataGenerator
-from src.helpers import TimeTrackingWrapper
+from mlair import helpers
+from mlair.data_handling import DataGenerator
+from mlair.helpers import TimeTrackingWrapper
 
 logging.getLogger('matplotlib').setLevel(logging.WARNING)
 
diff --git a/src/plotting/tracker_plot.py b/mlair/plotting/tracker_plot.py
similarity index 99%
rename from src/plotting/tracker_plot.py
rename to mlair/plotting/tracker_plot.py
index 20db5d9d9f22df548b1d499c4e8e0faa3fbfa1ee..406c32feb1ebda2d32d886051e32778d6c17f5db 100644
--- a/src/plotting/tracker_plot.py
+++ b/mlair/plotting/tracker_plot.py
@@ -4,7 +4,7 @@ import numpy as np
 import os
 from typing import Union, List, Optional, Dict
 
-from src.helpers import to_list
+from mlair.helpers import to_list
 
 from matplotlib import pyplot as plt, lines as mlines, ticker as ticker
 from matplotlib.patches import Rectangle
diff --git a/src/plotting/training_monitoring.py b/mlair/plotting/training_monitoring.py
similarity index 98%
rename from src/plotting/training_monitoring.py
rename to mlair/plotting/training_monitoring.py
index 473b966ce52ee7e2885bc14beef2e68b8835b15e..913c11dd8a4e0d23c2bde6864c12f17c65922644 100644
--- a/src/plotting/training_monitoring.py
+++ b/mlair/plotting/training_monitoring.py
@@ -10,7 +10,7 @@ import matplotlib
 import matplotlib.pyplot as plt
 import pandas as pd
 
-from src.model_modules.keras_extensions import LearningRateDecay
+from mlair.model_modules.keras_extensions import LearningRateDecay
 
 matplotlib.use('Agg')
 history_object = Union[Dict, keras.callbacks.History]
diff --git a/src/run_modules/README.md b/mlair/run_modules/README.md
similarity index 100%
rename from src/run_modules/README.md
rename to mlair/run_modules/README.md
diff --git a/mlair/run_modules/__init__.py b/mlair/run_modules/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..ba38d3e90fb5d66c4129f6645ef34b8137e48375
--- /dev/null
+++ b/mlair/run_modules/__init__.py
@@ -0,0 +1,7 @@
+from mlair.run_modules.experiment_setup import ExperimentSetup
+from mlair.run_modules.model_setup import ModelSetup
+from mlair.run_modules.partition_check import PartitionCheck
+from mlair.run_modules.post_processing import PostProcessing
+from mlair.run_modules.pre_processing import PreProcessing
+from mlair.run_modules.run_environment import RunEnvironment
+from mlair.run_modules.training import Training
diff --git a/src/run_modules/experiment_setup.py b/mlair/run_modules/experiment_setup.py
similarity index 98%
rename from src/run_modules/experiment_setup.py
rename to mlair/run_modules/experiment_setup.py
index a93fe403e11b6483832df417b0e97462bc252a4a..c40847eddc054e3fc32923d5fee87d4458f76754 100644
--- a/src/run_modules/experiment_setup.py
+++ b/mlair/run_modules/experiment_setup.py
@@ -6,9 +6,9 @@ import logging
 import os
 from typing import Union, Dict, Any, List
 
-from src.configuration import path_config
-from src import helpers
-from src.configuration.defaults import DEFAULT_STATIONS, DEFAULT_VAR_ALL_DICT, DEFAULT_NETWORK, DEFAULT_STATION_TYPE, \
+from mlair.configuration import path_config
+from mlair import helpers
+from mlair.configuration.defaults import DEFAULT_STATIONS, DEFAULT_VAR_ALL_DICT, DEFAULT_NETWORK, DEFAULT_STATION_TYPE, \
     DEFAULT_START, DEFAULT_END, DEFAULT_WINDOW_HISTORY_SIZE, DEFAULT_OVERWRITE_LOCAL_DATA, DEFAULT_TRANSFORMATION, \
     DEFAULT_HPC_LOGIN_LIST, DEFAULT_HPC_HOST_LIST, DEFAULT_CREATE_NEW_MODEL, DEFAULT_TRAINABLE, \
     DEFAULT_FRACTION_OF_TRAINING, DEFAULT_EXTREME_VALUES, DEFAULT_EXTREMES_ON_RIGHT_TAIL_ONLY, DEFAULT_PERMUTE_DATA, \
@@ -18,8 +18,8 @@ from src.configuration.defaults import DEFAULT_STATIONS, DEFAULT_VAR_ALL_DICT, D
     DEFAULT_VAL_MIN_LENGTH, DEFAULT_TEST_START, DEFAULT_TEST_END, DEFAULT_TEST_MIN_LENGTH, DEFAULT_TRAIN_VAL_MIN_LENGTH, \
     DEFAULT_USE_ALL_STATIONS_ON_ALL_DATA_SETS, DEFAULT_EVALUATE_BOOTSTRAPS, DEFAULT_CREATE_NEW_BOOTSTRAPS, \
     DEFAULT_NUMBER_OF_BOOTSTRAPS, DEFAULT_PLOT_LIST
-from src.run_modules.run_environment import RunEnvironment
-from src.model_modules.model_class import MyLittleModel as VanillaModel
+from mlair.run_modules.run_environment import RunEnvironment
+from mlair.model_modules.model_class import MyLittleModel as VanillaModel
 
 
 class ExperimentSetup(RunEnvironment):
diff --git a/src/run_modules/model_setup.py b/mlair/run_modules/model_setup.py
similarity index 97%
rename from src/run_modules/model_setup.py
rename to mlair/run_modules/model_setup.py
index f9683b953d85bacf6e452e0a1922e85dfe946cd1..6c05a5731056cd3926e319b6d549ca3f64ed3873 100644
--- a/src/run_modules/model_setup.py
+++ b/mlair/run_modules/model_setup.py
@@ -9,8 +9,8 @@ import os
 import keras
 import tensorflow as tf
 
-from src.model_modules.keras_extensions import HistoryAdvanced, CallbackHandler
-from src.run_modules.run_environment import RunEnvironment
+from mlair.model_modules.keras_extensions import HistoryAdvanced, CallbackHandler
+from mlair.run_modules.run_environment import RunEnvironment
 
 
 class ModelSetup(RunEnvironment):
diff --git a/src/run_modules/partition_check.py b/mlair/run_modules/partition_check.py
similarity index 93%
rename from src/run_modules/partition_check.py
rename to mlair/run_modules/partition_check.py
index 8f4c703e6b94f11905121d93c44dd8bf583abdec..c45f350079756282fbb43a1732d256c960f9e274 100644
--- a/src/run_modules/partition_check.py
+++ b/mlair/run_modules/partition_check.py
@@ -1,7 +1,7 @@
 __author__ = "Felix Kleinert"
 __date__ = '2020-04-07'
 
-from src.run_modules.run_environment import RunEnvironment
+from mlair.run_modules.run_environment import RunEnvironment
 
 
 class PartitionCheck(RunEnvironment):
diff --git a/src/run_modules/post_processing.py b/mlair/run_modules/post_processing.py
similarity index 98%
rename from src/run_modules/post_processing.py
rename to mlair/run_modules/post_processing.py
index dedcda0a6a3ff8fb9246bc6efe097eeb6b463999..f096d3b58290d8f6816962d302b5e7a10223c864 100644
--- a/src/run_modules/post_processing.py
+++ b/mlair/run_modules/post_processing.py
@@ -13,14 +13,14 @@ import numpy as np
 import pandas as pd
 import xarray as xr
 
-from src.data_handling import BootStraps, Distributor, DataGenerator, DataPrep
-from src.helpers.datastore import NameNotFoundInDataStore
-from src.helpers import TimeTracking, statistics
-from src.model_modules.linear_model import OrdinaryLeastSquaredModel
-from src.model_modules.model_class import AbstractModelClass
-from src.plotting.postprocessing_plotting import PlotMonthlySummary, PlotStationMap, PlotClimatologicalSkillScore, \
+from mlair.data_handling import BootStraps, Distributor, DataGenerator, DataPrep
+from mlair.helpers.datastore import NameNotFoundInDataStore
+from mlair.helpers import TimeTracking, statistics
+from mlair.model_modules.linear_model import OrdinaryLeastSquaredModel
+from mlair.model_modules.model_class import AbstractModelClass
+from mlair.plotting.postprocessing_plotting import PlotMonthlySummary, PlotStationMap, PlotClimatologicalSkillScore, \
     PlotCompetitiveSkillScore, PlotTimeSeries, PlotBootstrapSkillScore, PlotAvailability, PlotConditionalQuantiles
-from src.run_modules.run_environment import RunEnvironment
+from mlair.run_modules.run_environment import RunEnvironment
 
 
 class PostProcessing(RunEnvironment):
diff --git a/src/run_modules/pre_processing.py b/mlair/run_modules/pre_processing.py
similarity index 98%
rename from src/run_modules/pre_processing.py
rename to mlair/run_modules/pre_processing.py
index b4b36a20bf9ed7827a1ac151141c13122f517e33..c5955fc001dd27000e6e50d146eef129ad52f54a 100644
--- a/src/run_modules/pre_processing.py
+++ b/mlair/run_modules/pre_processing.py
@@ -10,11 +10,11 @@ from typing import Tuple, Dict, List
 import numpy as np
 import pandas as pd
 
-from src.data_handling import DataGenerator
-from src.helpers import TimeTracking
-from src.configuration import path_config
-from src.helpers.join import EmptyQueryResult
-from src.run_modules.run_environment import RunEnvironment
+from mlair.data_handling import DataGenerator
+from mlair.helpers import TimeTracking
+from mlair.configuration import path_config
+from mlair.helpers.join import EmptyQueryResult
+from mlair.run_modules.run_environment import RunEnvironment
 
 DEFAULT_ARGS_LIST = ["data_path", "network", "stations", "variables", "interpolate_dim", "target_dim", "target_var"]
 DEFAULT_KWARGS_LIST = ["limit_nan_fill", "window_history_size", "window_lead_time", "statistics_per_var", "min_length",
diff --git a/src/run_modules/run_environment.py b/mlair/run_modules/run_environment.py
similarity index 86%
rename from src/run_modules/run_environment.py
rename to mlair/run_modules/run_environment.py
index 45d0a4a019b305d477838bd9ec4c5b6f920ac6fb..ecb55282f25c369d6f5eddd81907a7d28ec7d62b 100644
--- a/src/run_modules/run_environment.py
+++ b/mlair/run_modules/run_environment.py
@@ -9,11 +9,11 @@ import os
 import shutil
 import time
 
-from src.helpers.datastore import DataStoreByScope as DataStoreObject
-from src.helpers.datastore import NameNotFoundInDataStore
-from src.helpers import Logger
-from src.helpers import TimeTracking
-from src.plotting.tracker_plot import TrackPlot
+from mlair.helpers.datastore import DataStoreByScope as DataStoreObject
+from mlair.helpers.datastore import NameNotFoundInDataStore
+from mlair.helpers import Logger
+from mlair.helpers import TimeTracking
+from mlair.plotting.tracker_plot import TrackPlot
 
 
 class RunEnvironment(object):
@@ -88,12 +88,16 @@ class RunEnvironment(object):
 
     # set data store and logger (both are mutable!)
     del_by_exit = False
-    data_store = DataStoreObject()
-    logger = Logger()
+    data_store = None
+    logger = None
     tracker_list = []
 
     def __init__(self):
         """Start time tracking automatically and logs as info."""
+        if RunEnvironment.data_store is None:
+            RunEnvironment.data_store = DataStoreObject()
+        if RunEnvironment.logger is None:
+            RunEnvironment.logger = Logger()
         self.time = TimeTracking()
         logging.info(f"{self.__class__.__name__} started")
         # atexit.register(self.__del__)
@@ -117,7 +121,7 @@ class RunEnvironment(object):
                 try:
                     self.__plot_tracking()
                     self.__save_tracking()
-                    self.__copy_log_file()
+                    self.__move_log_file()
                 except FileNotFoundError:
                     pass
                 self.data_store.clear_data_store()
@@ -132,11 +136,15 @@ class RunEnvironment(object):
             logging.error(exc_val, exc_info=(exc_type, exc_val, exc_tb))
         self.__del__()
 
-    def __copy_log_file(self):
+    def __move_log_file(self):
         try:
             new_file = self.__find_file_pattern("logging_%03i.log")
-            logging.info(f"Copy log file to {new_file}")
-            shutil.copyfile(self.logger.log_file, new_file)
+            logging.info(f"Move log file to {new_file}")
+            shutil.move(self.logger.log_file, new_file)
+            try:
+                os.rmdir(os.path.dirname(self.logger.log_file))
+            except (OSError, FileNotFoundError):
+                pass
         except (NameNotFoundInDataStore, FileNotFoundError):
             pass
 
diff --git a/src/run_modules/training.py b/mlair/run_modules/training.py
similarity index 97%
rename from src/run_modules/training.py
rename to mlair/run_modules/training.py
index 1a0d7beb1ec37bb5e59a4129da58572d79a73636..0c516c577201c62badd3d2b769a291612dce0c5a 100644
--- a/src/run_modules/training.py
+++ b/mlair/run_modules/training.py
@@ -11,10 +11,10 @@ from typing import Union
 import keras
 from keras.callbacks import Callback, History
 
-from src.data_handling import Distributor
-from src.model_modules.keras_extensions import CallbackHandler
-from src.plotting.training_monitoring import PlotModelHistory, PlotModelLearningRate
-from src.run_modules.run_environment import RunEnvironment
+from mlair.data_handling import Distributor
+from mlair.model_modules.keras_extensions import CallbackHandler
+from mlair.plotting.training_monitoring import PlotModelHistory, PlotModelLearningRate
+from mlair.run_modules.run_environment import RunEnvironment
 
 
 class Training(RunEnvironment):
diff --git a/src/run.py b/mlair/run_script.py
similarity index 97%
rename from src/run.py
rename to mlair/run_script.py
index 1494be0a75ebd1fd6a057d337ec2dcef8ed9c64f..2d1f6aeee89c32da56b088a22b06a4b03a58674b 100644
--- a/src/run.py
+++ b/mlair/run_script.py
@@ -1,7 +1,7 @@
 __author__ = "Lukas Leufen"
 __date__ = '2020-06-29'
 
-from src.workflows import DefaultWorkflow
+from mlair.workflows import DefaultWorkflow
 import inspect
 
 
diff --git a/mlair/workflows/__init__.py b/mlair/workflows/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..27c060f10975d86aa35c1f2d45e66966002ecd63
--- /dev/null
+++ b/mlair/workflows/__init__.py
@@ -0,0 +1,2 @@
+from mlair.workflows.abstract_workflow import Workflow
+from mlair.workflows.default_workflow import DefaultWorkflow, DefaultWorkflowHPC
\ No newline at end of file
diff --git a/src/workflows/abstract_workflow.py b/mlair/workflows/abstract_workflow.py
similarity index 97%
rename from src/workflows/abstract_workflow.py
rename to mlair/workflows/abstract_workflow.py
index 5d4e62c8a2e409e865f43412a6757a9cb4e4b1f3..f187ff11e849960b4a63eddd5d11e2ce1ddf2a11 100644
--- a/src/workflows/abstract_workflow.py
+++ b/mlair/workflows/abstract_workflow.py
@@ -5,7 +5,7 @@ __date__ = '2020-06-26'
 
 from collections import OrderedDict
 
-from src import RunEnvironment
+from mlair import RunEnvironment
 
 
 class Workflow:
diff --git a/src/workflows/default_workflow.py b/mlair/workflows/default_workflow.py
similarity index 94%
rename from src/workflows/default_workflow.py
rename to mlair/workflows/default_workflow.py
index 6a60c6ae60808b616fded3475179371763fd6feb..c1a9c749865898c3eaa5493ee289602963025464 100644
--- a/src/workflows/default_workflow.py
+++ b/mlair/workflows/default_workflow.py
@@ -4,9 +4,9 @@ __author__ = "Lukas Leufen"
 __date__ = '2020-06-26'
 
 import inspect
-from src.helpers import remove_items
-from src.run_modules import ExperimentSetup, PreProcessing, PartitionCheck, ModelSetup, Training, PostProcessing
-from src.workflows.abstract_workflow import Workflow
+from mlair.helpers import remove_items
+from mlair.run_modules import ExperimentSetup, PreProcessing, PartitionCheck, ModelSetup, Training, PostProcessing
+from mlair.workflows.abstract_workflow import Workflow
 
 
 class DefaultWorkflow(Workflow):
diff --git a/run.py b/run.py
index a9d8190628e1692c4b2812d3c8790bccd6b1b589..15f30a7ee775948fa744832a464562cd40c3e460 100644
--- a/run.py
+++ b/run.py
@@ -2,7 +2,7 @@ __author__ = "Lukas Leufen"
 __date__ = '2020-06-29'
 
 import argparse
-from src.workflows import DefaultWorkflow
+from mlair.workflows import DefaultWorkflow
 
 
 def main(parser_args):
diff --git a/run_HPC.py b/run_HPC.py
index fc2ead406469f0a254f5819e43c1e0d3542bb8d9..d6dbb4dc61e88a1e139b3cbe549bc6a3f2f0ab8a 100644
--- a/run_HPC.py
+++ b/run_HPC.py
@@ -2,7 +2,7 @@ __author__ = "Lukas Leufen"
 __date__ = '2020-06-29'
 
 import argparse
-from src.workflows import DefaultWorkflowHPC
+from mlair.workflows import DefaultWorkflowHPC
 
 
 def main(parser_args):
diff --git a/run_hourly.py b/run_hourly.py
index 682988f6f730d02be713c074dd63fc732e2868dc..b831cf1e1ee733a3c652c6cea364013b44cf2c0d 100644
--- a/run_hourly.py
+++ b/run_hourly.py
@@ -3,7 +3,7 @@ __date__ = '2019-11-14'
 
 import argparse
 
-from src.workflows import DefaultWorkflow
+from mlair.workflows import DefaultWorkflow
 
 
 def main(parser_args):
diff --git a/run_zam347.py b/run_zam347.py
index 2d351a8925e67b0bdfc010e92a3937435e160b2f..9027bec807ad9beafcdac573a70aa32d34491034 100644
--- a/run_zam347.py
+++ b/run_zam347.py
@@ -5,13 +5,13 @@ import argparse
 import json
 import logging
 
-from src.run_modules.experiment_setup import ExperimentSetup
-from src.run_modules.model_setup import ModelSetup
-from src.run_modules.post_processing import PostProcessing
-from src.run_modules.pre_processing import PreProcessing
-from src.run_modules.run_environment import RunEnvironment
-from src.run_modules.training import Training
-from src.workflows import DefaultWorkflowHPC
+from mlair.run_modules.experiment_setup import ExperimentSetup
+from mlair.run_modules.model_setup import ModelSetup
+from mlair.run_modules.post_processing import PostProcessing
+from mlair.run_modules.pre_processing import PreProcessing
+from mlair.run_modules.run_environment import RunEnvironment
+from mlair.run_modules.training import Training
+from mlair.workflows import DefaultWorkflowHPC
 
 
 def load_stations():
diff --git a/setup.py b/setup.py
index 8e08e921f5fb728f7b1758e4bb385efc7d71c29b..f708febb5a70c957a91059d840a1f4e140ad35c0 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 
 import setuptools
 
-from src import __version__, __author__, __email__
+from mlair import __version__, __author__, __email__
 
 
 with open("README.md", "r") as fh:
@@ -9,7 +9,7 @@ with open("README.md", "r") as fh:
 
 
 setuptools.setup(
-    name="mlt",
+    name="mlair",
     version=__version__,
     author=__author__,
     author_email=__email__,
@@ -17,8 +17,7 @@ setuptools.setup(
     long_description=long_description,
     long_description_content_type="text/markdown",
     url="https://gitlab.version.fz-juelich.de/toar/machinelearningtools",
-    package_dir={'': 'src'},
-    packages=setuptools.find_packages(where="src"),
+    packages=setuptools.find_packages(),
     classifiers=[
         "Programming Language :: Python :: 3",
         "License :: OSI Approved :: MIT License",  #  to be adjusted
diff --git a/src/run_modules/__init__.py b/src/run_modules/__init__.py
deleted file mode 100644
index 0c70ae4205ff38fdc876538c42c44ca0bc8cb9c0..0000000000000000000000000000000000000000
--- a/src/run_modules/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from src.run_modules.experiment_setup import ExperimentSetup
-from src.run_modules.model_setup import ModelSetup
-from src.run_modules.partition_check import PartitionCheck
-from src.run_modules.post_processing import PostProcessing
-from src.run_modules.pre_processing import PreProcessing
-from src.run_modules.run_environment import RunEnvironment
-from src.run_modules.training import Training
diff --git a/src/workflows/__init__.py b/src/workflows/__init__.py
deleted file mode 100644
index 57e514cd9ced32fbf1dbb290b1008deffcec52d3..0000000000000000000000000000000000000000
--- a/src/workflows/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from src.workflows.abstract_workflow import Workflow
-from src.workflows.default_workflow import DefaultWorkflow, DefaultWorkflowHPC
\ No newline at end of file
diff --git a/test/test_configuration/test_path_config.py b/test/test_configuration/test_path_config.py
index acb43676cb86ca76aded88aa0d46f62dd78d9992..128ddfceeed53920e6424d8d5d8f6addf5451c44 100644
--- a/test/test_configuration/test_path_config.py
+++ b/test/test_configuration/test_path_config.py
@@ -4,9 +4,9 @@ import os
 import mock
 import pytest
 
-from src.configuration import prepare_host, set_experiment_name, set_bootstrap_path, check_path_and_create, \
+from mlair.configuration import prepare_host, set_experiment_name, set_bootstrap_path, check_path_and_create, \
     set_experiment_path, ROOT_PATH
-from src.helpers import PyTestRegex
+from mlair.helpers import PyTestRegex
 
 
 class TestPrepareHost:
@@ -25,13 +25,11 @@ class TestPrepareHost:
 
     @mock.patch("socket.gethostname", return_value="NotExistingHostName")
     @mock.patch("getpass.getuser", return_value="zombie21")
-    def test_error_handling_unknown_host(self, mock_user, mock_host):
-        with pytest.raises(OSError) as e:
-            prepare_host()
-        assert "unknown host 'NotExistingHostName'" in e.value.args[0]
+    def test_prepare_host_unknown(self, mock_user, mock_host):
+        assert prepare_host() == os.path.join(os.path.abspath(os.getcwd()), 'data', 'daily')
 
     @mock.patch("getpass.getuser", return_value="zombie21")
-    @mock.patch("src.configuration.path_config.check_path_and_create", side_effect=PermissionError)
+    @mock.patch("mlair.configuration.path_config.check_path_and_create", side_effect=PermissionError)
     @mock.patch("os.path.exists", return_value=False)
     def test_error_handling(self, mock_path_exists, mock_cpath, mock_user):
         # if "runner-6HmDp9Qd-project-2411-concurrent" not in platform.node():
diff --git a/test/test_data_handling/test_bootstraps.py b/test/test_data_handling/test_bootstraps.py
index 3d32a090e62294793bda3f2421de4f52205f427f..c47ec59af4280cfa72e27f1bce06348e5aa2876f 100644
--- a/test/test_data_handling/test_bootstraps.py
+++ b/test/test_data_handling/test_bootstraps.py
@@ -7,8 +7,8 @@ import numpy as np
 import pytest
 import xarray as xr
 
-from src.data_handling.bootstraps import BootStraps, CreateShuffledData, BootStrapGenerator
-from src.data_handling.data_generator import DataGenerator
+from mlair.data_handling.bootstraps import BootStraps, CreateShuffledData, BootStrapGenerator
+from mlair.data_handling.data_generator import DataGenerator
 
 
 @pytest.fixture
@@ -73,7 +73,7 @@ class TestCreateShuffledData:
         return CreateShuffledData(orig_generator, 20, data_path)
 
     @pytest.fixture
-    @mock.patch("src.data_handling.bootstraps.CreateShuffledData.create_shuffled_data", return_value=None)
+    @mock.patch("mlair.data_handling.bootstraps.CreateShuffledData.create_shuffled_data", return_value=None)
     def shuffled_data_no_creation(self, mock_create_shuffle_data, orig_generator, data_path):
         return CreateShuffledData(orig_generator, 20, data_path)
 
@@ -174,7 +174,7 @@ class TestBootStraps:
         return BootStraps(orig_generator, data_path, 20)
 
     @pytest.fixture
-    @mock.patch("src.data_handling.bootstraps.CreateShuffledData", return_value=None)
+    @mock.patch("mlair.data_handling.bootstraps.CreateShuffledData", return_value=None)
     def bootstrap_no_shuffling(self, mock_create_shuffle_data, orig_generator, data_path):
         shutil.rmtree(data_path)
         return BootStraps(orig_generator, data_path, 20)
@@ -211,7 +211,7 @@ class TestBootStraps:
         assert xr.testing.assert_equal(gen.history, expected.sel(variables=var_others)) is None
         assert gen.shuffled.variables == "o3"
 
-    @mock.patch("src.data_handling.data_generator.DataGenerator._load_pickle_data", side_effect=FileNotFoundError)
+    @mock.patch("mlair.data_handling.data_generator.DataGenerator._load_pickle_data", side_effect=FileNotFoundError)
     def test_get_generator_different_generator(self, mock_load_pickle, data_path, orig_generator):
         BootStraps(orig_generator, data_path, 20)  # to create
         orig_generator.window_history_size = 4
diff --git a/test/test_data_handling/test_data_distributor.py b/test/test_data_handling/test_data_distributor.py
index 9e2242fed67599cdd53ddd29e4fbd4304425b77e..a1fe2f667f33896d2bd2f4c4ad69713020dc7caf 100644
--- a/test/test_data_handling/test_data_distributor.py
+++ b/test/test_data_handling/test_data_distributor.py
@@ -5,8 +5,8 @@ import keras
 import numpy as np
 import pytest
 
-from src.data_handling.data_distributor import Distributor
-from src.data_handling.data_generator import DataGenerator
+from mlair.data_handling.data_distributor import Distributor
+from mlair.data_handling.data_generator import DataGenerator
 from test.test_modules.test_training import my_test_model
 
 
diff --git a/test/test_data_handling/test_data_generator.py b/test/test_data_handling/test_data_generator.py
index 754728ba403fbda25c021c2f576a1bc89d26f83f..579b34f6b24d126bc10d28a255ed2f6f63662bdd 100644
--- a/test/test_data_handling/test_data_generator.py
+++ b/test/test_data_handling/test_data_generator.py
@@ -6,9 +6,9 @@ import numpy as np
 import pytest
 import xarray as xr
 
-from src.data_handling.data_generator import DataGenerator
-from src.data_handling.data_preparation import DataPrep
-from src.helpers.join import EmptyQueryResult
+from mlair.data_handling.data_generator import DataGenerator
+from mlair.data_handling.data_preparation import DataPrep
+from mlair.helpers.join import EmptyQueryResult
 
 
 class TestDataGenerator:
diff --git a/test/test_data_handling/test_data_preparation.py b/test/test_data_handling/test_data_preparation.py
index a8ca555c9748f7656fefc007922ee0d7df1992fa..4106e4a75a0ecd295a5ec4d2ffcab6c98b7a3b04 100644
--- a/test/test_data_handling/test_data_preparation.py
+++ b/test/test_data_handling/test_data_preparation.py
@@ -8,8 +8,8 @@ import pandas as pd
 import pytest
 import xarray as xr
 
-from src.data_handling.data_preparation import DataPrep
-from src.helpers.join import EmptyQueryResult
+from mlair.data_handling.data_preparation import DataPrep
+from mlair.helpers.join import EmptyQueryResult
 
 
 class TestDataPrep:
diff --git a/test/test_datastore.py b/test/test_datastore.py
index 9aca1eef35927242df0b5f659eece716f81f6c13..662c90bf04e11b8b4ff9647506c1981c8883f30b 100644
--- a/test/test_datastore.py
+++ b/test/test_datastore.py
@@ -3,8 +3,8 @@ __date__ = '2019-11-22'
 
 import pytest
 
-from src.helpers.datastore import AbstractDataStore, DataStoreByVariable, DataStoreByScope, CorrectScope
-from src.helpers.datastore import NameNotFoundInDataStore, NameNotFoundInScope, EmptyScope
+from mlair.helpers.datastore import AbstractDataStore, DataStoreByVariable, DataStoreByScope, CorrectScope
+from mlair.helpers.datastore import NameNotFoundInDataStore, NameNotFoundInScope, EmptyScope
 
 
 class TestAbstractDataStore:
diff --git a/test/test_helpers/test_helpers.py b/test/test_helpers/test_helpers.py
index 28a8bf6e421d62d58d76e7a32906f8a594f16ed7..281d60e07463c6b5118f36714d80144443a03050 100644
--- a/test/test_helpers/test_helpers.py
+++ b/test/test_helpers/test_helpers.py
@@ -5,13 +5,14 @@ import datetime as dt
 import logging
 import math
 import time
+import os
 
 import mock
 import pytest
 
-from src.helpers import to_list, dict_to_xarray, float_round, remove_items
-from src.helpers import PyTestRegex
-from src.helpers import Logger, TimeTracking
+from mlair.helpers import to_list, dict_to_xarray, float_round, remove_items
+from mlair.helpers import PyTestRegex
+from mlair.helpers import Logger, TimeTracking
 
 
 class TestToList:
@@ -236,8 +237,8 @@ class TestLogger:
 
     def test_setup_logging_path_none(self):
         log_file = Logger.setup_logging_path(None)
-        assert PyTestRegex(
-            ".*machinelearningtools/logging/logging_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}\.log") == log_file
+        test_regex = os.getcwd() + r"/logging/logging_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}\.log"
+        assert PyTestRegex(test_regex) == log_file
 
     @mock.patch("os.makedirs", side_effect=None)
     def test_setup_logging_path_given(self, mock_makedirs):
diff --git a/test/test_join.py b/test/test_join.py
index 5adc013cfbd446c4feaf4a2b344f07d6f170077d..791723335e16cf2124512629414ebe626bc20e9c 100644
--- a/test/test_join.py
+++ b/test/test_join.py
@@ -2,9 +2,9 @@ from typing import Iterable
 
 import pytest
 
-from src.helpers.join import *
-from src.helpers.join import _save_to_pandas, _correct_stat_name, _lower_list
-from src.configuration.join_settings import join_settings
+from mlair.helpers.join import *
+from mlair.helpers.join import _save_to_pandas, _correct_stat_name, _lower_list
+from mlair.configuration.join_settings import join_settings
 
 
 class TestJoinUrlBase:
diff --git a/test/test_model_modules/test_advanced_paddings.py b/test/test_model_modules/test_advanced_paddings.py
index 8c7cae91ad12cc2b06ec82ba64f91c792a620756..8ca81c42c0b807b28c444badba8d92a255341eb4 100644
--- a/test/test_model_modules/test_advanced_paddings.py
+++ b/test/test_model_modules/test_advanced_paddings.py
@@ -1,7 +1,7 @@
 import keras
 import pytest
 
-from src.model_modules.advanced_paddings import *
+from mlair.model_modules.advanced_paddings import *
 
 
 class TestPadUtils:
diff --git a/test/test_model_modules/test_flatten_tail.py b/test/test_model_modules/test_flatten_tail.py
index 0de138ec2323aea3409d5deadfb26c9741b89f50..623d51c07f6b27c8d6238d8a5189dea33837115e 100644
--- a/test/test_model_modules/test_flatten_tail.py
+++ b/test/test_model_modules/test_flatten_tail.py
@@ -1,6 +1,6 @@
 import keras
 import pytest
-from src.model_modules.flatten import flatten_tail, get_activation
+from mlair.model_modules.flatten import flatten_tail, get_activation
 
 
 class TestGetActivation:
diff --git a/test/test_model_modules/test_inception_model.py b/test/test_model_modules/test_inception_model.py
index ca0126a44fa0f8ccd2ed2a7ea79c872c4731fea1..2dfc2c9c1c0510355216769b2ab83152a0a02118 100644
--- a/test/test_model_modules/test_inception_model.py
+++ b/test/test_model_modules/test_inception_model.py
@@ -1,9 +1,9 @@
 import keras
 import pytest
 
-from src.helpers import PyTestRegex
-from src.model_modules.advanced_paddings import ReflectionPadding2D, SymmetricPadding2D
-from src.model_modules.inception_model import InceptionModelBase
+from mlair.helpers import PyTestRegex
+from mlair.model_modules.advanced_paddings import ReflectionPadding2D, SymmetricPadding2D
+from mlair.model_modules.inception_model import InceptionModelBase
 
 
 class TestInceptionModelBase:
diff --git a/test/test_model_modules/test_keras_extensions.py b/test/test_model_modules/test_keras_extensions.py
index 56c60ec43173e9fdd438214862603caba632bc65..78559ee0e54c725d242194133549d8b17699b729 100644
--- a/test/test_model_modules/test_keras_extensions.py
+++ b/test/test_model_modules/test_keras_extensions.py
@@ -4,8 +4,8 @@ import keras
 import mock
 import pytest
 
-from src.model_modules.loss import l_p_loss
-from src.model_modules.keras_extensions import *
+from mlair.model_modules.loss import l_p_loss
+from mlair.model_modules.keras_extensions import *
 
 
 class TestHistoryAdvanced:
diff --git a/test/test_model_modules/test_loss.py b/test/test_model_modules/test_loss.py
index c47f3f188a4b360bda08470fb00fd1d88a9f754c..e54e0b00de4a71d241f30e0b6b0c1a2e8fa1a19c 100644
--- a/test/test_model_modules/test_loss.py
+++ b/test/test_model_modules/test_loss.py
@@ -1,7 +1,7 @@
 import keras
 import numpy as np
 
-from src.model_modules.loss import l_p_loss
+from mlair.model_modules.loss import l_p_loss
 
 
 class TestLoss:
diff --git a/test/test_model_modules/test_model_class.py b/test/test_model_modules/test_model_class.py
index 0ee2eb7e5d439c76888f1f05e238bb5507db6a7a..6025516ba01abdcb35ea65b9c4570d5a8b0928b5 100644
--- a/test/test_model_modules/test_model_class.py
+++ b/test/test_model_modules/test_model_class.py
@@ -1,8 +1,8 @@
 import keras
 import pytest
 
-from src.model_modules.model_class import AbstractModelClass
-from src.model_modules.model_class import MyPaperModel
+from mlair.model_modules.model_class import AbstractModelClass
+from mlair.model_modules.model_class import MyPaperModel
 
 
 class Paddings:
diff --git a/test/test_modules/test_experiment_setup.py b/test/test_modules/test_experiment_setup.py
index 5b7d517e658de6bd71e1b4190bb5114dc005216e..60f0d2f9143b83a1333dd5de347591058686ea5c 100644
--- a/test/test_modules/test_experiment_setup.py
+++ b/test/test_modules/test_experiment_setup.py
@@ -4,9 +4,9 @@ import os
 
 import pytest
 
-from src.helpers import TimeTracking
-from src.configuration.path_config import prepare_host
-from src.run_modules.experiment_setup import ExperimentSetup
+from mlair.helpers import TimeTracking
+from mlair.configuration.path_config import prepare_host
+from mlair.run_modules.experiment_setup import ExperimentSetup
 
 
 class TestExperimentSetup:
@@ -14,7 +14,7 @@ class TestExperimentSetup:
     @pytest.fixture
     def empty_obj(self, caplog):
         obj = object.__new__(ExperimentSetup)
-        obj.time = TimeTracking()
+        super(ExperimentSetup, obj).__init__()
         caplog.set_level(logging.DEBUG)
         return obj
 
@@ -43,7 +43,7 @@ class TestExperimentSetup:
         assert data_store.get("fraction_of_training", "general") == 0.8
         # set experiment name
         assert data_store.get("experiment_name", "general") == "TestExperiment_daily"
-        path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "TestExperiment_daily"))
+        path = os.path.abspath(os.path.join(os.getcwd(), "TestExperiment_daily"))
         assert data_store.get("experiment_path", "general") == path
         default_statistics_per_var = {'o3': 'dma8eu', 'relhum': 'average_values', 'temp': 'maximum',
                                       'u': 'average_values', 'v': 'average_values', 'no': 'dma8eu', 'no2': 'dma8eu',
diff --git a/test/test_modules/test_model_setup.py b/test/test_modules/test_model_setup.py
index 60d140f8845b25432184de1f3890b3ee4d0b034e..b61e52d21758213c34b7830589f58e1edb53dc77 100644
--- a/test/test_modules/test_model_setup.py
+++ b/test/test_modules/test_model_setup.py
@@ -2,12 +2,12 @@ import os
 
 import pytest
 
-from src.data_handling.data_generator import DataGenerator
-from src.helpers.datastore import EmptyScope
-from src.model_modules.keras_extensions import CallbackHandler
-from src.model_modules.model_class import AbstractModelClass, MyLittleModel
-from src.run_modules.model_setup import ModelSetup
-from src.run_modules.run_environment import RunEnvironment
+from mlair.data_handling.data_generator import DataGenerator
+from mlair.helpers.datastore import EmptyScope
+from mlair.model_modules.keras_extensions import CallbackHandler
+from mlair.model_modules.model_class import AbstractModelClass, MyLittleModel
+from mlair.run_modules.model_setup import ModelSetup
+from mlair.run_modules.run_environment import RunEnvironment
 
 
 class TestModelSetup:
diff --git a/test/test_modules/test_partition_check.py b/test/test_modules/test_partition_check.py
index b04e01d13e9e160553f8ff66af8d97f65aa24bf0..1e576a8ce47c98e395468b76d3496dafa3cc0525 100644
--- a/test/test_modules/test_partition_check.py
+++ b/test/test_modules/test_partition_check.py
@@ -2,10 +2,10 @@ import logging
 
 import pytest
 import mock
-from src.run_modules.experiment_setup import ExperimentSetup
-from src.run_modules.partition_check import PartitionCheck
-from src.run_modules.run_environment import RunEnvironment
-from src.configuration import get_host
+from mlair.run_modules.experiment_setup import ExperimentSetup
+from mlair.run_modules.partition_check import PartitionCheck
+from mlair.run_modules.run_environment import RunEnvironment
+from mlair.configuration import get_host
 
 
 class TestPartitionCheck:
diff --git a/test/test_modules/test_pre_processing.py b/test/test_modules/test_pre_processing.py
index 29811fb04789f32a1e2cc1b3affb6f8d4ae99730..93f322f10820348ea3b431baccfc7404079c8fe8 100644
--- a/test/test_modules/test_pre_processing.py
+++ b/test/test_modules/test_pre_processing.py
@@ -2,12 +2,12 @@ import logging
 
 import pytest
 
-from src.data_handling.data_generator import DataGenerator
-from src.helpers.datastore import NameNotFoundInScope
-from src.helpers import PyTestRegex
-from src.run_modules.experiment_setup import ExperimentSetup
-from src.run_modules.pre_processing import PreProcessing, DEFAULT_ARGS_LIST, DEFAULT_KWARGS_LIST
-from src.run_modules.run_environment import RunEnvironment
+from mlair.data_handling.data_generator import DataGenerator
+from mlair.helpers.datastore import NameNotFoundInScope
+from mlair.helpers import PyTestRegex
+from mlair.run_modules.experiment_setup import ExperimentSetup
+from mlair.run_modules.pre_processing import PreProcessing, DEFAULT_ARGS_LIST, DEFAULT_KWARGS_LIST
+from mlair.run_modules.run_environment import RunEnvironment
 
 
 class TestPreProcessing:
diff --git a/test/test_modules/test_run_environment.py b/test/test_modules/test_run_environment.py
index 59bb8535c4dab44e646bd6bc4aa83a8553be4d26..aa385e32673c2bf58db3f5666b2f64076af0193f 100644
--- a/test/test_modules/test_run_environment.py
+++ b/test/test_modules/test_run_environment.py
@@ -1,7 +1,7 @@
 import logging
 
-from src.helpers import TimeTracking, PyTestRegex
-from src.run_modules.run_environment import RunEnvironment
+from mlair.helpers import TimeTracking, PyTestRegex
+from mlair.run_modules.run_environment import RunEnvironment
 
 
 class TestRunEnvironment:
diff --git a/test/test_modules/test_training.py b/test/test_modules/test_training.py
index eb5dfe5adb170981d5d67c94ca1fbcb55e326550..292bf7e76deb587b7a64e31e93a67cb143d8e540 100644
--- a/test/test_modules/test_training.py
+++ b/test/test_modules/test_training.py
@@ -9,14 +9,14 @@ import mock
 import pytest
 from keras.callbacks import History
 
-from src.data_handling.data_distributor import Distributor
-from src.data_handling.data_generator import DataGenerator
-from src.helpers import PyTestRegex
-from src.model_modules.flatten import flatten_tail
-from src.model_modules.inception_model import InceptionModelBase
-from src.model_modules.keras_extensions import LearningRateDecay, HistoryAdvanced, CallbackHandler
-from src.run_modules.run_environment import RunEnvironment
-from src.run_modules.training import Training
+from mlair.data_handling.data_distributor import Distributor
+from mlair.data_handling.data_generator import DataGenerator
+from mlair.helpers import PyTestRegex
+from mlair.model_modules.flatten import flatten_tail
+from mlair.model_modules.inception_model import InceptionModelBase
+from mlair.model_modules.keras_extensions import LearningRateDecay, HistoryAdvanced, CallbackHandler
+from mlair.run_modules.run_environment import RunEnvironment
+from mlair.run_modules.training import Training
 
 
 def my_test_model(activation, window_history_size, channels, dropout_rate, add_minor_branch=False):
diff --git a/test/test_plotting/test_tracker_plot.py b/test/test_plotting/test_tracker_plot.py
index 9a92360a819c130c213d06b89a48a896e082adad..196879657452fe12238c990fc419cb0848c9ec9c 100644
--- a/test/test_plotting/test_tracker_plot.py
+++ b/test/test_plotting/test_tracker_plot.py
@@ -7,8 +7,8 @@ import shutil
 from matplotlib import pyplot as plt
 import numpy as np
 
-from src.plotting.tracker_plot import TrackObject, TrackChain, TrackPlot
-from src.helpers import PyTestAllEqual
+from mlair.plotting.tracker_plot import TrackObject, TrackChain, TrackPlot
+from mlair.helpers import PyTestAllEqual
 
 
 class TestTrackObject:
diff --git a/test/test_plotting/test_training_monitoring.py b/test/test_plotting/test_training_monitoring.py
index 6e5e0abbc5da0978e200f19019700c4dedd14ad0..18009bc19947bd3318c6f1d220d303c1efeec972 100644
--- a/test/test_plotting/test_training_monitoring.py
+++ b/test/test_plotting/test_training_monitoring.py
@@ -3,8 +3,8 @@ import os
 import keras
 import pytest
 
-from src.model_modules.keras_extensions import LearningRateDecay
-from src.plotting.training_monitoring import PlotModelLearningRate, PlotModelHistory
+from mlair.model_modules.keras_extensions import LearningRateDecay
+from mlair.plotting.training_monitoring import PlotModelLearningRate, PlotModelHistory
 
 
 @pytest.fixture
diff --git a/test/test_statistics.py b/test/test_statistics.py
index 3da7a47871f6d92472de268d165d788c343ce394..d4a72674ae89ecd106ff1861aa6ee26567da3243 100644
--- a/test/test_statistics.py
+++ b/test/test_statistics.py
@@ -3,7 +3,7 @@ import pandas as pd
 import pytest
 import xarray as xr
 
-from src.helpers.statistics import standardise, standardise_inverse, standardise_apply, centre, centre_inverse, centre_apply, \
+from mlair.helpers.statistics import standardise, standardise_inverse, standardise_apply, centre, centre_inverse, centre_apply, \
     apply_inverse_transformation
 
 lazy = pytest.lazy_fixture