diff --git a/src/toolbox_scs/detectors/dssc_misc.py b/src/toolbox_scs/detectors/dssc_misc.py
index 33ff3019522f62216c223d0a5b62556f1c58a043..cd7899438c7e1b7498fe22e40d4454c06e91b302 100644
--- a/src/toolbox_scs/detectors/dssc_misc.py
+++ b/src/toolbox_scs/detectors/dssc_misc.py
@@ -184,24 +184,33 @@ def load_mask(fname):
     return mask
 
 
-def substract_dark():
-    #for var in ['pumped', 'unpumped']:
-    #    image[var] = (image[var] - dark[var].values)
-    pass
-
-
-def normalize_binned_data():
-    # XGM with darks
-    #im_pumped = (image.pumped - image.pumped_dark) / image.xgm_pumped
-    #im_unpumped = (image.unpumped - image.unpumped_dark) / image.xgm_unpumped
-    # TIM with darks
-    # im_pumped = (image.pumped - image.pumped_dark) / (-image.tim_pumped)
-    #im_unpumped = (image.unpumped - image.unpumped_dark) / \
-    # (-image.tim_unpumped)
-    # No normalization
-    #im_pumped = (image.pumped - image.pumped_dark)
-    #im_unpumped = (image.unpumped - image.unpumped_dark)
-    # XGM no darks
-    # im_pumped = (image.pumped) / image.xgm_pumped
-    # im_unpumped = (image.unpumped) / image.xgm_unpumped
-    pass
+def substract_dark(self, data, dark, keys=['pumped', 'pumped']):
+        """ 
+        Substract dark image from binned processed images
+        
+        Parameters
+        ----------
+        data: xarray.DataArray
+            processed data
+        dark: xarray.DataArray
+            processed dark run corresponding to data
+        key: str
+            name of the dataset to be accessed
+        """
+        return (data[keys[0]] - dark[keys[1]].values)
+
+
+def normalize_binned_data(self, data, norm, keys=['pumped', 'pumped']):
+        """ 
+        Divide processed images
+        
+        Parameters
+        ----------
+        data: xarray.DataArray
+            processed data
+        dark: xarray.DataArray
+            processed dark run corresponding to data
+        key: str
+            name of the dataset to be accessed
+        """
+        return data[keys[0]] / norm[keys[1]]
diff --git a/src/toolbox_scs/test/test_dssc_cls.py b/src/toolbox_scs/test/test_dssc_cls.py
index 74c92c3e861a9cae3e741df483495cbd96571e1a..6bec4772b0607d52bf5b2357f28b263d8653b567 100644
--- a/src/toolbox_scs/test/test_dssc_cls.py
+++ b/src/toolbox_scs/test/test_dssc_cls.py
@@ -61,15 +61,15 @@ class TestDSSC(unittest.TestCase):
                   'framepattern': ['pumped', 'unpumped']}
 
         # normal
-        run235 = tbdet.DSSC(2212, 235)
+        run235 = tbdet.DSSCBinner(2212, 235)
         del(run235)
-        run235 = tbdet.DSSC(2212, 235, is_dark=False)
-        run235 = tbdet.DSSC(2212, 235, is_dark=False, **params)
-        self.assertEqual(run235.bin_variable.values[0], 7585.5)
+        run235 = tbdet.DSSCBinner(2212, 235, is_dark=False)
+        run235 = tbdet.DSSCBinner(2212, 235, is_dark=False, **params)
+        self.assertEqual(run235.bins.values[0], 7585.5)
 
         # expected fails
         with self.assertRaises(FileNotFoundError) as cm:
-            run235 = tbdet.DSSC(2212, 2354)
+            run235 = tbdet.DSSCBinner(2212, 2354)
         err_msg = "[Errno 2] No such file or directory: " \
                   "'/gpfs/exfel/exp/SCS/201901/p002212/raw/r2354'"
         self.assertEqual(str(cm.exception), err_msg)
@@ -77,8 +77,9 @@ class TestDSSC(unittest.TestCase):
     def test_tmpfiles(self):
         params = {'bin_variable_name': 'PP800_PhaseShifter',
                   'framepattern': ['pumped', 'unpumped']}
-        run235 = tbdet.DSSC(2212, 235, is_dark=False, **params)
-        self.assertEqual(run235.scanfile, './tmp/scan.h5')
+        run235 = tbdet.DSSCBinner(2212, 235,
+                                  use_xgm=True, is_dark=False, **params)
+        self.assertEqual(run235.binfile, './tmp/scan.h5')
         self.assertTrue(os.path.isfile('./tmp/mask.h5'))
 
     def test_binning(self):
@@ -86,11 +87,11 @@ class TestDSSC(unittest.TestCase):
                   'is_dark': True,
                   'framepattern': ['pumped', 'unpumped']}
 
-        testrun = tbdet.DSSC(2212, 232, **params)
+        testrun = tbdet.DSSCBinner(2212, 232, **params)
         mod_list = [0,1]
