diff --git a/scripts/flog/main/argparse.py b/scripts/flog/main/argparse.py
new file mode 100644
index 0000000..01cdc4b
--- /dev/null
+++ b/scripts/flog/main/argparse.py
@@ -0,0 +1,181 @@
+# -*- python -*-
+'''A module for parsing script command line arguments.
+
+..seealso: https://docs.python.org/3/library/argparse.html##
+'''
+
+# -----------------------------------------------------------------------
+# Copyright 2022 Open Networking Foundation (ONF) and the ONF Contributors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+ARGV      = None
+namespace = None
+
+##-------------------##
+##---]  IMPORTS  [---##
+##-------------------##
+import argparse
+
+from flog.main        import utils              as main_utils
+from flog.main        import help            as main_help
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+def get_argv():
+    """Retrieve parsed command line switches.
+
+    ..pre: getopts() was called earlier.
+
+    :return: Parsed command line argument storage
+    :rtype : dict
+    """
+
+    global ARGV
+    global namespace
+
+    if ARGV is None:
+        # Normalize argspace/namespace into a getopt/dictionary
+        # Program wide syntax edits needed: args['foo'] => args.foo
+        arg_dict = {}
+        for arg in vars(namespace):
+            arg_dict[arg] = getattr(namespace, arg)
+        ARGV = arg_dict
+
+    return ARGV
+
+## -----------------------------------------------------------------------
+## -----------------------------------------------------------------------
+def getopts(argv, debug=None) -> None:
+    """Parse command line args, check options and pack into a hashmap
+
+    :param argv: values passed on the command line
+    :param debug: optional flag to enable debug mode
+
+    :return: Digested command line arguments
+    :rtype : dict
+
+    :raises  ValueError
+
+    .. versionadded:: 1.0
+    """
+
+    global namespace
+
+    iam = main_utils.iam()
+
+    if debug is None:
+        debug = False
+
+    parser = argparse.ArgumentParser\
+             (
+                 description = '''Report test dependencies based on selection criteria.'''
+                 # epilog = 'extra-help-text'
+             )
+
+    ## -----------------------------------------------------------------------
+    ## [TEST: categories]
+    ## -----------------------------------------------------------------------
+    parser.add_argument('--attr',
+                        action  = 'append',
+                        default = [],
+                        choices=\
+                        [
+                            'olt',   # optical line termination
+                            #
+                            'onu',   # optical network unit
+                            #
+                            'epon',
+                            'pon',   # passive optical network
+                            'gpon',  # gigabit-pon
+                            'xpon',
+                        ],
+                        help = 'Enable testing by attribute',
+                    )
+
+    ## -----------------------------------------------------------------------
+    ## [TEST:types]
+    ## -----------------------------------------------------------------------
+    parser.add_argument('--type',
+                        action  = 'append',
+                        default = [],
+                        choices=\
+                        [
+                            'burnin',       # profile, stress testing
+                            'integration',  # trigger inter-dependencies
+                            'oink',         # kitchen sink testing
+                            'regression',   # have we broken the renaissance ?
+                            'scale',        #
+                            'system',       #
+                            'smoke',        # quick: 60s > [n]
+                            'standalone',   # dependency-less tests
+                            'suite',        #
+                            'unit',         # module/api/narrow focus.
+                        ],
+                        help = 'Enable testing by category',
+                    )
+
+    ## -----------------------------------------------------------------------
+    ## [FILTER]
+    ## -----------------------------------------------------------------------
+    parser.add_argument('--excl',
+                        action  = 'append',
+                        default = [],
+                        help    = 'FILTER: Probe resources to exclude',
+                    )
+    parser.add_argument('--incl',
+                        action  = 'append',
+                        default = [],
+                        help    = 'FILTER: Probe resources to include',
+                    )
+
+    ## -----------------------------------------------------------------------
+    ## [MODES]
+    ## -----------------------------------------------------------------------
+    parser.add_argument('--debug',
+                        action  = 'store_true',
+                        default = False,
+                        help    = 'Enable debug mode',
+                        )
+
+    parser.add_argument('--trace',
+                        action  = 'append',
+                        default = [],
+                        help    = 'Enable python debugging to trace a named resource.',
+                    )
+
+    parser.add_argument('--usage',
+                        action  = 'store_true',
+                        default = False,
+                        help    = 'Show usage examples',
+                        )
+    
+    parser.add_argument('--version', action='version', version='%(prog)s 1.0')
+
+
+    namespace = parser.parse_args()
+
+    # --------------------------------------------------------------
+    # [TODO] update --usage to accept a value, display context help.
+    # --------------------------------------------------------------
+    if namespace.usage:
+        main_help.usage()
+
+    return
+
+# [EOF]
+                 
