diff --git a/scripts/flog/meta/README.md b/scripts/flog/meta/README.md
new file mode 100644
index 0000000..01916fd
--- /dev/null
+++ b/scripts/flog/meta/README.md
@@ -0,0 +1,29 @@
+# -----------------------------------------------------------------------
+##  PATCH: olt app
+## ACTION: Build an ONOS image
+# -----------------------------------------------------------------------
+
+## -----------------------------------------------------------------------
+## Default tests
+## -----------------------------------------------------------------------
+   * https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/job/periodic-voltha-multi-uni-multiple-olts-test-bbsim/
+
+## -----------------------------------------------------------------------
+## Periodic
+## Regression
+## -----------------------------------------------------------------------
+   * https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/job/periodic-voltha-openonu-go-test-bbsim
+   * https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/job/periodic-voltha-multiple-olts-test-bbsim
+   * https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/job/periodic-voltha-multiple-olts-openonu-go-test-bbsim
+
+## -----------------------------------------------------------------------
+## All tests
+## -----------------------------------------------------------------------
+   * https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/
+
+## -----------------------------------------------------------------------
+## [SEE ALSO]
+## -----------------------------------------------------------------------
+   * https://jira.opencord.org/browse/VOL-4805
+
+# [EOF]
diff --git a/scripts/flog/meta/__init__.py b/scripts/flog/meta/__init__.py
new file mode 100644
index 0000000..b8a587e
--- /dev/null
+++ b/scripts/flog/meta/__init__.py
@@ -0,0 +1,37 @@
+# -*- python -*-
+"""Augment module searchpath and existence indicates directory is a module."""
+
+# -----------------------------------------------------------------------
+# 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  IMPORTS  [---##
+##-------------------##
+import sys
+from pathlib import Path
+
+## ---------------------------------------
+## Artificial scope created for local vars
+## ---------------------------------------
+# pylint: disable=invalid-name
+# pylint: disable=using-constant-test
+if True:
+    root = '../..'
+    mod_path = Path(root).resolve().as_posix()
+    if mod_path not in sys.path:
+        sys.path.insert(0, mod_path)
+
+# [EOF]
diff --git a/scripts/flog/meta/all b/scripts/flog/meta/all
new file mode 100644
index 0000000..05d50c4
--- /dev/null
+++ b/scripts/flog/meta/all
@@ -0,0 +1,7 @@
+## ---------------------------------------------------------------------------
+## Default test suites
+## ---------------------------------------------------------------------------
+
+https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/
+
+# [EOF]
diff --git a/scripts/flog/meta/olt b/scripts/flog/meta/olt
new file mode 100644
index 0000000..b56b7ff
--- /dev/null
+++ b/scripts/flog/meta/olt
@@ -0,0 +1,7 @@
+## ---------------------------------------------------------------------------
+## ONOS/OLT Test Suites
+## ---------------------------------------------------------------------------
+
+https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/job/periodic-voltha-multi-uni-multiple-olts-test-bbsim
+
+# [EOF]
diff --git a/scripts/flog/meta/regression b/scripts/flog/meta/regression
new file mode 100644
index 0000000..8cf00f8
--- /dev/null
+++ b/scripts/flog/meta/regression
@@ -0,0 +1,9 @@
+## -----------------------------------------------------------------------
+## Regresison tests
+## -----------------------------------------------------------------------
+
+https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/job/periodic-voltha-openonu-go-test-bbsim
+https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/job/periodic-voltha-multiple-olts-test-bbsim
+https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/job/periodic-voltha-multiple-olts-openonu-go-test-bbsim
+
+# [EOF]
diff --git a/scripts/flog/meta/test/__init__.py b/scripts/flog/meta/test/__init__.py
new file mode 100644
index 0000000..4b4c0b2
--- /dev/null
+++ b/scripts/flog/meta/test/__init__.py
@@ -0,0 +1,37 @@
+# -*- python -*-
+"""Augment module searchpath and existence indicates directory is a module."""
+
+# -----------------------------------------------------------------------
+# 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.
+# -----------------------------------------------------------------------
+
+##-------------------##
+##---]  IMPORTS  [---##
+##-------------------##
+import sys
+from pathlib import Path
+
+## ---------------------------------------
+## Artificial scope created for local vars
+## ---------------------------------------
+# pylint: disable=invalid-name
+# pylint: disable=using-constant-test
+if True:
+    root = '../../..'
+    mod_path = Path(root).resolve().as_posix()
+    if mod_path not in sys.path:
+        sys.path.insert(0, mod_path)
+
+# [EOF]
diff --git a/scripts/flog/meta/test/test_voltha.py b/scripts/flog/meta/test/test_voltha.py
new file mode 100644
index 0000000..d69f38f
--- /dev/null
+++ b/scripts/flog/meta/test/test_voltha.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+'''Unit test for meta/voltha.py'''
+
+# -----------------------------------------------------------------------
+# 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  [---##
+##-------------------##
+
+##-------------------##
+##---]  IMPORTS  [---##
+##-------------------##
+import unittest
+
+from flog.main         import utils           as main_utils
+from flog.meta         import voltha
+
+
+class TestStringMethods(unittest.TestCase):
+
+    ## -----------------------------------------------------------------------
+    ## -----------------------------------------------------------------------
+    def test_by_all(self):
+        '''Verify result of default test lookup.'''
+
+        exp = ['https://jenkins.opencord.org/view/VOLTHA-2.X-Tests/']
+        for arg in ['all', 'invalid']:
+            got = voltha.Utils().get([arg])
+            self.assertCountEqual(got, exp)
+            
+    ## -----------------------------------------------------------------------
+    ## -----------------------------------------------------------------------
+    def test_by_olt(self):
+        '''Verify result of test lookup by string arg 'olt'.''' 
+
+        exp = 'periodic-voltha-multi-uni-multiple-olts-test-bbsim'
+        for arg in ['olt']:
+            got = voltha.Utils().get([arg])
+            self.assertEqual(len(got), 1)
+            self.assertIn(exp, got[0])
+
+    ## -----------------------------------------------------------------------
+    ## -----------------------------------------------------------------------
+    def test_by_regression(self):
+        '''Verify result of test lookup by string arg 'regression.'''
+
+        for arg in ['regression']:
+            got = voltha.Utils().get([arg])
+            self.assertTrue(len(got) > 2)
+        
+##----------------##
+##---]  MAIN  [---##
+##----------------##
+if __name__ == "__main__":
+    main()
+
+# [EOF]
diff --git a/scripts/flog/meta/voltha.py b/scripts/flog/meta/voltha.py
new file mode 100644
index 0000000..fd0410e
--- /dev/null
+++ b/scripts/flog/meta/voltha.py
@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+'''Return voltha test suites based on criteria.'''
+
+# -----------------------------------------------------------------------#
+# 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  [---##
+##-------------------##
+
+##-------------------##
+##---]  IMPORTS  [---##
+##-------------------##
+from pathlib           import Path
+from flog.main         import utils        as main_utils
+
+
+class Utils():
+    """ . """
+
+    ## -----------------------------------------------------------------------
+    ## -----------------------------------------------------------------------
+    def __init__(self, root=None):
+        """Module constructor
+
+        :param data: A data source (often a certificate) to extract hostnames from.
+        :type  data: arbitrary
+
+        :raises: ValueError
+        """
+
+        return
+
+    ## -----------------------------------------------------------------------
+    ## -----------------------------------------------------------------------
+    def filecat(self, name:str) -> list:
+        '''Slurp contents of a config file in the meta/ directory.
+
+        :param name: Config file name to read.
+        :type  name: str
+        
+        :return: Config file contents with comments and whitespace removed.
+        :rtype:  list
+        '''
+        
+        mod_path = Path(__file__).resolve().parent.as_posix()
+        meta = Path(mod_path + '/' + name)
+
+        ans = []
+        with open(meta, mode='r', encoding='utf-8') as stream:
+            for line in stream:
+                fields = line.split('#')
+                val = fields[0].strip()
+                if len(val) > 2:
+                    ans += [val]
+
+        return ans
+    
+    ## -----------------------------------------------------------------------
+    ## -----------------------------------------------------------------------
+    def get(self, args:list) -> list:
+        '''Retrieve a list of tests from a named config file.
+
+        :param args: Config file names to load.
+        :type  args: list[str]
+
+        :return: Value(s) loaded from config files.
+        :rtype:  list
+
+        ..note: Default beahavior will return an exhaustive list of tests
+        ..note: rather than an empty list due to typos.
+        '''
+
+        meta = ['olt', 'regression']
+
+        ans = []
+        for arg in args:
+            if arg in meta:
+                ans += self.filecat(arg)
+            else:
+                ans += self.filecat('all')
+
+        return ans
+
+# [EOF]
