diff --git a/TurTLE/DNS.py b/TurTLE/DNS.py
index d2f7dba660f04bd6082ea87594b020892cbbe04d..6e971a250d96a4d3561d05c0ba8bb0b49064f0c8 100644
--- a/TurTLE/DNS.py
+++ b/TurTLE/DNS.py
@@ -49,6 +49,7 @@ class DNS(_code):
                 work_dir = work_dir,
                 simname = simname)
         self.generate_default_parameters()
+        self.generate_extra_parameters()
         self.statistics = {}
         return None
     def set_precision(
@@ -179,6 +180,28 @@ class DNS(_code):
         #for key in ['NSVEparticles', 'NSVEparticles_no_output', 'NSVEcomplex_particles']:
         #    self.extra_parameters[key].update(self.NSVEp_extra_parameters)
         return None
+
+    def generate_extra_parameters(self):
+        self.extra_parameters = {}
+        self.extra_parameters['kraichnan_field'] = {
+            'output_velocity': int(1),
+            'field_random_seed': int(1),
+            'spectrum_dissipation': float(0.027),
+            'spectrum_Lint': float(1.3),
+            'spectrum_etaK': float(0.3),
+            'spectrum_large_scale_const': float(6.78),
+            'spectrum_small_scale_const': float(0.40)}
+        self.extra_parameters['NSVE_Stokes_particles'] = {
+            'initial_field_amplitude': float(0.0),
+            'initial_particle_vel': float(0.05),
+            'drag_coefficient': float(0.1)}
+        self.extra_parameters['NSVEp_extra_sampling'] = {
+            'sample_pressure': int(1),
+            'sample_pressure_gradient': int(1),
+            'sample_pressure_Hessian': int(1),
+            'sample_velocity_gradient': int(1)}
+        return None
+
     def get_kspace(self):
         kspace = {}
         if self.parameters['dealias_type'] == 1:
@@ -625,105 +648,79 @@ class DNS(_code):
     def add_parser_arguments(
             self,
             parser):
+        """Creates subparsers for all simulation types and supplies them with parameters"""
         subparsers = parser.add_subparsers(
                 dest = 'DNS_class',
                 help = 'type of simulation to run')
         subparsers.required = True
-        parser_NSE = subparsers.add_parser(
+        parser_list = {}
+        
+        parser_list['NSE'] = subparsers.add_parser(
                 'NSE',
                 help = 'plain Navier-Stokes equation')
 
-        parser_NSVE = subparsers.add_parser(
+        parser_list['NSVE'] = subparsers.add_parser(
                 'NSVE',
                 help = 'plain Navier-Stokes vorticity equation')
 
-        parser_NSVE_no_output = subparsers.add_parser(
+        parser_list['NSVE_no_output'] = subparsers.add_parser(
                 'NSVE_no_output',
                 help = 'plain Navier-Stokes vorticity formulation, checkpoints are NOT SAVED')
 
-        parser_NSVEparticles_no_output = subparsers.add_parser(
+        parser_list['NSVEparticles_no_output'] = subparsers.add_parser(
                 'NSVEparticles_no_output',
                 help = 'plain Navier-Stokes vorticity formulation, with basic fluid tracers, checkpoints are NOT SAVED')
 
-        parser_static_field = subparsers.add_parser(
+        parser_list['static_field'] = subparsers.add_parser(
                 'static_field',
                 help = 'static field with basic fluid tracers')
 
-        parser_static_field_with_ghost_collisions = subparsers.add_parser(
+        parser_list['static_field_with_ghost_collisions'] = subparsers.add_parser(
                 'static_field_with_ghost_collisions',
                 help = 'static field with basic fluid tracers and ghost collisions')
 
-        parser_kraichnan_field = subparsers.add_parser(
+        parser_list['kraichnan_field'] = subparsers.add_parser(
                 'kraichnan_field',
                 help = 'Kraichnan field with basic fluid tracers')
 
-        parser_NSVEp2 = subparsers.add_parser(
+        parser_list['NSVEparticles'] = subparsers.add_parser(
                 'NSVEparticles',
                 help = 'plain Navier-Stokes vorticity formulation, with basic fluid tracers')
 
-        parser_NSVE_Stokes_particles = subparsers.add_parser(
+        parser_list['NSVE_Stokes_particles'] = subparsers.add_parser(
                 'NSVE_Stokes_particles',
                 help = 'plain Navier-Stokes vorticity formulation, with passive Stokes drag particles')
 
-        parser_NSVEp2p = subparsers.add_parser(
+        parser_list['NSVEcomplex_particles'] = subparsers.add_parser(
                 'NSVEcomplex_particles',
                 help = 'plain Navier-Stokes vorticity formulation, with oriented active particles')
-        parser_NSVEp_extra_sampling = subparsers.add_parser(
+        parser_list['NSVEp_extra_sampling'] = subparsers.add_parser(
                 'NSVEp_extra_sampling',
                 help = 'plain Navier-Stokes vorticity formulation, with basic fluid tracers, that sample velocity gradient, as well as pressure and its derivatives.')
+
+        for pp in parser_list:
+            self.simulation_parser_arguments(parser_list[pp])
+            self.job_parser_arguments(parser_list[pp])
+            self.parameters_to_parser_arguments(parser_list[pp])
+            if pp in self.extra_parameters:
+                self.parameters_to_parser_arguments(
+                        parser_list[pp],
+                        self.extra_parameters[pp])
+
         for pp in [
-                'NSE',
-                'NSVE',
-                'NSVE_no_output',
-                'NSVEparticles_no_output',
-                'NSVEp2',
-                'NSVEp2p',
+                'NSVEparticles',
+                'NSVEcomplex_particles',
                 'NSVE_Stokes_particles',
-                'NSVEp_extra_sampling',
-                'static_field',
-                'static_field_with_ghost_collisions',
-                'kraichnan_field']:
-            eval('self.simulation_parser_arguments({0})'.format('parser_' + pp))
-            eval('self.job_parser_arguments({0})'.format('parser_' + pp))
-            eval('self.parameters_to_parser_arguments({0})'.format('parser_' + pp))
-            eval('self.parameters_to_parser_arguments('
-                    'parser_{0},'
-                    'self.generate_extra_parameters(\'{0}\'))'.format(pp))
-        for pp in [
                 'NSVEparticles_no_output',
-                'NSVEp2',
-                'NSVEp2p',
-                'NSVE_Stokes_particles',
                 'NSVEp_extra_sampling',
                 'static_field',
+                'static_field_with_ghost_collisions',
                 'kraichnan_field']:
-            eval('self.particle_parser_arguments({0})'.format('parser_' + pp))
-            eval('self.parameters_to_parser_arguments('
-                    'parser_{0},'
-                    'self.NSVEp_extra_parameters)'.format(pp))
+            self.particle_parser_arguments(parser_list[pp])
+            self.parameters_to_parser_arguments(parser_list[pp],
+                    self.NSVEp_extra_parameters)
         return None
-    def generate_extra_parameters(
-            self,
-            dns_type):
-        pars = {}
-        if dns_type == 'kraichnan_field':
-            pars['output_velocity'] = int(1)
-            pars['field_random_seed'] = int(1)
-            pars['spectrum_dissipation'] = float(0.027)
-            pars['spectrum_Lint'] = float(1.3)
-            pars['spectrum_etaK'] = float(0.3)
-            pars['spectrum_large_scale_const'] = float(6.78)
-            pars['spectrum_small_scale_const'] = float(0.40)
-        if dns_type == 'NSVE_Stokes_particles':
-            pars['initial_field_amplitude'] = float(0.0)
-            pars['initial_particle_vel'] = float(0.05)
-            pars['drag_coefficient'] = float(0.1)
-        if dns_type == 'NSVEp_extra_sampling':
-            pars['sample_pressure'] = int(1)
-            pars['sample_pressure_gradient'] = int(1)
-            pars['sample_pressure_Hessian'] = int(1)
-            pars['sample_velocity_gradient'] = int(1)
-        return pars
+
     def prepare_launch(
             self,
             args = [],
@@ -757,7 +754,9 @@ class DNS(_code):
         self.set_precision(opt.precision)
         self.dns_type = opt.DNS_class
         self.name = self.dns_type + '-' + self.fluid_precision + '-v' + TurTLE.__version__
-        # merge parameters if needed
+
+        # adding parameters for the chosen dns_type to self.parameters
+        # NSVEp_extra_parameters
         if self.dns_type in [
                 'NSVEparticles',
                 'NSVEcomplex_particles',
@@ -769,13 +768,16 @@ class DNS(_code):
                 'kraichnan_field']:
             for k in self.NSVEp_extra_parameters.keys():
                 self.parameters[k] = self.NSVEp_extra_parameters[k]
+        # extra parameters from prepare launch argument
         if type(extra_parameters) != type(None):
             if self.dns_type in extra_parameters.keys():
                 for k in extra_parameters[self.dns_type].keys():
                     self.parameters[k] = extra_parameters[self.dns_type][k]
-        additional_parameters = self.generate_extra_parameters(self.dns_type)
-        for k in additional_parameters.keys():
-            self.parameters[k] = additional_parameters[k]
+        # extra parameters from `self.extra_parameters`
+        if self.dns_type in self.extra_parameters.keys():
+            for k in self.extra_parameters[self.dns_type].keys():
+                self.parameters[k] = self.extra_parameters[self.dns_type][k]
+
         if ((self.parameters['niter_todo'] % self.parameters['niter_out']) != 0):
             self.parameters['niter_out'] = self.parameters['niter_todo']
         if len(opt.src_work_dir) == 0:
@@ -1217,6 +1219,7 @@ class DNS(_code):
             self,
             opt = None,
             iter0 = 0):
+        """Launches jobs. Prepares initial condition and writes parameters to file if necessary."""
         if not os.path.exists(self.get_data_file_name()):
             if not os.path.isdir(self.work_dir):
                 os.makedirs(self.work_dir)
diff --git a/TurTLE/_base.py b/TurTLE/_base.py
index 2cfe93a1853f595f7ba92785c1bd756afb734b53..c713ccd9ca3f5b3feb17a18283b647e1f734d281 100644
--- a/TurTLE/_base.py
+++ b/TurTLE/_base.py
@@ -340,6 +340,7 @@ class _base(object):
             parser,
             parameters = None,
             parameter_description = None):
+        """Adds dict of parameters to parser arguments."""
         if type(parameters) == type(None):
             parameters = self.parameters
         if type(parameter_description) == type(None):
diff --git a/TurTLE/test/test_Heun_p2p.py b/TurTLE/test/test_Heun_p2p.py
index ba997c8b687a309d5c95871aa855d122d4f35596..189edea050db31ade20743150d9c3d492e6ec4d5 100644
--- a/TurTLE/test/test_Heun_p2p.py
+++ b/TurTLE/test/test_Heun_p2p.py
@@ -70,45 +70,6 @@ class ADNS(TurTLE.DNS):
             outfile.write(self.main + '\n')
         self.check_current_vorticity_exists = True
         return None
-    def generate_default_parameters(self):
-        # these parameters are relevant for all DNS classes
-        self.parameters['fftw_plan_rigor'] = 'FFTW_ESTIMATE'
-        self.parameters['dealias_type'] = int(1)
-        self.parameters['dkx'] = float(1.0)
-        self.parameters['dky'] = float(1.0)
-        self.parameters['dkz'] = float(1.0)
-        self.parameters['niter_todo'] = int(200)
-        self.parameters['niter_stat'] = int(20)
-        self.parameters['niter_out'] = int(200)
-        self.parameters['checkpoints_per_file'] = int(1)
-        self.parameters['dt'] = float(0.0001)
-        self.parameters['histogram_bins'] = int(64)
-        self.parameters['max_velocity_estimate'] = float(1)
-        self.parameters['max_vorticity_estimate'] = float(1)
-        self.parameters['niter_part'] = int(1)
-        self.parameters['niter_part_fine_period'] = int(2)
-        self.parameters['niter_part_fine_duration'] = int(0)
-        self.parameters['nparticles'] = int(1000)
-        self.parameters['tracers0_integration_steps'] = int(0)
-        self.parameters['tracers0_neighbours'] = int(3)
-        self.parameters['tracers0_smoothness'] = int(2)
-        self.parameters['tracers0_enable_p2p'] = int(0)
-        self.parameters['tracers0_enable_inner'] = int(0)
-        self.parameters['tracers0_enable_vorticity_omega'] = int(0)
-        self.parameters['tracers0_cutoff'] = float(0.920272)
-        self.parameters['tracers0_inner_v0'] = float(1)
-        self.parameters['tracers0_lambda'] = float(1)
-
-        self.parameters['nu'] = float(0.1)
-        self.parameters['fmode'] = int(1)
-        self.parameters['famplitude'] = float(0.5)
-        self.parameters['friction_coefficient'] = float(0.5)
-        self.parameters['injection_rate'] = float(0.4)
-        self.parameters['fk0'] = float(2.0)
-        self.parameters['fk1'] = float(4.0)
-        self.parameters['energy'] = float(0.5)
-        self.parameters['forcing_type'] = 'fixed_energy_injection_rate'
-        return None
     def generate_tracer_state(
             self,
             rseed = None,
@@ -171,11 +132,17 @@ class ADNS(TurTLE.DNS):
         self.simulation_parser_arguments(parser)
         self.particle_parser_arguments(parser)
         self.parameters_to_parser_arguments(parser)
+        self.parameters_to_parser_arguments(parser,
+            self.NSVEp_extra_parameters)
         opt = parser.parse_args(args)
         self.simname=opt.simname
         self.set_precision(opt.precision)
         self.dns_type = 'NSVEparticle_set'
         self.name = self.dns_type + '-' + self.fluid_precision + '-v' + TurTLE.__version__
+
+        for k in self.NSVEp_extra_parameters.keys():
+            self.parameters[k] = self.NSVEp_extra_parameters[k]
+
         if ((self.parameters['niter_todo'] % self.parameters['niter_out']) != 0):
             self.parameters['niter_out'] = self.parameters['niter_todo']
         if len(opt.src_work_dir) == 0:
@@ -323,7 +290,17 @@ class ADNS(TurTLE.DNS):
 
 def main():
     bla = ADNS()
-    bla.launch(sys.argv[1:])
+    bla.launch([
+        '--niter_todo', '200',
+        '--niter_stat', '20',
+        '--niter_out', '200',
+        '--dt', '0.0001',
+        '--nparticles', '1000',
+        '--tracers0_integration_steps', '0',
+        '--tracers0_neighbours', '3',
+        '--tracers0_smoothness', '2',
+        '--tracers0_cutoff', '0.920272'
+        ] + sys.argv[1:])
     assert(bla.parameters['niter_part'] == 1)
     df = bla.get_particle_file()
     x = []