diff --git a/cal_tools/cal_tools/tools.py b/cal_tools/cal_tools/tools.py
index c253a7d7cfa978b5b5920d428cfabed35ba430ff..abed088acd87441711bf553242fe7346d6d56265 100644
--- a/cal_tools/cal_tools/tools.py
+++ b/cal_tools/cal_tools/tools.py
@@ -6,19 +6,21 @@ from os import environ, listdir, path, stat
 from os.path import isfile, splitext
 from queue import Queue
 import re
+import textwrap
 from time import sleep
 from urllib.parse import urljoin
 
 import dateutil.parser
-
 import ipykernel
 from metadata_client.metadata_client import MetadataClient
 from notebook.notebookapp import list_running_servers
 import numpy as np
 import requests
 
-from .mdc_config import MDC_config
 from .ana_tools import save_dict_to_hdf5
+from iCalibrationDB import ConstantMetaData, Versions
+from .mdc_config import MDC_config
+import zmq
 
 def parse_runs(runs, return_type=str):
     pruns = []
@@ -264,14 +266,39 @@ def get_dir_creation_date(directory, run, tsdir=False, verbosity=0):
             ntries -= 1
 
 
-def save_const_to_h5(metadata, out_folder):
+def save_const_to_h5(device, constant, data, condition,
+                    file_loc, creation_time, out_folder):
     """
     Save constant in h5 file with its metadata
     (e.g. db_module, condition, creation_time)
 
-    :param metadata: Metadata
+    :param device: Instance of detector
+    :type device: iCalibrationDB.detectors object
+    :param constant: Calibration constant known for given detector
+    :type constant: iCalibrationDB.know_constants object
+    :param condition: Calibration condition
+    :type condition: iCalibrationDB.know_detector_conditions object
+    :param data: Constant data to save 
+    :type data: ndarray
+    :param file_loc: Location of raw data "proposal:{} runs:{} {} {}"
+    :type file_loc: str
+    :param creation_time: creation_time for the saved constant
+    :type creation_time: datetime object
     :param out_folder: path to output folder
+    :type out_folder: str
     """
+    metadata = ConstantMetaData()
+    metadata.calibration_constant = constant
+    metadata.detector_condition = condition
+    if creation_time is None:
+        metadata.calibration_constant_version = Versions.Now(
+            device=device)
+    else:
+        metadata.calibration_constant_version = Versions.Timespan(
+            device=device,
+            start=creation_time)
+
+    metadata.calibration_constant_version.raw_data_location = file_loc
 
     dpar = {}
     for parm in metadata.detector_condition.parameters:
@@ -289,15 +316,16 @@ def save_const_to_h5(metadata, out_folder):
     data_to_store['condition'] = dpar
     data_to_store['db_module'] = db_module
     data_to_store['constant'] = constant_name
-    data_to_store['data'] = metadata.calibration_constant.data
+    data_to_store['data'] = data
     data_to_store['creation_time'] = creation_time
     data_to_store['file_loc'] = raw_data
 
-    ofile = "{}/const_{}_{}.h5".format(out_folder, constant_name, db_module)
+    ofile = f"{out_folder}/const_{constant_name}_{db_module}.h5"
     if isfile(ofile):
-        print('File {} already exists and will be overwritten'.format(ofile))
+        print(f'File {ofile} already exists and will be overwritten')
     save_dict_to_hdf5(data_to_store, ofile)
 
+    return metadata
 
 def get_random_db_interface(cal_db_interface):
     """
@@ -337,8 +365,6 @@ def get_from_db(device, constant, condition, empty_constant,
     :param doraise: (bool) if True raise errors during communication with DB.
     :return: Calibration constant, metadata
     """
-    from iCalibrationDB import ConstantMetaData, Versions
-    import zmq
 
     if version_info:
         meta_only = False
