diff --git a/bfps/Launcher.py b/bfps/Launcher.py
index 27d9f739987c5c2d4da8dc17a929c8fed841794c..ad09a1f22188426b99c94b799c6a82e600fdedf4 100644
--- a/bfps/Launcher.py
+++ b/bfps/Launcher.py
@@ -1,20 +1,52 @@
 import os
 
-import sys
-import numpy as np
+import argparse
 import bfps
 
 class Launcher:
-    def __init__(
-            self,
-            data_dir = './'):
-        self.parser = bfps.get_parser(
-                bfps.NavierStokes,
-                work_dir = os.path.realpath(data_dir))
+    def __init__(self):
+        self.base_class = bfps.NavierStokes
+        self.parser = argparse.ArgumentParser(prog = 'bfps')
+        self.parser.add_argument(
+                '-v', '--version',
+                action = 'version',
+                version = '%(prog)s ' + bfps.__version__)
+        self.parser.add_argument(
+                '-n',
+                type = int,
+                dest = 'n',
+                default = 32,
+                metavar = 'N',
+                help = 'code is run by default in a grid of NxNxN')
+        self.parser.add_argument(
+                '--run',
+                dest = 'run',
+                action = 'store_true')
+        self.parser.add_argument(
+                '--ncpu',
+                type = int, dest = 'ncpu',
+                default = 2)
+        self.parser.add_argument(
+                '--precision',
+                type = str, dest = 'precision',
+                default = 'single')
+        self.parser.add_argument(
+                '--simname',
+                type = str, dest = 'simname',
+                default = 'test')
+        self.parser.add_argument(
+                '--wd',
+                type = str, dest = 'work_dir',
+                default = './')
+        self.parser.add_argument(
+                '--njobs',
+                type = int, dest = 'njobs',
+                default = 1)
         self.parser.add_argument(
                 '--QR-stats',
                 action = 'store_true',
-                dest = 'QR_stats')
+                dest = 'QR_stats',
+                help = 'add this option if you want to compute velocity gradient and QR stats')
         self.parser.add_argument(
                 '--kMeta',
                 type = float,
@@ -41,8 +73,18 @@ class Launcher:
                 type = int,
                 dest = 'src_iteration',
                 default = 0)
-        self.data_dir = data_dir
-        self.base_class = bfps.NavierStokes
+        self.parser.add_argument(
+                '--particle-rand-seed',
+                type = int,
+                dest = 'particle_rand_seed',
+                default = None)
+        c = self.base_class()
+        for k in sorted(c.parameters.keys()):
+            self.parser.add_argument(
+                    '--{0}'.format(k),
+                    type = type(c.parameters[k]),
+                    dest = k,
+                    default = None)
         return None
     def __call__(
             self,
@@ -50,17 +92,14 @@ class Launcher:
         opt = self.parser.parse_args(args)
         if opt.environment != '':
             bfps.host_info['environment'] = opt.environment
-        opt.nx = opt.n
-        opt.ny = opt.n
-        opt.nz = opt.n
         opt.work_dir = os.path.join(
                 os.path.realpath(opt.work_dir),
                 'N{0:0>4}'.format(opt.n))
         c = self.base_class(
+                work_dir = opt.work_dir,
                 fluid_precision = opt.precision,
                 simname = opt.simname,
                 QR_stats_on = opt.QR_stats)
-        c.pars_from_namespace(opt)
         # with the default Lundgren forcing, I can estimate the dissipation
         # with nondefault forcing, figure out the amplitude for this viscosity
         # yourself
@@ -75,6 +114,16 @@ class Launcher:
             meantrS2 = (opt.n//2 / opt.kMeta)**4 * c.parameters['nu']**2
             c.parameters['max_Q_estimate'] = meantrS2
             c.parameters['max_R_estimate'] = .4*meantrS2**1.5
+
+        # command line parameters will overwrite any defaults
+        cmd_line_pars = vars(opt)
+        for k in ['nx', 'ny', 'nz']:
+            if type(cmd_line_pars[k]) == type(None):
+                cmd_line_pars[k] = opt.n
+        for k in c.parameters.keys():
+            if k in cmd_line_pars.keys():
+                if not type(cmd_line_pars[k]) == type(None):
+                    c.parameters[k] = cmd_line_pars[k]
         c.fill_up_fluid_code()
         c.finalize_code()
         c.write_src()
@@ -83,11 +132,7 @@ class Launcher:
             if not os.path.exists(os.path.join(c.work_dir, c.simname + '.h5')):
                 c.write_par()
                 if c.parameters['nparticles'] > 0:
-                    if opt.particle_rand_seed != 0:
-                        rseed = opt.particle_rand_seed
-                    else:
-                        rseed = None
-                    data = c.generate_tracer_state(species = 0, rseed = rseed)
+                    data = c.generate_tracer_state(species = 0, rseed = opt.particle_rand_seed)
                     for s in range(1, c.particle_species):
                         c.generate_tracer_state(species = s, data = data)
                 init_condition_file = os.path.join(
diff --git a/bfps/__init__.py b/bfps/__init__.py
index 519f83c482e24d4cf19fde9c12b5c6e8d55c874f..b9bc3a35ffafd7a181aa3521f2789aaa9f470244 100644
--- a/bfps/__init__.py
+++ b/bfps/__init__.py
@@ -53,41 +53,3 @@ from .fluid_converter import fluid_converter
 from .fluid_resize import fluid_resize
 from .NavierStokes import NavierStokes
 
-import argparse
-
-def get_parser(base_class = NavierStokes,
-               n = 32,
-               ncpu = 2,
-               precision = 'single',
-               simname = 'test',
-               work_dir = './',
-               njobs = 1):
-    parser = argparse.ArgumentParser()
-    parser.add_argument('--run', dest = 'run', action = 'store_true')
-    parser.add_argument('-n',
-            type = int, dest = 'n',
-            default = n)
-    parser.add_argument('--ncpu',
-            type = int, dest = 'ncpu',
-            default = ncpu)
-    parser.add_argument('--precision',
-            type = str, dest = 'precision',
-            default = precision)
-    parser.add_argument('--simname',
-            type = str, dest = 'simname',
-            default = simname)
-    parser.add_argument('--wd',
-            type = str, dest = 'work_dir',
-            default = work_dir)
-    parser.add_argument('--njobs',
-            type = int, dest = 'njobs',
-            default = njobs)
-    c = base_class(simname = simname)
-    for k in sorted(c.parameters.keys()):
-        parser.add_argument(
-                '--{0}'.format(k),
-                type = type(c.parameters[k]),
-                dest = k,
-                default = c.parameters[k])
-    return parser
-