diff --git a/ceci/stage.py b/ceci/stage.py
index 7819ab5..39d8ddc 100644
--- a/ceci/stage.py
+++ b/ceci/stage.py
@@ -12,7 +12,7 @@ import datetime
 from abc import abstractmethod
 from . import errors
 from .monitor import MemoryMonitor
-from .config import StageConfig, cast_to_streamable
+from .config import StageParameter, StageConfig, cast_to_streamable
 
 SERIAL = "serial"
 MPI_PARALLEL = "mpi"
@@ -488,8 +488,10 @@ I currently know about these stages:
         parser = argparse.ArgumentParser(description=f"Run pipeline stage {cls.name}")
         parser.add_argument("stage_name")
         for conf, def_val in cls.config_options.items():
-            opt_type = def_val if isinstance(def_val, type) else type(def_val)
-
+            if isinstance(def_val, StageParameter):
+                opt_type = def_val.dtype
+            else:
+                opt_type = def_val if isinstance(def_val, type) else type(def_val)
             if opt_type == bool:
                 parser.add_argument(f"--{conf}", action="store_const", const=True)
                 parser.add_argument(

diff --git a/tests/test_stage.py b/tests/test_stage.py
index 2201e84..c0fe1ec 100644
--- a/tests/test_stage.py
+++ b/tests/test_stage.py
@@ -128,13 +128,25 @@ def test_parameter():
         name = "test_stage_param"
         inputs = [("inp1", HDFFile)]
         outputs = []
-        config_options = dict(a=StageParameter(float, 5., msg="a float"))
+        config_options = dict(
+            a=StageParameter(float, 5., msg="a float"),
+            b=StageParameter(str, msg="a str"),
+        )
 
         def run(self):
             pass
 
-    stage_1 = TestStage.make_stage(a=6., inp1='dummy')
+    stage_1 = TestStage.make_stage(
+        a=6., b='puffins are not extinct?', inp1='dummy',
+        )
     assert stage_1.config.a == 6.
+    assert stage_1.config.b == 'puffins are not extinct?'
+
+    cmd = "TestStage", "--a", "6", "--b", "puffins are not extinct?", "--inp", "dummy"
+    stage_1_cmd = TestStage(TestStage.parse_command_line(cmd))
+    assert stage_1_cmd.config.a == 6.
+    assert stage_1_cmd.config.b == 'puffins are not extinct?'
+
 
     # This one should not work
     class TestStage_2(PipelineStage):
@@ -198,7 +210,7 @@ def test_parameter():
 
 
 
-    
+
 
 def test_incomplete():
     class Alpha(PipelineStage):

Setting a StageParameter 
If I try to set the data_path option on the bpz_lite stage on the command line by adding `--data_path=/path/to/somewhere` then the parameter value ends up with a broken value, looking like a string representation of the class, like `'<class StageParameter ...>'` or something like that. I guess the wrong thing is being str'd somewhere.
tests/test_stage.py::test_parameter
tests/test_stage.py::test_construct tests/test_stage.py::test_make_stage tests/test_stage.py::test_incomplete tests/test_stage.py::test_auto_name tests/test_stage.py::test_duplicate tests/test_stage.py::test_explicit_config tests/test_stage.py::test_okay_abc_dupe_name tests/test_stage.py::test_okay_abc_dupe_name2 tests/test_stage.py::test_config_specified tests/test_stage.py::test_bool_flags tests/test_stage.py::test_open_input tests/test_stage.py::test_open_output tests/test_stage.py::test_map tests/test_stage.py::test_unknown_stage