@@ -384,7 +410,6 @@ def get_from_db(device, constant, condition, empty_constant,
                 if ntries == 0 and doraise:
                     raise RuntimeError(f'{e}')
 
-
         if ntries > 0:
             if verbosity > 0:
                 if constant.name not in already_printed or verbosity > 1:
@@ -401,26 +426,33 @@ def get_from_db(device, constant, condition, empty_constant,
 
 def send_to_db(device, constant, condition, file_loc,
                cal_db_interface, creation_time=None,
-               verbosity=1, timeout=30000, ntries=7, doraise=False):
+               timeout=30000, ntries=7, doraise=False):
     """
     Return calibration constants and metadata requested from CalDB
 
     :param device: Instance of detector
+    :type device: iCalibrationDB.detectors object
     :param constant: Calibration constant known for given detector
+    :type constant: iCalibrationDB.know_constants object
     :param condition: Calibration condition
+    :type condition: iCalibrationDB.know_detector_conditions object
     :param file_loc: Location of raw data.
+    :type file_loc: str
     :param cal_db_interface: Interface string, e.g. "tcp://max-exfl016:8015"
+    :type cal_db_interface: str
     :param creation_time: Latest time for constant to be created
-    :param verbosity: Level of verbosity (0 - silent)
+    :type creation_time: datetime object
     :param timeout: Timeout for zmq request
+    :type timeout: int
     :param ntries: number of tries to contact the database,
     ntries is set to 7 so that if the timeout started at 30s last timeout
     will be ~ 1h.
-    :param doraise: (bool) if True raise errors during communication with DB
+    :type ntries: int
+    :param doraise: if True raise errors during communication with DB
+    :type doraise: bool
     """
-    from iCalibrationDB import ConstantMetaData, Versions
-    import zmq
 
+    success = False
     if device:
         metadata = ConstantMetaData()
         metadata.calibration_constant = constant
@@ -440,6 +472,7 @@ def send_to_db(device, constant, condition, file_loc,
             this_interface = get_random_db_interface(cal_db_interface)
             try:
                 r = metadata.send(this_interface, timeout=timeout)
+                success = True
                 break
             except zmq.error.Again:
                 ntries -= 1
@@ -448,8 +481,14 @@ def send_to_db(device, constant, condition, file_loc,
                 if ntries == 0 and doraise:
                     raise
             except Exception as e:
-                if verbosity > 0:
-                    print(e)
+                if "has already been take" in str(e):
+                    print(f"WARNING: {constant.name} has already been "
+                          "injected with the same parameter "
+                          "conditions\n")
+                else:
+                    # reduce error text if it is too long.
+                    print("\n".join(textwrap.wrap(str(e), 100)))
+
                 if 'missing_token' in str(e):
                     ntries -= 1
                 else:
@@ -457,14 +496,10 @@ def send_to_db(device, constant, condition, file_loc,
                 if ntries == 0 and doraise:
                     raise RuntimeError(f'{e}')
 
-        if ntries > 0:
-            if verbosity > 0:
-                if constant.name not in already_printed or verbosity > 1:
-                    already_printed[constant.name] = True
-                    begin_at = metadata.calibration_constant_version.begin_at
-                    print("{} was sent on: {}".format(constant.name,
-                                                      begin_at))
-
+        if success:
+            print(f"{constant.name} is injected with creation-time: "
+                  f"{metadata.calibration_constant_version.begin_at}\n")
+    return metadata
 
 def get_constant_from_db(device, constant, condition, empty_constant,
                          cal_db_interface, creation_time=None,
diff --git a/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb b/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb
index eaae915a6a8f7562452b0b4dd4f116b9f44be484..6e69bb8e79af6313e6c41b2fd0e3140ceb935f77 100644
--- a/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb
+++ b/notebooks/AGIPD/Characterize_AGIPD_Gain_Darks_NBC.ipynb
@@ -28,7 +28,7 @@
     "in_folder = \"/gpfs/exfel/d/raw/SPB/202030/p900138\" # path to input data, required\n",
     "out_folder = \"/gpfs/exfel/data/scratch/ahmedk/test/AGIPDbad_sep64\" # path to output to, required\n",
     "sequences = [0] # sequence files to evaluate.\n",
-    "modules = [-1]  # list of modules to evaluate, RANGE ALLOWED\n",
+    "modules = [0]  # list of modules to evaluate, RANGE ALLOWED\n",
     "run_high = 167 # run number in which high gain data was recorded, required\n",
     "run_med = 168 # run number in which medium gain data was recorded, required\n",
     "run_low = 169 # run number in which low gain data was recorded, required\n",
@@ -101,15 +101,16 @@
     "from IPython.display import display, Markdown, Latex\n",
     "%matplotlib inline\n",
     "\n",
-    "from cal_tools.tools import (map_gain_stages, parse_runs, \n",
-    "                             run_prop_seq_from_path, get_notebook_name, \n",
-    "                             get_dir_creation_date, save_const_to_h5,\n",
-    "                             get_random_db_interface, get_from_db)\n",
+    "from cal_tools.tools import (get_from_db, get_dir_creation_date,\n",
+    "                             get_notebook_name, get_random_db_interface,\n",
+    "                             map_gain_stages, parse_runs,\n",
+    "                             run_prop_seq_from_path, save_const_to_h5,\n",
+    "                             send_to_db)\n",
     "from cal_tools.influx import InfluxLogger\n",
     "from cal_tools.enums import BadPixels\n",
-    "from cal_tools.plotting import (show_overview, plot_badpix_3d,\n",
-    "                                create_constant_overview,\n",
-    "                                show_processed_modules)\n",
+    "from cal_tools.plotting import (create_constant_overview,\n",
+    "                                plot_badpix_3d, show_processed_modules,\n",
+    "                                show_overview)\n",
     "from cal_tools.agipdlib import get_gain_setting\n",
     "\n",
     "# make sure a cluster is running with ipcluster start --n=32, give it a while to start\n",
@@ -118,7 +119,7 @@
     "view = Client(profile=cluster_profile)[:]\n",
     "view.use_dill()\n",
     "\n",
-    "from iCalibrationDB import ConstantMetaData, Constants, Conditions, Detectors, Versions\n",
+    "from iCalibrationDB import Constants, Conditions, Detectors, Versions\n",
     "\n",
     "gains = np.arange(3)\n",
     "\n",
@@ -501,19 +502,17 @@
     "               'Noise': noise_g[qm],\n",
     "               'ThresholdsDark': thresholds_g[qm],\n",
     "               'BadPixelsDark': badpix_g[qm]    \n",
-    "               }\n",
-    "\n",
-    "if local_output:\n",
-    "    for qm in offset_g.keys():\n",
-    "        ofile = \"{}/agipd_offset_store_{}_{}.h5\".format(out_folder,\n",
-    "                                                        \"{}-{}-{}\".format(*offset_runs.values()), \n",
-    "                                                        qm)\n",
-    "        store_file = h5py.File(ofile, \"w\")\n",
-    "        store_file[\"{}/Offset/0/data\".format(qm)] = offset_g[qm]\n",
-    "        store_file[\"{}/Noise/0/data\".format(qm)] = noise_g[qm]\n",
-    "        store_file[\"{}/Threshold/0/data\".format(qm)] = thresholds_g[qm]\n",
-    "        store_file[\"{}/BadPixels/0/data\".format(qm)] = badpix_g[qm]\n",
-    "        store_file.close()"
+    "               }"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "proposal = list(filter(None, in_folder.strip('/').split('/')))[-2]\n",
+    "file_loc = 'proposal:{} runs:{} {} {}'.format(proposal, run_low, run_med, run_high)"
    ]
   },
   {
@@ -534,10 +533,8 @@
     "\n",
     "for qm in res:\n",
     "    for const in res[qm]:\n",
-    "        metadata = ConstantMetaData()\n",
     "        dconst = getattr(Constants.AGIPD, const)()\n",
     "        dconst.data = res[qm][const]\n",
-    "        metadata.calibration_constant = dconst\n",
     "\n",
     "        # Setting conditions\n",
     "        condition = Conditions.Dark.AGIPD(memory_cells=max_cells,\n",
@@ -557,21 +554,14 @@
     "            time = mdata.calibration_constant_version.begin_at\n",
     "            old_mdata[const] = time.isoformat()\n",
     "            os.makedirs('{}/old/'.format(out_folder), exist_ok=True)\n",
-    "            save_const_to_h5(mdata, '{}/old/'.format(out_folder))\n",
+    "            save_const_to_h5(device,\n",
+    "                             getattr(Constants.AGIPD, const)(),\n",
+    "                             condition, data, file_loc, creation_time,\n",
+    "                             f'{out_folder}/old/')\n",
     "        else:\n",
     "            old_mdata[const] = \"Not found\""
    ]
   },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "proposal = list(filter(None, in_folder.strip('/').split('/')))[-2]\n",
-    "file_loc = 'proposal:{} runs:{} {} {}'.format(proposal, run_low, run_med, run_high)"
-   ]
-  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -583,13 +573,12 @@
    },
    "outputs": [],
    "source": [
+    "md = None\n",
     "for qm in res:\n",
     "\n",
     "    for const in res[qm]:\n",
-    "        metadata = ConstantMetaData()\n",
     "        dconst = getattr(Constants.AGIPD, const)()\n",
     "        dconst.data = res[qm][const]\n",
-    "        metadata.calibration_constant = dconst\n",
     "\n",
     "        # set the operating condition\n",
     "        condition = Conditions.Dark.AGIPD(memory_cells=max_cells,\n",
@@ -599,33 +588,18 @@
     "        detinst = getattr(Detectors, dinstance)\n",
     "        device = getattr(detinst, qm)\n",
     "\n",
-    "        metadata.detector_condition = condition\n",
-    "\n",
-    "        # specify the a version for this constant\n",
-    "        if creation_time is None:\n",
-    "            metadata.calibration_constant_version = Versions.Now(device=device)\n",
-    "        else:\n",
-    "            metadata.calibration_constant_version = Versions.Timespan(device=device,\n",
-    "                                                                      start=creation_time)\n",
-    "\n",
-    "        metadata.calibration_constant_version.raw_data_location = file_loc\n",
-    "\n",
     "        if db_output:\n",
-    "            try:\n",
-    "                metadata.send(cal_db_interface, timeout=cal_db_timeout)\n",
-    "                print(f'Const {const} for module {qm} was injected to the calibration DB. '\n",
-    "                      f'Begin at: {metadata.calibration_constant_version.begin_at}')\n",
-    "            except Exception as e:\n",
-    "                print(\"Error:\", e)\n",
+    "            md = send_to_db(device, dconst, condition, file_loc, \n",
+    "                            cal_db_interface, creation_time=creation_time, timeout=cal_db_timeout)\n",
     "\n",
     "        if local_output:\n",
-    "            save_const_to_h5(metadata, out_folder)\n",
+    "            md = save_const_to_h5(device, dconst, condition, dconst.data, file_loc, creation_time, out_folder)\n",
     "            print(f\"Calibration constant {const} is stored locally.\\n\")\n",
     "            \n",
-    "    print(\"Generated constants with conditions:\\n\")\n",
+    "    print(\"Constants parameter conditions are:\\n\")\n",
     "    print(f\"• memory_cells: {max_cells}\\n• bias_voltage: {bias_voltage}\\n\"\n",
     "          f\"• acquisition_rate: {acq_rate}\\n• gain_setting: {gain_setting}\\n\"\n",
-    "          f\"• creation_time: {creation_time}\\n\")"
+    "          f\"• creation_time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")"
    ]
   },
   {
@@ -674,8 +648,7 @@
    "source": [
     "cell = 3\n",
     "gain = 0\n",
-    "out_folder = None\n",
-    "show_overview(res, cell, gain, out_folder=out_folder, infix=\"{}-{}-{}\".format(*offset_runs.values()))"
+    "show_overview(res, cell, gain, infix=\"{}-{}-{}\".format(*offset_runs.values()))"
    ]
   },
   {
@@ -695,7 +668,7 @@
    "source": [
     "cell = 3\n",
     "gain = 1\n",
-    "show_overview(res, cell, gain, out_folder=out_folder, infix=\"{}-{}-{}\".format(*offset_runs.values()))"
+    "show_overview(res, cell, gain, infix=\"{}-{}-{}\".format(*offset_runs.values()))"
    ]
   },
   {
@@ -715,7 +688,7 @@
    "source": [
     "cell = 3\n",
     "gain = 2\n",
-    "show_overview(res, cell, gain, out_folder=out_folder, infix=\"{}-{}-{}\".format(*offset_runs.values()))"
+    "show_overview(res, cell, gain, infix=\"{}-{}-{}\".format(*offset_runs.values()))"
    ]
   },
   {
diff --git a/notebooks/AGIPD/playground/AGIPD_SingleM_test_Dark.ipynb b/notebooks/AGIPD/playground/AGIPD_SingleM_test_Dark.ipynb
index b0d22ac4ecc2a7a6cb29e3d67858fb2af06f89a3..551f5f98a568931bcc44e659bcf9d141b406e3a0 100644
--- a/notebooks/AGIPD/playground/AGIPD_SingleM_test_Dark.ipynb
+++ b/notebooks/AGIPD/playground/AGIPD_SingleM_test_Dark.ipynb
@@ -102,7 +102,7 @@
     "from cal_tools.tools import (gain_map_files, parse_runs, \n",
     "                             run_prop_seq_from_path, get_notebook_name, \n",
     "                             get_dir_creation_date, save_const_to_h5,\n",
-    "                             get_random_db_interface)\n",
+    "                             get_random_db_interface, send_to_db)\n",
     "from cal_tools.influx import InfluxLogger\n",
     "from cal_tools.enums import BadPixels\n",
     "from cal_tools.plotting import show_overview, plot_badpix_3d, create_constant_overview\n",
@@ -458,11 +458,10 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "md = None\n",
     "for const in res:\n",
-    "    metadata = ConstantMetaData()\n",
     "    dconst = getattr(Constants.AGIPD, const)()\n",
     "    dconst.data = res[const]\n",
-    "    metadata.calibration_constant = dconst\n",
     "\n",
     "    # set the operating condition\n",
     "    condition = Conditions.Dark.AGIPD(memory_cells=max_cells,\n",
@@ -473,32 +472,20 @@
     "    # AGIPD_SIV1_AGIPDV11_M001Test\n",
     "    device = Detectors.AGIPD.AGIPD_SIV1_AGIPDV11_M001Test\n",
     "\n",
-    "    metadata.detector_condition = condition\n",
-    "\n",
-    "    # specify the a version for this constant\n",
-    "    if creation_time is None:\n",
-    "        metadata.calibration_constant_version = Versions.Now(device=device)\n",
-    "    else:\n",
-    "        metadata.calibration_constant_version = Versions.Timespan(device=device,\n",
-    "                                                                  start=creation_time)\n",
-    "\n",
-    "    metadata.calibration_constant_version.raw_data_location = file_loc\n",
     "    if db_output:\n",
-    "        try:\n",
-    "            metadata.send(cal_db_interface, timeout=cal_db_timeout)\n",
-    "            msg = 'Const {} was injected to the calibration DB. Begin at: {}'\n",
-    "            print(msg.format(const,\n",
-    "                             metadata.calibration_constant_version.begin_at))\n",
-    "        except Exception as e:    \n",
-    "            if \"has already been take\" in str(e):\n",
-    "                print(f\"WARN: {const_name} has already been injected with the same parameter conditions\\n\")\n",
-    "            else:\n",
-    "                # To prevent having big error message out of the pdf report's page.\n",
-    "                print(\"\\n\".join(textwrap.wrap(str(e),100)))\n",
+    "        md = send_to_db(device, dconst, condition, file_loc, \n",
+    "                   cal_db_interface, creation_time=creation_time,\n",
+    "                   timeout=cal_db_timeout)\n",
     "\n",
     "    if local_output:\n",
-    "        save_const_to_h5(metadata, out_folder)\n",
-    "        print(\"Calibration constant {} is stored locally.\".format(const))\n"
+    "        md = save_const_to_h5(device, dconst, condition,\n",
+    "                              dconst.data, file_loc, creation_time, out_folder)\n",
+    "        print(f\"Calibration constant {const} is stored locally.\\n\")\n",
+    "\n",
+    "print(\"Constants parameter conditions are:\\n\")\n",
+    "print(f\"• memory_cells: {max_cells}\\n• bias_voltage: {bias_voltage}\\n\"\n",
+    "      f\"• acquisition_rate: {acq_rate}\\n• gain_setting: {gain_setting}\\n\"\n",
+    "      f\"• creation_time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")"
    ]
   },
   {
@@ -525,11 +512,11 @@
    "source": [
     "cell = 3\n",
     "gain = 0\n",
-    "\n",
+    "# attach module name for plotting.\n",
     "res_da = {}\n",
     "res_da[module_name] = res\n",
     "\n",
-    "show_overview(res_da, cell, gain, out_folder=None, infix=\"_\".join(offset_runs.values()))"
+    "show_overview(res_da, cell, gain, infix=\"_\".join(offset_runs.values()))"
    ]
   },
   {
@@ -547,7 +534,7 @@
    "source": [
     "cell = 3\n",
     "gain = 1\n",
-    "show_overview(res_da, cell, gain, out_folder=None, infix=\"_\".join(offset_runs.values()))"
+    "show_overview(res_da, cell, gain, infix=\"_\".join(offset_runs.values()))"
    ]
   },
   {
@@ -565,7 +552,7 @@
    "source": [
     "cell = 3\n",
     "gain = 2\n",
-    "show_overview(res_da, cell, gain, out_folder=None, infix=\"_\".join(offset_runs.values()))"
+    "show_overview(res_da, cell, gain, infix=\"_\".join(offset_runs.values()))"
    ]
   },
   {
diff --git a/notebooks/DSSC/Characterize_DSSC_Darks_NBC.ipynb b/notebooks/DSSC/Characterize_DSSC_Darks_NBC.ipynb
index 78da0ec2727aa14cc85fdc07844ce0e4207e11a9..dcbd68882f598b217153d22ec0ec6018006eae60 100644
--- a/notebooks/DSSC/Characterize_DSSC_Darks_NBC.ipynb
+++ b/notebooks/DSSC/Characterize_DSSC_Darks_NBC.ipynb
@@ -71,36 +71,36 @@
    "source": [
     "# imports and things that do not usually need to be changed\n",
     "from datetime import datetime\n",
+    "import os\n",
     "import warnings\n",
     "warnings.filterwarnings('ignore')\n",
     "from collections import OrderedDict\n",
-    "import os\n",
+    "\n",
     "import h5py\n",
-    "import numpy as np\n",
+    "from ipyparallel import Client\n",
+    "from IPython.display import display, Markdown, Latex\n",
     "import matplotlib\n",
     "matplotlib.use('agg')\n",
     "import matplotlib.pyplot as plt\n",
     "%matplotlib inline\n",
+    "import numpy as np\n",
+    "import tabulate\n",
     "\n",
-    "from cal_tools.tools import (map_gain_stages, parse_runs, run_prop_seq_from_path, \n",
-    "                             get_notebook_name, get_dir_creation_date,\n",
-    "                             get_random_db_interface, get_from_db, save_const_to_h5)\n",
-    "from cal_tools.influx import InfluxLogger\n",
     "from cal_tools.enums import BadPixels\n",
-    "from cal_tools.plotting import (show_overview, plot_badpix_3d,\n",
-    "                                create_constant_overview,\n",
+    "from cal_tools.influx import InfluxLogger\n",
+    "from cal_tools.plotting import (create_constant_overview,\n",
+    "                                plot_badpix_3d, show_overview,\n",
     "                                show_processed_modules)\n",
-    "\n",
-    "# make sure a cluster is running with ipcluster start --n=32, give it a while to start\n",
-    "from ipyparallel import Client\n",
-    "from IPython.display import display, Markdown, Latex\n",
-    "import tabulate\n",
-    "\n",
+    "from cal_tools.tools import (get_dir_creation_date, get_from_db, \n",
+    "                             get_notebook_name, get_random_db_interface,\n",
+    "                             map_gain_stages, parse_runs,\n",
+    "                             run_prop_seq_from_path, \n",
+    "                             save_const_to_h5, send_to_db)\n",
+    "from iCalibrationDB import Constants, Conditions, Detectors, Versions\n",
     "view = Client(profile=cluster_profile)[:]\n",
     "view.use_dill()\n",
     "\n",
-    "from iCalibrationDB import ConstantMetaData, Constants, Conditions, Detectors, Versions\n",
-    "\n",
+    "# make sure a cluster is running with ipcluster start --n=32, give it a while to start\n",
     "\n",
     "h5path = h5path.format(karabo_id, receiver_id)\n",
     "h5path_idx = h5path_idx.format(karabo_id, receiver_id)\n",
@@ -153,7 +153,8 @@
     "print(f\"Using DB: {db_output}\")\n",
     "print(f\"Input: {in_folder}\")\n",
     "print(f\"Output: {out_folder}\")\n",
-    "print(f\"Bias voltage: {bias_voltage}V\")"
+    "print(f\"Bias voltage: {bias_voltage}V\")\n",
+    "file_loc = f'proposal:{prop} runs:{[ v for v in offset_runs.values()][0]}'"
    ]
   },
   {
@@ -389,7 +390,10 @@
     "            time = mdata.calibration_constant_version.begin_at\n",
     "            old_mdata[const] = time.isoformat()\n",
     "            os.makedirs(f'{out_folder}/old/', exist_ok=True)\n",
-    "            save_const_to_h5(mdata, f'{out_folder}/old/')\n",
+    "            save_const_to_h5(device,\n",
+    "                             getattr(Constants.DSSC, const)(),\n",
+    "                             condition, data, file_loc, creation_time,\n",
+    "                             f'{out_folder}/old/')\n",
     "        else:\n",
     "            old_mdata[const] = \"Not found\""
    ]
