diff --git a/diceware/__init__.py b/diceware/__init__.py
index 98346397a245d6caf7ccd3335af171b109f14f00..8df4fcd349201a50a8650937491fc663a8bf6e17 100644
--- a/diceware/__init__.py
+++ b/diceware/__init__.py
@@ -79,7 +79,8 @@ def get_random_sources():
 def handle_options(args):
     """Handle commandline options.
     """
-    random_sources = get_random_sources().keys()
+    plugins = get_random_sources()
+    random_sources = plugins.keys()
     wordlist_names = get_wordlist_names()
     defaults = get_config_dict()
     parser = argparse.ArgumentParser(
@@ -127,6 +128,9 @@ def handle_options(args):
         '--version', action='store_true',
         help='output version information and exit.',
         )
+    for plugin in plugins.values():
+        if hasattr(plugin, "update_argparser"):
+            parser = plugin.update_argparser(parser)
     parser.set_defaults(**defaults)
     args = parser.parse_args(args)
     return args
diff --git a/tests/test_diceware.py b/tests/test_diceware.py
index 05ad22944022f000589c4194a47500e08e69e052..2f8cc3a301e470b3990e914b5bde876f5edecfa9 100644
--- a/tests/test_diceware.py
+++ b/tests/test_diceware.py
@@ -147,6 +147,18 @@ class TestHandleOptions(object):
         assert options.delimiter == "my-delim"
         assert options.caps is False
 
+    def test_handle_options_allows_plugins_updating(self, monkeypatch):
+        # we allow plugins to update our argparser, before being used
+        import diceware
+        class FakePlugin(object):
+            @classmethod
+            def update_argparser(cls, parser):
+                parser.add_argument('--foo', default=2, type=int)
+                return parser
+        monkeypatch.setattr(diceware, 'get_random_sources', lambda: dict(foo=FakePlugin))
+        options = handle_options([])
+        assert options.foo == 2
+
 
 class TestDicewareModule(object):