diff --git a/bfps/fluid_converter.py b/bfps/FluidConvert.py
similarity index 94%
rename from bfps/fluid_converter.py
rename to bfps/FluidConvert.py
index 04f113c4ed44d99fb020d4a782bb7d28ae09adbb..e94031e9851d59f4191dae4f9b1c34624f3e27d7 100644
--- a/bfps/fluid_converter.py
+++ b/bfps/FluidConvert.py
@@ -24,22 +24,21 @@
 
 
 
-import bfps
-import bfps.fluid_base
-import bfps.tools
 import numpy as np
 import pickle
 import os
+from ._fluid_base import _fluid_particle_base
 
-class fluid_converter(bfps.fluid_base.fluid_particle_base):
+class FluidConvert(_fluid_particle_base):
     def __init__(
             self,
-            name = 'fluid_converter',
+            name = 'FluidConvert',
             work_dir = './',
             simname = 'test',
             fluid_precision = 'single',
             use_fftw_wisdom = True):
-        super(fluid_converter, self).__init__(
+        _fluid_particle_base.__init__(
+                self,
                 name = name,
                 work_dir = work_dir,
                 simname = simname,
diff --git a/bfps/fluid_resize.py b/bfps/FluidResize.py
similarity index 96%
rename from bfps/fluid_resize.py
rename to bfps/FluidResize.py
index 5c4e6c5ed001c9ca698d19824677c335a6a0ff53..cb145c9ddbf0627ccd538ef9f030788230c6ccb9 100644
--- a/bfps/fluid_resize.py
+++ b/bfps/FluidResize.py
@@ -24,20 +24,20 @@
 
 
 
-import bfps
-import bfps.fluid_base
+from ._fluid_base import _fluid_particle_base
 
 import numpy as np
 
-class fluid_resize(bfps.fluid_base.fluid_particle_base):
+class FluidResize(_fluid_particle_base):
     def __init__(
             self,
-            name = 'fluid_resize',
+            name = 'FluidResize',
             work_dir = './',
             simname = 'test',
             dtype = np.float32,
             use_fftw_wisdom = False):
-        super(fluid_resize, self).__init__(
+        _fluid_particle_base.__init__(
+                self,
                 name = name,
                 work_dir = work_dir,
                 simname = simname,
diff --git a/bfps/Launcher.py b/bfps/Launcher.py
index ad09a1f22188426b99c94b799c6a82e600fdedf4..fefa29782e891d4b34a7c39308e73115837ec663 100644
--- a/bfps/Launcher.py
+++ b/bfps/Launcher.py
@@ -1,11 +1,17 @@
 import os
 
 import argparse
-import bfps
+
+import .__init__ as bfps
+from .NavierStokes import NavierStokes
+from .FluidResize import FluidResize
+from .FluidConvert import FluidConvert
 
 class Launcher:
-    def __init__(self):
-        self.base_class = bfps.NavierStokes
+    def __init__(
+            self,
+            base_class = NavierStokes):
+        self.base_class = base_class
         self.parser = argparse.ArgumentParser(prog = 'bfps')
         self.parser.add_argument(
                 '-v', '--version',
@@ -18,10 +24,6 @@ class Launcher:
                 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',
@@ -128,29 +130,28 @@ class Launcher:
         c.finalize_code()
         c.write_src()
         c.set_host_info(bfps.host_info)
-        if opt.run:
-            if not os.path.exists(os.path.join(c.work_dir, c.simname + '.h5')):
-                c.write_par()
-                if c.parameters['nparticles'] > 0:
-                    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(
-                        c.work_dir,
-                        c.simname + '_cvorticity_i{0:0>5x}'.format(0))
-                if not os.path.exists(init_condition_file):
-                    if len(opt.src_simname) > 0:
-                        src_file = os.path.join(
-                                c.work_dir,
-                                opt.src_simname + '_cvorticity_i{0:0>5x}'.format(opt.src_iteration))
-                        os.symlink(src_file, init_condition_file)
-                    else:
-                       c.generate_vector_field(
-                               write_to_file = True,
-                               spectra_slope = 2.0,
-                               amplitude = 0.25)
-            c.run(ncpu = opt.ncpu,
-                  njobs = opt.njobs)
+        if not os.path.exists(os.path.join(c.work_dir, c.simname + '.h5')):
+            c.write_par()
+            if c.parameters['nparticles'] > 0:
+                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(
+                    c.work_dir,
+                    c.simname + '_cvorticity_i{0:0>5x}'.format(0))
+            if not os.path.exists(init_condition_file):
+                if len(opt.src_simname) > 0:
+                    src_file = os.path.join(
+                            c.work_dir,
+                            opt.src_simname + '_cvorticity_i{0:0>5x}'.format(opt.src_iteration))
+                    os.symlink(src_file, init_condition_file)
+                else:
+                   c.generate_vector_field(
+                           write_to_file = True,
+                           spectra_slope = 2.0,
+                           amplitude = 0.25)
+        c.run(ncpu = opt.ncpu,
+              njobs = opt.njobs)
         return c
 
 
diff --git a/bfps/NavierStokes.py b/bfps/NavierStokes.py
index aa11892d21ecb1e2af658a3d7885c81e0d84d44b..a075074fb4233e842a9055f74f074dec532dc694 100644
--- a/bfps/NavierStokes.py
+++ b/bfps/NavierStokes.py
@@ -28,11 +28,9 @@ import os
 import numpy as np
 import h5py
 
-import bfps
-import bfps.fluid_base
-import bfps.tools
+from ._fluid_base import _fluid_particle_base
 
-class NavierStokes(bfps.fluid_base.fluid_particle_base):
+class NavierStokes(_fluid_particle_base):
     def __init__(
             self,
             name = 'NavierStokes',
@@ -46,7 +44,8 @@ class NavierStokes(bfps.fluid_base.fluid_particle_base):
         self.QR_stats_on = QR_stats_on
         self.frozen_fields = frozen_fields
         self.fftw_plan_rigor = fftw_plan_rigor
-        super(NavierStokes, self).__init__(
+        _fluid_particle_base.__init__(
+                self,
                 name = name,
                 work_dir = work_dir,
                 simname = simname,
@@ -715,7 +714,7 @@ class NavierStokes(bfps.fluid_base.fluid_particle_base):
                          self.parameters['nx']//2+1,
                          3))
     def write_par(self, iter0 = 0):
-        super(NavierStokes, self).write_par(iter0 = iter0)
+        _fluid_particle_base.write_par(self, iter0 = iter0)
         with h5py.File(os.path.join(self.work_dir, self.simname + '.h5'), 'r+') as ofile:
             kspace = self.get_kspace()
             nshells = kspace['nshell'].shape[0]
diff --git a/bfps/__init__.py b/bfps/__init__.py
index b9bc3a35ffafd7a181aa3521f2789aaa9f470244..e7fff5953477ef007560256d560e9bb6e62500d6 100644
--- a/bfps/__init__.py
+++ b/bfps/__init__.py
@@ -48,8 +48,45 @@ bfpsfolder = os.path.join(homefolder, '.config/', 'bfps')
 sys.path.append(bfpsfolder)
 from host_information import host_info
 
-from .code import code
-from .fluid_converter import fluid_converter
-from .fluid_resize import fluid_resize
+from .FluidConvert import FluidConvert
+from .FluidResize import FluidResize
 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
+
diff --git a/bfps/__main__.py b/bfps/__main__.py
index e9b883fb48e35685ecca95ce7f809ce7136f58b3..747039769f99285c3ad316731759397fe13cb586 100644
--- a/bfps/__main__.py
+++ b/bfps/__main__.py
@@ -3,7 +3,7 @@ from .Launcher import Launcher
 
 def main():
     l = Launcher()
-    l(sys.argv[1:] + ['--run'])
+    l(sys.argv[1:])
     return None
 
 if __name__ == '__main__':
diff --git a/bfps/base.py b/bfps/_base.py
similarity index 97%
rename from bfps/base.py
rename to bfps/_base.py
index 1301fe65d465066134755c1e10d6b72d707c3236..286ebc62cafc071d601c328b929bddc0a8337a4a 100644
--- a/bfps/base.py
+++ b/bfps/_base.py
@@ -28,9 +28,9 @@ import os
 import sys
 import numpy as np
 import h5py
-import bfps
+from bfps import install_info
 
-class base(object):
+class _base(object):
     """
         This class contains simulation parameters, and handles parameter related
         functionalities of both python objects and C++ codes.
@@ -109,8 +109,8 @@ class base(object):
             else:
                 ofile['parameters/' + k] = self.parameters[k]
         ofile['iteration'] = int(iter0)
-        for k in bfps.install_info.keys():
-            ofile['install_info/' + k] = str(bfps.install_info[k])
+        for k in install_info.keys():
+            ofile['install_info/' + k] = str(install_info[k])
         ofile.close()
         return None
     def read_parameters(self):
diff --git a/bfps/code.py b/bfps/_code.py
similarity index 99%
rename from bfps/code.py
rename to bfps/_code.py
index e8baced47d29812354974f3b8f44cda896b5ff67..3ec9f4fc846fd51b87403c538a64c273897d26a3 100644
--- a/bfps/code.py
+++ b/bfps/_code.py
@@ -31,10 +31,11 @@ import subprocess
 import h5py
 from datetime import datetime
 import math
+
 import bfps
-from bfps.base import base
+from ._base import _base
 
-class code(base):
+class _code(_base):
     """
         This class is meant to stitch together the C++ code into a final source file,
         compile it, and handle all job launching.
@@ -43,7 +44,7 @@ class code(base):
             self,
             work_dir = './',
             simname = 'test'):
-        super(code, self).__init__(work_dir = work_dir, simname = simname)
+        _base.__init__(self, work_dir = work_dir, simname = simname)
         self.version_message = ('/***********************************************************************\n' +
                                 '* this code automatically generated by bfps\n' +
                                 '* version {0}\n'.format(bfps.__version__) +
diff --git a/bfps/fluid_base.py b/bfps/_fluid_base.py
similarity index 98%
rename from bfps/fluid_base.py
rename to bfps/_fluid_base.py
index 06c3098be516f440ee0649155d26fd30ae97f08b..31bd4d318ed239191bc63d1af9c524c36a954aa7 100644
--- a/bfps/fluid_base.py
+++ b/bfps/_fluid_base.py
@@ -24,15 +24,14 @@
 
 
 
-import bfps
-import bfps.code
-import bfps.tools
+from ._code import _code
+from bfps import tools
 
 import os
 import numpy as np
 import h5py
 
-class fluid_particle_base(bfps.code):
+class _fluid_particle_base(_code):
     def __init__(
             self,
             name = 'solver',
@@ -40,7 +39,8 @@ class fluid_particle_base(bfps.code):
             simname = 'test',
             dtype = np.float32,
             use_fftw_wisdom = True):
-        super(fluid_particle_base, self).__init__(
+        _code.__init__(
+                self,
                 work_dir = work_dir,
                 simname = simname)
         self.use_fftw_wisdom = use_fftw_wisdom
@@ -284,19 +284,19 @@ class fluid_particle_base(bfps.code):
             field_name = 'vorticity',
             write_to_file = False):
         np.random.seed(rseed)
-        Kdata00 = bfps.tools.generate_data_3D(
+        Kdata00 = tools.generate_data_3D(
                 self.parameters['nz']//2,
                 self.parameters['ny']//2,
                 self.parameters['nx']//2,
                 p = spectra_slope,
                 amplitude = amplitude).astype(self.ctype)
-        Kdata01 = bfps.tools.generate_data_3D(
+        Kdata01 = tools.generate_data_3D(
                 self.parameters['nz']//2,
                 self.parameters['ny']//2,
                 self.parameters['nx']//2,
                 p = spectra_slope,
                 amplitude = amplitude).astype(self.ctype)
-        Kdata02 = bfps.tools.generate_data_3D(
+        Kdata02 = tools.generate_data_3D(
                 self.parameters['nz']//2,
                 self.parameters['ny']//2,
                 self.parameters['nx']//2,
@@ -308,7 +308,7 @@ class fluid_particle_base(bfps.code):
         Kdata0[..., 0] = Kdata00
         Kdata0[..., 1] = Kdata01
         Kdata0[..., 2] = Kdata02
-        Kdata1 = bfps.tools.padd_with_zeros(
+        Kdata1 = tools.padd_with_zeros(
                 Kdata0,
                 self.parameters['nz'],
                 self.parameters['ny'],
@@ -396,7 +396,7 @@ class fluid_particle_base(bfps.code):
         assert (self.parameters['niter_todo'] % self.parameters['niter_part'] == 0)
         assert (self.parameters['niter_out']  % self.parameters['niter_stat'] == 0)
         assert (self.parameters['niter_out']  % self.parameters['niter_part'] == 0)
-        super(fluid_particle_base, self).write_par(iter0 = iter0)
+        _code.write_par(self, iter0 = iter0)
         with h5py.File(os.path.join(self.work_dir, self.simname + '.h5'), 'r+') as ofile:
             ofile['field_dtype'] = np.dtype(self.dtype).str
             kspace = self.get_kspace()
diff --git a/tests/base.py b/tests/base.py
index 948a1f8a0cadce1f85d8c5aa36c1d887e2a8f49e..de8d513c2abad496b2dffcbeade460b88b23665c 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -33,7 +33,7 @@ import numpy as np
 import matplotlib.pyplot as plt
 
 import bfps
-from bfps import fluid_resize
+from bfps import FluidResize
 from bfps.tools import particle_finite_diff_test as acceleration_test
 
 parser = bfps.get_parser()
@@ -54,7 +54,7 @@ parser.add_argument(
 def double(opt):
     old_simname = 'N{0:0>3x}'.format(opt.n)
     new_simname = 'N{0:0>3x}'.format(opt.n*2)
-    c = fluid_resize(
+    c = FluidResize(
             work_dir = opt.work_dir,
             simname = old_simname + '_double',
             dtype = opt.precision)
diff --git a/tests/test_io.py b/tests/test_io.py
index 447cb405406a61573cc7d7b2b5942d012e6f55f6..98f58c8f69b8d5bd48420dc2e3062e8c8bd5234e 100644
--- a/tests/test_io.py
+++ b/tests/test_io.py
@@ -26,7 +26,10 @@
 
 from base import *
 
-class test_io(bfps.code):
+import bfps
+from bfps._code import _code
+
+class test_io(_code):
     def __init__(
             self,
             name = 'test_io',