@@ -432,48 +436,38 @@
     "# Push the same constant two different times.\n",
     "# One with the generated pulseID check sum setting for the offline calibration.\n",
     "# And another for the online calibration as it doesn't have this pulseID checksum, yet.\n",
+    "md = None\n",
     "for dont_use_pulseIds in [True, False]:\n",
     "    for qm in res.keys():\n",
     "        detinst = getattr(Detectors, dinstance)\n",
     "        device = getattr(detinst, qm)\n",
     "\n",
     "        for const in res[qm].keys():\n",
-    "\n",
-    "            metadata = ConstantMetaData()\n",
     "            dconst = getattr(Constants.DSSC, const)()\n",
     "            dconst.data = res[qm][const]\n",
-    "            metadata.calibration_constant = dconst\n",
     "\n",
     "            pidsum = None if dont_use_pulseIds else checksums[qm]\n",
     "            # set the operating condition\n",
     "            condition = Conditions.Dark.DSSC(memory_cells=max_cells,\n",
     "                                             bias_voltage=bias_voltage,\n",
     "                                             pulseid_checksum=pidsum)\n",
-    "\n",
-    "            metadata.detector_condition = condition\n",
-    "\n",
-    "            # specify the a version for this constant\n",
-    "            if creation_time is None:\n",
-    "                metadata.calibration_constant_version = Versions.Now(device=device)\n",
-    "            else:\n",
-    "                metadata.calibration_constant_version = Versions.Timespan(device=device, start=creation_time)\n",
-    "\n",
     "            if db_output:\n",