-        data = testrun.bin_data(use_joblib=False, process_modules=mod_list)
+        data = testrun.bin_data(use_joblib=False, modules=mod_list)
         self.assertEqual(data.run, 232)
-        data = testrun.bin_data(use_joblib=True, process_modules=mod_list)
+        data = testrun.bin_data(use_joblib=True, modules=mod_list)
         self.assertEqual(data.run, 232)
 
 
diff --git a/src/toolbox_scs/test/test_dssc_methods.py b/src/toolbox_scs/test/test_dssc_methods.py
index b5db1d8ba0a7c396349e7ce3791b9efe73ee5d5e..d7af27ed4943c06a9404ee4dc77560991303dca2 100644
--- a/src/toolbox_scs/test/test_dssc_methods.py
+++ b/src/toolbox_scs/test/test_dssc_methods.py
@@ -29,9 +29,6 @@ suites = {"metafunctions": (
                 ),
           "image-processing": (
                 "test_info",
-                "test_calcindices",
-                "test_createpulsemask",
-                "test_loadmergechunk",
                 "test_processmodule",
                 ),
           "intra-train-processing": (
@@ -81,7 +78,7 @@ class TestDSSC(unittest.TestCase):
 
 
         cls._run = tb.load_run(cls._proposal, cls._run_nr, include='*DA*')
-        cls._scan_variable = tb.load_binned_array(cls._run,
+        cls._scan_variable = tb.get_binned_array(cls._run,
                                                   cls._scan_variable_name,
                                                   cls._stepsize)
         cls._scan_variable.to_netcdf(cls._scanfile,
@@ -181,10 +178,16 @@ class TestDSSC(unittest.TestCase):
     def test_processmodule(self):
         cls = self.__class__
         max_GB = 300
-        chunksize = int(max_GB * 128 // cls._fpt)
+        r_nb = 232
+        info = tbdet.load_dssc_info(cls._proposal, r_nb)
+        fpt = info['frames_per_train']
+        binfile = './tmp/scan.h5'
+        framepattern = ['pumped', 'unpumped']
+        chunksize = int(max_GB * 128 // fpt)
         chunksize = min(512, chunksize) 
         print('processing', chunksize, 'trains per chunk')
 
+
         jobs = []
         for m in range(2):
             jobs.append(dict(
@@ -192,9 +195,8 @@ class TestDSSC(unittest.TestCase):
                 run_nr=cls._run_nr,
                 module=m,
                 chunksize=chunksize,
-                binfile=cls._scanfile,
-                framepattern=cls._framepattern,
-                maskfile=None if cls._is_dark else cls._maskfile,
+                binfile=binfile,
+                framepattern=framepattern
             ))
 
         print(f'start processing modules:', strftime('%X'))
@@ -229,12 +231,12 @@ class TestDSSC(unittest.TestCase):
         print(f'start processing modules:', strftime('%X'))
 
         with multiprocessing.Pool(16) as pool:
-            module_data = pool.map(tbdet.process_intra_train, jobs)
+            module_data = pool.map(tbdet.sum_trains_multipr, jobs)
 
         print('finished processing modules:', strftime('%X'))
         self.assertIsNotNone(module_data)
 
-        
+   
     def test_storage(self):
         cls = self.__class__
 
diff --git a/src/toolbox_scs/test/test_top_level.py b/src/toolbox_scs/test/test_top_level.py
index e1b81d2948011f4434999b38d77fb95d94739673..76db5e98fac29513879bffe278fc2787f7bd15e7 100644
--- a/src/toolbox_scs/test/test_top_level.py
+++ b/src/toolbox_scs/test/test_top_level.py
@@ -21,7 +21,7 @@ suites = {"packaging": (
                 "test_load",
                 "test_openrun",
                 "test_openrunpath",
-                "test_loadscanvariable",
+                "test_loadbinnedarray",
                 )
           }
 
@@ -83,18 +83,18 @@ class TestToolbox(unittest.TestCase):
         src = 'SCS_DET_DSSC1M-1/DET/0CH0:xtdf'
         self.assertTrue(src in run.all_sources)
 
-    def test_loadscanvariable(self):
+    def test_loadbinnedarray(self):
         cls = self.__class__
 
         # Normal use
         mnemonic = 'PP800_PhaseShifter'
-        scan_variable = tb.load_scan_variable(cls._ed_run, mnemonic, 0.5)
+        scan_variable = tb.get_binned_array(cls._ed_run, mnemonic, 0.5)
         self.assertTrue = (scan_variable)
 
         # unknown mnemonic
         mnemonic = 'blabla'
         with self.assertRaises(ToolBoxValueError) as cm:
-            scan_variable = tb.load_scan_variable(cls._ed_run, mnemonic, 0.5)
+            scan_variable = tb.get_binned_array(cls._ed_run, mnemonic, 0.5)
         excp = cm.exception
         self.assertEqual(excp.value, mnemonic)