-    "                try:\n",
-    "                    metadata.send(cal_db_interface, timeout=cal_db_timeout)\n",
-    "                except Exception as e:\n",
-    "                    print(\"Error\", e)\n",
+    "                md = send_to_db(device, dconst, condition, file_loc, \n",
+    "                                cal_db_interface, creation_time=creation_time, timeout=cal_db_timeout)\n",
     "\n",
     "            if local_output:\n",
     "                # Don't save constant localy two times.\n",
     "                if dont_use_pulseIds:\n",
-    "                    save_const_to_h5(metadata, out_folder)\n",
+    "                    md = save_const_to_h5(device, dconst, condition,\n",
+    "                                          dconst.data, file_loc,\n",
+    "                                          creation_time, out_folder)\n",
     "                    print(f\"Calibration constant {const} is stored locally.\\n\")\n",
     "    \n",
     "        if not dont_use_pulseIds:\n",
-    "            print(\"Generated constants with conditions:\\n\")\n",
+    "            print(\"Constants parameter conditions are:\\n\")\n",
     "            print(f\"• memory_cells: {max_cells}\\n• bias_voltage: {bias_voltage}\\n\"\n",
-    "                  f\"• pulseid_checksum: {pidsum}\\n• creation_time: {creation_time}\\n\")"
+    "                  f\"• pulseid_checksum: {pidsum}\\n\"\n",
+    "                  f\"• creation_time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")"
    ]
   },
   {
diff --git a/notebooks/FastCCD/Characterize_Darks_NewDAQ_FastCCD_NBC_New_Common_Mode.ipynb b/notebooks/FastCCD/Characterize_Darks_NewDAQ_FastCCD_NBC_New_Common_Mode.ipynb
index ac3842e5e253636c0d7410caea790864c81738dd..0c4d704014d69db5f4b346c61b1d180a95d0fbae 100644
--- a/notebooks/FastCCD/Characterize_Darks_NewDAQ_FastCCD_NBC_New_Common_Mode.ipynb
+++ b/notebooks/FastCCD/Characterize_Darks_NewDAQ_FastCCD_NBC_New_Common_Mode.ipynb
@@ -21,7 +21,7 @@
    "source": [
     "cluster_profile = \"noDB\" # ipcluster profile to use\n",
     "in_folder = \"/gpfs/exfel/exp/SCS/201930/p900074/raw\" # input folder, required\n",
-    "out_folder = '/gpfs/exfel/exp/SCS/201930/p900074/scratch/' # output folder, required\n",
+    "out_folder = '/gpfs/exfel/data/scratch/ahmedk/test/fastccd' # output folder, required\n",
     "sequence = 0 # sequence file to use\n",
     "run = 351 # which run to read data from, required\n",
     "\n",
@@ -75,11 +75,10 @@
    "outputs": [],
    "source": [
     "# Required Packages:\n",
-    "\n",
     "import copy\n",
     "import datetime\n",
-    "import os\n",
     "import time\n",
+    "import os\n",
     "import warnings\n",
     "warnings.filterwarnings('ignore')\n",
     "\n",
@@ -90,10 +89,10 @@
     "import numpy as np\n",
     "from prettytable import PrettyTable\n",
     "\n",
-    "from iCalibrationDB import ConstantMetaData, Constants, Conditions, Detectors, Versions\n",
-    "from iCalibrationDB.detectors import DetectorTypes\n",
-    "from cal_tools.tools import get_dir_creation_date, save_const_to_h5, get_random_db_interface\n",
+    "from cal_tools.tools import get_dir_creation_date, get_random_db_interface, save_const_to_h5\n",
     "from cal_tools.enums import BadPixels\n",
+    "from iCalibrationDB import Constants, Conditions, Detectors, Versions\n",
+    "from iCalibrationDB.detectors import DetectorTypes\n",
     "from XFELDetAna import xfelpyanatools as xana\n",
     "from XFELDetAna import xfelpycaltools as xcal\n",
     "from XFELDetAna.detectors.fastccd import readerh5 as fastccdreaderh5\n",
@@ -1093,12 +1092,10 @@
     "dictionary['Offset'] = offsetMap.data\n",
     "dictionary['Noise'] = noiseMapCM_2nd.data\n",
     "dictionary['BadPixelsDark'] = bad_pixels.data\n",
-    "\n",
+    "md = None\n",
     "for const in dictionary:\n",
-    "    metadata = ConstantMetaData()\n",
     "    dconst = getattr(Constants.CCD(DetectorTypes.fastCCD), const)()\n",
     "    dconst.data = dictionary[const]\n",
-    "    metadata.calibration_constant = dconst\n",
     "    \n",
     "    condition = Conditions.Dark.CCD(bias_voltage=bias_voltage,\n",
     "                                integration_time=integration_time,\n",
@@ -1113,29 +1110,20 @@
     "            parm.upper_deviation = temp_limits\n",
     "\n",
     "    device = Detectors.fastCCD1\n",
-    "    metadata.detector_condition = condition\n",
-    "    \n",
-    "    # Specifying the a version for this constant:\n",
-    "    if creation_time is None:\n",
-    "        metadata.calibration_constant_version = Versions.Now(device=device)\n",
-    "    else:\n",
-    "        metadata.calibration_constant_version = Versions.Timespan(device=device, start=creation_time)\n",
-    "    \n",
-    "    metadata.calibration_constant_version.raw_data_location = file_loc\n",
     "    \n",
     "    if db_output:\n",
-    "        try:\n",
-    "            metadata.send(cal_db_interface, timeout=cal_db_timeout)\n",
-    "            print(\"Calibration constant {} is sent to the database.\".format(const))\n",
-    "        except Exception as e:\n",
-    "            print(e)\n",
-    "       \n",
+    "        md = send_to_db(device, dconst, condition, file_loc, \n",
+    "                        cal_db_interface, creation_time=creation_time, timeout=cal_db_timeout)\n",
+    "\n",
     "    if local_output:\n",
-    "        save_const_to_h5(metadata, out_folder)\n",
-    "        print(\"Calibration constant {} is stored locally.\".format(const))\n",
+    "        md = save_const_to_h5(device, dconst, condition, dconst.data, file_loc, creation_time, out_folder)\n",
+    "        print(f\"Calibration constant {const} is stored locally.\")\n",
     "        \n",
-    "print(\"Creation time is: {}\".format(creation_time))\n",
-    "print(\"Raw data location is: {}\".format(file_loc))"
+    "print(\"Constants parameter conditions are:\\n\")\n",
+    "print(f\"• bias_voltage: {bias_voltage}\\n• integration_time: {integration_time}\\n\"\n",
+    "      f\"• temperature: {temperature_k}\\n• gain_setting: {gain_setting}\\n\"\n",
+    "      f\"• in_vacuum: {in_vacuum}\\n\"\n",
+    "      f\"• creation_time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")"
    ]
   }
  ],
diff --git a/notebooks/Jungfrau/Jungfrau_dark_analysis_all_gains_burst_mode_NBC.ipynb b/notebooks/Jungfrau/Jungfrau_dark_analysis_all_gains_burst_mode_NBC.ipynb
index 4369e67e30389710349e9d28f4b3e54e7d5b571d..931233724f13ce2d06135c6179cc1d4501aedc53 100644
--- a/notebooks/Jungfrau/Jungfrau_dark_analysis_all_gains_burst_mode_NBC.ipynb
+++ b/notebooks/Jungfrau/Jungfrau_dark_analysis_all_gains_burst_mode_NBC.ipynb
@@ -63,38 +63,33 @@
    },
    "outputs": [],
    "source": [
+    "import glob\n",
     "import os\n",
     "import warnings\n",
     "warnings.filterwarnings('ignore')\n",
-    "import textwrap\n",
     "\n",
+    "import h5py\n",
+    "from h5py import File as h5file\n",
     "import matplotlib\n",
     "matplotlib.use('agg')\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
     "import numpy as np\n",
-    "import h5py\n",
-    "from h5py import File as h5file\n",
     "\n",
     "from cal_tools.enums import BadPixels\n",
-    "from cal_tools.tools import get_dir_creation_date, get_random_db_interface\n",
+    "from cal_tools.tools import (get_dir_creation_date, get_random_db_interface,\n",
+    "                             save_const_to_h5, send_to_db)\n",
     "from cal_tools.ana_tools import save_dict_to_hdf5\n",
-    "from iCalibrationDB import ConstantMetaData, Constants, Conditions, Detectors, Versions\n",
+    "from iCalibrationDB import Constants, Conditions, Detectors, Versions\n",
     "\n",
     "from XFELDetAna.util import env\n",
     "env.iprofile = cluster_profile\n",
-    "\n",
     "from XFELDetAna.detectors.jungfrau import readerPSI as jfreaderPSI\n",
     "from XFELDetAna.detectors.jungfrau import reader as jfreader\n",
     "from XFELDetAna.detectors.jungfrau.jf_chunk_reader import JFChunkReader\n",
     "from XFELDetAna.detectors.jungfrau.util import count_n_files, rollout_data, sanitize_data_cellid\n",
-    "import glob\n",
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
-    "\n",
-    "from XFELDetAna.plotting.histogram import histPlot\n",
     "from XFELDetAna.plotting.heatmap import heatmapPlot\n",
-    "\n",
-    "\n",
-    "os.makedirs(out_folder, exist_ok=True)"
+    "from XFELDetAna.plotting.histogram import histPlot"
    ]
   },
   {
@@ -108,6 +103,8 @@
     "proposal = list(filter(None, in_folder.strip('/').split('/')))[-2]\n",
     "file_loc = 'proposal:{} runs:{} {} {}'.format(proposal, run_high, run_med, run_low)\n",
     "\n",
+    "os.makedirs(out_folder, exist_ok=True)\n",
+    "\n",
     "# TODO \n",
     "# this trick is needed until proper mapping is introduced\n",
     "if len(db_module)>1:\n",
@@ -450,13 +447,11 @@
     "constants = {'Offset': np.moveaxis(offset_map, 0, 1),\n",
     "             'Noise': np.moveaxis(noise_map, 0, 1), \n",
     "             'BadPixelsDark': np.moveaxis(bad_pixels_map, 0, 1)}\n",
-    "\n",
+    "md = None\n",
     "for key, const_data in constants.items():\n",
     "\n",
-    "    metadata = ConstantMetaData()\n",
     "    const =  getattr(Constants.jungfrau, key)()\n",
     "    const.data = const_data\n",
-    "    metadata.calibration_constant = const\n",
     "\n",
     "    # set the operating condition\n",
     "    condition = Conditions.Dark.jungfrau(memory_cells=memoryCells, bias_voltage=bias_voltage,\n",
@@ -468,51 +463,19 @@
     "            parm.upper_deviation = time_limits\n",
     "            \n",
     "    device = getattr(Detectors, db_module)\n",
-    "    metadata.detector_condition = condition\n",
     "\n",
-    "    # specify the version for this constant\n",
-    "    if creation_time is None:\n",
-    "        metadata.calibration_constant_version = Versions.Now(device=device)\n",
-    "    else:\n",
-    "        metadata.calibration_constant_version = Versions.Timespan(device=device,\n",
-    "                                                                  start=creation_time)\n",
-    "        \n",
-    "    metadata.calibration_constant_version.raw_data_location = file_loc\n",
     "    if db_output:\n",
-    "        try:\n",
-    "            metadata.send(cal_db_interface, timeout=cal_db_timeout)\n",
-    "            print(f'Constants {key} is sent to the data base\\n')\n",
-    "        except Exception as e:    \n",
-    "            if \"has already been take\" in str(e):\n",
-    "                print(f\"{key} has already been injected with the same parameter conditions\\n\")\n",
-    "            else:\n",
-    "                # To prevent having big error message in the pdf report.\n",
-    "                print(\"\\n\".join(textwrap.wrap(str(e),100)))\n",
-    "        \n",
-    "    # save everything to file.\n",
-    "    # one file - one entrt in the DB\n",
+    "        md = send_to_db(device, const, condition, file_loc, \n",
+    "                        cal_db_interface, creation_time=creation_time, timeout=cal_db_timeout)\n",
+    "\n",
     "    if local_output:\n",
-    "        dpar = {}\n",
-    "        for parm in metadata.detector_condition.parameters:\n",
-    "            dpar[parm.name] = {'lower_deviation': parm.lower_deviation,\n",
-    "                               'upper_deviation': parm.upper_deviation,\n",
-    "                               'value': parm.value}\n",
-    "        \n",
-    "        data_to_store = {}\n",
-    "        data_to_store['condition'] = dpar\n",
-    "        data_to_store['db_module'] = db_module\n",
-    "        data_to_store['constant'] = key\n",
-    "        data_to_store['data'] = const_data\n",
-    "        data_to_store['creation_time'] = creation_time\n",
-    "        data_to_store['dclass'] = 'jungfrau'\n",
-    "        data_to_store['file_loc'] = file_loc\n",
-    "        \n",
-    "        ofile = \"{}/const_{}_{}.h5\".format(out_folder, key, db_module)\n",
-    "        save_dict_to_hdf5(data_to_store, ofile)\n",
+    "        md = save_const_to_h5(device, const, condition, const_data, file_loc, creation_time, out_folder)\n",
     "        print(f\"Calibration constant {key} is stored locally at {out_folder}.\\n\")\n",
-    "print(f\"Operating conditions are:\\n• Bias voltage: {bias_voltage}\\n• Memory cells: {memoryCells}\\n\"\n",
+    "        \n",
+    "print(\"Constants parameter conditions are:\\n\")\n",
+    "print(f\"• Bias voltage: {bias_voltage}\\n• Memory cells: {memoryCells}\\n\"\n",
     "      f\"• Integration time: {integration_time}\\n\"\n",
-    "      f\"• Creation time: {metadata.calibration_constant_version.begin_at}\\n\")"
+    "      f\"• Creation time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")"
    ]
   },
   {
diff --git a/notebooks/LPD/LPDChar_Darks_NBC.ipynb b/notebooks/LPD/LPDChar_Darks_NBC.ipynb
index 53039a126b47cb7368e9fb1cd84881968d19d622..e260e54d23d6bffa9919da3df38ae7ccbf197703 100644
--- a/notebooks/LPD/LPDChar_Darks_NBC.ipynb
+++ b/notebooks/LPD/LPDChar_Darks_NBC.ipynb
@@ -77,30 +77,28 @@
     "import h5py\n",
     "from ipyparallel import Client\n",
     "from IPython.display import display, Markdown, Latex\n",
-    "import numpy as np\n",
     "import matplotlib\n",
     "matplotlib.use(\"agg\")\n",
     "import matplotlib.patches as patches\n",
     "import matplotlib.pyplot as plt\n",
     "%matplotlib inline\n",
+    "import numpy as np\n",
     "import tabulate\n",
-    "from XFELDetAna.plotting.heatmap import heatmapPlot\n",
-    "from XFELDetAna.plotting.simpleplot import simplePlot\n",
     "\n",
-    "from iCalibrationDB import (ConstantMetaData, Constants, \n",
-    "                            Conditions, Detectors, \n",
-    "                            Versions)\n",
-    "from cal_tools.tools import (map_gain_stages, parse_runs, \n",
-    "                             run_prop_seq_from_path, \n",
-    "                             get_notebook_name, \n",
-    "                             get_dir_creation_date, get_from_db,\n",
-    "                             get_random_db_interface,\n",
-    "                             save_const_to_h5)\n",
-    "from cal_tools.influx import InfluxLogger\n",
     "from cal_tools.enums import BadPixels\n",
+    "from cal_tools.influx import InfluxLogger\n",
     "from cal_tools.plotting import (show_overview, plot_badpix_3d, \n",
     "                                create_constant_overview,\n",
-    "                                show_processed_modules)"
+    "                                show_processed_modules)\n",
+    "from cal_tools.tools import (get_dir_creation_date, get_from_db,\n",
+    "                             get_notebook_name, \n",
+    "                             get_random_db_interface,\n",
+    "                             map_gain_stages, parse_runs, \n",
+    "                             run_prop_seq_from_path,\n",
+    "                             save_const_to_h5, send_to_db)\n",
+    "from iCalibrationDB import Constants, Conditions, Detectors, Versions\n",
+    "from XFELDetAna.plotting.heatmap import heatmapPlot\n",
+    "from XFELDetAna.plotting.simpleplot import simplePlot"
    ]
   },
   {
@@ -338,6 +336,16 @@
     "logger.send()"
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "proposal = list(filter(None, in_folder.strip('/').split('/')))[-2]\n",
+    "file_loc = 'proposal:{} runs:{} {} {}'.format(proposal, run_low, run_med, run_high)"
+   ]
+  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -372,7 +380,10 @@
     "                time = mdata.calibration_constant_version.begin_at\n",
     "                old_mdata[const] = time.isoformat()\n",
     "                os.makedirs('{}/old/'.format(out_folder), exist_ok=True)\n",
-    "                save_const_to_h5(mdata, '{}/old/'.format(out_folder))\n",
+    "                save_const_to_h5(getattr(detinst, qm),\n",
+    "                                 getattr(Constants.LPD, const)(),\n",
+    "                                 condition, data, file_loc, creation_time,\n",
+    "                                 f'{out_folder}/old/')\n",
     "            else:\n",
     "                old_mdata[const] = \"Not found\""
    ]
@@ -395,16 +406,6 @@
     "                        }"
    ]
   },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "proposal = list(filter(None, in_folder.strip('/').split('/')))[-2]\n",
-    "file_loc = 'proposal:{} runs:{} {} {}'.format(proposal, run_low, run_med, run_high)"
-   ]
-  },
   {
    "cell_type": "code",
    "execution_count": null,
@@ -412,6 +413,7 @@
    "outputs": [],
    "source": [
     "# Save constants in the calibration DB\n",
+    "md = None\n",
     "for cap in capacitor_settings:\n",
     "    for qm in res[cap]:\n",
     "        # Do not store empty constants\n",
@@ -420,43 +422,28 @@
     "            continue\n",
     "        for const in res[cap][qm]:\n",
     "\n",
-    "            metadata = ConstantMetaData()\n",
     "            dconst = getattr(Constants.LPD, const)()\n",
     "            dconst.data = res[cap][qm][const]\n",
-    "            metadata.calibration_constant = dconst\n",
     "\n",
     "            # set the operating condition\n",
     "            condition = Conditions.Dark.LPD(memory_cells=max_cells,\n",
     "                                            bias_voltage=bias_voltage,\n",
     "                                            capacitor=cap)\n",
     "            device = getattr(Detectors.LPD1M1, qm)\n",
-    "            if device:\n",
-    "                metadata.detector_condition = condition\n",
-    "\n",
-    "                # specify the a version for this constant\n",
-    "                if creation_time is None:\n",
-    "                    metadata.calibration_constant_version = Versions.Now(device=device)\n",
-    "                else:\n",
-    "                    metadata.calibration_constant_version = Versions.Timespan(device=device,\n",
-    "                                                                              start=creation_time)\n",
-    "\n",
-    "                metadata.calibration_constant_version.raw_data_location = file_loc\n",
     "\n",
-    "                if db_output:\n",
-    "                    try:\n",
-    "                        metadata.send(cal_db_interface, timeout=cal_db_timeout)\n",
-    "                        print(f'Const {const} for module {qm} was injected to the calibration DB. '\n",
-    "                              f'Begin at: {metadata.calibration_constant_version.begin_at}')\n",
-    "                    except Exception as e:\n",
-    "                        print(\"Error:\", e)\n",
+    "            if db_output:\n",
+    "                md = send_to_db(device, dconst, condition, file_loc, \n",
+    "                                cal_db_interface, creation_time=creation_time, timeout=cal_db_timeout)\n",
     "\n",
-    "                if local_output:\n",
-    "                    save_const_to_h5(metadata, out_folder)\n",
-    "                    print(f\"Calibration constant {const} is stored locally.\\n\")\n",
+    "            if local_output:\n",
+    "                md = save_const_to_h5(device, dconst, condition,\n",
+    "                                      dconst.data, file_loc, creation_time, out_folder)\n",
+    "                print(f\"Calibration constant {const} is stored locally.\\n\")\n",
     "\n",
-    "        print(\"Generated constants with conditions:\\n\")\n",
+    "        print(\"Constants parameter conditions are:\\n\")\n",
     "        print(f\"• memory_cells: {max_cells}\\n• bias_voltage: {bias_voltage}\\n\"\n",
-    "              f\"• capacitor: {cap}\\n• creation_time: {creation_time}\\n\")"
+    "              f\"• capacitor: {cap}\\n\"\n",
+    "              f\"• creation_time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")"
    ]
   },
   {
diff --git a/notebooks/ePix100/Characterize_Darks_ePix100_NBC.ipynb b/notebooks/ePix100/Characterize_Darks_ePix100_NBC.ipynb
index d829869675b67d244a4b44f0fd3a2f6634b59eab..ec7c96f0f1b997b5a44e3be5b1cda93881a959a6 100644
--- a/notebooks/ePix100/Characterize_Darks_ePix100_NBC.ipynb
+++ b/notebooks/ePix100/Characterize_Darks_ePix100_NBC.ipynb
@@ -53,32 +53,31 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "from IPython.display import display, Markdown, Latex\n",
     "import os\n",
-    "import textwrap\n",
+    "import warnings\n",
+    "warnings.filterwarnings('ignore')\n",
     "\n",
-    "import numpy as np\n",
     "import h5py\n",
+    "from IPython.display import display, Markdown, Latex\n",
     "import matplotlib.pyplot as plt\n",
     "%matplotlib inline\n",
-    "import warnings\n",
-    "warnings.filterwarnings('ignore')\n",
+    "import numpy as np\n",
     "\n",
-    "from cal_tools.tools import get_dir_creation_date, save_const_to_h5, get_random_db_interface\n",
-    "from iCalibrationDB import (ConstantMetaData, Constants, Conditions, Detectors,\n",
-    "                            Versions)\n",
+    "from cal_tools.tools import (get_dir_creation_date, get_random_db_interface,\n",
+    "                             save_const_to_h5, send_to_db)\n",
+    "from iCalibrationDB import Constants, Conditions, Detectors, Versions\n",
     "from iCalibrationDB.detectors import DetectorTypes\n",
-    "import XFELDetAna.xfelprofiler as xprof\n",
-    "profiler = xprof.Profiler()\n",
-    "profiler.disable()\n",
     "from XFELDetAna.util import env\n",
     "env.iprofile = cluster_profile\n",
     "from XFELDetAna import xfelpycaltools as xcal\n",
     "from XFELDetAna import xfelpyanatools as xana\n",
+    "from XFELDetAna.detectors.fastccd import readerh5 as fastccdreaderh5\n",
     "from XFELDetAna.plotting.util import prettyPlotting\n",
     "prettyPlotting = True\n",
+    "import XFELDetAna.xfelprofiler as xprof\n",
+    "profiler = xprof.Profiler()\n",
+    "profiler.disable()\n",
     "from XFELDetAna.xfelreaders import ChunkReader\n",
-    "from XFELDetAna.detectors.fastccd import readerh5 as fastccdreaderh5\n",
     "\n",
     "h5path = h5path.format(karabo_id, receiver_id)\n",
     "h5path_t = h5path_t.format(karabo_id, receiver_id)\n",
@@ -258,21 +257,18 @@
    "source": [
     "# Save constants to DB\n",
     "dclass=\"ePix100\"\n",
-    "cal_db_interface = get_random_db_interface(cal_db_interface)\n",
+    "md = None\n",
+    "\n",
     "for const_name in constant_maps.keys():\n",
-    "    metadata = ConstantMetaData()\n",
     "    det = getattr(Constants, dclass)\n",
     "    const = getattr(det, const_name)()\n",
     "    const.data = constant_maps[const_name].data\n",
     "\n",
-    "    metadata.calibration_constant = const\n",
-    "\n",
     "    # set the operating condition\n",
-    "    dcond = Conditions.Dark\n",
-    "    condition =  getattr(dcond, dclass)(bias_voltage=bias_voltage,\n",
-    "                                        integration_time=integration_time,\n",
-    "                                        temperature=temperature_k,\n",
-    "                                        in_vacuum=in_vacuum)\n",
+    "    condition =  getattr(Conditions.Dark, dclass)(bias_voltage=bias_voltage,\n",
+    "                                                  integration_time=integration_time,\n",
+    "                                                  temperature=temperature_k,\n",
+    "                                                  in_vacuum=in_vacuum)\n",
     "\n",
     "    for parm in condition.parameters:\n",
     "        if parm.name == \"Sensor Temperature\":\n",
@@ -280,36 +276,28 @@
     "            parm.upper_deviation = temp_limits\n",
     "\n",
     "    device = getattr(Detectors, db_module)\n",
-    "    metadata.detector_condition = condition\n",
-    "\n",
-    "    # specify the a version for this constant\n",
-    "    if creation_time is None:\n",
-    "        metadata.calibration_constant_version = Versions.Now(device=device)\n",
-    "    else:\n",
-    "        metadata.calibration_constant_version = Versions.Timespan(device=device,\n",
-    "                                                                  start=creation_time)\n",
-    "        \n",
-    "    metadata.calibration_constant_version.raw_data_location = file_loc\n",
     "\n",
     "    if db_output:\n",
-    "        try:\n",
-    "            metadata.send(cal_db_interface, timeout=cal_db_timeout)\n",
-    "            print(f\"Inject {const_name} constants from {metadata.calibration_constant_version.begin_at}\\n\")\n",
-    "        except Exception as e:    \n",
-    "            if \"has already been take\" in str(e):\n",
-    "                print(f\"{const_name} has already been injected with the same parameter conditions\\n\")\n",
-    "            else:\n",
-    "                # To prevent having big error message in the pdf report.\n",
-    "                print(\"\\n\".join(textwrap.wrap(str(e),100)))\n",
+    "        md = send_to_db(device, const, condition, file_loc, \n",
+    "                        cal_db_interface, creation_time=creation_time)\n",
     "\n",
     "    if local_output:\n",
-    "        save_const_to_h5(metadata, out_folder)\n",
-    "        print(f\"Calibration constant {const_name} is stored locally at {out_folder}.\")\n",
+    "        md = save_const_to_h5(device, const, condition,\n",
+    "                              const.data, file_loc, creation_time, out_folder)\n",
+    "        print(f\"Calibration constant {const_name} is stored locally at {out_folder} \\n\")\n",
     "\n",
-    "print(f\"Operating conditions are:\\n• Bias voltage: {bias_voltage}\\n• Integration time: {integration_time}\\n\"\n",
+    "print(\"Constants parameter conditions are:\\n\")\n",
+    "print(f\"• Bias voltage: {bias_voltage}\\n• Integration time: {integration_time}\\n\"\n",
     "      f\"• Temperature: {temperature_k}\\n• In Vacuum: {in_vacuum}\\n\"\n",
-    "      f\"• Creation time: {metadata.calibration_constant_version.begin_at}\\n\")"
+    "      f\"• Creation time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {
diff --git a/notebooks/ePix10K/Characterize_Darks_ePix10K_NBC.ipynb b/notebooks/ePix10K/Characterize_Darks_ePix10K_NBC.ipynb
index cf8a9d2852dc60d30ff49ecd0a3287c4acad405f..536f8b04b99453c5c95f9c86ce636ed9cae6871a 100644
--- a/notebooks/ePix10K/Characterize_Darks_ePix10K_NBC.ipynb
+++ b/notebooks/ePix10K/Characterize_Darks_ePix10K_NBC.ipynb
@@ -21,7 +21,7 @@
    "source": [
     "cluster_profile = \"noDB\" # ipcluster profile to use\n",
     "in_folder = '/gpfs/exfel/exp/HED/201922/p002550/raw' # input folder, required\n",
-    "out_folder = '/gpfs/exfel/exp/HED/201922/p002550/usr/dark/' # output folder, required\n",
+    "out_folder = '/gpfs/exfel/data/scratch/ahmedk/test/epix10' # output folder, required\n",
     "sequence = 0 # sequence file to use\n",
     "run = 55 # which run to read data from, required\n",
     "\n",
@@ -53,34 +53,30 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "import XFELDetAna.xfelprofiler as xprof\n",
-    "\n",
-    "profiler = xprof.Profiler()\n",
-    "profiler.disable()\n",
-    "from XFELDetAna.util import env\n",
-    "env.iprofile = cluster_profile\n",
-    "\n",
     "import warnings\n",
     "warnings.filterwarnings('ignore')\n",
+    "import os\n",
     "\n",
-    "from XFELDetAna import xfelpycaltools as xcal\n",
+    "import h5py\n",
+    "import matplotlib.pyplot as plt\n",
+    "%matplotlib inline\n",
+    "import numpy as np\n",
+    "\n",
+    "from cal_tools.tools import (get_dir_creation_date, save_const_to_h5,\n",
+    "                             get_random_db_interface, send_to_db)\n",
+    "from iCalibrationDB import Constants, Conditions, Detectors, Versions\n",
+    "from iCalibrationDB.detectors import DetectorTypes\n",
     "from XFELDetAna import xfelpyanatools as xana\n",
+    "from XFELDetAna import xfelpycaltools as xcal\n",
     "from XFELDetAna.plotting.util import prettyPlotting\n",
-    "\n",
     "prettyPlotting = True\n",
-    "from XFELDetAna.xfelreaders import ChunkReader\n",
     "from XFELDetAna.detectors.fastccd import readerh5 as fastccdreaderh5\n",
-    "from cal_tools.tools import get_dir_creation_date, save_const_to_h5, get_random_db_interface\n",
-    "\n",
-    "from iCalibrationDB import (ConstantMetaData, Constants, Conditions, Detectors,\n",
-    "                            Versions)\n",
-    "from iCalibrationDB.detectors import DetectorTypes\n",
-    "\n",
-    "import numpy as np\n",
-    "import os\n",
-    "import h5py\n",
-    "import matplotlib.pyplot as plt\n",
-    "%matplotlib inline\n",
+    "from XFELDetAna.util import env\n",
+    "env.iprofile = cluster_profile\n",
+    "import XFELDetAna.xfelprofiler as xprof\n",
+    "profiler = xprof.Profiler()\n",
+    "profiler.disable()\n",
+    "from XFELDetAna.xfelreaders import ChunkReader\n",
     "\n",
     "h5path = h5path.format(karabo_id, receiver_id)\n",
     "h5path_t = h5path_t.format(karabo_id, receiver_id)\n",
@@ -265,15 +261,13 @@
    "source": [
     "# Save constants to DB\n",
     "dclass=\"ePix10K\"\n",
-    "cal_db_interface = get_random_db_interface(cal_db_interface)\n",
+    "md = None\n",
+    "\n",
     "for const_name in constant_maps.keys():\n",
-    "    metadata = ConstantMetaData()\n",
     "    det = getattr(Constants, dclass)\n",
     "    const = getattr(det, const_name)()\n",
     "    const.data = constant_maps[const_name].data\n",
     "\n",
-    "    metadata.calibration_constant = const\n",
-    "\n",
     "    # set the operating condition\n",
     "    dcond = Conditions.Dark\n",
     "    condition =  getattr(dcond, dclass)(bias_voltage=bias_voltage,\n",
@@ -288,29 +282,21 @@
     "            parm.upper_deviation = temp_limits\n",
     "\n",
     "    device = getattr(Detectors, db_module)\n",
-    "\n",
-    "    metadata.detector_condition = condition\n",
-    "\n",
-    "    # specify the a version for this constant\n",
-    "    if creation_time is None:\n",
-    "        metadata.calibration_constant_version = Versions.Now(device=device)\n",
-    "    else:\n",
-    "        metadata.calibration_constant_version = Versions.Timespan(device=device,\n",
-    "                                                                  start=creation_time)\n",
-    "        \n",
-    "    metadata.calibration_constant_version.raw_data_location = file_loc\n",
     "    \n",
     "    if db_output:\n",
-    "        try:\n",
-    "            metadata.send(cal_db_interface, timeout=cal_db_timeout)\n",
-    "            print(\"Inject {} constants from {}\".format(const_name, \n",
-    "                                          metadata.calibration_constant_version.begin_at))\n",
-    "        except Exception as e:\n",
-    "            print(e)\n",
-    "        \n",
+    "        md = send_to_db(device, const, const.data, condition, file_loc, \n",
+    "                        cal_db_interface, creation_time=creation_time, timeout=cal_db_timeout)\n",
+    "\n",
     "    if local_output:\n",
-    "        save_const_to_h5(metadata, out_folder)\n",
-    "        print(\"Calibration constant {} is stored locally.\".format(const))"
+    "        md = save_const_to_h5(device, const, condition,\n",
+    "                              const.data, file_loc, creation_time, out_folder)\n",
+    "        print(f\"Calibration constant {const_name} is stored locally.\")\n",
+    "\n",
+    "print(\"Constants parameter conditions are:\\n\")\n",
+    "print(f\"• bias_voltage: {bias_voltage}\\n• integration_time: {integration_time}\\n\"\n",
+    "      f\"• temperature: {temperature_k}\\n• gain_setting: {gain_setting}\\n\"\n",
+    "      f\"• in_vacuum: {in_vacuum}\\n\"\n",
+    "      f\"• creation_time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")"
    ]
   }
  ],
diff --git a/notebooks/pnCCD/Characterize_pnCCD_Dark_NBC.ipynb b/notebooks/pnCCD/Characterize_pnCCD_Dark_NBC.ipynb
index ec232229b6f13f75d2f51be924c9c2d56c22e42d..48c76a03a4151bae898de8827dea9d959dc92479 100644
--- a/notebooks/pnCCD/Characterize_pnCCD_Dark_NBC.ipynb
+++ b/notebooks/pnCCD/Characterize_pnCCD_Dark_NBC.ipynb
@@ -31,10 +31,10 @@
    "outputs": [],
    "source": [
     "cluster_profile = \"noDB\"  # ipcluster profile to use\n",
-    "in_folder = \"/gpfs/exfel/exp/SQS/202031/p900166/raw\"  # input folder, required\n",
+    "in_folder = \"/gpfs/exfel/exp/SQS/202002/p002714/raw\"  # input folder, required\n",
     "out_folder = '/gpfs/exfel/data/scratch/ahmedk/test/pnccd'  # output folder, required\n",
     "sequence = 0  # sequence file to use\n",
-    "run = 39 # which run to read data from, required\n",
+    "run = 281 # which run to read data from, required\n",
     "\n",
     "db_module = \"pnCCD_M205_M206\"\n",
     "karabo_da = ['PNCCD01'] # data aggregators\n",
@@ -94,7 +94,10 @@
     "from prettytable import PrettyTable\n",
     "from IPython.display import display, Markdown\n",
     "\n",
-    "from iCalibrationDB import ConstantMetaData, Constants, Conditions, Detectors, Versions\n",
+    "from cal_tools.enums import BadPixels\n",
+    "from cal_tools.tools import (get_dir_creation_date, save_const_to_h5,\n",
+    "                             get_random_db_interface, send_to_db)\n",
+    "from iCalibrationDB import (Constants, Conditions, Detectors, Versions)\n",
     "from iCalibrationDB.detectors import DetectorTypes\n",
     "import XFELDetAna.xfelprofiler as xprof\n",
     "profiler = xprof.Profiler()\n",
@@ -106,9 +109,7 @@
     "from XFELDetAna.plotting.util import prettyPlotting\n",
     "prettyPlotting=True\n",
     "from XFELDetAna.xfelreaders import ChunkReader\n",
-    "from XFELDetAna.detectors.fastccd import readerh5 as fastccdreaderh5\n",
-    "from cal_tools.tools import get_dir_creation_date, save_const_to_h5, get_random_db_interface\n",
-    "from cal_tools.enums import BadPixels"
+    "from XFELDetAna.detectors.fastccd import readerh5 as fastccdreaderh5"
    ]
   },
   {
@@ -998,13 +999,11 @@
     "    'Noise': noiseMapCM_2nd,\n",
     "    'BadPixelsDark': bad_pixels\n",
     "}\n",
-    "\n",
+    "md = None\n",
     "for const_name in constant_maps.keys():\n",
-    "    metadata = ConstantMetaData()\n",
     "    det = Constants.CCD(DetectorTypes.pnCCD)\n",
     "    const = getattr(det, const_name)()\n",
     "    const.data = constant_maps[const_name].data\n",
-    "    metadata.calibration_constant = const\n",
     "\n",
     "    # set the operating condition\n",
     "    condition = Conditions.Dark.CCD(bias_voltage=bias_voltage,\n",
@@ -1020,51 +1019,19 @@
     "            parm.upper_deviation = temp_limits\n",
     "\n",
     "    device = getattr(Detectors, db_module)\n",
-    "    metadata.detector_condition = condition\n",
-    "\n",
-    "    # specify the a version for this constant\n",
-    "    if creation_time is None:\n",
-    "        metadata.calibration_constant_version = Versions.Now(device=device)\n",
-    "    else:\n",
-    "        metadata.calibration_constant_version = Versions.Timespan(device=device,\n",
-    "                                                                  start=creation_time)\n",
-    "\n",
-    "    metadata.calibration_constant_version.raw_data_location = file_loc\n",
     "\n",
     "    if db_output:\n",
-    "        try:\n",
-    "            metadata.send(cal_db_interface, timeout=cal_db_timeout)\n",
-    "            print(f\"Inject {const_name} constants from {metadata.calibration_constant_version.begin_at}\\n\")\n",
-    "        except Exception as e:    \n",
-    "            if \"has already been take\" in str(e):\n",
-    "                print(f\"WARN: {const_name} has already been injected with the same parameter conditions\\n\")\n",
-    "            else:\n",
-    "                # To prevent having big error message out of the pdf report's page.\n",
-    "                print(\"\\n\".join(textwrap.wrap(str(e),100)))\n",
-    "\n",
+    "        md = send_to_db(device, const, condition, file_loc, \n",
+    "                        cal_db_interface, creation_time=creation_time, timeout=cal_db_timeout)\n",
     "    if local_output:\n",
-    "        save_const_to_h5(metadata, out_folder)\n",
-    "        print(f\"Calibration constant {const.name} is stored to {out_folder}.\\n\")\n",
+    "        md = save_const_to_h5(device, const, condition, const.data, file_loc, creation_time, out_folder)\n",
+    "        print(f\"Calibration constant {const_name} is stored to {out_folder}.\\n\")\n",
     "\n",
-    "print(\"Generated constants with conditions:\\n\")\n",
+    "print(\"Constants parameter conditions are:\\n\")\n",
     "print(f\"• bias_voltage: {bias_voltage}\\n• integration_time: {integration_time}\\n\"\n",
     "      f\"• gain_setting: {gain}\\n• temperature: {fix_temperature}\\n\"\n",
-    "      f\"• creation_time: {creation_time}\\n\")"
+    "      f\"• creation_time: {md.calibration_constant_version.begin_at if md is not None else creation_time}\\n\")"
    ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": []
-  },
-  {
-   "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": []
   }
  ],
  "metadata": {