Repository: CrowdStrike/falconpy (language: python)

Issue:
[ ENH ] Add the ability to drop columns from results in the Grab CVEs by CID sample
Add a keyword to specify columns that should not be displayed in output results.


Discussion / hints:

Fix patch:
diff --git a/.flake8 b/.flake8
new file mode 100644
index 000000000..7e77c5764
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,3 @@
+[flake8]
+max-line-length = 127
+max-complexity = 20
diff --git a/.github/wordlist.txt b/.github/wordlist.txt
index da134d94e..4757565e6 100644
--- a/.github/wordlist.txt
+++ b/.github/wordlist.txt
@@ -830,4 +830,12 @@ arn
 tou
 applicationPackages
 CompleteDashboard
-fqdn
\ No newline at end of file
+fqdn
+APIError
+init
+pythonic
+basicConfig
+ServiceClass
+FalconInterface
+UberInterface
+APIRequest
\ No newline at end of file
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index e78aa6f64..7964b5384 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -15,12 +15,12 @@ on:
   push:
     paths:
       - '**.py'
-    branches: [ main ]
+    branches: [ main, dev, samples, ver_* ]
   pull_request:
     paths:
       - '**.py'
     # The branches below must be a subset of the branches above
-    branches: [ main ]
+    branches: [ main, dev, ver_* ]
   schedule:
     - cron: '26 4 * * 3'
 
diff --git a/.github/workflows/flake8.yml b/.github/workflows/flake8.yml
index 8c22567de..ea175d278 100644
--- a/.github/workflows/flake8.yml
+++ b/.github/workflows/flake8.yml
@@ -37,10 +37,10 @@ jobs:
         flake8 src/falconpy --count --select=E9,F63,F7,F82 --show-source --statistics
         # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
         # Stop the build on all linting errors - 04.02.21 / jshcodes@CrowdStrike
-        flake8 src/falconpy --count --max-complexity=15 --max-line-length=127 --statistics
+        flake8 src/falconpy --count --statistics
     - name: Lint samples with flake8
       run: |
         # stop the build if there are Python syntax errors or undefined names
         flake8 samples --count --select=E9,F63,F7,F82 --show-source --statistics
         # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
-        flake8 samples --exit-zero --count --max-complexity=15 --max-line-length=127 --statistics
+        flake8 samples --exit-zero --count --statistics
diff --git a/.pylintrc b/.pylintrc
new file mode 100644
index 000000000..a8bf583e7
--- /dev/null
+++ b/.pylintrc
@@ -0,0 +1,609 @@
+[MAIN]
+
+# Analyse import fallback blocks. This can be used to support both Python 2 and
+# 3 compatible code, which means that the block might have code that exists
+# only in one or another interpreter, leading to false positives when analysed.
+analyse-fallback-blocks=no
+
+# Load and enable all available extensions. Use --list-extensions to see a list
+# all available extensions.
+#enable-all-extensions=
+
+# In error mode, checkers without error messages are disabled and for others,
+# only the ERROR messages are displayed, and no reports are done by default.
+#errors-only=
+
+# Always return a 0 (non-error) status code, even if lint errors are found.
+# This is primarily useful in continuous integration scripts.
+#exit-zero=
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code.
+extension-pkg-allow-list=
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code. (This is an alternative name to extension-pkg-allow-list
+# for backward compatibility.)
+extension-pkg-whitelist=
+
+# Return non-zero exit code if any of these messages/categories are detected,
+# even if score is above --fail-under value. Syntax same as enable. Messages
+# specified are enabled, while categories only check already-enabled messages.
+fail-on=
+
+# Specify a score threshold to be exceeded before program exits with error.
+fail-under=10
+
+# Interpret the stdin as a python script, whose filename needs to be passed as
+# the module_or_package argument.
+#from-stdin=
+
+# Files or directories to be skipped. They should be base names, not paths.
+ignore=CVS
+
+# Add files or directories matching the regex patterns to the ignore-list. The
+# regex matches against paths and can be in Posix or Windows format.
+ignore-paths=
+
+# Files or directories matching the regex patterns are skipped. The regex
+# matches against base names, not paths. The default value ignores Emacs file
+# locks
+ignore-patterns=^\.#
+
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis). It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
+# number of processors available to use.
+jobs=1
+
+# Control the amount of potential inferred values when inferring a single
+# object. This can help the performance when dealing with large functions or
+# complex, nested conditions.
+limit-inference-results=100
+
+# List of plugins (as comma separated values of python module names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Minimum Python version to use for version dependent checks. Will default to
+# the version used to run pylint.
+py-version=3.9
+
+# Discover python modules and packages in the file system subtree.
+recursive=no
+
+# When enabled, pylint would attempt to guess common misconfiguration and emit
+# user-friendly hints instead of false-positive error messages.
+suggestion-mode=yes
+
+# Allow loading of arbitrary C extensions. Extensions are imported into the
+# active Python interpreter and may run arbitrary code.
+unsafe-load-any-extension=no
+
+# In verbose mode, extra non-checker-related info will be displayed.
+#verbose=
+
+
+[REPORTS]
+
+# Python expression which should return a score less than or equal to 10. You
+# have access to the variables 'fatal', 'error', 'warning', 'refactor',
+# 'convention', and 'info' which contain the number of messages in each
+# category, as well as 'statement' which is the total number of statements
+# analyzed. This score is used by the global evaluation report (RP0004).
+evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))
+
+# Template used to display messages. This is a python new-style format string
+# used to format the message information. See doc for all details.
+msg-template=
+
+# Set the output format. Available formats are text, parseable, colorized, json
+# and msvs (visual studio). You can also give a reporter class, e.g.
+# mypackage.mymodule.MyReporterClass.
+#output-format=
+
+# Tells whether to display a full report or only the messages.
+reports=no
+
+# Activate the evaluation score.
+score=yes
+
+
+[MESSAGES CONTROL]
+
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE,
+# UNDEFINED.
+confidence=HIGH,
+           CONTROL_FLOW,
+           INFERENCE,
+           INFERENCE_FAILURE,
+           UNDEFINED
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once). You can also use "--disable=all" to
+# disable everything first and then re-enable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use "--disable=all --enable=classes
+# --disable=W".
+disable=raw-checker-failed,
+        bad-inline-option,
+        locally-disabled,
+        file-ignored,
+        suppressed-message,
+        useless-suppression,
+        deprecated-pragma,
+        use-symbolic-message-instead,
+        duplicate-code
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once). See also the "--disable" option for examples.
+enable=c-extension-no-member
+
+
+[LOGGING]
+
+# The type of string formatting that logging methods do. `old` means using %
+# formatting, `new` is for `{}` formatting.
+logging-format-style=old
+
+# Logging modules to check that the string format arguments are in logging
+# function parameter format.
+logging-modules=logging
+
+
+[SPELLING]
+
+# Limits count of emitted suggestions for spelling mistakes.
+max-spelling-suggestions=4
+
+# Spelling dictionary name. Available dictionaries: none. To make it work,
+# install the 'python-enchant' package.
+spelling-dict=
+
+# List of comma separated words that should be considered directives if they
+# appear at the beginning of a comment and should not be checked.
+spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:
+
+# List of comma separated words that should not be checked.
+spelling-ignore-words=
+
+# A path to a file that contains the private dictionary; one word per line.
+spelling-private-dict-file=
+
+# Tells whether to store unknown words to the private dictionary (see the
+# --spelling-private-dict-file option) instead of raising a message.
+spelling-store-unknown-words=no
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,
+      XXX,
+      TODO
+
+# Regular expression of note tags to take in consideration.
+notes-rgx=
+
+
+[TYPECHECK]
+
+# List of decorators that produce context managers, such as
+# contextlib.contextmanager. Add to this list to register other decorators that
+# produce valid context managers.
+contextmanager-decorators=contextlib.contextmanager
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E1101 when accessed. Python regular
+# expressions are accepted.
+generated-members=
+
+# Tells whether to warn about missing members when the owner of the attribute
+# is inferred to be None.
+ignore-none=yes
+
+# This flag controls whether pylint should warn about no-member and similar
+# checks whenever an opaque object is returned when inferring. The inference
+# can return multiple potential results while evaluating a Python object, but
+# some branches might not be evaluated, which results in partial inference. In
+# that case, it might be useful to still emit no-member and other checks for
+# the rest of the inferred objects.
+ignore-on-opaque-inference=yes
+
+# List of symbolic message names to ignore for Mixin members.
+ignored-checks-for-mixins=no-member,
+                          not-async-context-manager,
+                          not-context-manager,
+                          attribute-defined-outside-init
+
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace
+
+# Show a hint with possible names when a member name was not found. The aspect
+# of finding the hint is based on edit distance.
+missing-member-hint=yes
+
+# The minimum edit distance a name should have in order to be considered a
+# similar match for a missing member name.
+missing-member-hint-distance=1
+
+# The total number of similar names that should be taken in consideration when
+# showing a hint for a missing member.
+missing-member-max-choices=1
+
+# Regex pattern to define which classes are considered mixins.
+mixin-class-rgx=.*[Mm]ixin
+
+# List of decorators that change the signature of a decorated function.
+signature-mutators=
+
+
+[CLASSES]
+
+# Warn about protected attribute access inside special methods
+check-protected-access-in-special-methods=no
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,
+                      __new__,
+                      setUp,
+                      __post_init__
+
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=_asdict,
+                  _fields,
+                  _replace,
+                  _source,
+                  _make
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=cls
+
+
+[VARIABLES]
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid defining new builtins when possible.
+additional-builtins=
+
+# Tells whether unused global variables should be treated as a violation.
+allow-global-unused-variables=yes
+
+# List of names allowed to shadow builtins
+allowed-redefined-builtins=
+
+# List of strings which can identify a callback function by name. A callback
+# name must start or end with one of those strings.
+callbacks=cb_,
+          _cb
+
+# A regular expression matching the name of dummy variables (i.e. expected to
+# not be used).
+dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
+
+# Argument names that match this expression will be ignored. Default to name
+# with leading underscore.
+ignored-argument-names=_.*|^ignored_|^unused_
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# List of qualified module names which can have objects that can redefine
+# builtins.
+redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io
+
+
+[FORMAT]
+
+# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
+expected-line-ending-format=
+
+# Regexp for a line that is allowed to be longer than the limit.
+ignore-long-lines=^\s*(# )?<?https?://\S+>?$
+
+# Number of spaces of indent required inside a hanging or continued line.
+indent-after-paren=4
+
+# String used as indentation unit. This is usually "    " (4 spaces) or "\t" (1
+# tab).
+indent-string='    '
+
+# Maximum number of characters on a single line.
+max-line-length=127
+
+# Maximum number of lines in a module.
+max-module-lines=1000
+
+# Allow the body of a class to be on the same line as the declaration if body
+# contains single statement.
+single-line-class-stmt=no
+
+# Allow the body of an if to be on the same line as the test if there is no
+# else.
+single-line-if-stmt=no
+
+
+[IMPORTS]
+
+# List of modules that can be imported at any level, not just the top level
+# one.
+allow-any-import-level=
+
+# Allow wildcard imports from modules that define __all__.
+allow-wildcard-with-all=no
+
+# Deprecated modules which should not be used, separated by a comma.
+deprecated-modules=
+
+# Output a graph (.gv or any supported image format) of external dependencies
+# to the given file (report RP0402 must not be disabled).
+ext-import-graph=
+
+# Output a graph (.gv or any supported image format) of all (i.e. internal and
+# external) dependencies to the given file (report RP0402 must not be
+# disabled).
+import-graph=
+
+# Output a graph (.gv or any supported image format) of internal dependencies
+# to the given file (report RP0402 must not be disabled).
+int-import-graph=
+
+# Force import order to recognize a module as part of the standard
+# compatibility libraries.
+known-standard-library=
+
+# Force import order to recognize a module as part of a third party library.
+known-third-party=enchant
+
+# Couples of modules and preferred modules, separated by a comma.
+preferred-modules=
+
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when caught.
+overgeneral-exceptions=BaseException,
+                       Exception
+
+
+[REFACTORING]
+
+# Maximum number of nested blocks for function / method body
+max-nested-blocks=5
+
+# Complete name of functions that never returns. When checking for
+# inconsistent-return-statements if a never returning function is called then
+# it will be considered as an explicit return statement and no message will be
+# printed.
+never-returning-functions=sys.exit,argparse.parse_error
+
+
+[SIMILARITIES]
+
+# Comments are removed from the similarity computation
+ignore-comments=yes
+
+# Docstrings are removed from the similarity computation
+ignore-docstrings=yes
+
+# Imports are removed from the similarity computation
+ignore-imports=yes
+
+# Signatures are removed from the similarity computation
+ignore-signatures=yes
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+
+[DESIGN]
+
+# List of regular expressions of class ancestor names to ignore when counting
+# public methods (see R0903)
+exclude-too-few-public-methods=
+
+# List of qualified class names to ignore when counting class parents (see
+# R0901)
+ignored-parents=
+
+# Maximum number of arguments for function / method.
+max-args=10
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=12
+
+# Maximum number of boolean expressions in an if statement (see R0916).
+max-bool-expr=5
+
+# Maximum number of branch for function / method body.
+max-branches=15
+
+# Maximum number of locals for function / method body.
+max-locals=20
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=30
+
+# Maximum number of return / yield for function / method body.
+max-returns=6
+
+# Maximum number of statements in function / method body.
+max-statements=50
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+
+[STRING]
+
+# This flag controls whether inconsistent-quotes generates a warning when the
+# character used as a quote delimiter is used inconsistently within a module.
+check-quote-consistency=no
+
+# This flag controls whether the implicit-str-concat should generate a warning
+# on implicit string concatenation in sequences defined over several lines.
+check-str-concat-over-line-jumps=no
+
+
+[BASIC]
+
+# Naming style matching correct argument names.
+argument-naming-style=snake_case
+
+# Regular expression matching correct argument names. Overrides argument-
+# naming-style. If left empty, argument names will be checked with the set
+# naming style.
+#argument-rgx=
+
+# Naming style matching correct attribute names.
+attr-naming-style=snake_case
+
+# Regular expression matching correct attribute names. Overrides attr-naming-
+# style. If left empty, attribute names will be checked with the set naming
+# style.
+#attr-rgx=
+
+# Bad variable names which should always be refused, separated by a comma.
+bad-names=foo,
+          bar,
+          baz,
+          toto,
+          tutu,
+          tata
+
+# Bad variable names regexes, separated by a comma. If names match any regex,
+# they will always be refused
+bad-names-rgxs=
+
+# Naming style matching correct class attribute names.
+class-attribute-naming-style=any
+
+# Regular expression matching correct class attribute names. Overrides class-
+# attribute-naming-style. If left empty, class attribute names will be checked
+# with the set naming style.
+#class-attribute-rgx=
+
+# Naming style matching correct class constant names.
+class-const-naming-style=UPPER_CASE
+
+# Regular expression matching correct class constant names. Overrides class-
+# const-naming-style. If left empty, class constant names will be checked with
+# the set naming style.
+#class-const-rgx=
+
+# Naming style matching correct class names.
+class-naming-style=PascalCase
+
+# Regular expression matching correct class names. Overrides class-naming-
+# style. If left empty, class names will be checked with the set naming style.
+#class-rgx=
+
+# Naming style matching correct constant names.
+const-naming-style=UPPER_CASE
+
+# Regular expression matching correct constant names. Overrides const-naming-
+# style. If left empty, constant names will be checked with the set naming
+# style.
+#const-rgx=
+
+# Minimum line length for functions/classes that require docstrings, shorter
+# ones are exempt.
+docstring-min-length=-1
+
+# Naming style matching correct function names.
+function-naming-style=snake_case
+
+# Regular expression matching correct function names. Overrides function-
+# naming-style. If left empty, function names will be checked with the set
+# naming style.
+#function-rgx=
+
+# Good variable names which should always be accepted, separated by a comma.
+good-names=i,
+           j,
+           k,
+           ex,
+           Run,
+           _
+
+# Good variable names regexes, separated by a comma. If names match any regex,
+# they will always be accepted
+good-names-rgxs=
+
+# Include a hint for the correct naming format with invalid-name.
+include-naming-hint=no
+
+# Naming style matching correct inline iteration names.
+inlinevar-naming-style=any
+
+# Regular expression matching correct inline iteration names. Overrides
+# inlinevar-naming-style. If left empty, inline iteration names will be checked
+# with the set naming style.
+#inlinevar-rgx=
+
+# Naming style matching correct method names.
+method-naming-style=snake_case
+
+# Regular expression matching correct method names. Overrides method-naming-
+# style. If left empty, method names will be checked with the set naming style.
+#method-rgx=
+
+# Naming style matching correct module names.
+module-naming-style=snake_case
+
+# Regular expression matching correct module names. Overrides module-naming-
+# style. If left empty, module names will be checked with the set naming style.
+#module-rgx=
+
+# Colon-delimited sets of names that determine each other's naming style when
+# the name regexes allow several styles.
+name-group=
+
+# Regular expression which should only match function or class names that do
+# not require a docstring.
+no-docstring-rgx=^_
+
+# List of decorators that produce properties, such as abc.abstractproperty. Add
+# to this list to register other decorators that produce valid properties.
+# These decorators are taken in consideration only for invalid-name.
+property-classes=abc.abstractproperty
+
+# Regular expression matching correct type variable names. If left empty, type
+# variable names will be checked with the set naming style.
+#typevar-rgx=
+
+# Naming style matching correct variable names.
+variable-naming-style=snake_case
+
+# Regular expression matching correct variable names. Overrides variable-
+# naming-style. If left empty, variable names will be checked with the set
+# naming style.
+#variable-rgx=
diff --git a/AUTHORS.md b/AUTHORS.md
index 5fd7366a9..1b1502881 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -88,6 +88,7 @@ This has been a critical element in the development of the FalconPy project.
 + Alex, `@khyberspache`
 + Phil Massyn, `@massyn`
 + Russell Snyder, `@rusnyder`
++ `@PeroSoy`
 
 
 ## Sponsors
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7f5b5005c..11f3106b3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,137 @@
+# Version 1.3.0
+> Developer Enhancements Release 🎉
+## Added features and functionality
++ Added: **Developer Extensibility features** - Enhanced existing programmatic architecture with new objects and submodules to address technical debt and provide developers with the necessary structures to easily extend core library functionality.
+  + **_APIHarness_** - Derivative and an interface class commonly referred to as the _Uber Class_, APIHarness has been refactored to inherit common functionality provided by the **_FalconInterface_** class, remove technical debt, add typing, and expand available operations and extensibility features.
+    + `api_complete.py`
+  + **_APIRequest_** - Simple interface class comprised of multiple data classes that is leveraged for managing the components of a request sent to the CrowdStrike API. This is a new object.
+    + `_api_request/__init__.py`
+    + `_api_request/_request.py`
+    + `_api_request/_request_behavior.py`
+    + `_api_request/_request_connection.py`
+    + `_api_request/_request_meta.py`
+    + `_api_request/_request_payloads.py`
+    + `_api_request/_request_validator.py`
+  + **_Constant submodule_** - Stores global constants used throughout the library. This is a new module implemented to store new and pre-existing constants.
+    + `_constant/__init__.py`
+  + **_Enum submodule_** - Stores enumerators available within the library. This is a new module implemented to store pre-existing enumerators.
+    + `_enum/__init__.py`
+    + `_enum/_base_url.py`
+    + `_enum/_container_base_url.py`
+    + `_enum/_token_fail_reason.py`
+  + **_Error submodule_** - Provides python native errors and warnings. This is a new module.
+    + `_error/__init__.py`
+    + `_error/_exceptions.py`
+    + `_error/_warnings.py`
+  + **_FalconInterface_** - Interface class that handles authentication and state management, also referred to as the authentication object or the `auth_object`. Refactored to address technical debt and add new functionality.
+    + `_auth_object/__init__.py`
+    + `_auth_object/_base_falcon_auth.py`
+    + `_auth_object/_bearer_token.py`
+    + `_auth_object/_falcon_interface.py`
+    + `_auth_object/_interface_config.py`
+    + `_auth_object/_uber_interface.py`
+  + **_Log submodule_** - Provides debug logging functionality. This is a new module.
+    + `_log/__init__.py`
+    + `_log/_facility.py`
+  + **_Result_** - Complex interface class that is leveraged to parse and return results received from the CrowdStrike API. This class has been refactored to address technical debt and provide new developer functionality and extensibility. Default behavior for requests received from the CrowdStrike API remains unchanged (results are returned as a Python dictionary). Expanded functionality provides developers the ability to handle received responses as python structures, allowing for easy iteration and processing without having to handle a dictionary.
+    + `_result/__init__.py`
+    + `_result/_base_resource.py`
+    + `_result/_base_dictionary.py`
+    + `_result/_errors.py`
+    + `_result/_expanded_result.py`
+    + `_result/_headers.py`
+    + `_result/_meta.py`
+    + `_result/_resources.py`
+    + `_result/_response_component.py`
+    + `_result/_result.py`
+  + **_ServiceClass_** - Interface class leveraged by Service Classes to provide common functionality. This class has also been refactored to expand on functionality provided by the **_FalconInterface_** class, remove technical debt, add typing and expand extensibility features.
+    + `_service_class/_init__.py`
+    + `_service_class/_base_service_class.py`
+    + `_service_class/_service_class.py`
+  + **_Util submodule_** - Functions and utilities library containing both private and public methods. This is a new module implemented to store new and pre-existing functions.
+    + `_util/__init__.py`
+    + `_util/_auth.py`
+    + `_util/_functions.py`
+    + `_util/_uber.py`
++ Added: **Debug logging** - Native debug logging can now be activated per class upon construction. Logs are sanitized by default.
+  ```python
+  import logging
+  from falconpy import Hosts
+
+  logging.basicConfig(level=logging.DEBUG)
+  hosts = Hosts(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, debug=True)
+  result = hosts.query_devices_by_filter_scroll()
+  ```
+  Log sanitization can also be disabled when instantiating the class.
+  ```python
+  hosts = Hosts(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, debug=True, sanitize_log=False)
+  ``` 
+  Local unit testing has been expanded to take advantage of this functionality. To activate, set the environment variable `FALCONPY_UNIT_TEST_DEBUG` to __`DEBUG`__.
+  + `_log/__init__.py`
+  + `_log/_facility.py`
++ Added: **Environment Authentication** - New authentication mechanism that retrieves CrowdStrike API credentials that are pre-defined as variables within the runtime environment. These environment variables must be named `FALCON_CLIENT_ID` and `FALCON_CLIENT_SECRET` and both must be present in order for this mechanism to be used. Environment Authentication is the last mechanism attempted, meaning all other authentication mechanisms will take precedence.
+  ```python
+  from falconpy import Hosts
+
+  hosts = Hosts()
+  result = hosts.query_devices_by_filter_scroll()
+  ```
+  + `_auth_object/_falcon_interface.py`
++ Added: **Pythonic response handling** - Allows for the handling of responses received from the CrowdStrike API as pythonic structures as opposed to dictionaries.
+  ```python
+  from falconpy import Hosts
+
+  hosts = Hosts(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, pythonic=True)
+  host_list = hosts.query_devices_by_filter_scroll()
+  for device in hosts_list:
+      print(device)
+  ```
+  + `_result/__init__.py`
+  + `_result/_base_resource.py`
+  + `_result/_base_dictionary.py`
+  + `_result/_errors.py`
+  + `_result/_expanded_result.py`
+  + `_result/_headers.py`
+  + `_result/_meta.py`
+  + `_result/_resources.py`
+  + `_result/_response_component.py`
+  + `_result/_result.py`
++ Added: **Pythonic errors and warnings** - Leverages native Python exceptions to implement error and warning handling.
+  ```python
+  from falconpy import Hosts, APIError
+
+  hosts = Hosts(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, pythonic=True)
+  try:
+      device_detail = hosts.get_device_details("not-a-real-id")
+  except APIError as not_found:
+      print(not_found)
+  ```
+  + `_error/__init__.py`
+  + `_error/_exceptions.py`
+  + `_error/_warnings.py`
++ Added: **Typing** - Type hints have been added throughout the library. This is an ongoing initiative. 
+
+## Issues resolved
++ Fixed: Unusual responses from operations within the Falcon Container service collection.
+  + `_result/_result.py`
+  + `_util/_functions.py`
++ Fixed: Uber Class functionality using operations within the OAuth2 service collection. Closes #835.
+  + `api_complete.py`
+  + `_auth_object/_falcon_interface.py`
+  + `_auth_object/_uber_interface.py`
++ Fixed: Inbound strings provided to the `creds` and `proxy` keywords are not automatically converted to dictionaries. Closes #909.
+  + `_auth_object/_falcon_interface.py`
++ Fixed: Fixed missing facet keyword in follow request for vulnerabilities - Grab CVEs for CID sample. Closes #1004.
+  + `samples/spotlight/spotlight_grab_cves_for_cid.py`
+
+## Other
++ Expanded: Unit testing expanded to complete code coverage.
++ Updated: Added column prune keyword to Grab CVEs by CID sample. Closes #1005.
+  +  `samples/spotlight/spotlight_grab_cves_for_cid.py`
++ __PLEASE NOTE__: Python 3.6 support will be discontinued in __January 2024__.
+
+---
+
 # Version 1.2.16
 ## Added features and functionality
 + Added: New keywords were added to 1 operations within the __Alerts__ Service Class.
diff --git a/README.md b/README.md
index 131f96320..58a889f3f 100644
--- a/README.md
+++ b/README.md
@@ -27,8 +27,8 @@ The CrowdStrike Falcon SDK for Python completely abstracts token management, whi
 > 
 > _"One SDK to rule them all, One SDK to find them, One SDK to bring them all and in the darkness bind them."_
 
-[![Downloads](https://static.pepy.tech/personalized-badge/crowdstrike-falconpy?left_text=package%20installs/month&left_color=gray&right_color=blue&period=month)](https://pepy.tech/project/crowdstrike-falconpy)
-[![Development Installs](https://static.pepy.tech/personalized-badge/crowdstrike-falconpy-dev?left_text=development%20package%20installs/month&left_color=gray&right_color=blue&period=month)](https://pepy.tech/project/crowdstrike-falconpy-dev)
+[![Downloads](https://static.pepy.tech/personalized-badge/crowdstrike-falconpy?left_text=package%20installs/month&left_color=grey&right_color=blue&period=month)](https://pepy.tech/project/crowdstrike-falconpy)
+[![Development Installs](https://static.pepy.tech/personalized-badge/crowdstrike-falconpy-dev?left_text=development%20package%20installs/month&left_color=grey&right_color=blue&period=month)](https://pepy.tech/project/crowdstrike-falconpy-dev)
 
 #### Supported versions of Python
 The CrowdStrike Falcon SDK for Python was developed for Python 3, and does not support versions of Python below 3.6. Every commit to the FalconPy code base is unit tested for functionality using all versions of Python the library currently supports.
diff --git a/samples/spotlight/spotlight_grab_cves_for_cid.py b/samples/spotlight/spotlight_grab_cves_for_cid.py
index 47c4d1ed4..b6dfeb0b1 100644
--- a/samples/spotlight/spotlight_grab_cves_for_cid.py
+++ b/samples/spotlight/spotlight_grab_cves_for_cid.py
@@ -61,47 +61,60 @@ def get_all_vulnerabilites_from_account(client_id, secret, filter, verbose=False
             print("[+] Total Records Pulled: %d" % len(rows_dict_list))
             print("[+] Elapsed Time (seconds): %d minutes %d seconds" % (elapsed_minutes, elapsed_seconds))
             
-        spotlight_results = spotlight.query_vulnerabilities_combined(filter=filter, limit=400, after=after)
+        spotlight_results = spotlight.query_vulnerabilities_combined(filter=filter,
+                                                                     limit=400,
+                                                                     after=after,
+                                                                     facet=facet
+                                                                     )
 
     return pd.json_normalize(rows_dict_list)
 
 def main():
     parser = ArgumentParser(description=__doc__, formatter_class=RawTextHelpFormatter)
-    parser.add_argument('--client_id',
+    parser.add_argument('-k', '--client_id',
                         type=str,
                         required=True,
                         help="The Client ID of your Falcon API Key"
                         )
-    parser.add_argument('--client_secret',
+    parser.add_argument('-s', '--client_secret',
                         type=str,
                         required=True,
                         help="The Client secret of your Falcon API Key"
                         )
-    parser.add_argument('--output_file',
+    parser.add_argument('-o', '--output_file',
                         type=str,
                         required=False,
                         help="The output file for the associated vulnerabilities",
                         default="spotlight_vulnerabilities.txt"
                         )
-    parser.add_argument('--filter',
+    parser.add_argument('-f', '--filter',
                         type=str,
                         required=False,
                         help="Filter for Vulnerabilities created via FQL: https://falconpy.io/Service-Collections/Spotlight-Vulnerabilities.html",
                         default="status:!'closed'+last_seen_within:'3'+cve.exprt_rating:['CRITICAL']"
                         )
-    parser.add_argument('--verbose',
+    parser.add_argument('-p', '--prune',
+                        help="Comma delimited list of columns to prune",
+                        required=False,
+                        default=None
+                        )
+    parser.add_argument('-v', '--verbose',
                         action="store_true",
                         required=False,
                         help="Give Verbose Information On Data Pull",
                         default=False
                         )
     args = parser.parse_args()
-
     spotlight_data = get_all_vulnerabilites_from_account(args.client_id,
                                                          args.client_secret,
                                                          args.filter,
                                                          args.verbose
                                                          )
+    if args.prune:
+        # Remove any columns they asked us to prune
+        for pruned in args.prune.split(","):
+            spotlight_data.pop(pruned)
+    # Output the result to CSV
     spotlight_data.to_csv(args.output_file)
 
 if __name__ == "__main__":
diff --git a/src/falconpy/README.md b/src/falconpy/README.md
index dcb5552df..04cd6890d 100644
--- a/src/falconpy/README.md
+++ b/src/falconpy/README.md
@@ -35,6 +35,7 @@ for every single operation available within that service collection.
 | `malquery.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/malquery |
 | `message_center.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/message-center |
 | `ml_exclusions.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/ml-exclusions |
+| `mobile_enrollment.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/mobile-enrollment |
 | `mssp.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/mssp |
 | `oauth2.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/oauth2 |
 | `ods.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/ods |
@@ -52,7 +53,9 @@ for every single operation available within that service collection.
 | `sensor_download.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/sensor-download |
 | `sensor_update_policy.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/sensor-update-policies |
 | `sensor_visibility_exclusions.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/sensor-visibility-exclusions |
+| `spotlight_evaluation_logic.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/spotlight-evaluation-logic |
 | `spotlight_vulnerabilities.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/spotlight-vulnerabilities |
+| `tailored_intelligence.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/tailored-intelligence |
 | `user_management.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/user-management |
 | `zero_trust_assessment.py` | https://assets.falcon.crowdstrike.com/support/api/swagger.html#/zero-trust-assessment |
 
diff --git a/src/falconpy/__init__.py b/src/falconpy/__init__.py
index 0c09ef057..4f803fc63 100644
--- a/src/falconpy/__init__.py
+++ b/src/falconpy/__init__.py
@@ -21,11 +21,68 @@
 """
 from ._version import _VERSION, _MAINTAINER, _AUTHOR, _AUTHOR_EMAIL
 from ._version import _CREDITS, _DESCRIPTION, _TITLE, _PROJECT_URL
-from ._version import _DOCS_URL, _KEYWORDS
-from ._service_class import ServiceClass
+from ._version import _DOCS_URL, _KEYWORDS, version
+from ._auth_object import (
+    BaseFalconAuth,
+    BearerToken,
+    FalconInterface,
+    UberInterface,
+    InterfaceConfiguration
+    )
+from ._service_class import BaseServiceClass, ServiceClass
 from ._util import confirm_base_region, confirm_base_url
-from ._base_url import BaseURL
-from ._container_base_url import ContainerBaseURL
+from ._constant import (
+    MAX_DEBUG_RECORDS,
+    ALLOWED_METHODS,
+    USER_AGENT,
+    MIN_TOKEN_RENEW_WINDOW,
+    MAX_TOKEN_RENEW_WINDOW,
+    GLOBAL_API_MAX_RETURN,
+    MOCK_OPERATIONS
+    )
+from ._enum import BaseURL, ContainerBaseURL, TokenFailReason
+from ._log import LogFacility
+from ._error import (
+    APIError,
+    SDKError,
+    SDKWarning,
+    NoContentWarning,
+    SSLDisabledWarning,
+    RegionSelectError,
+    InvalidCredentials,
+    InvalidMethod,
+    InvalidOperation,
+    TokenNotSpecified,
+    KeywordsOnly,
+    CannotRevokeToken,
+    FunctionalityNotImplemented,
+    InvalidBaseURL,
+    PayloadValidationError,
+    NoAuthenticationMechanism,
+    InvalidIndex,
+    InvalidCredentialFormat
+    )
+from ._result import (
+    Result,
+    ExpandedResult,
+    BaseDictionary,
+    BaseResource,
+    Resources,
+    ResponseComponent,
+    Meta,
+    Headers,
+    Errors,
+    RawBody,
+    BinaryFile
+    )
+from ._api_request import (
+    APIRequest,
+    RequestBehavior,
+    RequestConnection,
+    RequestMeta,
+    RequestPayloads,
+    RequestValidator
+    )
 from .alerts import Alerts
 from .api_complete import APIHarness
 from .cloud_connect_aws import CloudConnectAWS
@@ -92,6 +149,7 @@
 __keywords__ = _KEYWORDS
 __all__ = [
     "confirm_base_url", "confirm_base_region", "BaseURL", "ServiceClass", "Alerts",
+    "BaseServiceClass", "BaseFalconAuth", "FalconInterface", "UberInterface", "TokenFailReason",
     "APIHarness", "CloudConnectAWS", "CSPMRegistration", "CustomIOA", "D4CRegistration",
     "Detects", "DeviceControlPolicies", "Discover", "EventStreams", "CompleteDashboard",
     "FalconContainer", "FalconXSandbox", "FirewallManagement", "FirewallPolicies", "HostGroup",
@@ -100,10 +158,20 @@
     "OverwatchDashboard", "PreventionPolicy", "Quarantine", "QuickScan", "RealTimeResponseAdmin",
     "RealTimeResponse", "Recon", "ReportExecutions", "ResponsePolicies", "SampleUploads",
     "ScheduledReports", "SensorDownload", "SensorUpdatePolicy", "SensorVisibilityExclusions",
-    "SpotlightVulnerabilities", "SpotlightEvaluationLogic", "UserManagement", "ODS",
+    "SpotlightVulnerabilities", "SpotlightEvaluationLogic", "UserManagement", "MAX_DEBUG_RECORDS",
     "ZeroTrustAssessment", "PreventionPolicies", "SensorUpdatePolicies", "MessageCenter",
-    "FileVantage", "MobileEnrollment", "ContainerBaseURL", "TailoredIntelligence", "FDR"
-]
+    "FileVantage", "MobileEnrollment", "ContainerBaseURL", "TailoredIntelligence", "ODS", "FDR",
+    "Result", "APIError", "SDKError", "SDKWarning", "NoContentWarning", "SSLDisabledWarning",
+    "RegionSelectError", "InvalidCredentials", "InvalidMethod", "InvalidOperation",
+    "TokenNotSpecified", "KeywordsOnly", "ALLOWED_METHODS", "USER_AGENT", "APIRequest",
+    "ExpandedResult", "CannotRevokeToken", "Headers", "Meta", "Resources",
+    "ResponseComponent", "BaseDictionary", "Errors", "BaseResource", "RawBody", "BinaryFile",
+    "FunctionalityNotImplemented", "BearerToken", "LogFacility", "InvalidBaseURL",
+    "InterfaceConfiguration", "RequestBehavior", "RequestConnection", "RequestMeta",
+    "RequestPayloads", "RequestValidator", "PayloadValidationError", "MIN_TOKEN_RENEW_WINDOW",
+    "MAX_TOKEN_RENEW_WINDOW", "GLOBAL_API_MAX_RETURN", "MOCK_OPERATIONS",
+    "NoAuthenticationMechanism", "InvalidIndex", "version", "InvalidCredentialFormat"
+    ]
 """
 This is free and unencumbered software released into the public domain.
 
diff --git a/src/falconpy/_uber_default_preference.py b/src/falconpy/_api_request/__init__.py
similarity index 74%
rename from src/falconpy/_uber_default_preference.py
rename to src/falconpy/_api_request/__init__.py
index 137cd5740..1ad5586e1 100644
--- a/src/falconpy/_uber_default_preference.py
+++ b/src/falconpy/_api_request/__init__.py
@@ -1,4 +1,4 @@
-"""Internal constant library.
+"""FalconPy API Request module.
 
  _______                        __ _______ __        __ __
 |   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
@@ -35,16 +35,13 @@
 
 For more information, please refer to <https://unlicense.org>
 """
-PREFER_NONETYPE = [
-    "report_executions_download_get", "report_executions_download.get",
-    "RTR_ListFiles", "RTR_ListFilesV2", "RTR_GetExtractedFileContents",
-    "RTR_DeleteSession"
-]
-PREFER_IDS_IN_BODY = [
-    "GetDeviceDetails", "PostDeviceDetailsV2", "GetVulnerabilities", "GetIntelIndicatorEntities",
-    "getChildrenV2", "cancel-scans", "GetDetectSummaries", "UpdateQuarantinedDetectsByIds",
-    "GetQuarantineFiles"
-]
-MOCK_OPERATIONS = [
-    "GetImageAssessmentReport", "DeleteImageDetails", "ImageMatchesPolicy"
-]
+from ._request import APIRequest
+from ._request_behavior import RequestBehavior
+from ._request_connection import RequestConnection
+from ._request_meta import RequestMeta
+from ._request_payloads import RequestPayloads
+from ._request_validator import RequestValidator
+
+__all__ = ["APIRequest", "RequestBehavior", "RequestConnection",
+           "RequestMeta", "RequestPayloads", "RequestValidator"
+           ]
diff --git a/src/falconpy/_api_request/_request.py b/src/falconpy/_api_request/_request.py
new file mode 100644
index 000000000..cbc46287e
--- /dev/null
+++ b/src/falconpy/_api_request/_request.py
@@ -0,0 +1,270 @@
+"""FalconPy API Request object.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Union, Dict, Optional, List, Any
+from logging import Logger
+from ._request_behavior import RequestBehavior
+from ._request_connection import RequestConnection
+from ._request_meta import RequestMeta
+from ._request_payloads import RequestPayloads
+from .._log import LogFacility
+
+
+class APIRequest:
+    """This class represents a request made to the CrowdStrike API."""
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    def __init__(self,
+                 endpoint: str,
+                 initializer: Optional[Dict[str, Any]] = None
+                 ):
+        """Construct an instance of the APIRequest class."""
+        if initializer:
+            # Key metadata regarding this API request
+            self._meta = RequestMeta(endpoint, initializer.get("method", "GET"))
+            # Payloads for the request
+            self._payloads = RequestPayloads(params=initializer.get("params", None),
+                                             body=initializer.get("body", None),
+                                             data=initializer.get("data", None),
+                                             files=initializer.get("files", [])
+                                             )
+            # Connection specific details for creating the request
+            self._connection = RequestConnection(user_agent=initializer.get("user_agent", None),
+                                                 proxy=initializer.get("proxy", {}),
+                                                 timeout=initializer.get("timeout", None),
+                                                 verify=initializer.get("verify", True)
+                                                 )
+            # Behavioral flags that alter the behavior of request processing
+            self._behavior = RequestBehavior(expand_result=initializer.get("expand_result", False),
+                                             container=initializer.get("container", False),
+                                             authenticating=initializer.get("authenticating", False),
+                                             perform=initializer.get("perform", True),
+                                             body_validator=initializer.get("body_validator", None),
+                                             body_required=initializer.get("body_required", None)
+                                             )
+            # Logging functionality
+            self._request_log = LogFacility(log=initializer.get("log_util", None),
+                                            debug_record_count=initializer.get("debug_record_count", None),
+                                            sanitize_log=initializer.get("sanitize", None)
+                                            )
+
+        else:
+            self._meta = RequestMeta()
+            self._payloads = RequestPayloads()
+            self._connection = RequestConnection()
+            self._behavior = RequestBehavior()
+            self._request_log: Optional[LogFacility] = None
+
+    # _  _ ____ ___ _  _ ____ ___  ____
+    # |\/| |___  |  |__| |  | |  \ [__
+    # |  | |___  |  |  | |__| |__/ ___]
+    #
+    def log_error(self, code: int = 500, msg: str = None, content: Union[dict, str, bytes] = None):
+        """Leverage the attached log utility to log the passed error detail if logging is enabled."""
+        if self.log_util:
+            self.log_util.error(msg)
+            self.log_util.debug("STATUS CODE: %s", code)
+            self.log_util.debug("RESULT: %s", content)
+
+    def log_warning(self, msg: str = None):
+        """Leverage the attached log utility to log the passed warning detail if logging is enabled."""
+        if self.log_util:
+            self.log_util.warning(msg)
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____                        |
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__          \_            /;
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]         `\~--.._     //'
+    #                                                        `//////\  \\/;'
+    # All of these properties reflect states for               ~/////\~\`)'
+    # properties of connected attribute objects.                   `~'  |
+    #                                                              ;'_\'\
+    # _  _ ____ ___ ____                                          /~/ '" "'
+    # |\/| |___  |  |__|                                         `\/' CROWDSTRIKE
+    # |  | |___  |  |  |
+    @property
+    def meta(self) -> RequestMeta:
+        """Return the RequestMeta object."""
+        return self._meta
+
+    @property
+    def endpoint(self) -> Optional[str]:
+        """Return the endpoint attribute."""
+        return self.meta.endpoint
+
+    @property
+    def method(self) -> str:
+        """Return the method attribute."""
+        return self.meta.method
+
+    @property
+    def debug_headers(self) -> Optional[Dict[str, Optional[Union[str, int, float]]]]:
+        """Return the debug headers."""
+        return self.meta.debug_headers
+
+    @debug_headers.setter
+    def debug_headers(self, value):
+        """Set the debug headers."""
+        self.meta.debug_headers = value
+
+    # ___  ____ _   _ _    ____ ____ ___  ____
+    # |__] |__|  \_/  |    |  | |__| |  \ [__
+    # |    |  |   |   |___ |__| |  | |__/ ___]
+    @property
+    def payloads(self) -> RequestPayloads:
+        """Retrieve the payloads object."""
+        return self._payloads
+
+    # Body
+    @property
+    def body_payload(self) -> Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]]:
+        """Retrieve the body payload from the payloads object."""
+        return self.payloads.body
+
+    # Params
+    @property
+    def param_payload(self) -> Optional[Dict[str, Optional[Union[str, int, float, list, dict]]]]:
+        """Retrieve the param payload from the payloads object."""
+        return self.payloads.params
+
+    # Data
+    @property
+    def data_payload(self) -> Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]]:
+        """Retrieve the data payload from the data object."""
+        return self.payloads.data
+
+    # Files
+    @property
+    def files(self) -> Optional[List[tuple]]:
+        """Retrieve the files payload from the files object."""
+        return self.payloads.files
+
+    # ___  ____ _  _ ____ _  _ _ ____ ____
+    # |__] |___ |__| |__| |  | | |  | |__/
+    # |__] |___ |  | |  |  \/  | |__| |  \
+    @property
+    def behavior(self) -> RequestBehavior:
+        """Return the RequestBehavior object."""
+        return self._behavior
+
+    @property
+    def expand_result(self) -> bool:
+        """Return a boolean indicator if result expansion is requested."""
+        return self.behavior.expand_result
+
+    @property
+    def container(self) -> bool:
+        """Return a boolean indicating if this is a container API request."""
+        return self.behavior.container
+
+    @property
+    def authenticating(self) -> bool:
+        """Return a boolean indicating if this is an authentication request."""
+        return self.behavior.authenticating
+
+    @property
+    def perform(self) -> bool:
+        """Return the perform boolean."""
+        return self.behavior.perform
+
+    @perform.setter
+    def perform(self, value: bool):
+        """Set the perform boolean (this request has passed validation)."""
+        self.behavior.perform = value
+
+    @property
+    def body_validator(self) -> Optional[Dict[str, Any]]:
+        """Return the body payload validator from the behavior object."""
+        return self.behavior.body_validator
+
+    @property
+    def body_required(self) -> Optional[List[str]]:
+        """Return the body required list from the behavior object."""
+        return self.behavior.body_required
+
+    # _    ____ ____    \ /
+    # |    |  | | __     |
+    # |___ |__| |__]    /o\
+    @property
+    def request_log(self) -> LogFacility:
+        """Return the LogFacility object."""
+        return self._request_log
+
+    @property
+    def log_util(self) -> Optional[Logger]:
+        """Return the Logger from the request log object."""
+        return self.request_log.log
+
+    @property
+    def max_debug(self) -> int:
+        """Return the maximum number of records to log per debug entry setting."""
+        return self.request_log.debug_record_count
+
+    @property
+    def sanitize_log(self) -> bool:
+        """Return the sanitize logs setting."""
+        return self.request_log.sanitize_log
+
+    # ____ ____ _  _ _  _ ____ ____ ___ _ ____ _  _
+    # |    |  | |\ | |\ | |___ |     |  | |  | |\ |
+    # |___ |__| | \| | \| |___ |___  |  | |__| | \|
+    @property
+    def connection(self) -> RequestConnection:
+        """Return the RequestConnection object."""
+        return self._connection
+
+    @property
+    def user_agent(self) -> Optional[str]:
+        """Return the User Agent string."""
+        return self.connection.user_agent
+
+    @property
+    def proxy(self) -> Optional[Dict[str, str]]:
+        """Return the proxy dictionary."""
+        return self.connection.proxy
+
+    @property
+    def timeout(self) -> Optional[Union[int, tuple]]:
+        """Return the timeout from the connection object.."""
+        return self.connection.timeout
+
+    @property
+    def verify(self) -> bool:
+        """Return the SSL verification setting."""
+        return self.connection.verify
diff --git a/src/falconpy/_api_request/_request_behavior.py b/src/falconpy/_api_request/_request_behavior.py
new file mode 100644
index 000000000..7a2323f67
--- /dev/null
+++ b/src/falconpy/_api_request/_request_behavior.py
@@ -0,0 +1,143 @@
+"""FalconPy Request Behavior class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Optional, Any, Dict, List
+from ._request_validator import RequestValidator
+
+
+class RequestBehavior:
+    """This class represents specified behaviors for an API request."""
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    def __init__(self,
+                 expand_result: Optional[bool] = False,
+                 container: Optional[bool] = False,
+                 authenticating: Optional[bool] = False,
+                 perform: Optional[bool] = True,
+                 body_validator: Optional[Dict[str, Any]] = None,
+                 body_required: Optional[List[str]] = None
+                 ):
+        """Construct an instance of RequestBehavior class."""
+        self._expand_result = False
+        if isinstance(expand_result, bool):
+            self._expand_result = expand_result
+
+        self._container = False
+        if isinstance(container, bool):
+            self._container = container
+
+        self._authenticating = False
+        if isinstance(authenticating, bool):
+            self._authenticating = authenticating
+
+        self._perform = True
+        if isinstance(perform, bool):
+            self._perform = perform
+
+        if isinstance(body_validator, dict) or isinstance(body_required, list):
+            self._validator = RequestValidator(validator=body_validator,
+                                               required=body_required
+                                               )
+        else:
+            self._validator = RequestValidator()
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]
+    #
+    @property
+    def expand_result(self) -> bool:
+        """Indicate if the result for this request be expanded into a tuple."""
+        return self._expand_result
+
+    @expand_result.setter
+    def expand_result(self, value: bool):
+        """Enable or disable results expansion."""
+        self._expand_result = value
+
+    @property
+    def container(self) -> bool:
+        """Indicate if this request interacts with a Falcon Container endpoint."""
+        return self._container
+
+    @container.setter
+    def container(self, value: bool):
+        """Change the container value."""
+        self._container = value
+
+    @property
+    def authenticating(self) -> bool:
+        """Indicate if this request is for authentication."""
+        return self._authenticating
+
+    @authenticating.setter
+    def authenticating(self, value: bool):
+        """Specify if this is an authenticating request."""
+        self._authenticating = value
+
+    @property
+    def perform(self) -> bool:
+        """Flag indicating if this request should be performed. (Set by the payload validation)."""
+        return self._perform
+
+    @perform.setter
+    def perform(self, value: bool):
+        """Enable or disable the perform bit."""
+        self._perform = value
+
+    @property
+    def validator(self) -> RequestValidator:
+        """Object representing the request validation performed on any provided payloads."""
+        return self._validator
+
+    @validator.setter
+    def validator(self, value: RequestValidator):
+        """Change the validator object."""
+        self._validator = value
+
+    @property
+    def body_validator(self) -> Optional[Dict[str, Any]]:
+        """Reflection into the validator object for the body payload validator."""
+        return self.validator.validator
+
+    @property
+    def body_required(self) -> Optional[List[str]]:
+        """Reflection into the validator object for the body payload required list."""
+        return self.validator.required
diff --git a/src/falconpy/_api_request/_request_connection.py b/src/falconpy/_api_request/_request_connection.py
new file mode 100644
index 000000000..9c43c7444
--- /dev/null
+++ b/src/falconpy/_api_request/_request_connection.py
@@ -0,0 +1,129 @@
+"""FalconPy Request Connection class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Optional, Dict, Union
+
+
+class RequestConnection:
+    """This class represents connection details related to an API request."""
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    def __init__(self,
+                 user_agent: Optional[str] = None,
+                 proxy: Optional[Dict[str, str]] = None,
+                 timeout: Optional[Union[int, tuple]] = None,
+                 verify: Optional[bool] = True
+                 ):
+        """Construct an instance of RequestConnection class."""
+        self._user_agent: Optional[str] = user_agent
+        self._proxy: Optional[Dict[str, str]] = proxy
+        self._timeout: Optional[Union[int, tuple]] = timeout
+
+        self._verify = True
+        if isinstance(verify, bool):
+            self.verify: bool = verify
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]
+    #
+    @property
+    def user_agent(self) -> Optional[str]:
+        """User agent string to be sent along with connection headers."""
+        return self._user_agent
+
+    @user_agent.setter
+    def user_agent(self, value: str):
+        """Set the user agent string."""
+        self._user_agent = value
+
+    @property
+    def proxy(self) -> Optional[Dict[str, str]]:
+        """Return the dictionary containing proxy information that is used for requests."""
+        return self._proxy
+
+    @proxy.setter
+    def proxy(self, value: Dict[str, str]):
+        """Specify a new proxy dictionary."""
+        self._proxy = value
+
+    @property
+    def timeout(self) -> Optional[Union[int, tuple]]:
+        """Timeout in seconds for the connection specified as either an integer or tuple.
+
+        Tuple format: (connect, read)
+        """
+        return self._timeout
+
+    @timeout.setter
+    def timeout(self, value: Union[int, tuple]):
+        """Specify a new timeout setting for the connection."""
+        self._timeout = value
+
+    @property
+    def verify(self) -> bool:
+        """Flag indicating if SSL verification is enabled for the connection."""
+        return self._verify
+
+    @verify.setter
+    def verify(self, value: bool):
+        """Enable or disable SSL verification for the connection."""
+        self._verify = value
+
+
+# Python 3.7+ version
+# This code will be updated to the following once Python 3.6 support is dropped.
+#
+# from dataclasses import dataclass
+# from typing import Optional, Dict, Union
+
+
+# @dataclass
+# class RequestConnection:
+#     """This class represents connection details related to an API request."""
+
+#     # ____ ___ ___ ____ _ ___  _  _ ___ ____ ____
+#     # |__|  |   |  |__/ | |__] |  |  |  |___ [__
+#     # |  |  |   |  |  \ | |__] |__|  |  |___ ___]
+#     #
+#     user_agent: Optional[str] = None
+#     verify: bool = True
+#     timeout: Optional[Union[int, tuple]] = None
+#     proxy: Optional[Dict[str, str]] = None
diff --git a/src/falconpy/_api_request/_request_meta.py b/src/falconpy/_api_request/_request_meta.py
new file mode 100644
index 000000000..1042cd9be
--- /dev/null
+++ b/src/falconpy/_api_request/_request_meta.py
@@ -0,0 +1,93 @@
+"""FalconPy Request Meta class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Dict, Union, Optional
+
+
+class RequestMeta:
+    """This class contains the relevant metadata for the API request being performed."""
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    def __init__(self,
+                 endpoint: Optional[str] = None,
+                 method: str = "GET",
+                 debug_headers: Optional[Dict[str, Optional[Union[str, int, float]]]] = None
+                 ):
+        """Construct an instance of RequestMeta class."""
+        self._endpoint: Optional[str] = endpoint
+        self._method: str = method
+
+        self._debug_headers: Optional[Dict[str, Optional[Union[str, int, float]]]] = debug_headers
+        if debug_headers is None:
+            self._debug_headers = {}
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]
+    #
+    @property
+    def endpoint(self) -> Optional[str]:
+        """Return the endpoint attribute."""
+        return self._endpoint
+
+    @endpoint.setter
+    def endpoint(self, value: Optional[str]):
+        """Set the endpoint attribute."""
+        self._endpoint = value
+
+    @property
+    def method(self) -> str:
+        """Return the method attribute."""
+        return self._method
+
+    @method.setter
+    def method(self, value: str):
+        """Set the method attribute."""
+        self._method = value
+
+    @property
+    def debug_headers(self) -> Optional[Dict[str, Optional[Union[str, int, float]]]]:
+        """Return the debug headers."""
+        return self._debug_headers
+
+    @debug_headers.setter
+    def debug_headers(self, value: Dict[str, Optional[Union[str, int, float]]]):
+        """Set the debug headers."""
+        self._debug_headers = value
diff --git a/src/falconpy/_api_request/_request_payloads.py b/src/falconpy/_api_request/_request_payloads.py
new file mode 100644
index 000000000..8b935ea74
--- /dev/null
+++ b/src/falconpy/_api_request/_request_payloads.py
@@ -0,0 +1,123 @@
+"""FalconPy Request Payloads class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Optional, Dict, List, Union
+
+
+class RequestPayloads:
+    """This class contains all of the payloads sent as part of the API request."""
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    def __init__(self,
+                 params: Optional[Dict[str, Optional[Union[str, int, float, list, dict]]]] = None,
+                 body: Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]] = None,
+                 data: Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]] = None,
+                 files: Optional[List[tuple]] = None
+                 ):
+        """Construct an instance of RequestPayloads class."""
+        self._params = params
+        self._body = body
+        self._data = data
+        self._files = files
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]
+    #
+    @property
+    def params(self) -> Optional[Dict[str, Optional[Union[str, int, float, list, dict]]]]:
+        """Return the query string parameter payload."""
+        return self._params
+
+    @params.setter
+    def params(self, value: Optional[Dict[str, Optional[Union[str, int, float, list, dict]]]]):
+        """Set the query string parameter payload."""
+        self._params = value
+
+    @property
+    def body(self) -> Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]]:
+        """Return the body payload."""
+        return self._body
+
+    @body.setter
+    def body(self, value: Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]]):
+        """Set the body payload."""
+        self._body = value
+
+    @property
+    def data(self) -> Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]]:
+        """Return the data payload."""
+        return self._data
+
+    @data.setter
+    def data(self, value: Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]]):
+        """Set the data payload."""
+        self._data = value
+
+    @property
+    def files(self) -> Optional[List[tuple]]:
+        """Return the files payload."""
+        return self._files
+
+    @files.setter
+    def files(self, value: Optional[List[tuple]]):
+        """Set the files payload."""
+        self._files = value
+
+
+# Python 3.7
+# This code will be updated to leverage dataclasses once Python 3.6 support is dropped.
+#
+# from dataclasses import dataclass
+# from typing import Optional, Dict, List, Union
+
+
+# @dataclass
+# class RequestPayloads:
+#     """This class contains all of the payloads sent as part of the API request."""
+#
+#     # ____ ___ ___ ____ _ ___  _  _ ___ ____ ____
+#     # |__|  |   |  |__/ | |__] |  |  |  |___ [__
+#     # |  |  |   |  |  \ | |__] |__|  |  |___ ___]
+#     #
+#     params: Optional[Dict[str, Optional[Union[str, int, float, list, dict]]]] = None
+#     body: Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]] = None
+#     data: Optional[Union[bytes, Dict[str, Union[str, int, dict, list, bytes]]]] = None
+#     files: Optional[List[tuple]] = None
diff --git a/src/falconpy/_api_request/_request_validator.py b/src/falconpy/_api_request/_request_validator.py
new file mode 100644
index 000000000..a87cea14d
--- /dev/null
+++ b/src/falconpy/_api_request/_request_validator.py
@@ -0,0 +1,96 @@
+"""FalconPy Request Validator class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Any, Dict, Optional, List
+
+
+class RequestValidator:
+    """This class represents a request payload validator."""
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    def __init__(self,
+                 validator: Optional[Dict[str, Any]] = None,
+                 required: Optional[List[str]] = None
+                 ):
+        """Construct an instance of RequestValidator class."""
+        self._validator: Optional[Dict[str, Any]] = validator
+        self._required: Optional[List[str]] = required
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]
+    #
+    @property
+    def validator(self) -> Optional[Dict[str, Any]]:
+        """Return the validator dictionary."""
+        return self._validator
+
+    @validator.setter
+    def validator(self, value: Optional[Dict[str, Any]]):
+        """Set the validator dictionary."""
+        self._validator = value
+
+    @property
+    def required(self) -> Optional[List[str]]:
+        """Return the required list."""
+        return self._required
+
+    @required.setter
+    def required(self, value: Optional[List[str]]):
+        """Set the required list."""
+        self._required = value
+
+# Python 3.7
+# This code will be updated to the following once Python 3.6 support is dropped.
+#
+# from dataclasses import dataclass
+# from typing import Any, Dict, Optional, List
+
+
+# @dataclass
+# class RequestValidator:
+#     """This class represents a request payload validator."""
+
+#     # ____ ___ ___ ____ _ ___  _  _ ___ ____ ____
+#     # |__|  |   |  |__/ | |__] |  |  |  |___ [__
+#     # |  |  |   |  |  \ | |__] |__|  |  |___ ___]
+#     #
+#     validator: Optional[Dict[str, Any]] = None
+#     required: Optional[List[str]] = None
diff --git a/src/falconpy/_auth_object/__init__.py b/src/falconpy/_auth_object/__init__.py
new file mode 100644
index 000000000..4a7c22dc4
--- /dev/null
+++ b/src/falconpy/_auth_object/__init__.py
@@ -0,0 +1,46 @@
+"""FalconPy API Interface module.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from ._base_falcon_auth import BaseFalconAuth
+from ._falcon_interface import FalconInterface
+from ._uber_interface import UberInterface
+from ._bearer_token import BearerToken
+from ._interface_config import InterfaceConfiguration
+
+__all__ = ["BaseFalconAuth", "FalconInterface", "UberInterface",
+           "BearerToken", "InterfaceConfiguration"
+           ]
diff --git a/src/falconpy/_auth_object/_base_falcon_auth.py b/src/falconpy/_auth_object/_base_falcon_auth.py
new file mode 100644
index 000000000..f90da8aef
--- /dev/null
+++ b/src/falconpy/_auth_object/_base_falcon_auth.py
@@ -0,0 +1,97 @@
+"""Authentication Object base class.
+
+This file contains the definition of the base class that provides the
+necessary functions to authenticate to the CrowdStrike Falcon OAuth2 API.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from abc import ABC, abstractmethod
+from typing import Dict, Union
+
+
+class BaseFalconAuth(ABC):
+    """Abstract class that provides a skeleton interface for the CrowdStrike Falcon OAuth2 API.
+
+    This class does not implement a generic constructor and is not intended to be used by
+    developers directly. In order to leverage the functionality provided by the authorization
+    object, you should work with a derivative of this class, such as a FalconAuth class.
+    """
+
+    #  ______  _______ _______ _______ _     _        _______
+    #  |     \ |______ |______ |_____| |     | |         |
+    #  |_____/ |______ |       |     | |_____| |_____    |
+    #
+    #  _______ _______ _______ _     _  _____  ______  _______
+    #  |  |  | |______    |    |_____| |     | |     \ |______
+    #  |  |  | |______    |    |     | |_____| |_____/ ______|
+    #
+    # The generic login and logout handlers must be individually defined by all
+    # inheriting classes. The private methods defined here are used to allow for
+    # easy overriding of login and logout processing by inheriting classes without
+    # altering the parent handler method that may be leveraged by other inheriting
+    # class types.
+    @abstractmethod
+    def login(self) -> Union[dict, bool]:
+        """Login handler generic abstract."""
+
+    @abstractmethod
+    def logout(self) -> Union[dict, bool]:
+        """Logout handler generic abstract."""
+
+    #   _____   ______  _____   _____  _______  ______ _______ _____ _______ _______
+    #  |_____] |_____/ |     | |_____] |______ |_____/    |      |   |______ |______
+    #  |       |    \_ |_____| |       |______ |    \_    |    __|__ |______ ______|
+    #
+    # These properties are present within all BaseFalconAuth derivatives.
+    @property
+    @abstractmethod
+    def auth_headers(self) -> Dict[str, str]:
+        """Get a dictionary of headers that can authenticate a HTTP request."""
+
+    @property
+    @abstractmethod
+    def authenticated(self) -> bool:
+        """Read-only property to return whether authentication is successful."""
+
+    @property
+    @abstractmethod
+    def token_expired(self) -> bool:
+        """Read-only property that returns the current token expiration status."""
+
+    @property
+    @abstractmethod
+    def cred_format_valid(self) -> bool:
+        """Read-only property that returns a boolean if the creds dictionary format is valid."""
diff --git a/src/falconpy/_auth_object/_bearer_token.py b/src/falconpy/_auth_object/_bearer_token.py
new file mode 100644
index 000000000..ca87591a1
--- /dev/null
+++ b/src/falconpy/_auth_object/_bearer_token.py
@@ -0,0 +1,158 @@
+"""Bearer Token class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+import time
+from typing import Optional
+from .._constant import MIN_TOKEN_RENEW_WINDOW, MAX_TOKEN_RENEW_WINDOW
+
+
+class BearerToken:
+    """This class represents a bearer token received from the API."""
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    # Tokens can be instantiated without a value (e.g. invalid or expired).
+    def __init__(self,
+                 token_value: Optional[str] = None,
+                 expiration: Optional[int] = 0,
+                 status: Optional[int] = None
+                 ):
+        """Create an instance of the BearerToken class."""
+        self._value = token_value
+
+        # String containing the error message received from the API when token generation failed.
+        self._fail_reason: Optional[str] = None
+        # Number of seconds between token expiration and now before a token is considered stale.
+        self._renew_window: int = 120
+
+        # Integer specifying the amount of time remaining before the token expires (in seconds).
+        self._expiration: int = 0
+        if isinstance(expiration, int):
+            self._expiration = expiration
+
+        # Integer representing the HTTP status code received when generating the token.
+        self._status: Optional[int] = None
+        if isinstance(status, int):
+            self._status = status
+
+        # Float indicating the moment in time that the token was generated (timestamp).
+        self._token_time: float = 0
+        if token_value:
+            self._token_time = time.time()
+
+    # _  _ ____ ___ _  _ ____ ___  ____
+    # |\/| |___  |  |__| |  | |  \ [__
+    # |  | |___  |  |  | |__| |__/ ___]
+    #
+    def fail_token(self, status_code: Optional[int] = None, reason: Optional[str] = None):
+        """Fail the token by clearing the token value and setting the expiration to zero."""
+        self.expiration = 0
+        self.value = None
+        self.status = 403
+        if status_code:
+            if isinstance(status_code, int):
+                self.status = status_code
+        if reason:
+            self.fail_reason = reason
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____    ---     __o
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__      ---  _`\<,_
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]    ---  (*)/ (*)
+    #
+    # These properties are present and mutable within all FalconInterface derivatives.
+    @property
+    def expiration(self) -> int:
+        """Return the current expiration setting."""
+        return self._expiration
+
+    @expiration.setter
+    def expiration(self, value: int):
+        """Set the current token expiration."""
+        self._expiration = value
+
+    @property
+    def token_time(self) -> float:
+        """Return the current token_time setting."""
+        return self._token_time
+
+    @token_time.setter
+    def token_time(self, value: float):
+        """Change the token time."""
+        self._token_time = value
+
+    @property
+    def fail_reason(self) -> Optional[str]:
+        """Return the current fail_reason setting."""
+        return self._fail_reason
+
+    @fail_reason.setter
+    def fail_reason(self, value: Optional[str]):
+        """Update the token failure reason."""
+        self._fail_reason = value
+
+    @property
+    def status(self) -> Optional[int]:
+        """Return the current status setting."""
+        return self._status
+
+    @status.setter
+    def status(self, value: Optional[int]):
+        """Update the token status code."""
+        self._status = value
+
+    @property
+    def value(self) -> Optional[str]:
+        """Return the current value setting."""
+        return self._value
+
+    @value.setter
+    def value(self, value: str):
+        """Change the token value."""
+        self._value = value
+
+    @property
+    def renew_window(self) -> int:
+        """Return the current renew_window setting."""
+        return self._renew_window
+
+    @renew_window.setter
+    def renew_window(self, value: int):
+        """Set the token renew window."""
+        _value = max(min(MAX_TOKEN_RENEW_WINDOW, value), MIN_TOKEN_RENEW_WINDOW)
+        self._renew_window = _value
diff --git a/src/falconpy/_auth_object/_falcon_interface.py b/src/falconpy/_auth_object/_falcon_interface.py
new file mode 100644
index 000000000..64dd2a963
--- /dev/null
+++ b/src/falconpy/_auth_object/_falcon_interface.py
@@ -0,0 +1,510 @@
+"""API Interface base class.
+
+This file contains the definition of the standard base class that provides
+necessary functionality to authenticate to the CrowdStrike Falcon OAuth2 API.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+import time
+import os
+import warnings
+from json import loads
+try:
+    from simplejson import JSONDecodeError
+except ImportError:
+    from json.decoder import JSONDecodeError
+from logging import Logger, getLogger
+from typing import Dict, Optional, Union
+from ._base_falcon_auth import BaseFalconAuth
+from ._bearer_token import BearerToken
+from .._log import LogFacility
+from .._constant import MIN_TOKEN_RENEW_WINDOW, MAX_TOKEN_RENEW_WINDOW
+from ._interface_config import InterfaceConfiguration
+from .._enum import TokenFailReason
+from .._util import (
+    autodiscover_region,
+    perform_request,
+    log_class_startup,
+    login_payloads,
+    logout_payloads
+    )
+from .._error import InvalidCredentials, NoAuthenticationMechanism, InvalidCredentialFormat
+
+
+# pylint: disable=R0902
+class FalconInterface(BaseFalconAuth):
+    """Standard Falcon API interface used by Service Classes."""
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    # The default constructor for all authentication objects. Ingests provided credentials
+    # and sets the necessary class attributes based upon the authentication detail received.
+    # pylint: disable=R0912,R0913,R0914
+    def __init__(self,
+                 access_token: Optional[Union[str, bool]] = False,
+                 base_url: Optional[str] = "https://api.crowdstrike.com",
+                 creds: Optional[Dict[str, str]] = None,
+                 client_id: Optional[str] = None,
+                 client_secret: Optional[str] = None,
+                 member_cid: Optional[str] = None,
+                 ssl_verify: Optional[bool] = True,
+                 proxy: Optional[Dict[str, str]] = None,
+                 timeout: Optional[Union[float, tuple]] = None,
+                 user_agent: Optional[str] = None,
+                 renew_window: Optional[int] = 120,
+                 debug: Optional[bool] = False,
+                 debug_record_count: Optional[int] = None,
+                 sanitize_log: Optional[bool] = None,
+                 pythonic: Optional[bool] = False
+                 ) -> "FalconInterface":
+        """Construct an instance of the FalconInterface class."""
+        # Set the pythonic behavior mode.
+        self._pythonic: bool = False
+        if isinstance(pythonic, bool):
+            self._pythonic = pythonic
+
+        # The default credential dictionary, where the client_id and client_secret are stored.
+        self._creds = {}
+
+        # Set up an empty Bearer Token container
+        self._token: BearerToken = BearerToken()
+
+        # Setup our configuration object using the provided keywords.
+        self._config: InterfaceConfiguration = InterfaceConfiguration(base_url=base_url,
+                                                                      proxy=proxy,
+                                                                      timeout=timeout,
+                                                                      user_agent=user_agent,
+                                                                      ssl_verify=ssl_verify
+                                                                      )            # \ o /
+        # ____ _  _ ___ _  _ ____ _  _ ___ _ ____ ____ ___ _ ____ _  _                 |
+        # |__| |  |  |  |__| |___ |\ |  |  | |    |__|  |  | |  | |\ |                / \
+        # |  | |__|  |  |  | |___ | \|  |  | |___ |  |  |  | |__| | \|
+        # Direct Authentication
+        if client_id and client_secret and not creds:
+            creds = {
+                "client_id": client_id,
+                "client_secret": client_secret
+            }
+            # You must pass member_cid the same way you pass client_id / secret.
+            # If you use a creds dictionary, pass the member_cid there instead.
+            if member_cid:
+                creds["member_cid"] = member_cid
+        elif not creds:
+            creds = {}
+        # Credential Authentication (also powers Direct Authentication).
+        if isinstance(creds, str):
+            try:
+                # Try and clean up any attempts to provide the dictionary as a string
+                self._creds: Dict[str, str] = loads(creds.replace("'", "\""))
+            except (TypeError, JSONDecodeError) as bad_cred_format:
+                raise InvalidCredentialFormat from bad_cred_format
+        elif isinstance(creds, dict):
+            self._creds: Dict[str, str] = creds
+        else:
+            raise InvalidCredentialFormat
+
+        # Legacy (Token) Authentication (fallback)
+        if access_token:
+            # Store this non-refreshable token, assuming it was just generated.
+            self._token: BearerToken = BearerToken(access_token, 1799, 201)
+
+        # Set the token renewal window, ignored when using Legacy Authentication.
+        self.renew_window: int = max(min(renew_window, MAX_TOKEN_RENEW_WINDOW),
+                                     MIN_TOKEN_RENEW_WINDOW
+                                     )
+
+        # Environment Authentication
+        # When credentials are not provided, attempt to retrieve them from the environment.
+        if not self.cred_format_valid and not self.token_value:
+            # Both variables must be present within the running environment.
+            if os.getenv("FALCON_CLIENT_ID") and os.getenv("FALCON_CLIENT_SECRET"):
+                api_id = os.getenv("FALCON_CLIENT_ID") if "client_id" not in self.creds else self.creds["client_id"]
+                if "client_secret" not in self.creds:
+                    api_sec = os.getenv("FALCON_CLIENT_SECRET")
+                else:
+                    api_sec = self.creds["client_secret"]
+                # Environment Authentication will not override values that preexist in the creds dictionary.
+                self._creds = {
+                    "client_id": api_id,
+                    "client_secret": api_sec
+                }
+
+        # Log the creation of this object if debugging is enabled.
+        # Starting with v1.3.0 minimal Python native logging is available. In order to reduce
+        # potential impacts to developer configurations, this facility is extremely limited
+        # and not implemented by default. (Meaning logs are not generated.)
+        # To enable logging, pass the keyword "debug" with a value of True to the constructor.
+        if debug:
+            # Ignored when debugging is disabled.
+            _debug_record_count: int = debug_record_count if debug_record_count else None
+            # Allow log sanitization to be overridden.
+            _sanitize = sanitize_log if isinstance(sanitize_log, bool) else None
+            # Logging facility for all classes using this interface, defaults to disabled.
+            self._log: LogFacility = LogFacility(getLogger(__name__),
+                                                 _debug_record_count,
+                                                 _sanitize
+                                                 )
+            # Log the startup of this class.
+            log_class_startup(self, self.log)
+        else:
+            # Set up an empty log facility
+            self._log: LogFacility = LogFacility()
+
+        try:
+            if not self.cred_format_valid and not self.token_value:
+                raise NoAuthenticationMechanism
+        except NoAuthenticationMechanism as no_auth_mechanism:
+            if pythonic:
+                warnings.warn(no_auth_mechanism.message, NoAuthenticationMechanism, stacklevel=2)
+            if self.log:
+                self.log.warning(no_auth_mechanism.message)
+
+    # _  _ ____ ___ _  _ ____ ___  ____
+    # |\/| |___  |  |__| |  | |  \ [__
+    # |  | |___  |  |  | |__| |__/ ___]
+    #
+    # The generic login and logout handlers are provided here and leverage private methods
+    # to perform the operation. These private methods can be overridden to provide individual
+    # login and logout functionality to different inheriting class types.
+    def login(self) -> dict or bool:
+        """Login to the Falcon API by requesting a new token."""
+        return self._login_handler()
+
+    def logout(self) -> dict or bool:
+        """Log out of the Falcon API by revoking the current token."""
+        return self._logout_handler()
+
+    # The default behavior for both the login and logout handlers is to return
+    # the entire dictionary created by the token API response.
+    def _login_handler(self, stateful: bool = True) -> dict:
+        """Login by requesting a new token.
+
+        This method can also be leveraged to generate tokens without impacting authorization state.
+        """
+        _returned_headers = {}
+        try:
+            if self.cred_format_valid:
+                operation, target_url, data_payload = login_payloads(self.creds, self.base_url)
+                # Log the call to this operation if debugging is enabled.
+                if self.log:
+                    self.log.debug("OPERATION: %s", operation)
+                returned = perform_request(method="POST", endpoint=target_url, data=data_payload,
+                                           headers={}, verify=self.ssl_verify, proxy=self.proxy,
+                                           timeout=self.timeout, user_agent=self.user_agent,
+                                           log_util=self.log, authenticating=True,
+                                           sanitize=self.sanitize_log
+                                           )
+                _returned_headers = returned["headers"]
+                if stateful:
+                    self.token_status = returned["status_code"]
+                    if self.token_status == 201:
+                        # Token generation was successful.
+                        self.bearer_token = BearerToken(token_value=returned["body"]["access_token"],
+                                                        expiration=returned["body"]["expires_in"],
+                                                        status=201
+                                                        )
+                        # Cloud Region auto discovery.
+                        self.base_url = autodiscover_region(self.base_url, returned)
+                    else:
+                        # Token generation failure, reset the current token and check for an error response.
+                        self.bearer_token = BearerToken(status=returned["status_code"])
+                        # Retrieve the list of errors, there should only be one item in the list.
+                        error_list = returned["body"].get("errors", [])
+                        if error_list:
+                            self.bearer_token.fail_token(returned["status_code"],
+                                                         error_list[0]["message"]
+                                                         )
+            else:
+                if stateful:
+                    self.bearer_token.fail_token(403, TokenFailReason["INVALID"])
+                raise InvalidCredentials(headers=_returned_headers)
+
+        except InvalidCredentials as bad_creds:
+            returned = bad_creds.result
+            if self.log:
+                self.log.error(bad_creds.message)
+
+        return returned
+
+    def _logout_handler(self, token_value: str = None, stateful: bool = True, client_id: str = None) -> dict:
+        """Log out by revoking the current token.
+
+        This method can also be leveraged to revoke other tokens.
+        """
+        try:
+            if self.cred_format_valid:
+                if not token_value:
+                    token_value = self.token_value
+                operation, target_url, data_payload, header_payload = logout_payloads(
+                    creds=self.creds,
+                    base=self.base_url,
+                    token_val=token_value,
+                    client_id=client_id
+                    )
+                # Log the call to this operation if debugging is enabled.
+                if self.log:
+                    self.log.debug("OPERATION: %s", operation)
+                returned = perform_request(method="POST", endpoint=target_url, data=data_payload,
+                                           headers=header_payload, verify=self.ssl_verify,
+                                           proxy=self.proxy, timeout=self.timeout,
+                                           user_agent=self.user_agent, log_util=self.log,
+                                           sanitize=self.sanitize_log
+                                           )
+                if stateful:
+                    self.bearer_token: BearerToken = BearerToken()
+            else:
+                raise InvalidCredentials
+        except InvalidCredentials as bad_creds:
+            returned = bad_creds.result
+            if self.log:
+                self.log.error(bad_creds.message)
+
+        return returned
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]
+    #
+    # These properties are present in all FalconInterface derivatives.
+    @property
+    def creds(self) -> Dict[str, str]:
+        """Return the current credential dictionary."""
+        return self._creds
+
+    @creds.setter
+    def creds(self, value: Dict[str, str]):
+        self._creds = value
+
+    @property
+    def config(self) -> InterfaceConfiguration:
+        """Return the interface configuration object for this interface."""
+        return self._config
+
+    @config.setter
+    def config(self, value: InterfaceConfiguration):
+        if not isinstance(value, InterfaceConfiguration):
+            raise ValueError
+        self._config = value
+
+    @property
+    def base_url(self) -> str:
+        """Return the base URL for this interface from the configuration object."""
+        return self._config.base_url
+
+    @base_url.setter
+    def base_url(self, value):
+        self._config.base_url = value
+
+    @property
+    def ssl_verify(self) -> bool:
+        """Return the SSL verification setting from the configuration object."""
+        return self._config.ssl_verify
+
+    @ssl_verify.setter
+    def ssl_verify(self, value: bool):
+        self._config.ssl_verify = value
+
+    @property
+    def proxy(self) -> Dict[str, str]:
+        """Return the current proxy setting."""
+        return self._config.proxy
+
+    @proxy.setter
+    def proxy(self, value: Dict[str, str]):
+        self._config.proxy = value
+
+    @property
+    def user_agent(self) -> str:
+        """Return the current user agent setting."""
+        return self._config.user_agent
+
+    @user_agent.setter
+    def user_agent(self, value: str):
+        self._config.user_agent = value
+
+    @property
+    def timeout(self) -> Union[int, tuple]:
+        """Return the current timeout setting."""
+        return self._config.timeout
+
+    @timeout.setter
+    def timeout(self, value: Union[int, tuple]):
+        self._config.timeout = value
+
+    @property
+    def debug_record_count(self) -> int:
+        """Return the current debug record count setting."""
+        return self.log_facility.debug_record_count
+
+    @debug_record_count.setter
+    def debug_record_count(self, value: int):
+        self.log_facility.debug_record_count = value
+
+    @property
+    def sanitize_log(self) -> bool:
+        """Return the current log sanitization."""
+        return self.log_facility.sanitize_log
+
+    @sanitize_log.setter
+    def sanitize_log(self, value):
+        self.log_facility.sanitize_log = value
+
+    # These properties provide reflection into the token object
+    @property
+    def bearer_token(self) -> BearerToken:
+        """Return the bearer token object for this configuration."""
+        return self._token
+
+    @bearer_token.setter
+    def bearer_token(self, value: BearerToken):
+        """Set the bearer token."""
+        self._token = value
+
+    @property
+    def renew_window(self) -> int:
+        """Return the current token renew window setting."""
+        return self.bearer_token.renew_window
+
+    @renew_window.setter
+    def renew_window(self, value: int):
+        self.bearer_token.renew_window = value
+
+    @property
+    def token_expiration(self) -> int:
+        """Return the current expiration setting."""
+        return self.bearer_token.expiration
+
+    @token_expiration.setter
+    def token_expiration(self, value: int):
+        self.bearer_token.expiration = value
+
+    @property
+    def token_time(self) -> float:
+        """Return the current token_time setting."""
+        return self.bearer_token.token_time
+
+    @token_time.setter
+    def token_time(self, value: float):
+        self.bearer_token.token_time = value
+
+    @property
+    def token_fail_reason(self) -> str:
+        """Return the current fail_reason setting."""
+        return self.bearer_token.fail_reason
+
+    @token_fail_reason.setter
+    def token_fail_reason(self, value: str):
+        self.bearer_token.fail_reason = value
+
+    @property
+    def token_status(self) -> int:
+        """Return the current status setting."""
+        return self.bearer_token.status
+
+    @token_status.setter
+    def token_status(self, value: int):
+        self.bearer_token.status = value
+
+    @property
+    def token_value(self) -> str:
+        """Return the current value setting."""
+        return self.bearer_token.value
+
+    @token_value.setter
+    def token_value(self, value: str):
+        self.bearer_token.value = value
+
+    # All properties defined here are by design IMMUTABLE.
+    @property
+    def refreshable(self) -> bool:
+        """Return a boolean if this interface can automatically refresh tokens when they expire."""
+        return self.cred_format_valid
+
+    @property
+    def token_expired(self) -> bool:
+        """Return whether the token is ready to be renewed."""
+        return (time.time() - self.token_time) >= (self.token_expiration - self.renew_window)
+
+    @property
+    def authenticated(self) -> bool:
+        """Return if we are authenticated by retrieving the inverse of token_expired."""
+        return not self.token_expired
+
+    @property
+    def cred_format_valid(self) -> bool:
+        """Return a boolean that the creds dictionary is valid."""
+        _returned = False
+        if "client_id" in self.creds and "client_secret" in self.creds:
+            if isinstance(self.creds["client_id"], str) and isinstance(self.creds["client_secret"], str):
+                _returned = True
+        return _returned
+
+    @property
+    def log(self) -> Logger:
+        """Return the logger from our log facility."""
+        return self.log_facility.log
+
+    @property
+    def log_facility(self) -> LogFacility:
+        """Return the entire log facility."""
+        return self._log
+
+    # The default functionality of a FalconInterface object performs a token refresh
+    # whenever a request is made for the auth_headers property and the token is stale.
+    @property
+    def auth_headers(self) -> Dict[str, str]:
+        """Return a Bearer token baked into an Authorization header ready for an HTTP request."""
+        if self.token_expired and self.refreshable:
+            self.login()
+
+        return {"Authorization": f"Bearer {self.token_value}"}
+
+    @property
+    def debug(self) -> bool:
+        """Return a boolean if we are in a debug mode."""
+        return bool(self.log)
+
+    @property
+    def pythonic(self) -> bool:
+        """Return a boolean if we are in a pythonic mode."""
+        return self._pythonic
+
+    @pythonic.setter
+    def pythonic(self, value: bool):
+        """Enable or disable pythonic mode."""
+        self._pythonic = value
diff --git a/src/falconpy/_auth_object/_interface_config.py b/src/falconpy/_auth_object/_interface_config.py
new file mode 100644
index 000000000..02d409ed4
--- /dev/null
+++ b/src/falconpy/_auth_object/_interface_config.py
@@ -0,0 +1,117 @@
+"""Interface Configuration class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Dict, Union, Optional
+
+
+class InterfaceConfiguration:
+    """This class represents the configuration of the interface."""
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    def __init__(self,
+                 base_url: Optional[str] = None,
+                 proxy: Optional[Dict[str, str]] = None,
+                 timeout: Optional[Union[int, tuple]] = None,
+                 user_agent: Optional[str] = None,
+                 ssl_verify: Optional[bool] = True
+                 ):
+        """Construct an instance of the InterfaceConfiguration class."""
+        self._base_url: Optional[str] = base_url
+        self._proxy: Optional[Dict[str, str]] = proxy
+        self._timeout: Optional[Union[int, tuple]] = timeout
+        self._user_agent: Optional[str] = user_agent
+
+        self._ssl_verify: bool = True
+        if isinstance(ssl_verify, bool):
+            self._ssl_verify = ssl_verify
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]
+    #
+    @property
+    def base_url(self) -> str:
+        """Return the base URL."""
+        return self._base_url
+
+    @base_url.setter
+    def base_url(self, value: str):
+        """Change the base URL."""
+        self._base_url = value
+
+    @property
+    def proxy(self) -> Optional[Dict[str, str]]:
+        """Return the proxy."""
+        return self._proxy
+
+    @proxy.setter
+    def proxy(self, value: Optional[Dict[str, str]] = None):
+        """Update or replace the proxy dictionary."""
+        self._proxy = value
+
+    @property
+    def timeout(self) -> Union[int, tuple]:
+        """Return the timeout."""
+        return self._timeout
+
+    @timeout.setter
+    def timeout(self, value: Union[int, tuple]):
+        """Update or change the timeout."""
+        self._timeout = value
+
+    @property
+    def user_agent(self) -> str:
+        """Return the user agent string."""
+        return self._user_agent
+
+    @user_agent.setter
+    def user_agent(self, value: Optional[str] = None):
+        """Alter the user agent string."""
+        self._user_agent = value
+
+    @property
+    def ssl_verify(self) -> bool:
+        """Return the SSL verification setting."""
+        return self._ssl_verify
+
+    @ssl_verify.setter
+    def ssl_verify(self, value: bool):
+        """Change the SSL verification setting."""
+        self._ssl_verify = value
diff --git a/src/falconpy/_auth_object/_uber_interface.py b/src/falconpy/_auth_object/_uber_interface.py
new file mode 100644
index 000000000..9e78ded88
--- /dev/null
+++ b/src/falconpy/_auth_object/_uber_interface.py
@@ -0,0 +1,221 @@
+"""Uber Interface class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Dict, List, Optional, Union
+from ._falcon_interface import FalconInterface
+from .._constant import MAX_DEBUG_RECORDS
+from .._endpoint import api_endpoints
+from .._util import confirm_base_url
+
+
+class UberInterface(FalconInterface):
+    """Uber Class specific interface."""
+
+    # ____ ___ ___ ____ _ ___  _  _ ___ ____ ____
+    # |__|  |   |  |__/ | |__] |  |  |  |___ [__
+    # |  |  |   |  |  \ | |__] |__|  |  |___ ___]
+    #
+    # Attributes present only within the Uber Class.
+    #
+    # A dictionary of every available API operation provided by the library.
+    commands: List[List[Union[str, bool, int, List[dict]]]] = []
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    # Starting in v1.3.0, the Uber Class constructs itself leveraging the generic
+    # FalconAuth constructor. This results in the Uber Class benefiting from a new
+    # authentication style; Legacy / Token authentication.
+    # pylint: disable=R0913
+    def __init__(self,
+                 access_token: Optional[Union[str, bool]] = False,
+                 base_url: Optional[str] = "https://api.crowdstrike.com",
+                 creds: Optional[dict] = None,
+                 client_id: Optional[str] = None,
+                 client_secret: Optional[str] = None,
+                 member_cid: Optional[str] = None,
+                 ssl_verify: Optional[bool] = True,
+                 proxy: Optional[dict] = None,
+                 timeout: Optional[Union[float, tuple]] = None,
+                 user_agent: Optional[str] = None,
+                 renew_window: Optional[int] = 120,
+                 debug: Optional[bool] = False,
+                 debug_record_count: Optional[int] = MAX_DEBUG_RECORDS,
+                 sanitize_log: Optional[bool] = None,
+                 pythonic: Optional[bool] = None
+                 ):
+        """Construct an instance of the UberInterface class.
+
+        Instantiates an instance of the class, ingests credentials,
+        the base URL and the SSL verification boolean.
+        Afterwards class attributes are initialized.
+
+        Keyword arguments:
+        base_url: CrowdStrike API URL to use for requests. [Default: US-1]
+        ssl_verify: Boolean specifying if SSL verification should be used. [Default: True]
+        proxy: Dictionary of proxies to be used for requests.
+        timeout: Float or tuple specifying timeouts to use for requests.
+        creds: Dictionary containing CrowdStrike API credentials.
+               Mutually exclusive to client_id / client_secret.
+               {
+                   "client_id": "CLIENT_ID_HERE",
+                   "client_secret": "CLIENT_SECRET_HERE",
+                   "member_cid": "CHILD_CID_MSSP_ONLY"
+               }
+        client_id: Client ID for the CrowdStrike API. Mutually exclusive to creds.
+        client_secret: Client Secret for the CrowdStrike API. Mutually exclusive to creds.
+        member_cid: Child CID to connect to. (MSSP only) Mutually exclusive to creds.
+        user_agent: User-Agent string to use for all requests made to the CrowdStrike API.
+                    String. Defaults to crowdstrike-falconpy/VERSION.
+        renew_window: Amount of time (in seconds) between now and the token expiration before
+                      a refresh of the token is performed. Default: 120, Max: 1200
+                      Values over 1200 will be reset to the maximum.
+        debug: Enables debugging. Boolean.
+        debug_record_count: Maximum number of returned records to write to log files. Integer
+                            Max: 5000
+        sanitize_log: Enable / Disable log sanitization of client IDs, secrets and tokens.
+                      Boolean. Defaults to enabled.
+        This method only accepts keywords to specify arguments.
+        """
+        super().__init__(base_url=confirm_base_url(base_url),
+                         ssl_verify=ssl_verify,
+                         timeout=timeout,
+                         proxy=proxy,
+                         user_agent=user_agent,
+                         access_token=access_token,
+                         creds=creds,
+                         client_id=client_id,
+                         client_secret=client_secret,
+                         member_cid=member_cid,
+                         renew_window=renew_window,
+                         debug=debug,
+                         debug_record_count=debug_record_count,
+                         sanitize_log=sanitize_log,
+                         pythonic=pythonic
+                         )
+
+        # Complete list of available API operations.
+        self.commands = api_endpoints
+
+    # _  _ ____ ___ _  _ ____ ___  ____
+    # |\/| |___  |  |__| |  | |  \ [__
+    # |  | |___  |  |  | |__| |__/ ___]
+    #
+    # Override the default login and logout handlers to
+    # provide Uber Class-specific functionality.
+    def login(self) -> bool:
+        """Generate an authorization token."""
+        super().login()
+
+        return self.authenticated
+
+    def logout(self) -> bool:
+        """Revoke the current authorization token."""
+        result = super().logout()
+
+        return bool(result["status_code"] == 200)
+
+    # _    ____ ____ ____ ____ _   _    _  _ ____ _  _ ___  _    ____ ____ ____
+    # |    |___ | __ |__| |     \_/     |__| |__| |\ | |  \ |    |___ |__/ [__
+    # |___ |___ |__] |  | |___   |      |  | |  | | \| |__/ |___ |___ |  \ ___]
+    #
+    # These handlers provide legacy Uber Class-specific functionality that will be
+    # maintained for provide backwards compatibility purposes.
+    def authenticate(self) -> bool:
+        """Legacy Uber Class functionality handler.
+
+        DEPRECATED
+        ----
+        Consider updating your code to leverage the login method.
+        """
+        return self.login()
+
+    def deauthenticate(self) -> bool:
+        """Legacy Uber Class functionality handler.
+
+        DEPRECATED
+        ----
+        Consider updating your code to leverage the logout method.
+        """
+        return self.logout()
+
+    def valid_cred_format(self) -> bool:
+        """Legacy property to confirm credential dictionary format.
+
+        DEPRECATED
+        ----
+        Consider updating your code to leverage the cred_format_valid property.
+        """
+        return self.cred_format_valid
+
+    def headers(self) -> Dict[str, str]:
+        """Legacy property getter for the current authorization headers.
+
+        DEPRECATED
+        ----
+        Consider updating your code to leverage the auth_headers property.
+        """
+        return self.auth_headers
+
+    @property
+    def token_renew_window(self) -> int:
+        """Return the current renew window from the auth_object.
+
+        DEPRECATED: This property recreates a legacy attribute.
+        Developers should update code to make use of the `renew_window` property.
+        """
+        return self.renew_window
+
+    @token_renew_window.setter
+    def token_renew_window(self, value: int):
+        """Allow the renew_window to be changed.
+
+        DEPRECATED: This property recreates a legacy attribute.
+        Developers should update code to make use of the `renew_window` property.
+        """
+        self.renew_window = value
+
+    @property
+    def token(self) -> str:
+        """Legacy attribute handler to return the token string.
+
+        DEPRECATED
+        ----
+        Consider updating your code to leverage the token_value property.
+        """
+        return self.token_value
diff --git a/src/falconpy/_constant/__init__.py b/src/falconpy/_constant/__init__.py
new file mode 100644
index 000000000..a8bf1e5cb
--- /dev/null
+++ b/src/falconpy/_constant/__init__.py
@@ -0,0 +1,64 @@
+"""FalconPy constant module.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import List
+from .._version import version
+PREFER_NONETYPE: List[str] = [
+    "report_executions_download_get", "report_executions_download.get",
+    "RTR_ListFiles", "RTR_ListFilesV2", "RTR_GetExtractedFileContents",
+    "RTR_DeleteSession"
+]
+PREFER_IDS_IN_BODY: List[str] = [
+    "GetDeviceDetails", "PostDeviceDetailsV2", "GetVulnerabilities", "GetIntelIndicatorEntities",
+    "getChildrenV2", "cancel-scans", "GetDetectSummaries", "UpdateQuarantinedDetectsByIds",
+    "GetQuarantineFiles", "PostEntitiesAlertsV1"
+]
+MOCK_OPERATIONS: List[str] = [
+    "GetImageAssessmentReport", "DeleteImageDetails", "ImageMatchesPolicy"
+]
+# Restrict requests to only allowed HTTP methods
+ALLOWED_METHODS: List[str] = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'UPDATE']
+# Default user-agent string
+USER_AGENT: str = version(agent_string=True)
+# Default maximum number of records to write to debug logs (when active)
+MAX_DEBUG_RECORDS: int = 100
+# Global maximum number of records returned from any endpoint across all service collections
+GLOBAL_API_MAX_RETURN: int = 5000
+# Largest available token renew window (in seconds).
+MAX_TOKEN_RENEW_WINDOW: int = 1200
+# Minimum available token renew window (in seconds).
+MIN_TOKEN_RENEW_WINDOW: int = 120
diff --git a/src/falconpy/_endpoint/__init__.py b/src/falconpy/_endpoint/__init__.py
index 145adf231..490435ac4 100644
--- a/src/falconpy/_endpoint/__init__.py
+++ b/src/falconpy/_endpoint/__init__.py
@@ -19,6 +19,7 @@
                                                         |::.|     CrowdStrike Falcon      |::.|
                                                         `---' OAuth2 API SDK for Python 3 `---'
 """
+from typing import List, Any
 from .deprecated import _custom_ioa_deprecated
 from .deprecated import _d4c_registration_deprecated
 from .deprecated import _discover_deprecated
@@ -88,7 +89,7 @@
 from ._user_management import _user_management_endpoints
 from ._zero_trust_assessment import _zero_trust_assessment_endpoints
 
-api_endpoints = []
+api_endpoints: List[Any] = []
 api_endpoints.extend(_alerts_endpoints)
 api_endpoints.extend(_cloud_connect_aws_endpoints)
 api_endpoints.extend(_cspm_registration_endpoints)
diff --git a/src/falconpy/_enum/__init__.py b/src/falconpy/_enum/__init__.py
new file mode 100644
index 000000000..6f1418fd3
--- /dev/null
+++ b/src/falconpy/_enum/__init__.py
@@ -0,0 +1,43 @@
+"""FalconPy enum module.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from ._base_url import BaseURL
+from ._container_base_url import ContainerBaseURL
+from ._token_fail_reason import TokenFailReason
+
+
+__all__ = ["BaseURL", "ContainerBaseURL", "TokenFailReason"]
diff --git a/src/falconpy/_base_url.py b/src/falconpy/_enum/_base_url.py
similarity index 100%
rename from src/falconpy/_base_url.py
rename to src/falconpy/_enum/_base_url.py
diff --git a/src/falconpy/_container_base_url.py b/src/falconpy/_enum/_container_base_url.py
similarity index 100%
rename from src/falconpy/_container_base_url.py
rename to src/falconpy/_enum/_container_base_url.py
diff --git a/src/falconpy/_token_fail_reason.py b/src/falconpy/_enum/_token_fail_reason.py
similarity index 100%
rename from src/falconpy/_token_fail_reason.py
rename to src/falconpy/_enum/_token_fail_reason.py
diff --git a/src/falconpy/_error/__init__.py b/src/falconpy/_error/__init__.py
new file mode 100644
index 000000000..2db166ca6
--- /dev/null
+++ b/src/falconpy/_error/__init__.py
@@ -0,0 +1,69 @@
+"""FalconPy error module.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from ._exceptions import (
+    SDKError,
+    RegionSelectError,
+    InvalidMethod,
+    InvalidOperation,
+    TokenNotSpecified,
+    KeywordsOnly,
+    InvalidCredentials,
+    APIError,
+    CannotRevokeToken,
+    FunctionalityNotImplemented,
+    InvalidBaseURL,
+    PayloadValidationError,
+    FeatureNotSupportedByPythonVersion,
+    InvalidIndex,
+    InvalidCredentialFormat
+    )
+from ._warnings import (
+    SDKWarning,
+    SSLDisabledWarning,
+    NoContentWarning,
+    NoAuthenticationMechanism
+)
+
+
+__all__ = ["SDKError", "RegionSelectError", "InvalidMethod", "InvalidOperation",
+           "TokenNotSpecified", "KeywordsOnly", "SDKWarning", "SSLDisabledWarning",
+           "InvalidCredentials", "APIError", "NoContentWarning", "CannotRevokeToken",
+           "FunctionalityNotImplemented", "InvalidBaseURL", "PayloadValidationError",
+           "NoAuthenticationMechanism", "FeatureNotSupportedByPythonVersion",
+           "InvalidIndex", "InvalidCredentialFormat"
+           ]
diff --git a/src/falconpy/_error/_exceptions.py b/src/falconpy/_error/_exceptions.py
new file mode 100644
index 000000000..d5333f3a1
--- /dev/null
+++ b/src/falconpy/_error/_exceptions.py
@@ -0,0 +1,182 @@
+"""FalconPy exceptions.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Dict, Union, Optional, List
+from .._result import Result
+
+
+class SDKError(Exception):
+    """Base class for all errors generated by the SDK."""
+
+    _headers: Dict[str, Optional[Union[str, int, float]]] = {}
+    _code: int = 500
+    _message: str = "An unexpected error has occurred."
+    warning: bool = False
+
+    def __init__(self,
+                 code: int = None,
+                 message: str = None,
+                 headers: dict = None
+                 ):
+        """Construct an instance of the class."""
+        self.code = self._code
+        self.message = self._message
+        self.headers = self._headers
+        if isinstance(code, int):
+            self.code = code
+        if message:
+            self.message = message
+        if isinstance(headers, dict):
+            self.headers = headers
+        super().__init__(self.message)
+
+    @property
+    def result(self) -> Dict[str, Dict[str, List[str]]]:
+        """Return the error result using the Result object class."""
+        _body = {"errors": [{"message": f"{self.message}", "code": self.code}], "resources": []}
+        return Result()(self.code, self.headers, _body)
+
+    @property
+    def simple(self) -> str:
+        """Generate a simple version of the error message that includes the error code."""
+        return f"ERROR: [{self.code}] {self.message}"
+
+
+class RegionSelectError(SDKError):
+    """Error for a region autoselection failure."""
+
+    _code = 403
+    _message = "Region autodiscovery failure. (GovCloud does not support this feature)"
+
+
+class InvalidMethod(SDKError):
+    """An invalid HTTP method was specified."""
+
+    _message = "Invalid HTTP method specified."
+    _code = 405
+
+
+class InvalidOperation(SDKError):
+    """An invalid operation was specified."""
+
+    _message = "Invalid API operation specified."
+    # That command doesn't exist. Perhaps a nice cup of tea instead?
+    _code = 418
+
+
+class InvalidBaseURL(SDKError):
+    """The base URL specified is invalid or does not exist."""
+
+    _message = "Invalid base URL address specified."
+    _code = 400
+
+
+class FunctionalityNotImplemented(SDKError):
+    """This functionality is not yet implemented."""
+
+    _message = "This functionality is not implemented"
+    _code = 501
+
+
+class TokenNotSpecified(SDKError):
+    """A token was not provided to the revoke operation."""
+
+    _message = "The token_value keyword is required to use this operation."
+    _code = 400
+
+
+class KeywordsOnly(SDKError):
+    """Keyword arguments are required to use this method."""
+
+    # I'd prefer to define this as a 400, but this has produced
+    # 500's in all previous versions, so we will maintain that
+    # status moving forward.
+    _message = "Keyword arguments are required to use this method."
+
+
+class InvalidCredentials(SDKError):
+    """Invalid credentials have been specified."""
+
+    _message = "Invalid API credentials provided."
+    _code = 403
+
+
+class CannotRevokeToken(SDKError):
+    """Unable to revoke the token specified."""
+
+    _message = "Unable to revoke specified token."
+    # Probably an authentication error, but will fall back to a 500 if we don't know.
+
+
+class PayloadValidationError(SDKError):
+    """Payload validation has failed."""
+
+    _message = "Validation failed. Please check your payloads and try this request again."
+    _code = 400
+
+    def __init__(self, msg: str = None, code: int = None):
+        """Construct an instance of the exception, setting the message and code."""
+        if msg:
+            self._message = msg
+        if isinstance(code, int):
+            self._code = code
+        super().__init__()
+
+
+class FeatureNotSupportedByPythonVersion(SDKError):
+    """This feature is not supported by your version of Python."""
+
+    _message = "This feature is not supported by your current version of Python."
+    _code = 426
+
+
+class APIError(SDKError):
+    """Generic error received back from the API."""
+
+    _message = "An unexpected error has occurred. Please check your payloads and try again."
+
+
+class InvalidIndex(SDKError):
+    """Item ID was not found in the list or string."""
+
+    _message = "Item not found. Check your index and try again."
+
+
+class InvalidCredentialFormat(SDKError):
+    """Credentials dictionary was provided as a datatype that will not convert to a dictionary."""
+
+    _message = "Invalid credential format. This keyword must be provided as a dictionary."
diff --git a/src/falconpy/_error/_warnings.py b/src/falconpy/_error/_warnings.py
new file mode 100644
index 000000000..6a62129b1
--- /dev/null
+++ b/src/falconpy/_error/_warnings.py
@@ -0,0 +1,97 @@
+"""FalconPy warnings.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Dict, Optional, Union
+from .._result import Result
+
+
+class SDKWarning(RuntimeWarning):
+    """Base class for all SDK generated warnings."""
+
+    _code: int = 100
+    _message: str = "An unexpected warning was generated."
+    _headers: Dict[str, Optional[Union[str, int, float]]] = {}
+    warning: bool = True
+
+    def __init__(self,
+                 code: int = None,
+                 message: str = None,
+                 headers: dict = None
+                 ):
+        """Construct an instance of the class."""
+        self.code = self._code
+        self.message = self._message
+        self.headers = self._headers
+        if isinstance(code, int):
+            self.code = code
+        if message:
+            self.message = message
+        if isinstance(headers, dict):
+            self.headers = headers
+        super().__init__(self.message)
+
+    @property
+    def result(self) -> dict:
+        """Return a properly formatted result leveraging the Result object."""
+        _body = {"errors": [{"message": f"{self.message}"}], "resources": []}
+        return Result()(self.code, self.headers, _body)
+
+    @property
+    def simple(self) -> dict:
+        """Return the warning in a simple format that includes the error code."""
+        return f"[{self.code}] {self.message}"
+
+
+class SSLDisabledWarning(SDKWarning):
+    """SSL verify has been disabled for requests to the CrowdStrike API."""
+
+    _code = 400
+    _message = "SSL verification is currently disabled for requests to the CrowdStrike API."
+
+
+class NoContentWarning(SDKWarning):
+    """No content was received."""
+
+    _code = 204
+    _message = "No content was received for this request."
+
+
+class NoAuthenticationMechanism(SDKWarning):
+    """No authentication mechanism was specified when creating this class."""
+
+    _code = 400
+    _message = "No authentication mechanism has been specified for this class."
diff --git a/src/falconpy/_log/__init__.py b/src/falconpy/_log/__init__.py
new file mode 100644
index 000000000..aaf1fd918
--- /dev/null
+++ b/src/falconpy/_log/__init__.py
@@ -0,0 +1,40 @@
+"""FalconPy logging module.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from ._facility import LogFacility
+
+__all__ = ["LogFacility"]
diff --git a/src/falconpy/_log/_facility.py b/src/falconpy/_log/_facility.py
new file mode 100644
index 000000000..1dafb7dcc
--- /dev/null
+++ b/src/falconpy/_log/_facility.py
@@ -0,0 +1,97 @@
+"""Logging Class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from logging import Logger
+from typing import Optional
+from .._constant import MAX_DEBUG_RECORDS
+
+
+class LogFacility:
+    """This class encapsulates the log facility and additional configuration."""
+
+    def __init__(self,
+                 log: Optional[Logger] = None,
+                 debug_record_count: Optional[int] = None,
+                 sanitize_log: Optional[bool] = None
+                 ):
+        """Construct an instance of the LogFacility class."""
+        self._log: Optional[Logger] = None
+        if isinstance(log, Logger):
+            self._log = log
+
+        self._debug_record_count: int = MAX_DEBUG_RECORDS
+        if isinstance(debug_record_count, (int, str)):
+            self._debug_record_count = int(debug_record_count)
+
+        self._sanitize: bool = True
+        if isinstance(sanitize_log, bool):
+            self._sanitize = sanitize_log
+
+    def deactivate_log(self):
+        """Deactivate the log by removing it from the facility."""
+        self._log = None  # Elvis has left the building!
+
+    @property
+    def log(self) -> Optional[Logger]:
+        """Return our immutable logger."""
+        return self._log
+
+    @property
+    def active(self) -> bool:
+        """Return if logging is active within this facility."""
+        return bool(self.log)
+
+    # Mutable
+    @property
+    def sanitize_log(self) -> bool:
+        """Return if sanitization is enabled."""
+        return self._sanitize
+
+    @sanitize_log.setter
+    def sanitize_log(self, value: bool):
+        """Set the log sanitization flag."""
+        self._sanitize = value
+
+    @property
+    def debug_record_count(self) -> int:
+        """Return the current debug record count setting."""
+        return self._debug_record_count
+
+    @debug_record_count.setter
+    def debug_record_count(self, value: int):
+        """Set the debug record count."""
+        self._debug_record_count = value
diff --git a/src/falconpy/_payload/_cloud_connect_aws.py b/src/falconpy/_payload/_cloud_connect_aws.py
index e60815aec..2455bc9ab 100644
--- a/src/falconpy/_payload/_cloud_connect_aws.py
+++ b/src/falconpy/_payload/_cloud_connect_aws.py
@@ -35,9 +35,10 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, List, Union
 
 
-def aws_registration_payload(passed_keywords: dict) -> dict:
+def aws_registration_payload(passed_keywords: dict) -> Dict[str, List[Dict[str, Union[str, int]]]]:
     """Create a properly formatted payload for RTR command.
 
     {
@@ -55,7 +56,7 @@ def aws_registration_payload(passed_keywords: dict) -> dict:
         ]
     }
     """
-    returned_payload = {}
+    returned_payload: Dict[str, List[Dict[str, Union[str, int]]]] = {}
     returned_payload["resources"] = []
     item = {}
     if passed_keywords.get("cloudtrail_bucket_owner_id", None):
diff --git a/src/falconpy/_payload/_cspm_registration.py b/src/falconpy/_payload/_cspm_registration.py
index 117877090..07b132f1c 100644
--- a/src/falconpy/_payload/_cspm_registration.py
+++ b/src/falconpy/_payload/_cspm_registration.py
@@ -35,9 +35,10 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, List, Union
 
 
-def cspm_registration_payload(passed_keywords: dict) -> dict:
+def cspm_registration_payload(passed_keywords: dict) -> Dict[str, List[Dict[str, str]]]:
     """Create a properly formatted CSPM registration payload.
 
     {
@@ -63,7 +64,7 @@ def cspm_registration_payload(passed_keywords: dict) -> dict:
         ]
     }
     """
-    returned_payload = {}
+    returned_payload: Dict[str, List[Dict[str, str]]] = {}
     returned_payload["resources"] = []
     item = {}
     keys = ["account_id", "account_type", "cloudtrail_region", "iam_role_arn",
@@ -91,7 +92,7 @@ def cspm_registration_payload(passed_keywords: dict) -> dict:
     return returned_payload
 
 
-def cspm_policy_payload(passed_keywords: dict) -> dict:
+def cspm_policy_payload(passed_keywords: dict) -> Dict[str, List[Dict[str, Union[str, bool, List[str]]]]]:
     """Create a properly formatted CSPM policy update payload.
 
     {
@@ -112,7 +113,7 @@ def cspm_policy_payload(passed_keywords: dict) -> dict:
     ]
     }
     """
-    returned_payload = {}
+    returned_payload: Dict[str, List[Dict[str, Union[str, bool, List[str]]]]] = {}
     returned_payload["resources"] = []
     keys = ["account_id", "severity"]
     bool_keys = ["enabled", "tag_excluded"]
@@ -143,7 +144,7 @@ def cspm_policy_payload(passed_keywords: dict) -> dict:
     return returned_payload
 
 
-def cspm_scan_payload(passed_keywords: dict) -> dict:
+def cspm_scan_payload(passed_keywords: dict) -> Dict[str, List[Dict[str, str]]]:
     """Create a properly formmatted CSPM scan schedule payload.
 
     {
@@ -157,7 +158,7 @@ def cspm_scan_payload(passed_keywords: dict) -> dict:
         ]
     }
     """
-    returned_payload = {}
+    returned_payload: Dict[str, List[Dict[str, str]]] = {}
     returned_payload["resources"] = []
     item = {}
     for key in ["cloud_platform", "next_scan_timestamp", "scan_interval", "scan_schedule"]:
diff --git a/src/falconpy/_payload/_d4c_registration.py b/src/falconpy/_payload/_d4c_registration.py
index c1e5df082..301bd32d5 100644
--- a/src/falconpy/_payload/_d4c_registration.py
+++ b/src/falconpy/_payload/_d4c_registration.py
@@ -35,9 +35,10 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, List, Union, Any
 
 
-def aws_d4c_registration_payload(passed_keywords: dict) -> dict:
+def aws_d4c_registration_payload(passed_keywords: dict) -> Dict[str, List[Dict[str, Union[str, bool]]]]:
     """Create a properly formatted AWS registration payload.
 
     {
@@ -53,22 +54,24 @@ def aws_d4c_registration_payload(passed_keywords: dict) -> dict:
         ]
     }
     """
-    returned_payload = {}
+    returned_payload: Dict[str, List[Dict[str, Union[str, bool]]]] = {}
     returned_payload["resources"] = []
     keys = ["account_id", "account_type", "cloudtrail_region", "iam_role_arn", "organization_id"]
-    item = {}
+    item: Dict[str, Any] = {}
+
     for key in keys:
-        if passed_keywords.get(key, None):
+        if isinstance(passed_keywords.get(key, None), str):
             item[key] = passed_keywords.get(key)
-    if passed_keywords.get("is_master", None) is not None:
+    if isinstance(passed_keywords.get("is_master", None), bool):
         item["is_master"] = passed_keywords.get("is_master")
 
-    returned_payload["resources"].append(item)
+    if item:
+        returned_payload["resources"].append(item)
 
     return returned_payload
 
 
-def azure_registration_payload(passed_keywords: dict) -> dict:
+def azure_registration_payload(passed_keywords: dict) -> Dict[str, List[Dict[str, str]]]:
     """Create a properly formatted Azure registration payload.
 
     {
@@ -115,7 +118,7 @@ def gcp_registration_payload(passed_keywords: dict) -> dict:
         ]
     }
     """
-    returned_payload = {}
+    returned_payload: Dict[str, List[Dict[str, str]]] = {}
     returned_payload["resources"] = []
     keys = ["parent_id", "parent_type"]
     item = {}
diff --git a/src/falconpy/_payload/_host_group.py b/src/falconpy/_payload/_host_group.py
index 82724d2eb..913f48465 100644
--- a/src/falconpy/_payload/_host_group.py
+++ b/src/falconpy/_payload/_host_group.py
@@ -35,9 +35,10 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, List
 
 
-def host_group_create_payload(passed_keywords: dict) -> dict:
+def host_group_create_payload(passed_keywords: dict) -> Dict[str, List[Dict[str, str]]]:
     """Create a properly formatted payload for host group operations.
 
     Create operations are supported. `id` and `group_type`
@@ -47,13 +48,13 @@ def host_group_create_payload(passed_keywords: dict) -> dict:
             {
                 "assignment_rule": "string",
                 "description": "string",
-                "group_type": "static",
+                "group_type": "string",
                 "name": "string"
             }
         ]
     }
     """
-    returned_payload = {}
+    returned_payload: Dict[str, List[Dict[str, str]]] = {}
     returned_payload["resources"] = []
     host_group_item = {}
     if passed_keywords.get("assignment_rule", None):
@@ -70,7 +71,7 @@ def host_group_create_payload(passed_keywords: dict) -> dict:
     return returned_payload
 
 
-def host_group_update_payload(passed_keywords: dict) -> dict:
+def host_group_update_payload(passed_keywords: dict) -> Dict[str, List[Dict[str, str]]]:
     """Create a properly formatted payload for host group operations.
 
     Update operations are supported. `id` and `group_type`
@@ -86,7 +87,7 @@ def host_group_update_payload(passed_keywords: dict) -> dict:
         ]
     }
     """
-    returned_payload = {}
+    returned_payload: Dict[str, List[Dict[str, str]]] = {}
     returned_payload["resources"] = []
     host_group_item = {}
     if passed_keywords.get("assignment_rule", None):
diff --git a/src/falconpy/_payload/_incidents.py b/src/falconpy/_payload/_incidents.py
index fcc3f401e..feaa6a7b9 100644
--- a/src/falconpy/_payload/_incidents.py
+++ b/src/falconpy/_payload/_incidents.py
@@ -37,7 +37,7 @@
 """
 
 
-def incident_action_parameters(passed_keywords: dict) -> dict:
+def incident_action_parameters(passed_keywords: dict) -> list:
     """Create a properly formatted action_parameters branch for incident action payload operations.
 
     Available keywords
diff --git a/src/falconpy/_payload/_malquery.py b/src/falconpy/_payload/_malquery.py
index 140fa3074..294fda6cf 100644
--- a/src/falconpy/_payload/_malquery.py
+++ b/src/falconpy/_payload/_malquery.py
@@ -55,7 +55,7 @@ def malquery_fuzzy_payload(passed_keywords: dict) -> dict:
         ]
     }
     """
-    returned_payload = {}
+    returned_payload: dict = {}
     filters = passed_keywords.get("filter_meta", None)
     limit = passed_keywords.get("limit", 0)
     if filters or limit:
@@ -75,7 +75,7 @@ def malquery_fuzzy_payload(passed_keywords: dict) -> dict:
 
 def handle_malquery_search_params(passed_params: dict) -> dict:
     """Create the base payload used by exact_search and hunt."""
-    returned_base = {}
+    returned_base: dict = {}
     filters = passed_params.get("filter_filetypes", None)
     filter_meta = passed_params.get("filter_meta", None)
     limit = passed_params.get("limit", 0)
diff --git a/src/falconpy/_payload/_recon.py b/src/falconpy/_payload/_recon.py
index 8090a601e..4390d2008 100644
--- a/src/falconpy/_payload/_recon.py
+++ b/src/falconpy/_payload/_recon.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import List, Dict
 
 
 def handle_recon_rule_params(inbound: dict) -> dict:
@@ -52,22 +53,22 @@ def handle_recon_rule_params(inbound: dict) -> dict:
     return returned_dict
 
 
-def recon_rules_payload(passed_keywords: dict) -> dict:
+def recon_rules_payload(passed_keywords: dict) -> List[Dict[str, str]]:
     """Create a properly formatted payload for recon rule handling.
 
     Creates a list of dictionaries.
-            [
-                {
-                    "breach_monitoring_enabled": true,
-                    "filter": "string",
-                    "id": "string",
-                    "name": "string",
-                    "permissions": "string",
-                    "priority": "string",
-                    "substring_matching_enabled": true,
-                    "topic": "string"
-                }
-            ]
+    [
+        {
+            "breach_monitoring_enabled": true,
+            "filter": "string",
+            "id": "string",
+            "name": "string",
+            "permissions": "string",
+            "priority": "string",
+            "substring_matching_enabled": true,
+            "topic": "string"
+        }
+    ]
     """
     returned_rules = []
     provided_rules = passed_keywords.get("rules", None)
@@ -86,7 +87,7 @@ def recon_rules_payload(passed_keywords: dict) -> dict:
     return returned_rules
 
 
-def recon_notifications_payload(passed_keywords: dict) -> dict:
+def recon_notifications_payload(passed_keywords: dict) -> List[Dict[str, str]]:
     """Recon notification payload handler.
 
     Creates a properly formatted payload for a recon notification
diff --git a/src/falconpy/_payload/_reports.py b/src/falconpy/_payload/_reports.py
index 7543560de..3a87a3011 100644
--- a/src/falconpy/_payload/_reports.py
+++ b/src/falconpy/_payload/_reports.py
@@ -35,9 +35,10 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Union, List, Optional
 
 
-def reports_payload(passed_keywords: dict = None, passed_arguments: list = None) -> dict:
+def reports_payload(passed_keywords: dict, passed_arguments: Optional[tuple] = None) -> List[dict]:
     """Create a properly formatted payload for report execution / scheduling.
 
     [
@@ -47,9 +48,9 @@ def reports_payload(passed_keywords: dict = None, passed_arguments: list = None)
     ]
     """
     returned_payload = []
-    submitted = ""
+    submitted: Union[str, list] = ""
     if passed_keywords.get("ids", None):
-        key = passed_keywords.get("ids", None)
+        key: Union[str, list] = passed_keywords.get("ids", None)
         if isinstance(key, list):
             submitted = key
         else:
diff --git a/src/falconpy/_result/__base_resource.py b/src/falconpy/_result/__base_resource.py
new file mode 100644
index 000000000..f49ce5bd7
--- /dev/null
+++ b/src/falconpy/_result/__base_resource.py
@@ -0,0 +1,102 @@
+"""FalconPy BaseResource object.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import List, Optional, Union
+from ._response_component import ResponseComponent
+
+
+class BaseResource(ResponseComponent):
+    """The base class for different resource types we can have within an API response."""
+
+    #  _______  _____  __   _ _______ _______  ______ _     _ _______ _______  _____   ______
+    #  |       |     | | \  | |______    |    |_____/ |     | |          |    |     | |_____/
+    #  |_____  |_____| |  \_| ______|    |    |    \_ |_____| |_____     |    |_____| |    \_
+    #
+    def __init__(self, data: Optional[List[Union[str, int, float, dict]]] = None):
+        """Construct an instance of the class."""
+        # Override the _data attribute from ResponseComponent to always be a list.
+        self._data: Optional[List[Union[str, int, float, dict]]] = []
+        self._pos: int = 0
+
+        if isinstance(data, list):
+            super().__init__(data=data)
+
+        # else the Resources branch is present but is a NoneType
+
+    #  _______ _______ _______ _     _  _____  ______  _______
+    #  |  |  | |______    |    |_____| |     | |     \ |______
+    #  |  |  | |______    |    |     | |_____| |_____/ ______|
+    #
+    # Helper dunder methods to expose functionality of the underlying _data list attribute.
+    def __iter__(self):
+        """Return the resource list iterator."""
+        return self._data.__iter__()
+
+    def __next__(self):
+        """Get the next item in the resources list."""
+        _returned = None
+        if self.data:
+            _returned = next(self.__iter__())
+            self._pos += 1
+            if self._pos >= len(self.data):
+                raise StopIteration
+        else:
+            raise StopIteration
+
+        return _returned
+
+    def __getitem__(self, pos):
+        """Retrieve an item by position from the resources list."""
+        return self._data.__getitem__(pos)
+
+    def __reversed__(self):
+        """Reverse the iteration order."""
+        return self._data.__reversed__()
+
+    def __len__(self) -> int:
+        """Return the length of the resource list."""
+        return len(self._data)
+
+    #   _____   ______  _____   _____  _______  ______ _______ _____ _______ _______
+    #  |_____] |_____/ |     | |_____] |______ |_____/    |      |   |______ |______
+    #  |       |    \_ |_____| |       |______ |    \_    |    __|__ |______ ______|
+    #
+    # Properties within a resource object are immutable once they are created.
+    @property
+    def data(self) -> List[Optional[Union[str, int, float, dict]]]:
+        """Return the contents of the underlying _data attribute."""
+        return list(self._data)
diff --git a/src/falconpy/_result/__init__.py b/src/falconpy/_result/__init__.py
new file mode 100644
index 000000000..6b41c45cb
--- /dev/null
+++ b/src/falconpy/_result/__init__.py
@@ -0,0 +1,49 @@
+"""FalconPy result module.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from ._result import Result
+from ._expanded_result import ExpandedResult
+from ._resources import Resources, BaseResource, RawBody, BinaryFile
+from ._response_component import ResponseComponent
+from ._headers import Headers
+from ._meta import Meta
+from ._base_dictionary import BaseDictionary
+from ._errors import Errors
+
+__all__ = ["Result", "ExpandedResult", "Resources", "BaseResource", "ResponseComponent",
+           "Headers", "Meta", "BaseDictionary", "Errors", "RawBody", "BinaryFile"
+           ]
diff --git a/src/falconpy/_result/_base_dictionary.py b/src/falconpy/_result/_base_dictionary.py
new file mode 100644
index 000000000..8e526e926
--- /dev/null
+++ b/src/falconpy/_result/_base_dictionary.py
@@ -0,0 +1,112 @@
+"""FalconPy BaseDictionary object.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import ItemsView, Any, Union, Dict, List, Optional
+import sys
+from ._response_component import ResponseComponent
+
+
+# I live here for now to prevent a circular reference
+class UnsupportedPythonVersion(Exception):
+    """This feature is not supported by your version of Python."""
+
+    message = "This feature is not supported by your current version of Python."
+    code = 426
+
+
+class BaseDictionary(ResponseComponent):
+    """This class represents a dictionary component of an API response."""
+
+    #  _______ _______ _______ _     _  _____  ______  _______
+    #  |  |  | |______    |    |_____| |     | |     \ |______
+    #  |  |  | |______    |    |     | |_____| |_____/ ______|
+    #
+    # Convert this object into an iterator by adding iteration
+    # handling that leverages our underlying _data dictionary.
+    def __init__(self,
+                 data: Optional[Dict[str, Union[str, Dict[str, Union[str, dict, list]], List[Union[str, int, dict]]]]] = None
+                 ):
+        """Construct an instance of the BaseDictionary."""
+        super().__init__()
+        if data:
+            self._data = data
+        else:
+            self._data = {}
+
+    def __iter__(self):
+        """Iterate for the data dictionary."""
+        return self._data.__iter__()
+
+    def __next__(self):
+        """Get the next item from the data dictionary."""
+        _returned = None
+        if self.data:
+            _returned = next(self.__iter__())
+        else:
+            raise StopIteration
+
+        return _returned
+
+    def __getitem__(self, pos):
+        """Retrieve an item by position from the data dictionary."""
+        return self._data.__getitem__(pos)
+
+    def __reversed__(self):
+        """Reverse the iteration order."""
+        if sys.version_info.minor <= 7:  # pragma: no cover
+            raise UnsupportedPythonVersion
+        return self._data.__reversed__()
+
+    def __len__(self) -> int:
+        """Retrieve the length of the data dictionary."""
+        return len(self._data)
+
+    def items(self) -> ItemsView[Any, Any]:
+        """Provide expanded dictionary iteration functionality to the class."""
+        return self._data.items()
+
+    #   _____   ______  _____   _____  _______  ______ _______ _____ _______ _______
+    #  |_____] |_____/ |     | |_____] |______ |_____/    |      |   |______ |______
+    #  |       |    \_ |_____| |       |______ |    \_    |    __|__ |______ ______|
+    #
+    @property
+    def data(self) -> Dict[str, Union[str,
+                                      Dict[str, Union[str, dict, list]],
+                                      List[Union[str, int, dict]]
+                                      ]]:
+        """Return the contents of the _data attribute as a dictionary."""
+        return dict(self._data)
diff --git a/src/falconpy/_result/_errors.py b/src/falconpy/_result/_errors.py
new file mode 100644
index 000000000..ca0506fa1
--- /dev/null
+++ b/src/falconpy/_result/_errors.py
@@ -0,0 +1,42 @@
+"""FalconPy Errors object.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from .__base_resource import BaseResource
+
+
+class Errors(BaseResource):
+    """This class represents the errors list within an API response."""
diff --git a/src/falconpy/_result.py b/src/falconpy/_result/_expanded_result.py
similarity index 64%
rename from src/falconpy/_result.py
rename to src/falconpy/_result/_expanded_result.py
index 408c6438f..1741ebc15 100644
--- a/src/falconpy/_result.py
+++ b/src/falconpy/_result/_expanded_result.py
@@ -1,4 +1,4 @@
-"""API Response formatting classes.
+"""API Response formatting class.
 
  _______                        __ _______ __        __ __
 |   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
@@ -35,39 +35,31 @@
 
 For more information, please refer to <https://unlicense.org>
 """
-# pylint: disable=R0903  # Using a class so that the data structure is callable
+# pylint: disable=R0903
+from typing import Tuple, Dict, Union
 
 
-class Result:
-    """Callable subclass to handle parsing of result client output."""
-
-    def __init__(self: object) -> dict:
-        """Instantiate the subclass and initializes the result object."""
-        self.result_obj = {}
-
-    def __call__(self: object, status_code: int, headers, body: dict) -> dict:
-        """Format values into a properly formatted result object."""
-        self.result_obj['status_code'] = status_code
-        # force standard dictionary to prevent json issues
-        self.result_obj['headers'] = dict(headers)
-        self.result_obj['body'] = body
-
-        return self.result_obj
+class ExpandedResult:
+    """Callable subsclass to handle parsing of expanded result client output.
 
+    DEPRECATED
+    ---
+    This class is deprecated and maintained for backwards compatibility purposes only.
 
-class ExpandedResult:
-    """Callable subsclass to handle parsing of expanded result client output."""
+    Please move all code over to use Result.tupled.
 
-    def __init__(self: object) -> tuple:
-        """Instantiate the subclass and intialize the expanded result object."""
-        self.result_tuple = ()
+    Examples: tupled_response: Result = falcon.query_detects(pythonic=True).tupled
+              tupled_response: Result = Result(full=falcon.query_detects()).tupled
+    """
 
-    def __call__(self: object, status_code: int, headers, content) -> tuple:
+    def __call__(self,
+                 status_code: int,
+                 headers: Dict[str, str],
+                 content: Union[str, bytes, Dict[str, Dict]]
+                 ) -> Tuple[str, Dict[str, str], Dict[str, Dict]]:
         """Format ingested values into a properly formatted expanded result object."""
         content_result = content
         if isinstance(content, dict):
             content_result = content["body"]
 
-        self.result_tuple = (status_code, dict(headers), content_result)
-
-        return self.result_tuple
+        return (status_code, dict(headers), content_result)
diff --git a/src/falconpy/_result/_headers.py b/src/falconpy/_result/_headers.py
new file mode 100644
index 000000000..32509dcde
--- /dev/null
+++ b/src/falconpy/_result/_headers.py
@@ -0,0 +1,78 @@
+"""FalconPy Headers object.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Optional, Union
+from ._base_dictionary import BaseDictionary
+
+
+class Headers(BaseDictionary):
+    """This class represents the headers of an API response."""
+
+    @property
+    def content_encoding(self) -> Optional[str]:
+        """Return the contents of the Content-Encoding key."""
+        return self.get_property("Content-Encoding", None)
+
+    @property
+    def content_length(self) -> Optional[Union[int, float]]:
+        """Return the contents of the Content-Length key."""
+        return self.get_property("Content-Length", 0)
+
+    @property
+    def content_type(self) -> Optional[str]:
+        """Return the contents of the Content-Type key."""
+        return self.get_property("Content-Type", None)
+
+    @property
+    def date(self) -> Optional[str]:
+        """Return the contents of the Date key."""
+        return self.get_property("Date", None)
+
+    @property
+    def region(self) -> Optional[str]:
+        """Return the contents of the X-Cs-Region key."""
+        return self.get_property("X-Cs-Region", None)
+
+    @property
+    def ratelimit_limit(self) -> Optional[int]:
+        """Return the contents of the X-Ratelimit-Limit key."""
+        return self.get_property("X-Ratelimit-Limit", None)
+
+    @property
+    def ratelimit_remaining(self) -> Optional[int]:
+        """Return the contents of the X-Ratelimit-Remaining key."""
+        return self.get_property("X-Ratelimit-Remaining", None)
diff --git a/src/falconpy/_result/_meta.py b/src/falconpy/_result/_meta.py
new file mode 100644
index 000000000..5341657db
--- /dev/null
+++ b/src/falconpy/_result/_meta.py
@@ -0,0 +1,83 @@
+"""FalconPy Meta object.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Union, Dict, Optional
+from ._base_dictionary import BaseDictionary
+
+
+class Meta(BaseDictionary):
+    """Class to represent the metadata API response within a result."""
+
+    @property
+    def pagination(self) -> Dict[str, Union[int, str, float]]:
+        """Return the contents of the pagination branch."""
+        return self.get_property("pagination", {})
+
+    @property
+    def query_time(self) -> Optional[float]:
+        """Return the the contents of the query_time key."""
+        return self.get_property("query_time", None)
+
+    @property
+    def offset(self) -> Optional[Union[int, str, float]]:
+        """Return the the contents of the offset key."""
+        return self.pagination.get("offset", None)
+
+    @property
+    def limit(self) -> Optional[Union[int, str, float]]:
+        """Return the the contents of the limit key."""
+        return self.pagination.get("limit", None)
+
+    @property
+    def total(self) -> Optional[Union[int, str, float]]:
+        """Return the the contents of the total key."""
+        return self.pagination.get("total", None)
+
+    @property
+    def expires_at(self) -> Optional[Union[int, str, float]]:
+        """Return the the contents of the expires_at key."""
+        return self.pagination.get("expires_at", None)
+
+    @property
+    def powered_by(self) -> Optional[str]:
+        """Return the the contents of the powered_by key."""
+        return self.get_property("powered_by", None)
+
+    @property
+    def trace_id(self) -> Optional[str]:
+        """Return the the contents of the trace_id key."""
+        return self.get_property("trace_id", None)
diff --git a/src/falconpy/_result/_resources.py b/src/falconpy/_result/_resources.py
new file mode 100644
index 000000000..834cd2b28
--- /dev/null
+++ b/src/falconpy/_result/_resources.py
@@ -0,0 +1,66 @@
+"""FalconPy Resource object.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from ._response_component import ResponseComponent
+from .__base_resource import BaseResource
+from ._base_dictionary import BaseDictionary
+
+
+class Resources(BaseResource):
+    """This class represents the resources branch of an API response."""
+
+    def contains(self, substr) -> list:
+        """Search filter."""
+        # May move this to __contains__
+        _returned = []
+        if self._data:
+            _data = self._data
+            _returned = [x for x in _data if substr in x]
+
+        return _returned
+
+
+class BinaryFile(ResponseComponent):
+    """A binary file resource."""
+
+    def __bytes__(self):
+        """Return the object in bytes."""
+        return bytes(self._data)
+
+
+class RawBody(BaseDictionary):
+    """Class to represent a raw payload that does not match standard formatting."""
diff --git a/src/falconpy/_result/_response_component.py b/src/falconpy/_result/_response_component.py
new file mode 100644
index 000000000..cb181133d
--- /dev/null
+++ b/src/falconpy/_result/_response_component.py
@@ -0,0 +1,93 @@
+"""FalconPy ResponseComponent object.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Union, Optional
+
+
+class ResponseComponent:
+    """Base class for all response object derivatives."""
+
+    #  _______  _____  __   _ _______ _______  ______ _     _ _______ _______  _____   ______
+    #  |       |     | | \  | |______    |    |_____/ |     | |          |    |     | |_____/
+    #  |_____  |_____| |  \_| ______|    |    |    \_ |_____| |_____     |    |_____| |    \_
+    #
+    # Sets the data attribute upon creation.
+    def __init__(self, data: Optional[Union[dict, bytes, list, str]] = None):
+        """Construct an instance of the class and set the private data attribute."""
+        # All response components maintain an underlying data attribute.
+        # Due to the dynamic types of responses received from the API,
+        # this base element is defined as generically as possible.
+        self._data: Optional[Union[dict, bytes, list, str, int, float]] = None
+        if isinstance(data, (dict, bytes, list, str, int, float)):
+            self._data = data
+
+    #  _______ _______ _______ _     _  _____  ______  _______
+    #  |  |  | |______    |    |_____| |     | |     \ |______
+    #  |  |  | |______    |    |     | |_____| |_____/ ______|
+    #
+    def __repr__(self) -> str:
+        """Return a clean string representation of the underlying data dictionary."""
+        return str(self._data)
+
+    def get_property(self, item, default_return: Union[str, int, dict, float, list] = None):
+        """Property lookup helper. Returns None if the underlying data is binary."""
+        _returned = None
+        if isinstance(self._data, dict):
+            _returned = self._data.get(item, default_return)
+        elif isinstance(self._data, (list, str)):
+            try:
+                _returned = self._data[item]
+            except IndexError as bad_pos:
+                raise IndexError(
+                    "Invalid position specified. Please check your index and try again."
+                    ) from bad_pos
+
+        return _returned
+
+    #   _____   ______  _____   _____  _______  ______ _______ _____ _______ _______
+    #  |_____] |_____/ |     | |_____] |______ |_____/    |      |   |______ |______
+    #  |       |    \_ |_____| |       |______ |    \_    |    __|__ |______ ______|
+    #
+    @property
+    def data(self) -> Optional[Union[dict, bytes, list, str, int, float]]:
+        """Property to reflect the contents of the private _data attribute."""
+        return self._data
+
+    @property
+    def binary(self) -> bool:
+        """Return a boolean indicating if this component represents a binary response."""
+        return isinstance(self._data, bytes)
diff --git a/src/falconpy/_result/_result.py b/src/falconpy/_result/_result.py
new file mode 100644
index 000000000..6cd85ed74
--- /dev/null
+++ b/src/falconpy/_result/_result.py
@@ -0,0 +1,433 @@
+"""API Response formatting class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Dict, Union, Optional, List, Tuple
+from requests.structures import CaseInsensitiveDict
+from ._meta import Meta
+from ._errors import Errors
+from ._headers import Headers
+from ._resources import Resources, BinaryFile, RawBody
+
+
+class BaseResult:
+    """Base class for all result objects."""
+
+    # _______ _______ _______ _     _  _____  ______  _______
+    # |  |  | |______    |    |_____| |     | |     \ |______
+    # |  |  | |______    |    |     | |_____| |_____/ ______|
+    #
+    def __init__(self,
+                 status_code: Optional[int] = 0,
+                 headers: Optional[Dict[str, Union[str, int, float]]] = None,
+                 body: Optional[Dict[str, Union[str, dict, list, int, float, bytes]]] = None
+                 ):
+        """Construct an instance of the class."""
+        self._pos: int = 0
+        # self._reversed: bool = False
+
+        # Configure defaults
+        self.status_code = status_code  # Will default to 0
+        self.headers = Headers()
+        self.meta = Meta()
+        self.resources = Resources([])
+        self.errors = Errors()
+        self.raw = RawBody()
+
+        if status_code and headers and body:
+            self.status_code = status_code
+            _headers = headers
+            if isinstance(_headers, CaseInsensitiveDict):
+                _headers = dict(headers)
+            self.headers = Headers(_headers)
+            if isinstance(body, bytes):
+                # Binary response
+                self.resources = BinaryFile(body)
+                self.meta = Meta()
+                self.errors = Errors()
+            elif isinstance(body, str):
+                # Invalid or raw response
+                if not body.strip():
+                    body = {}
+                self.raw = RawBody(body)
+                self.meta = Meta()
+                self.resources = Resources()
+                self.errors = Errors()
+            elif body.get("access_token", None):
+                # Authentication response
+                self.raw = RawBody(body)
+                self.meta = Meta()
+                self.resources = Resources()
+                self.errors = Errors()
+            else:
+                # Standard responses, GraphQL and RTR
+                self.meta = Meta(body.get("meta", {}))
+                self.errors = Errors(body.get("errors", []))
+                # RTR Batch responses
+                if body.get("batch_id", {}):
+                    # Batch session init
+                    self.raw = RawBody(body)
+                    self.resources = Resources(body.get("resources", []))
+                elif body.get("combined", {}):
+                    # Batch session results have to be handled as RawBody
+                    # due to the combined response format.
+                    self.raw = RawBody(body)
+                elif body.get("data", {}):  # pragma: no cover
+                    # GraphQL uses a custom response payload, we will
+                    # use RawBody for this return for now. Due to
+                    # environment constraints, this is manually tested.
+                    self.raw = RawBody(body)
+                elif body.get("resources", None) is None:
+                    # No resources, this must be a raw dictionary
+                    # Probably came from the container API
+                    self.raw = RawBody(body)
+                elif isinstance(body.get("resources", []), dict):
+                    # Catch unusual response payloads not explicitly handled
+                    self.raw = RawBody(body)
+                else:
+                    # Standard API responses
+                    self.resources = Resources(body.get("resources", []))
+
+    # Iteration handlers
+    def __iter__(self):
+        """Return this object for iteration handling."""
+        _returned = self
+        if self.data:
+            _returned = self.resources.data.__iter__()
+        return _returned
+
+    def __reversed__(self):
+        """Reverse the iteration order."""
+        _returned = self
+        if self.data:
+            _returned = self.resources.data.__reversed__()
+        return _returned
+
+    def __next__(self):
+        """Retrieve the next item in the list."""
+        _returned = None
+        if self.resources.data:
+            _returned = next(self.__iter__())
+            self._pos += 1
+            if self._pos >= len(self.resources.data):
+                raise StopIteration
+        else:
+            raise StopIteration
+
+        return _returned
+
+    def __getitem__(self, pos):
+        """Retrieve an item by position from the resources list."""
+        _returned = None
+        if isinstance(self.resources.data, list) and isinstance(pos, int):
+            if len(self.resources.data) >= pos:
+                _returned = self.resources.data.__getitem__(pos)
+
+        return _returned
+
+    # Returns the length of the resources data attribute
+    def __len__(self) -> int:
+        """Return the length of the resources list when taking the length of this object."""
+        return len(self.resources.data)
+    # Return a boolean if the string matches
+
+    def __contains__(self, substr):
+        """Return a boolean if the search string is found within the list. Exact matches only."""
+        return bool(substr in self.resources.data)
+
+    # Legacy handler that emulates functionality in versions prior to v1.3.
+    def __call__(self, status_code: int, headers, body: dict):
+        """Legacy Result object functionality.
+
+        This method provides the legacy result object functionality and should not be removed.
+        """
+        return {
+            "status_code": status_code,
+            # force standard dictionary to prevent json issues
+            "headers": dict(headers),
+            "body": body
+        }
+
+    # Return the entire structure as a JSON formatted string.
+    # I'm back and forth on how to best implement this still.
+    def __repr__(self) -> str:
+        """Return a clean string representation of the result."""
+        _body = {}
+        if self.raw:
+            _body = self.raw.data
+        if not _body:
+            _body = {
+                "meta": self.meta.data,
+                "resources": self.resources.data,
+                "errors": self.errors.data
+            }
+
+        return str({
+            "status_code": self.status_code,
+            "headers": self.headers.data,
+            "body": _body
+        })
+
+    @property
+    def data(self) -> list:
+        """Return the contents of the data property from the underlying Resources object."""
+        return self.resources.data
+
+
+class Result(BaseResult):
+    """CrowdStrike API response representation class."""
+
+    def __init__(self,
+                 status_code: Optional[int] = None,
+                 headers: Optional[Dict[str, str]] = None,
+                 body: Optional[Union[bytes,
+                                      Dict[str, Union[str, dict, list, int, float, bytes]]
+                                      ]] = None,
+                 full: Dict[str, Union[int,
+                                       Dict[str, str],
+                                       Dict[str, Union[str, dict, list, int, float, bytes]]
+                                       ]] = None
+                 ):
+        """Class constructor.
+
+        Provides the ability to create a full object from a result dictionary.
+        """
+        # Default behavior is to create an empty object to emulate previous functionality.
+        # Status code, headers and body must all be present, or full must be provided in
+        # order to create a fully populated instance of this object.
+        # if full:
+        if isinstance(full, dict):
+            status_code = full.get("status_code", None)
+            headers = full.get("headers", None)
+            body = full.get("body", None)
+
+        super().__init__(status_code=status_code, headers=headers, body=body)
+
+    # Easy filter method
+    def prune(self, substr) -> list:
+        """Return a list of matches for the search string from the result list."""
+        _returned = list(self.resources.contains(substr))
+        return _returned
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]
+    @property
+    def total(self) -> Optional[Union[int, str, float]]:
+        """Return the total record count from the underlying Meta object."""
+        _returned: Optional[Union[int, str, float]] = 0
+        if self.meta:
+            _returned = self.meta.total
+        return _returned
+
+    @property
+    def offset(self) -> Optional[Union[int, str, float]]:
+        """Return the record offset from the underlying Meta object."""
+        _returned: Optional[Union[int, str, float]] = None
+        if self.meta:
+            _returned = self.meta.offset
+        return _returned
+
+    @property
+    def limit(self) -> Optional[Union[int, str, float]]:
+        """Return the record limit from the underlying Meta object."""
+        _returned: Optional[Union[int, str, float]] = 0
+        if self.meta:
+            _returned = self.meta.limit
+        return _returned
+
+    @property
+    def query_time(self) -> Optional[Union[int, float]]:
+        """Return the query execution time from the underlying Meta object."""
+        _returned: Optional[Union[int, float]] = 0
+        if self.meta:
+            _returned = self.meta.query_time
+        return _returned
+
+    @property
+    def powered_by(self) -> Optional[str]:
+        """Return the powered by value from the underlying Meta object."""
+        _returned: Optional[str] = None
+        if self.meta:
+            _returned = self.meta.powered_by
+        return _returned
+
+    @property
+    def trace_id(self) -> Optional[str]:
+        """Return the trace ID from the underlying Meta object."""
+        _returned: Optional[str] = None
+        if self.meta:
+            _returned = self.meta.trace_id
+        return _returned
+
+    @property
+    def content_encoding(self) -> Optional[str]:
+        """Return the content encoding from the underlying Headers object."""
+        return self.headers.content_encoding
+
+    @property
+    def content_type(self) -> Optional[str]:
+        """Return the content type from the underlying Headers object."""
+        return self.headers.content_type
+
+    @property
+    def content_length(self) -> Optional[Union[int, float]]:
+        """Return the content length from the underlying Headers object."""
+        return self.headers.content_length
+
+    @property
+    def date(self) -> Optional[str]:
+        """Return the date of the request from the underlying Headers object."""
+        return self.headers.date
+
+    @property
+    def region(self) -> Optional[str]:
+        """Return the CrowdStrike region from the underlying Headers object."""
+        return self.headers.region
+
+    @property
+    def ratelimit_limit(self) -> Optional[int]:
+        """Return the rate limit total from the underlying Headers object."""
+        return self.headers.ratelimit_limit
+
+    @property
+    def ratelimit_remaining(self) -> Optional[int]:
+        """Return the rate limit remaining from the underlying Headers object."""
+        return self.headers.ratelimit_remaining
+
+    @property
+    def headers_object(self) -> bool:
+        """Return if the headers data is a dictionary or Headers object."""
+        return isinstance(self.headers.data, Headers)
+
+    @property
+    def meta_object(self) -> bool:
+        """Return if the meta data is a dictionary or a Meta object."""
+        return isinstance(self.meta.data, Meta)
+
+    @property                                       # Doh!
+    def tupled(self) -> Tuple[int,               # \o_
+                              Dict[str, str],  # __/
+                              Union[bytes,      # /
+                                    Dict[str,
+                                         Union[str, Dict[str, Union[str, List[Union[str, dict]]]]]
+                                         ]
+                                    ]
+                              ]:
+        """Results expansion.
+
+        Emulates legacy Results expansions functionality by returning
+        the contents of the Result object as a tuple.
+        """
+        _content: Optional[Union[Dict[str, Union[dict, list]], bytes]] = None
+        if self.resources.binary:
+            _content = bytes(self.resources)
+        else:
+            _content = {
+                "meta": self.meta.data,
+                "resources": self.resources.data,
+                "errors": self.errors.data
+            }
+        return (self.status_code, self.headers.data, _content)
+
+    @property
+    def body(self) -> dict:
+        """Shortcut property to access just the body dictionary."""
+        return dict({"meta": self.meta,
+                     "resources": self.resources,
+                     "errors": self.errors
+                     })
+
+    @property
+    def binary(self) -> bool:
+        """Return a flag indicating if the downloaded content is a bianry object."""
+        return isinstance(self.resources, BinaryFile)  # self.resources.binary
+
+    @property
+    def full_return(self) -> dict:
+        """Full dictionary representation of the result.
+
+        Used by internal methods for returning contents back to the user.
+        """
+        if not self.binary:
+            _body = self.raw.data if self.raw else {}
+            _headers = {}
+            if not _body:
+                _body = {}
+                if self.meta or self.resources or self.errors:
+                    _meta = {}
+                    _resources = []
+                    _errors = []
+                    if self.meta:
+                        _meta = dict(self.meta.data)
+                    if self.resources:
+                        _resources = self.resources.data
+                    if self.errors.data:
+                        _errors = self.errors.data
+                    _body["meta"] = _meta
+                    _body["resources"] = _resources
+                    _body["errors"] = _errors
+            if self.headers:
+                _headers = dict(self.headers.data)
+            if "meta" in _body:
+                _body = dict(_body)
+
+            # try:
+            #     # Content is malformed JSON
+            #     # No content returned, but a valid response
+            #     _body = dict(_body)
+            # except ValueError:
+            #     _body = _body
+            #     _body = {
+            #         "meta": {},
+            #         "resources": [],
+            #         "errors": [
+            #             {
+            #                 "message": "Invalid JSON response received",
+            #                 "code": 500
+            #             }
+            #         ]
+            #     }
+
+            _returned = {
+                "status_code": int(self.status_code),
+                "headers": _headers,
+                "body": _body
+            }
+        else:
+            _returned = bytes(self.resources)
+
+        return _returned
diff --git a/src/falconpy/_service_class.py b/src/falconpy/_service_class.py
deleted file mode 100644
index ce085d47f..000000000
--- a/src/falconpy/_service_class.py
+++ /dev/null
@@ -1,190 +0,0 @@
-"""ServiceClass base class.
-
- _______                        __ _______ __        __ __
-|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
-|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
-|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
-|:  1   |                         |:  1   |
-|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
-`-------'                         `-------'
-
-OAuth2 API - Customer SDK
-
-This is free and unencumbered software released into the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or
-distribute this software, either in source code form or as a compiled
-binary, for any purpose, commercial or non-commercial, and by any
-means.
-
-In jurisdictions that recognize copyright laws, the author or authors
-of this software dedicate any and all copyright interest in the
-software to the public domain. We make this dedication for the benefit
-of the public at large and to the detriment of our heirs and
-successors. We intend this dedication to be an overt act of
-relinquishment in perpetuity of all present and future rights to this
-software under copyright law.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-For more information, please refer to <https://unlicense.org>
-"""
-from ._util import confirm_base_url, autodiscover_region
-from .oauth2 import OAuth2
-
-# pylint: disable=R0902  # Nine is reasonable
-# pylint: disable=R0912  # Currently at 13 branches
-# pylint: disable=R0915  # 51/50 statements. Allowing for now. 10.07.21 - jshcodes
-
-
-class ServiceClass:
-    """Base class of all service classes. Contains the default __init__ method."""
-
-    def __init__(self: object, auth_object: object = None,
-                 creds: dict = None, base_url: str = "https://api.crowdstrike.com",
-                 proxy: dict = None, **kwargs) -> object:
-        """Service Class base constructor.
-
-        Instantiates the object, ingests authorization credentials,
-        and initializes attributes.
-
-        Keyword arguments:
-        access_token: Token string to use for all requests performed.
-                      Mutually exclusive to all other authentication elements.
-        auth_object: Properly authenticated instance of the OAuth2 Authentication service class.
-        base_url: CrowdStrike API URL to use for requests. [Default: US-1]
-        ssl_verify: Boolean specifying if SSL verification should be used or string representing
-                    the path to a CA_BUNDLE file or directory of trusted certificates.
-                    Default: True
-        proxy: Dictionary of proxies to be used for requests.
-        timeout: Float or tuple specifying timeouts to use for requests.
-        creds: Dictionary containing CrowdStrike API credentials.
-               Mutually exclusive to client_id / client_secret.
-               {
-                   "client_id": "CLIENT_ID_HERE",
-                   "client_secret": "CLIENT_SECRET_HERE",
-                   "member_cid": "CHILD_CID_MSSP_ONLY"
-               }
-        client_id: Client ID for the CrowdStrike API. Mutually exclusive to creds.
-        client_secret: Client Secret for the CrowdStrike API. Mutually exclusive to creds.
-        member_cid: CID of the child account to authenticate to (MSSP only)
-        validate_payload: Boolean specifying if body payloads should be validated.
-                          Defaults to True.
-        user_agent: User-Agent string to use for all requests made to the CrowdStrike API.
-                    String. Defaults to crowdstrike-falconpy/VERSION.
-        renew_window: Amount of time (in seconds) between now and the token expiration before
-                      a refresh of the token is performed. Default: 120, Max: 1200
-                      Values over 1200 will be reset to the maximum.
-        ext_headers: Additional headers to be prepended to the default headers dictionary.
-                     Dictionary.
-
-        This method only accepts keywords to specify arguments.
-        """
-        access_token = kwargs.get("access_token", None)
-        self.ssl_verify = kwargs.get("ssl_verify", True)
-        self.timeout = kwargs.get("timeout", None)
-        self.token_renew_window = kwargs.get("renew_window", 120)
-        user_agent = kwargs.get("user_agent", None)
-        member_cid = kwargs.get("member_cid", None)
-        self.headers = kwargs.get("ext_headers", {})
-        # Currently defaulting to validation enabled
-        self.validate_payloads = kwargs.get("validate_payloads", True)
-        self.refreshable = False
-        self.token_fail_reason = None
-        self.token_status = None
-        self.auth_object = None
-        client_id = kwargs.get("client_id", None)
-        client_secret = kwargs.get("client_secret", None)
-        if client_id and client_secret and not creds:
-            # Passing client_id and client_secret will not
-            # overwrite the contents of the creds dictionary
-            creds = {
-                "client_id": client_id,
-                "client_secret": client_secret
-            }
-            if member_cid:
-                # Passing member_cid will not overwrite the
-                # existing value in the creds dictionary
-                creds["member_cid"] = member_cid
-        if auth_object:
-            # Assume they've passed us an OAuth2 object
-            self.auth_object = auth_object
-            if not isinstance(auth_object, OAuth2):
-                # If they didn't, look for one as an attribute to the object they provided.
-                for attr in [x for x in dir(auth_object) if "__" not in x]:
-                    if attr == "auth_object":
-                        self.auth_object = auth_object.auth_object
-            if not self.authenticated():
-                token_result = self.auth_object.token()
-                self.token_status = token_result["status_code"]
-                if self.token_status == 201:
-                    self.token = token_result["body"]["access_token"]
-                    self.headers["Authorization"] = f"Bearer {self.token}"
-                else:
-                    self.token = False
-                    self.token_fail_reason = self.auth_object.token_fail_reason
-            else:
-                self.token = self.auth_object.token_value
-                self.headers["Authorization"] = f"Bearer {self.token}"
-
-            self.base_url = auth_object.base_url
-            self.ssl_verify = auth_object.ssl_verify
-            self.proxy = auth_object.proxy
-            # Supports overriding user-agent per class
-            if not user_agent:
-                self.user_agent = auth_object.user_agent
-            else:
-                self.user_agent = user_agent
-            # At this point in time, you cannot override
-            # the auth_object's timeout per class instance
-            self.timeout = auth_object.timeout
-            self.refreshable = True
-        else:
-            confirmed_base = confirm_base_url(base_url)
-            self.base_url = confirmed_base
-            if creds:
-                self.auth_object = OAuth2(creds=creds,
-                                          base_url=confirmed_base,
-                                          proxy=proxy,
-                                          ssl_verify=self.ssl_verify,
-                                          timeout=self.timeout,
-                                          user_agent=user_agent,
-                                          renew_window=self.token_renew_window
-                                          )
-                token_result = self.auth_object.token()
-                self.token_status = token_result["status_code"]
-                if self.token_status == 201:
-                    self.token = token_result["body"]["access_token"]
-                    self.headers["Authorization"] = f"Bearer {self.token}"
-                    self.base_url = autodiscover_region(confirmed_base, token_result)
-                else:
-                    self.token = False
-                    self.token_fail_reason = self.auth_object.token_fail_reason
-                self.refreshable = True
-            else:
-                self.headers["Authorization"] = f"Bearer {access_token}"
-
-            self.proxy = proxy
-            self.user_agent = user_agent
-
-    def authenticated(self):
-        """Return the current authentication status."""
-        result = None
-        if self.auth_object:
-            result = self.auth_object.authenticated()
-
-        return result
-
-    def token_expired(self):
-        """Return a boolean reflecting token expiration status."""
-        result = None
-        if self.auth_object:
-            result = self.auth_object.token_expired()
-
-        return result
diff --git a/src/falconpy/_service_class/__init__.py b/src/falconpy/_service_class/__init__.py
new file mode 100644
index 000000000..5800bd407
--- /dev/null
+++ b/src/falconpy/_service_class/__init__.py
@@ -0,0 +1,41 @@
+"""FalconPy Service Class module.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from ._base_service_class import BaseServiceClass
+from ._service_class import ServiceClass
+
+__all__ = ["BaseServiceClass", "ServiceClass"]
diff --git a/src/falconpy/_service_class/_base_service_class.py b/src/falconpy/_service_class/_base_service_class.py
new file mode 100644
index 000000000..8d18b114d
--- /dev/null
+++ b/src/falconpy/_service_class/_base_service_class.py
@@ -0,0 +1,281 @@
+"""Service Class generic base class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+import inspect
+from abc import ABC, abstractmethod
+from logging import Logger, getLogger
+from typing import Dict, Type, Union, Optional
+from .._constant import MAX_DEBUG_RECORDS
+from .._auth_object import FalconInterface, UberInterface
+from .._error import FunctionalityNotImplemented
+
+
+class BaseServiceClass(ABC):
+    """Base class for all Service Classes."""
+
+    #  _______  _____  __   _ _______ _______  ______ _     _ _______ _______  _____   ______
+    #  |       |     | | \  | |______    |    |_____/ |     | |          |    |     | |_____/
+    #  |_____  |_____| |  \_| ______|    |    |    \_ |_____| |_____     |    |_____| |    \_
+    #
+    def __init__(self: "BaseServiceClass",
+                 auth_object: Optional[FalconInterface] = None,
+                 default_auth_object_class: Optional[Union[Type[FalconInterface], Type[UberInterface]]] = FalconInterface,
+                 **kwargs
+                 ):
+        """Construct an instance of the base class."""
+        # All Service Classes excluding OAuth2 contain a FalconInterface derivative
+        # as an attribute (auth_object). This object can be shared between
+        # instances of Service Classes, and is leveraged for all authentication
+        # processing. Unlike the OAuth2 and Uber Class, regular Service Classes
+        # do not maintain authentication detail outside of the auth_object.
+        # An auth_object is treated as an atomic collection.
+        if auth_object:
+            if issubclass(type(auth_object), FalconInterface):
+                self.auth_object: Union[FalconInterface, UberInterface] = auth_object
+            else:
+                # Easy Object Authentication
+                # Look for an auth_object as an attribute to the object they
+                # provided. This attribute must be a FalconInterface derivative.
+                if hasattr(auth_object, "auth_object"):
+                    if issubclass(type(auth_object.auth_object), FalconInterface):
+                        self.auth_object: Union[FalconInterface, UberInterface] = auth_object.auth_object
+        else:
+            # Get all constructor arguments for the default authentication class.
+            auth_kwargs = {
+                param: kwargs[param]
+                for param in inspect.signature(default_auth_object_class).parameters
+                if param in kwargs
+            }
+            # Create an instance of the default auth_object using the provided keywords.
+            self.auth_object: Union[FalconInterface, UberInterface] = default_auth_object_class(**auth_kwargs)
+
+        # Service Classes can enable logging individually, allowing developers to
+        # debug API activity for only that service collection within their code.
+        self._log: Optional[Union[Logger, bool]] = None
+        if kwargs.get("debug", False):
+            # Allow a Service Class to enable logging individually.
+            self._log: Logger = getLogger(__name__)
+        if kwargs.get("debug", None) is False:
+            # Allow a Service Class to disable logging individually.
+            self._log: bool = False
+        # Allow a Service Class to customize the number of debug records logged.
+        # This allows developers to individually set maximum records logged per Service Class.
+        self._debug_record_count: Optional[int] = None
+        if kwargs.get("debug_record_count", None):
+            self._debug_record_count = kwargs.get("debug_record_count", MAX_DEBUG_RECORDS)
+
+        # Should logs be sanitized - redacts client_id, client_secret, member_cid, and tokens.
+        # Performance impacts when enabled, but defaults to true to prevent unintentional
+        # sensitive data disclosure. Can be disabled with the sanitize_log keyword.
+        # Set the sanitization flag if they provided it
+        _sanitize_log = kwargs.get("sanitize_log", None)
+        if isinstance(_sanitize_log, bool):
+            self._sanitize: Optional[bool] = _sanitize_log
+        else:
+            self._sanitize: Optional[bool] = None
+
+        self._pythonic = kwargs.get("pythonic", None)
+
+    #  _______ _______ _______ _     _  _____  ______  _______
+    #  |  |  | |______    |    |_____| |     | |     \ |______
+    #  |  |  | |______    |    |     | |_____| |_____/ ______|
+    #
+    # The generic login and logout handlers must be individually defined by all
+    # inheriting classes. The default functionality provided by the embedded
+    # auth_object is a perfectly acceptable option for this, and is what is used
+    # by the standard ServiceClass object.
+    @abstractmethod
+    def login(self) -> Union[dict, bool]:
+        """Login handler abstract."""
+
+    @abstractmethod
+    def logout(self) -> Union[dict, bool]:
+        """Logout handler abstract."""
+
+    #   _____   ______  _____   _____  _______  ______ _______ _____ _______ _______
+    #  |_____] |_____/ |     | |_____] |______ |_____/    |      |   |______ |______
+    #  |       |    \_ |_____| |       |______ |    \_    |    __|__ |______ ______|
+    #
+    # These properties are present within all Service Class derivatives. These are
+    # typically maintained within the underlying auth_object, but can be overridden
+    # to implement additional functionality as necessary.
+
+    # _  _ _  _ ___ ____ ___  _    ____
+    # |\/| |  |  |  |__| |__] |    |___
+    # |  | |__|  |  |  | |__] |___ |___
+    #
+    # Changes made to these properties will effect the underlying auth_object
+    # and all Service Classes that happen to be sharing the same auth_object.
+    @property
+    def base_url(self) -> str:
+        """Provide the base_url to code that reads it straight from the service class."""
+        return self.auth_object.base_url
+
+    @base_url.setter
+    def base_url(self, value: str):
+        """Set the base_url in the underlying auth_object."""
+        self.auth_object.base_url = value
+
+    @property
+    def ssl_verify(self) -> bool:
+        """Provide the ssl_verify value to legacy code."""
+        return self.auth_object.ssl_verify
+
+    # Changing this setting will impact all traffic thru the interface.
+    @ssl_verify.setter
+    def ssl_verify(self, value: bool):
+        """Allow code to flip the underlying SSL verify flag via the this class."""
+        self.auth_object.ssl_verify = value
+
+    # _ _  _ _  _ _  _ ___ ____ ___  _    ____
+    # | |\/| |\/| |  |  |  |__| |__] |    |___
+    # | |  | |  | |__|  |  |  | |__] |___ |___
+    #
+    # These properties cannot be changed in the base implementation of a Service Class.
+    @property
+    def log(self) -> Logger:
+        """Property to expose the underlying logger of a Service Class (if enabled)."""
+        _returned = None
+        if self._log:
+            # Logging is unique for this Service Class.
+            _returned = self._log
+        elif self._log is False:
+            # Logging is forcibly disabled for this Service Class.
+            _returned = None
+        elif self.auth_object:
+            _returned = self.auth_object.log
+
+        return _returned
+
+    @property
+    # Extended via the inheriting ServiceClass class.
+    def headers(self) -> Dict[str, str]:
+        """Provide a complete set of request headers."""
+        return {**self.auth_object.auth_headers}
+
+    @property
+    def token_status(self) -> int:
+        """Provide the current token_status."""
+        return self.auth_object.token_status
+
+    @property
+    def token_fail_reason(self) -> str:
+        """Error message received on token generation failure."""
+        return self.auth_object.token_fail_reason
+
+    @property
+    def refreshable(self) -> bool:
+        """Flag indicating if the token for this auth_object is refreshable."""
+        return self.auth_object.cred_format_valid
+
+    @property
+    def debug(self) -> bool:
+        """Return a boolean if this Service Class is in debug mode."""
+        _returned = bool(self.log)
+        if not _returned:
+            _returned = bool(self.auth_object.log)
+
+        return _returned
+
+    # These properties are defined as mutable within the inheriting ServiceClass class.
+
+    @property
+    def proxy(self) -> dict:
+        """Provide the proxy from the auth_object."""
+        return self.auth_object.proxy
+
+    @proxy.setter
+    def proxy(self, _):
+        raise FunctionalityNotImplemented
+
+    @property
+    def timeout(self) -> int:
+        """Provide the timeout from the auth_object."""
+        return self.auth_object.timeout
+
+    @property
+    def renew_window(self) -> int:
+        """Provide the renew_window from the auth_object."""
+        return self.auth_object.renew_window
+
+    @property
+    def user_agent(self) -> int:
+        """Provide the user_agent from the auth_object."""
+        return self.auth_object.user_agent
+
+    @user_agent.setter
+    def user_agent(self, _):
+        raise FunctionalityNotImplemented
+
+    # Mutable
+    @property
+    def debug_record_count(self) -> int:
+        """Return the maximum number of records to log to a debug log."""
+        _returned = self.auth_object.debug_record_count
+        if isinstance(self._debug_record_count, int):
+            _returned = self._debug_record_count
+
+        return _returned
+
+    @debug_record_count.setter
+    def debug_record_count(self, value):
+        """Set the custom debug record count value for this Service Class."""
+        self._debug_record_count = value
+
+    @property
+    def sanitize_log(self) -> bool:
+        """Return a flag if log sanitization is enabled."""
+        _returned = self.auth_object.sanitize_log
+        if _returned != self._sanitize and isinstance(self._sanitize, bool):
+            _returned = self._sanitize
+        return _returned
+
+    @sanitize_log.setter
+    def sanitize_log(self, value):
+        """Enable or disable log sanitization."""
+        if self._sanitize is not None:
+            self._sanitize = value
+        else:
+            self.auth_object.sanitize_log = value
+
+    @property
+    def pythonic(self) -> bool:
+        """Return the current pythonic mode setting."""
+        _returned = self.auth_object.pythonic
+        if _returned != self._pythonic and isinstance(self._pythonic, bool):
+            _returned = self._pythonic
+        return _returned
diff --git a/src/falconpy/_service_class/_service_class.py b/src/falconpy/_service_class/_service_class.py
new file mode 100644
index 000000000..54003449a
--- /dev/null
+++ b/src/falconpy/_service_class/_service_class.py
@@ -0,0 +1,292 @@
+"""Service Class generic class.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Dict, Type, Optional
+from ._base_service_class import BaseServiceClass
+from .._auth_object import FalconInterface
+from .._util import log_class_startup
+from ..oauth2 import OAuth2
+
+
+class ServiceClass(BaseServiceClass):
+    r"""This is the Falconpy standard Service Class base class.
+
+    This class inherits all functionality provided by the BaseServiceClass object.
+    All current Service Classes (as of v1.3.0) inherit from this base class.
+
+    ┌──────────────────────┐
+    │     Encapsulated     ├─── Attributes
+    │  Service Base Class  ├─── Constructor (__init__)
+    │                      ├─── Methods (helpers)
+    │    ______________    ├─── Properties
+    └──/│ Inherited by │\──┘
+      /─┴──────────────┴─\
+      │ Service  Classes ├─── Methods (API operations)
+      └──────────────────┘
+
+    This class is intended to be inherited by a class that represents a
+    CrowdStrike API service collection.
+    """
+
+    # ____ ____ _  _ ____ ___ ____ _  _ ____ ___ ____ ____
+    # |    |  | |\ | [__   |  |__/ |  | |     |  |  | |__/
+    # |___ |__| | \| ___]  |  |  \ |__| |___  |  |__| |  \
+    #
+    # Override the default auth_object class to be our extended Service Class
+    # object (OAuth2). Implement extended headers and payload validation and
+    # provide a solution for maintaining instantiated class specific properties.
+    #
+    def __init__(self: "ServiceClass",
+                 auth_object: Optional[FalconInterface or OAuth2] = None,
+                 default_auth_object_class: Optional[Type[FalconInterface]] = OAuth2,
+                 **kwargs
+                 ):
+        """Service Class base constructor.
+
+        Instantiates the object, ingests authorization, and initializes attributes.
+
+        Keyword arguments
+        ----
+        access_token : str
+            Token string to use for all requests performed.
+            Mutually exclusive to all other authentication elements.
+        auth_object : object (FalconInterface derivative)
+            Properly authenticated instance of an authentication backend,
+            such as the OAuth2 Service Class.
+        base_url : str
+            CrowdStrike API URL to use for requests. [Default: US-1]
+        ext_headers : dict
+            Additional headers to be prepended to the default headers dictionary.
+        ssl_verify : bool
+            Flag specifying if SSL verification should be used. [Default: True]
+        proxy : dict
+            Dictionary of proxies to be used for requests.
+        timeout : float or tuple
+            Timeouts to use for requests.
+        creds : dict
+            Dictionary containing CrowdStrike API credentials.
+            Mutually exclusive to client_id / client_secret.
+            {
+                "client_id": "CLIENT_ID_HERE",
+                "client_secret": "CLIENT_SECRET_HERE",
+                "member_cid": "CHILD_CID_MSSP_ONLY"
+            }
+        client_id : str
+            Client ID for the CrowdStrike API. Mutually exclusive to creds.
+        client_secret : str
+            Client Secret for the CrowdStrike API. Mutually exclusive to creds.
+        member_cid : str
+            CID of the child account to authenticate to (MSSP only)
+        validate_payload : bool
+            Flag specifying if body payloads should be validated. Defaults to True.
+        user_agent : str
+            User-Agent string to use for all requests made to the CrowdStrike API.
+            Defaults to crowdstrike-falconpy/VERSION.
+        renew_window : int
+            Amount of time (in seconds) between now and the token expiration before
+            a refresh of the token is performed. Default: 120, Max: 1200
+            Values over 1200 will be reset to the maximum.
+
+        Arguments
+        ----
+        This method only accepts keywords to specify arguments.
+
+        Returns
+        ----
+        class
+            Instance of a ServiceClass derivative.
+        """
+        super().__init__(auth_object=auth_object,
+                         default_auth_object_class=default_auth_object_class,
+                         **kwargs
+                         )
+
+        # Extended headers that can be set on a Service Class and provided
+        # with every request to the CrowdStrike API. These do not override
+        # authorization headers.
+        self.ext_headers: dict = kwargs.get("ext_headers", {})
+
+        # Minimal payload validation is included in a few Service Classes.
+        # This defaults to True but is not heavily used as ingested keywords
+        # are reviewed by the parameter and body payload abstraction handlers.
+        # Currently retained as we may leverage the functionality to provide
+        # expanded required value validation in future versions.
+        self.validate_payloads: bool = kwargs.get("validate_payloads", True)
+
+        # These private attributes are used to store instantiated class-specific
+        # settings for the proxy, timeout and user_agent properties. This results
+        # in our being able to use multiple Service Classes that share the same
+        # auth_object but maintain different connection handling configurations.
+        self._override_proxy: Dict[str, str] = None
+        self._override_timeout: int = None
+        self._override_user_agent: str = None
+
+        # The following properties can be overridden per Service Class.
+        for item in ["proxy", "timeout", "user_agent"]:
+            if kwargs.get(item, None) is not None:
+                setattr(self, f"_override_{item}", kwargs.get(item))
+
+        # Service Classes automatically log themselves in upon instantiation
+        # if no authentication status is present.
+        if not self.token_status:
+            self.login()
+
+        # Log the creation of this Service Class if debugging is enabled.
+        if self.log:
+            log_class_startup(self, self.log)
+
+    # _  _ ____ ___ _  _ ____ ___  ____
+    # |\/| |___  |  |__| |  | |  \ [__
+    # |  | |___  |  |  | |__| |__/ ___]
+    #
+    # Provide our required login and logout method handlers.
+    def login(self) -> dict:
+        """Login to the CrowdStrike API by requesting a new token."""
+        return self.auth_object.login()
+
+    def logout(self) -> dict:
+        """Logout from the CrowdStrike API by revoking the current token."""
+        return self.auth_object.logout()
+
+    # Legacy property getters maintained for backwards functionality.
+    def authenticated(self) -> bool:
+        """Return the current authentication status."""
+        return self.auth_object.authenticated
+
+    def token_expired(self) -> bool:
+        """Return a boolean reflecting token expiration status."""
+        return self.auth_object.token_expired
+
+    # ___  ____ ____ ___  ____ ____ ___ _ ____ ____
+    # |__] |__/ |  | |__] |___ |__/  |  | |___ [__
+    # |    |  \ |__| |    |___ |  \  |  | |___ ___]
+    #
+    # Allow these mutable properties to be set per Service Class in memory.
+    @property
+    def proxy(self) -> dict:
+        """Provide the proxy from the auth_object if it's not been set."""
+        if self._override_proxy:
+            returned = self._override_proxy
+        else:
+            returned = self.auth_object.proxy
+
+        return returned
+
+    @proxy.setter
+    def proxy(self, value: dict):
+        """Allow the proxy to be changed for this instance of the class."""
+        self._override_proxy = value
+
+    @property
+    def timeout(self) -> int:
+        """Provide the timeout from the auth_object if it's not been set."""
+        if self._override_timeout:
+            returned = self._override_timeout
+        else:
+            returned = self.auth_object.timeout
+
+        return returned
+
+    @timeout.setter
+    def timeout(self, value: int):
+        """Allow the timeout to be changed for this instance of the class."""
+        self._override_timeout = value
+
+    @property
+    def renew_window(self) -> int:
+        """Provide the renew_window from the auth_object."""
+        return self.auth_object.renew_window
+
+    @renew_window.setter
+    def renew_window(self, value: int):
+        """Allow the renew_window to be changed.
+
+        Changing this value will impact the renew window for all classes
+        using this auth_object.
+        """
+        self.auth_object.renew_window = value
+
+    @property
+    def token_renew_window(self) -> int:
+        """Return the current renew window from the auth_object.
+
+        DEPRECATED: This property recreates a legacy attribute.
+        Developers should update code to make use of the `renew_window` property.
+        """
+        return self.auth_object.renew_window
+
+    @token_renew_window.setter
+    def token_renew_window(self, value: int):
+        """Allow the renew_window to be changed.
+
+        DEPRECATED: This property recreates a legacy attribute.
+        Developers should update code to make use of the `renew_window` property.
+        """
+        self.auth_object.renew_window = value
+
+    @property
+    def user_agent(self) -> int:
+        """Provide the user_agent from the auth_object if it's not been set."""
+        if self._override_user_agent:
+            returned = self._override_user_agent
+        else:
+            returned = self.auth_object.user_agent
+
+        return returned
+
+    @user_agent.setter
+    def user_agent(self, value: int):
+        """Allow the user_agent to be changed for this instance of the class."""
+        self._override_user_agent = value
+
+    # Override the headers read only property to inject our ext_headers.
+    # The Uber Class accomplishes this functionality differently.
+    @property
+    def headers(self) -> Dict[str, str]:
+        """Provide a complete set of request headers."""
+        return {
+            ** self.auth_object.auth_headers,
+            ** self.ext_headers
+        }
+
+    @property
+    def token(self) -> str:
+        """Return the underlying token value from the auth_object.
+
+        This recreates pre-1.3.0 functionality.
+        """
+        return self.auth_object.token_value
diff --git a/src/falconpy/_util.py b/src/falconpy/_util.py
deleted file mode 100644
index 71cbf167a..000000000
--- a/src/falconpy/_util.py
+++ /dev/null
@@ -1,523 +0,0 @@
-"""Internal utilities library.
-
- _______                        __ _______ __        __ __
-|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
-|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
-|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
-|:  1   |                         |:  1   |
-|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
-`-------'                         `-------'
-
-OAuth2 API - Customer SDK
-
-This is free and unencumbered software released into the public domain.
-
-Anyone is free to copy, modify, publish, use, compile, sell, or
-distribute this software, either in source code form or as a compiled
-binary, for any purpose, commercial or non-commercial, and by any
-means.
-
-In jurisdictions that recognize copyright laws, the author or authors
-of this software dedicate any and all copyright interest in the
-software to the public domain. We make this dedication for the benefit
-of the public at large and to the detriment of our heirs and
-successors. We intend this dedication to be an overt act of
-relinquishment in perpetuity of all present and future rights to this
-software under copyright law.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-For more information, please refer to <https://unlicense.org>
-"""
-import base64
-import functools
-try:
-    from simplejson import JSONDecodeError
-except ImportError:
-    from json.decoder import JSONDecodeError
-import requests
-import urllib3
-from urllib3.exceptions import InsecureRequestWarning
-from ._version import _TITLE, _VERSION
-from ._result import Result, ExpandedResult
-from ._base_url import BaseURL
-from ._container_base_url import ContainerBaseURL
-from ._uber_default_preference import PREFER_NONETYPE, MOCK_OPERATIONS
-urllib3.disable_warnings(InsecureRequestWarning)
-
-# Restrict requests to only allowed HTTP methods
-_ALLOWED_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'UPDATE']
-# Default user-agent string
-_USER_AGENT = f"{_TITLE}/{str(_VERSION)}"
-
-
-def validate_payload(validator: dict, params: dict, required: list = None) -> bool:
-    """Validate parameters and body payloads sent to the API."""
-    # Repurposed with permission from
-    # https://github.com/yaleman/crowdstrike_api
-    #         __
-    #        ( (\
-    #         \ =\
-    #        __\_ `--\
-    #       (____))(  \----
-    #       (____)) _     Thanks
-    #       (____))       James!
-    #       (____))____/----
-    #
-    if required:
-        for key in required:
-            if key not in params:
-                raise ValueError(f"Argument {key} must be specified.")
-
-    for key in params:
-        if key not in validator:
-            raise ValueError(f"{key} is not a valid argument.")
-        if not isinstance(params[key], validator[key]):
-            should = validator[key]
-            was = type(params[key])
-            raise TypeError(f"{key} is not the valid type. Should be: {should}, was {was}")
-
-    return True
-
-
-def generate_b64cred(client_id: str, client_secret: str) -> str:
-    """base64 encodes passed client_id and client_secret for authorization headers."""
-    cred = f"{client_id}:{client_secret}"
-    b64_byt = base64.b64encode(cred.encode("ascii"))
-    encoded = b64_byt.decode("ascii")
-
-    return encoded
-
-
-def handle_single_argument(passed_arguments: list, passed_keywords: dict, search_key: str) -> dict:
-    """Handle a single argument that is provided without keywords.
-
-    Reviews arguments passed to a method and injects them into the keyword dictionary if they
-    match the search string.
-    """
-    if len(passed_arguments) > 0:
-        passed_keywords[search_key] = passed_arguments[0]
-
-    return passed_keywords
-
-
-def force_default(defaults: list, default_types: list = None):
-    """Force default values.
-
-    Intended to decorate other functions.
-
-    Keyword arguments:
-    defaults = list of values to default
-    default_types = list of types to default the values to
-
-    Example: @force_default(defaults=["parameters], default_types=["dict"])
-    """
-    if not default_types:
-        default_types = []
-
-    def wrapper(func):
-        """Inner wrapper."""
-        @functools.wraps(func)
-        def factory(*args, **kwargs):
-            """Parameter factory.
-
-            This method is a factory and runs through keywords passed to the called function,
-            setting defaults on values within the **kwargs dictionary when necessary
-            as specified in our "defaults" list that is passed to the parent wrapper.
-            """
-            element_count = 0   # Tracker so we can retrieve matching data types
-            # Loop through every element specified in our defaults list
-            for element in defaults:
-                if element in kwargs:
-                    # It exists but it's a NoneType
-                    if kwargs.get(element) is None:
-                        kwargs[element] = get_default(default_types, element_count)
-                else:
-                    # Not present whatsoever
-                    kwargs[element] = get_default(default_types, element_count)
-                # Increment our tracker for our sibling default_types list
-                element_count += 1
-
-            try:
-                created = func(*args, **kwargs)
-            except TypeError:
-                # They passed us an argument but did not specify what it was (non-keyword) [Issue #263]
-                created = generate_error_result("Keyword arguments must be used for this method.")
-
-            return created
-        return factory
-    return wrapper
-
-
-def service_request(caller: object = None, **kwargs) -> object:  # May return dict or object datatypes
-    """Check for token expiration, refresh if possible and then perform the request."""
-    if caller:
-        try:
-            if caller.auth_object:
-                if caller.auth_object.token_expired():
-                    auth_response = caller.auth_object.token()
-                    if auth_response["status_code"] == 201:
-                        caller.headers['Authorization'] = f"Bearer {auth_response['body']['access_token']}"
-                    else:
-                        caller.headers['Authorization'] = "Bearer "
-                else:
-                    caller.headers['Authorization'] = f"Bearer {caller.auth_object.token_value}"
-        except AttributeError:
-            pass
-
-        try:
-            proxy = caller.proxy
-        except AttributeError:
-            proxy = None
-
-        try:
-            timeout = caller.timeout
-        except AttributeError:
-            timeout = None
-
-        try:
-            user_agent = caller.user_agent
-        except AttributeError:
-            user_agent = None
-
-    returned = perform_request(proxy=proxy, timeout=timeout, user_agent=user_agent, **kwargs)
-
-    return returned
-
-
-@force_default(defaults=["headers"], default_types=["dict"])
-def perform_request(endpoint: str = "",  # pylint: disable=R0912
-                    headers: dict = None,
-                    **kwargs
-                    ) -> object:  # May return dict or object data types
-    """Leverage the requests library to perform the requested CrowdStrike OAuth2 API operation.
-
-    Keyword arguments:
-    method: str - HTTP method to use when communicating with the API
-        - Example: GET, POST, PATCH, DELETE or UPDATE
-    endpoint: str - API endpoint, including the URL base
-        - Example: https://api.crowdstrike.com/oauth2/revoke
-    headers: dict - HTTP headers to send to the API
-        - Example: {"AdditionalHeader": "AdditionalValue"}
-    params: dict - HTTP query string parameters to send to the API
-        - Example: {"limit": 1, "sort": "state.asc"}
-    body: dict - HTTP body payload to send to the API
-        - Example: {"ids": ["123456789abcdefg", "987654321zyxwvutsr"]}
-    verify: bool - Enable / Disable SSL certificate checks
-        - Example: True
-    data - Encoded data to send to the API
-        - Example: PAYLOAD = open(FILENAME, 'rb').read()
-    files: list - List of files to upload
-        - Example: [('file',('testfile2.jpg',open('testfile2.jpg','rb'),'image/jpeg'))]
-    body_validator: dict - Dictionary containing payload to be validated for the requested operation (key / datatype)
-        - Example: { "limit": int, "offset": int, "filter": str}
-    body_required: list - List of payload parameters required by the requested operation
-        - Example: ["ids"]
-    proxy: dict - Dictionary containing a list of proxies to use for requests
-        - Example: {"https": "https://myproxy.com:4000", "http": "http://myhttpproxy:80"}
-    timeout: float or tuple
-        Float representing the global timeout for requests or a tuple containing the connect / read timeouts.
-        - Example: 30
-        - Example: (5.05, 25)
-    user_agent: string
-        - Example: companyname-integrationname/version
-    expand_result: bool - Enable expanded results output
-        - Example: True
-    container: bool - Is this request being sent to a Falcon Container registry endpoint
-        - Example: False
-    """
-    method = kwargs.get("method", "GET")
-    body = kwargs.get("body", None)
-    body_validator = kwargs.get("body_validator", None)
-    user_agent = kwargs.get("user_agent", None)
-    expand_result = kwargs.get("expand_result", False)
-    perform = True
-    if method.upper() in _ALLOWED_METHODS:
-        # Validate parameters
-        # 05.21.21/JSH - Param validation is now handled by the updated args_to_params method
-
-        # Validate body payload
-        if body_validator:
-            try:
-                validate_payload(body_validator, body, kwargs.get("body_required", None))
-            except ValueError as err:
-                returned = generate_error_result(message=f"{str(err)}")
-                perform = False
-            except TypeError as err:
-                returned = generate_error_result(message=f"{str(err)}")
-                perform = False
-
-        # Perform the request
-        if perform:
-            if user_agent:
-                headers["User-Agent"] = user_agent
-            else:
-                headers["User-Agent"] = _USER_AGENT  # Force all requests to pass the User-Agent identifier
-            headers["CrowdStrike-SDK"] = _USER_AGENT
-            try:
-                response = requests.request(method.upper(), endpoint, params=kwargs.get("params", None),
-                                            headers=headers, json=kwargs.get("body", None), data=kwargs.get("data", None),
-                                            files=kwargs.get("files", []), verify=kwargs.get("verify", True),
-                                            proxies=kwargs.get("proxy", None), timeout=kwargs.get("timeout", None)
-                                            )
-                # Force binary when content-type is not provided
-                returning_content_type = response.headers.get('content-type', "Binary")
-                if returning_content_type.startswith("application/json"):  # Issue 708
-                    content_return = Result()(response.status_code, response.headers, response.json())
-                elif kwargs.get("container", False):
-                    content_return = Result()(response.status_code, response.headers, response.json())
-                else:
-                    content_return = response.content
-                # Expanded results allow for status code and header checks on binary returns
-                if expand_result:
-                    returned = ExpandedResult()(response.status_code, response.headers, content_return)
-                else:
-                    returned = content_return
-
-            except JSONDecodeError:  # pragma: no cover
-                # No response content, but a successful request was made
-                returned = generate_ok_result(
-                    message="No content returned",
-                    code=response.status_code,
-                    headers=response.headers
-                    )
-            except Exception as err:  # pylint: disable=W0703  # General catch-all for anything coming out of requests
-                returned = generate_error_result(message=f"{str(err)}")
-    else:
-        returned = generate_error_result(message="Invalid API operation specified.", code=405)
-
-    return returned
-
-
-def generate_error_result(
-        message: str = "An error has occurred. Check your payloads and try again.",
-        code: int = 500,
-        **kwargs
-        ) -> dict:
-    """Normalize error messages."""
-    return_headers = kwargs.get("headers", {})
-    return Result()(status_code=code, headers=return_headers, body={"errors": [{"message": f"{message}"}], "resources": []})
-
-
-def generate_ok_result(message: str = "Request returned with success", code: int = 200, **kwargs) -> dict:
-    """Normalize OK messages."""
-    return_headers = kwargs.get("headers", {})
-    return Result()(status_code=code, headers=return_headers, body={"message": message, "resources": []})
-
-
-def get_default(types: list, position: int):
-    """I determine the requested default data type and return it."""
-    default_value_names = ["list", "str", "int", "dict", "bool"]
-    default_value_types = [[], "", 0, {}, False]
-    value_count = 0
-    retval = {}  # Default to dictionary data type as that is our most often used
-    for type_ in default_value_names:
-        try:
-            if type_ in types[position]:
-                retval = default_value_types[value_count]
-        except IndexError:
-            # Data type not specified, fall back to dictionary
-            pass
-        value_count += 1
-
-    return retval
-
-
-def args_to_params(payload: dict, passed_arguments: dict, endpoints: list, epname: str) -> dict:
-    """Query String parameter abstraction handler.
-
-    This function reviews arguments passed to the function against arguments accepted by the
-    endpoint. If a valid argument is passed, it is added and returned as part of the QueryString
-    payload dictionary.
-
-    This function will convert passed comma-delimited strings to list data types when necessary.
-
-    The method only handles QueryString parameters, and will skip any Body payload parameters it
-    encounters.
-
-    When using override functionality via the Uber class, this method skips processing. (Override
-    functionality does not support QueryString parameter abstraction.)
-
-    Keyword arguments:
-    payload -- Existing QueryString parameter payload. Dictionary.
-    passed_arguments -- Keywords provided to the calling method.
-    endpoints -- List of API endpoints available to the calling method.
-    epname -- Operation ID to be retrieved from the endpoints list.
-
-    Returns: dictionary representing QueryString parameters.
-    """
-    returned_payload = {}
-    if epname != "Manual":  # pylint: disable=R1702
-        for arg in passed_arguments:
-            eps = [ep[5] for ep in endpoints if epname == ep[0]][0]
-            try:
-                argument = [param for param in eps if param["name"] == arg][0]
-                if argument:
-                    arg_name = argument["name"]
-                    if "type" in argument:  # Body payload parameters do not have a type field
-                        if argument["type"] == "array":
-                            if isinstance(passed_arguments[arg_name], (str)):
-                                passed_arguments[arg_name] = passed_arguments[arg_name].split(",")
-                        # More data type validation can go here
-                        payload[arg_name] = passed_arguments[arg_name]
-            except IndexError:
-                # Unrecognized argument
-                pass
-
-    # Clean up reserved word conversions when passing in an invalid raw payload
-    if payload:
-        for element in payload:
-            if not isinstance(element, str):
-                returned_payload[element.__name__] = payload[element]
-            else:
-                returned_payload[element] = payload[element]
-
-    return returned_payload
-
-
-def process_service_request(calling_object: object,  # pylint: disable=R0914 # (19/15)
-                            endpoints: list,
-                            operation_id: str,
-                            **kwargs
-                            ) -> dict:
-    """Perform a request originating from a service class module.
-
-    Calculates the target_url based upon the provided operation ID and endpoint list.
-
-    Keyword arguments:
-    endpoints -- list - List of service class endpoints, defined as Endpoints in a service class. [required]
-    operation_id -- The name of the operation ID. Normally this is also the function name from the service class. [required]
-    method -- HTTP method to execute. GET, POST, PATCH, DELETE, PUT accepted. Defaults to GET.
-    keywords -- Dictionary of kwargs that were passed to the function within the service class.
-    params -- Dictionary of parameters passed to the service class function.
-    headers -- Dictionary of headers passed to and calculated by the service class function.
-    body -- Dictionary representing the body payload passed to the service class function.
-    data -- Dictionary representing the data payload passed to the service class function.
-    files -- List of files to be uploaded.
-    partition -- ID of the partition to open (Event Streams API)
-    distinct_field -- Field name to retrieve distinct values for (Sensor Update Policies API)
-    image_id -- Image ID to be deleted (Falcon Container API)
-    body_validator -- Dictionary containing details regarding body payload validation
-    body_required -- List of required body payload parameters
-    expand_result -- Request expanded results output
-    """
-    target_endpoint = [ep for ep in endpoints if operation_id == ep[0]][0]
-    base_url = calling_object.base_url
-    container = False
-    if operation_id in MOCK_OPERATIONS:
-        for base in [burl for burl in dir(BaseURL) if "__" not in burl]:
-            if BaseURL[base].value == calling_object.base_url.replace("https://", ""):
-                base_url = f"https://{ContainerBaseURL[base].value}"
-                container = True
-    target_url = f"{base_url}{target_endpoint[2]}"
-    target_method = target_endpoint[1]
-    passed_partition = kwargs.get("partition", None)
-    if passed_partition or isinstance(passed_partition, int):
-        target_url = target_url.format(str(passed_partition))
-    passed_distinct_field = kwargs.get("distinct_field", None)
-    if passed_distinct_field:
-        target_url = target_url.format(str(passed_distinct_field))
-    passed_image_id = kwargs.get("image_id", None)
-    if passed_image_id:
-        target_url = target_url.format(str(passed_image_id))
-    # Retrieve our keyword arguments
-    passed_keywords = kwargs.get("keywords", None)
-    passed_params = kwargs.get("params", None)
-    parameter_payload = None
-    if passed_keywords or passed_params:
-        parameter_payload = args_to_params(passed_params, passed_keywords, endpoints, operation_id)
-    passed_headers = kwargs.get("headers", None) if kwargs.get("headers", None) else calling_object.headers
-    expand_result = passed_keywords.get("expand_result", False) if passed_keywords else kwargs.get("expand_result", False)
-    new_keywords = {
-        "caller": calling_object,
-        "method": target_method,
-        "endpoint": target_url,
-        "verify": calling_object.ssl_verify,
-        "headers": passed_headers,
-        "params": parameter_payload,
-        "body": kwargs.get("body", None),
-        "data": kwargs.get("data", None),
-        "files": kwargs.get("files", None),
-        "body_validator": kwargs.get("body_validator", None),
-        "body_required": kwargs.get("body_required", None),
-        "expand_result": expand_result,
-        "container": container
-    }
-
-    return service_request(**new_keywords)
-
-
-def confirm_base_url(provided_base: str = "https://api.crowdstrike.com") -> str:
-    """Confirm the passed base_url value matches URL syntax.
-
-    If it does not, it is looked up in the BaseURL enum. If the value is not found
-    within the enum, https:// is prepended to the value and then it is used for API requests.
-    """
-    # Assume they passed a full URL
-    returned_base = provided_base
-    if "://" not in provided_base:
-        # They're passing the name instead of the URL
-        dashed_bases = ["US-1", "US-2", "EU-1", "US-GOV-1"]
-        if provided_base.upper() in dashed_bases:
-            provided_base = provided_base.replace("-", "")  # Strip the dash
-        try:
-            returned_base = f"https://{BaseURL[provided_base.upper()].value}"
-        except KeyError:
-            # Invalid base URL name, fall back to assuming they didn't give us https
-            returned_base = f"https://{provided_base}"
-
-    if returned_base[-1] == "/":  # Issue 558
-        returned_base = returned_base[:-1]
-
-    return returned_base
-
-
-def confirm_base_region(provided_base_url: str = "https://api.crowdstrike.com") -> str:
-    """Retrieve the base url shortname based upon the provided base url value."""
-    try:
-        shortname = BaseURL(provided_base_url.replace("https://", "").lower()).name
-    except (KeyError, ValueError):
-        shortname = "US1"  # Fall back to US-1
-
-    return shortname
-
-
-def return_preferred_default(method_name: str = None, keyword_type: str = "dict"):
-    """Use the PREFER_NONETYPE list lookup to determine the default to use for empty payloads."""
-    default_return = {}
-    if method_name:
-        if keyword_type.lower() == "list":
-            default_return = []
-        if method_name in PREFER_NONETYPE:
-            default_return = None
-
-    return default_return
-
-
-def base_url_regions():
-    """Return a list of available Base URL regions."""
-    return [bu.name for bu in BaseURL]
-
-
-def autodiscover_region(provided_base_url: str, auth_result: dict):
-    """Autodiscovers the correct region for the token response."""
-    new_base_url = confirm_base_url(provided_base_url)
-    # Swap to the correct region if they've provided the incorrect one
-    if "X-Cs-Region" not in auth_result["headers"]:  # pragma: no cover
-        # Starting in v1.2.4, us-gov-1 headers are returned
-        # but autoselection is still unsupported
-        token_region = confirm_base_region(confirm_base_url(provided_base_url))
-    else:
-        token_region = auth_result["headers"]["X-Cs-Region"].replace("-", "")
-    if token_region.upper() in base_url_regions():
-        requested_region = confirm_base_region(confirm_base_url(provided_base_url))
-        if token_region != requested_region:
-            new_base_url = confirm_base_url(token_region.upper())
-
-    return new_base_url
diff --git a/src/falconpy/_util/__init__.py b/src/falconpy/_util/__init__.py
new file mode 100644
index 000000000..06fdcc53a
--- /dev/null
+++ b/src/falconpy/_util/__init__.py
@@ -0,0 +1,77 @@
+"""FalconPy utility module.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from ._auth import login_payloads, logout_payloads
+from ._functions import (
+    validate_payload,
+    generate_b64cred,
+    handle_single_argument,
+    force_default,
+    service_request,
+    perform_request,
+    generate_error_result,
+    generate_ok_result,
+    get_default,
+    args_to_params,
+    process_service_request,
+    confirm_base_url,
+    confirm_base_region,
+    return_preferred_default,
+    base_url_regions,
+    autodiscover_region,
+    sanitize_dictionary,
+    calc_content_return,
+    log_class_startup,
+    _ALLOWED_METHODS
+)
+from ._uber import (
+    create_uber_header_payload,
+    handle_body_payload_ids,
+    scrub_target,
+    handle_container_operations,
+    uber_request_keywords,
+)
+
+__all__ = ["create_uber_header_payload", "handle_body_payload_ids", "scrub_target",
+           "handle_container_operations", "uber_request_keywords", "autodiscover_region",
+           "validate_payload", "generate_b64cred", "handle_single_argument", "force_default",
+           "service_request", "perform_request", "generate_error_result", "generate_ok_result",
+           "get_default", "args_to_params", "process_service_request", "confirm_base_url",
+           "confirm_base_region", "return_preferred_default", "base_url_regions",
+           "_ALLOWED_METHODS", "login_payloads", "logout_payloads", "sanitize_dictionary",
+           "calc_content_return", "log_class_startup"
+           ]
diff --git a/src/falconpy/_util/_auth.py b/src/falconpy/_util/_auth.py
new file mode 100644
index 000000000..f98c9b555
--- /dev/null
+++ b/src/falconpy/_util/_auth.py
@@ -0,0 +1,74 @@
+"""Internal authentication utilities library.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from ._functions import generate_b64cred
+from .._endpoint._oauth2 import _oauth2_endpoints as AuthEndpoints
+
+
+def login_payloads(creds: dict, base: str):
+    """Craft the necessary payloads to generate a token.
+
+    This method is intentionally generic and does not necessarily need to
+    be used to generate the token currently being used for other API operations.
+    """
+    op_id = "oauth2AccessToken"
+    target = f"{base}{[ep[2] for ep in AuthEndpoints if op_id in ep[0]][0]}"
+    data = {
+        'client_id': creds['client_id'],
+        'client_secret': creds['client_secret']
+    }
+    if "member_cid" in creds:
+        data["member_cid"] = creds["member_cid"]
+
+    return op_id, target, data
+
+
+def logout_payloads(creds: dict, base: str, token_val: str, client_id: str = None):
+    """Craft the necessary payloads to revoke a token.
+
+    This method is intentionally generic and does not necessarily need to
+    be used to revoke the token currently being used for other API operations.
+    """
+    op_id = "oauth2RevokeToken"
+    target = f"{base}{[ep[2] for ep in AuthEndpoints if op_id in ep[0]][0]}"
+    b64cred = generate_b64cred(creds["client_id"], creds["client_secret"])
+    headers = {"Authorization": f"basic {b64cred}"}
+    data = {"token": f"{token_val}"}
+    if client_id:
+        data["client_id"] = client_id
+
+    return op_id, target, data, headers
diff --git a/src/falconpy/_util/_functions.py b/src/falconpy/_util/_functions.py
new file mode 100644
index 000000000..6dd1d62af
--- /dev/null
+++ b/src/falconpy/_util/_functions.py
@@ -0,0 +1,783 @@
+"""Internal utilities library.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+import base64
+import functools
+from warnings import warn
+from json import loads
+try:
+    from simplejson import JSONDecodeError
+except ImportError:
+    from json.decoder import JSONDecodeError
+from typing import Dict, Any, Union, Optional, List
+from copy import deepcopy
+from logging import Logger
+import requests
+import urllib3
+from urllib3.exceptions import InsecureRequestWarning
+from .._api_request import APIRequest
+from .._enum import BaseURL, ContainerBaseURL
+from .._constant import (
+    PREFER_NONETYPE,
+    MOCK_OPERATIONS,
+    ALLOWED_METHODS as _ALLOWED_METHODS,
+    USER_AGENT as _USER_AGENT,
+    MAX_DEBUG_RECORDS,
+    GLOBAL_API_MAX_RETURN
+)
+from .._error import (
+    RegionSelectError,
+    SDKError,
+    InvalidMethod,
+    KeywordsOnly,
+    APIError,
+    NoContentWarning,
+    PayloadValidationError,
+    InvalidBaseURL,
+    SSLDisabledWarning
+    )
+from .._result import Result
+urllib3.disable_warnings(InsecureRequestWarning)
+
+
+def validate_payload(validator: Dict[str, Any],
+                     payload: Dict[str, Union[str, int, dict, list, bytes]],
+                     required: Optional[List[str]] = None
+                     ) -> bool:
+    """Validate parameters and body payloads sent to the API."""
+    # Repurposed with permission from
+    # https://github.com/yaleman/crowdstrike_api
+    #         __
+    #        ( (\
+    #         \ =\
+    #        __\_ `--\
+    #       (____))(  \-----
+    #       (____)) _     Thanks
+    #       (____))       James!
+    #       (____))____/----
+    #
+    if required:
+        for key in required:
+            if key not in payload:
+                raise PayloadValidationError(code=400, msg=f"Argument {key} must be specified.")
+
+    for key in payload:
+        if key not in validator:
+            raise PayloadValidationError(code=400, msg=f"{key} is not a valid argument.")
+        if not isinstance(payload[key], validator[key]):
+            should = validator[key]
+            was = type(payload[key])
+            raise PayloadValidationError(code=400, msg=f"{key} is not the valid type. Should be: {should}, was {was}")
+
+    return True
+
+
+def generate_b64cred(client_id: str, client_secret: str) -> str:
+    """base64 encodes passed client_id and client_secret for authorization headers."""
+    cred = f"{client_id}:{client_secret}"
+    b64_byt = base64.b64encode(cred.encode("ascii"))
+    encoded = b64_byt.decode("ascii")
+
+    return encoded
+
+
+def handle_single_argument(passed_arguments: tuple,
+                           passed_keywords: Optional[dict] = None,
+                           search_key: Optional[str] = None
+                           ) -> dict:
+    """Handle a single argument that is provided without keywords.
+
+    Reviews arguments passed to a method and injects them into the keyword dictionary if they
+    match the search string.
+    """
+    if not passed_keywords:
+        passed_keywords: dict = {}
+    if len(passed_arguments) > 0 and search_key:
+        passed_keywords[search_key] = passed_arguments[0]
+
+    return passed_keywords
+
+
+def force_default(defaults: List[str], default_types: List[str] = None):
+    """Force default values.
+
+    Intended to decorate other functions.
+
+    Keyword arguments:
+    defaults = list of values to default
+    default_types = list of types to default the values to
+
+    Example: @force_default(defaults=["parameters"], default_types=["dict"])
+    """
+    if not default_types:
+        default_types = []
+
+    def wrapper(func):
+        """Inner wrapper."""
+        @functools.wraps(func)
+        def factory(*args, **kwargs):
+            """Parameter factory.
+
+            This method is a factory and runs through keywords passed to the called function,
+            setting defaults on values within the **kwargs dictionary when necessary
+            as specified in our "defaults" list that is passed to the parent wrapper.
+            It also wraps the protected method with an error handler.
+            """
+            element_count = 0   # Tracker so we can retrieve matching data types
+            # Loop through every element specified in our defaults list
+            for element in defaults:
+                if element in kwargs:
+                    # It exists but it's a NoneType
+                    if kwargs.get(element) is None:
+                        kwargs[element] = get_default(default_types, element_count)
+                else:
+                    # Not present whatsoever
+                    kwargs[element] = get_default(default_types, element_count)
+                # Increment our tracker for our sibling default_types list
+                element_count += 1
+
+            try:
+                # created = func(*args, **kwargs)
+                try:
+                    created = func(*args, **kwargs)
+                except TypeError as keywords_only:
+                    # They passed us an argument but did not specify
+                    # what it was (non-keyword) [Issue #263]
+                    raise KeywordsOnly from keywords_only
+            except KeywordsOnly as bad_keywords:
+                created = bad_keywords.result
+            except NoContentWarning as no_content_received:
+                created = no_content_received.result
+            except APIError as api_error:
+                # Should only receive this in pythonic mode
+                raise api_error
+            except (SDKError, InvalidMethod) as bad_sdk_command:
+                created = bad_sdk_command.result
+            return created
+        return factory
+    return wrapper
+
+
+# Caller is a derivitive of ServiceClass below, but we cannot type it until after
+# support for Python 3.6 is dropped due to the circular reference it would cause.
+def service_request(caller=None, **kwargs) -> Union[Dict[str, Union[int, dict, list]], bytes]:
+    """Prepare and then perform the request (Service Classes only).
+
+    Inbound caller argument should be a ServiceClass class or derivative.
+    """
+    if caller:
+        # EAFP
+        try:
+            proxy: Optional[Dict[str, str]] = caller.proxy
+        except AttributeError:
+            proxy = None
+
+        try:
+            timeout: Optional[int] = caller.timeout
+        except AttributeError:
+            timeout = None
+
+        try:
+            user_agent: Optional[str] = caller.user_agent
+        except AttributeError:
+            user_agent = None
+
+        try:
+            log_utility: Optional[Logger] = caller.log
+        except AttributeError:
+            log_utility = None
+
+        try:
+            debug_count: Optional[int] = caller.debug_record_count
+        except AttributeError:
+            debug_count = None
+        try:
+            do_sanitize: Optional[bool] = caller.sanitize_log
+        except AttributeError:
+            do_sanitize = None
+        try:
+            # Allow pythonic behaviors to be enabled / disabled per request
+            do_pythonic: Optional[bool] = kwargs.get("pythonic", None)
+            if not isinstance(do_pythonic, bool):
+                kwargs["pythonic"] = caller.pythonic
+            # do_pythonic: Optional[bool] = caller.pythonic
+        except AttributeError:
+            kwargs["pythonic"] = None
+
+    return perform_request(proxy=proxy,
+                           timeout=timeout,
+                           user_agent=user_agent,
+                           log_util=log_utility,
+                           debug_record_count=debug_count,
+                           sanitize=do_sanitize,
+                           **kwargs
+                           )
+
+
+# pylint: disable=R0912  # I don't disagree, but this will work for now.
+def calc_content_return(resp: requests.Response,
+                        contain: bool,
+                        auth: bool,
+                        log: Logger,
+                        pythonic_mode: bool,
+                        ) -> Union[dict, bytes]:
+    """Calculate the returned content based upon the results from the call to requests."""
+    returned = {}
+    returned_content_type = resp.headers.get('content-type', None)
+    if not returned_content_type:
+        returned_content_type = resp.headers.get("Content-Type", "Binary")
+    if log:
+        log.debug("RECEIVED: Content returned in %s format", returned_content_type)
+    if returned_content_type.startswith("application/json"):  # Issue 708
+        json_resp: Union[dict, Result] = {}
+        try:
+            json_resp = resp.json()
+        except JSONDecodeError:
+            # It says JSON in the headers but it came back to us as a binary string.
+            json_resp = loads(resp.content.decode("ascii"))
+        finally:
+            # Default behavior is to return results as a standardized dictionary.
+            returned = Result(status_code=resp.status_code,
+                              headers=resp.headers,
+                              body=json_resp
+                              ).full_return
+    elif returned_content_type.startswith("text/plain"):
+        # Assuming UTF-8 for now
+        returned = Result(resp.status_code,
+                          resp.headers,
+                          loads(resp.content.decode("utf-8"))
+                          ).full_return
+    elif contain:
+        returned = Result(resp.status_code, resp.headers, resp.json()).full_return
+    else:
+        # Binary response
+        if not resp.content:
+            if auth:
+                # Issue 433 - GovCloud autodiscovery is not supported
+                raise RegionSelectError(headers=resp.headers)
+
+            # Nothing was returned, so give them back the blank binary object
+            # Emulates < v1.3 functionality
+            returned = resp.content
+        else:
+            # returned = resp.content
+            returned = Result(resp.status_code, resp.headers, resp.content).full_return
+
+    # Catch and log API response errors
+    try:
+        if resp.status_code >= 400:
+            _message = None
+            _errors = returned.get("body", {}).get("errors", [])
+            if _errors:
+                _message = f"ERROR: {_errors[0]['message']}"
+            raise APIError(code=resp.status_code, message=_message, headers=resp.headers)
+    except APIError as api_error:
+        # Still return the payload unless we're in pythonic mode
+        if log:
+            log.error(api_error.message)
+        if pythonic_mode:
+            raise api_error
+
+    return returned, returned_content_type
+
+
+# pylint: disable=R0915
+@force_default(defaults=["headers"], default_types=["dict"])
+def perform_request(endpoint: str = "",
+                    headers: dict = None,
+                    **kwargs      # May return dict or binary data types
+                    ) -> Union[Dict[str, Union[int, Dict[str, str], Dict[str, Dict]]], bytes]:
+    """Leverage the requests library to perform the requested CrowdStrike OAuth2 API operation.
+
+    Keyword arguments:
+    method: str - HTTP method to use when communicating with the API
+        - Example: GET, POST, PATCH, DELETE or UPDATE
+    endpoint: str - API endpoint, including the URL base
+        - Example: https://api.crowdstrike.com/oauth2/revoke
+    headers: dict - HTTP headers to send to the API
+        - Example: {"AdditionalHeader": "AdditionalValue"}
+    params: dict - HTTP query string parameters to send to the API
+        - Example: {"limit": 1, "sort": "state.asc"}
+    body: dict - HTTP body payload to send to the API
+        - Example: {"ids": ["123456789abcdefg", "987654321zyxwvutsr"]}
+    verify: bool - Enable / Disable SSL certificate checks
+        - Example: True
+    data - Encoded data to send to the API
+        - Example: PAYLOAD = open(FILENAME, 'rb').read()
+    files: list - List of files to upload
+        - Example: [('file',('testfile2.jpg',open('testfile2.jpg','rb'),'image/jpeg'))]
+    body_validator: dict - Dictionary containing payload to be validated for the requested operation (key / datatype)
+        - Example: { "limit": int, "offset": int, "filter": str}
+    body_required: list - List of payload parameters required by the requested operation
+        - Example: ["ids"]
+    proxy: dict - Dictionary containing a list of proxies to use for requests
+        - Example: {"https": "https://myproxy.com:4000", "http": "http://myhttpproxy:80"}
+    timeout: float or tuple
+        Float representing the global timeout for requests or a tuple containing the connect / read timeouts.
+        - Example: 30
+        - Example: (5.05, 25)
+    user_agent: string
+        - Example: companyname-integrationname/version
+    expand_result: bool - Enable expanded results output
+        - Example: True
+    container: bool - Is this request being sent to a Falcon Container registry endpoint
+        - Example: False
+    log_util: Logger - Logging utility
+    debug_record_count: int - Maximum number of records to log in debug logs
+    authenticating: bool - This request is driving a token request
+    """
+    # Shortcut for now
+    pythonic = kwargs.get("pythonic", False)
+    api: APIRequest = APIRequest(endpoint, kwargs)
+    if not api.verify:
+        ssl_disabled = SSLDisabledWarning()
+        if pythonic:
+            warn(ssl_disabled.message, SSLDisabledWarning, stacklevel=2)
+        else:
+            api.log_warning(msg=ssl_disabled.message)
+
+    if api.method.upper() in _ALLOWED_METHODS:
+        # Validate body payload
+        if api.body_validator:
+            try:
+                validate_payload(api.body_validator, api.body_payload, api.body_required)
+            except PayloadValidationError as err:
+                api.log_error(400, err.message, err.result)
+                returned = err.result
+                api.perform = False
+
+        # Perform the request
+        if api.perform:
+            if api.user_agent:
+                headers["User-Agent"] = api.user_agent
+            else:
+                # Force all requests to pass the User-Agent identifier
+                headers["User-Agent"] = _USER_AGENT
+            headers["CrowdStrike-SDK"] = _USER_AGENT
+            try:
+                # Log our payloads if debugging is enabled
+                log_api_payloads(api, headers)
+                response = requests.request(api.method.upper(), endpoint, params=api.param_payload,
+                                            headers=headers, json=api.body_payload, data=api.data_payload,
+                                            files=api.files, verify=api.verify,
+                                            proxies=api.proxy, timeout=api.timeout
+                                            )
+                api.debug_headers = response.headers
+                content_return, returning_content_type = calc_content_return(response,
+                                                                             api.container,
+                                                                             api.authenticating,
+                                                                             api.log_util,
+                                                                             pythonic
+                                                                             )
+                # Expanded results allow for status code and
+                # header checks on binary returns.
+                # Maintained for < v1.3 syntax compatibility
+                if api.expand_result:
+                    returned = Result(response.status_code, response.headers, content_return).tupled
+                else:
+                    returned = content_return
+
+                # Log our response if debugging is enabled
+                log_api_activity(content_return, returning_content_type, api)
+
+                # !!! EXPERIMENTAL !!!
+                # This functionality is new in v1.3.0 and still experimental, mileage may vary.
+                if pythonic:
+                    if isinstance(returned, bytes):
+                        returned = Result(response.status_code, response.headers, returned)
+                    else:
+                        returned = Result(full=returned)
+
+            except RegionSelectError as bad_region:
+                # More than likely they tried to autoselect to GovCloud
+                returned = bad_region.result
+                api.log_error(returned.get("status_code"), bad_region.message, returned)
+
+            except JSONDecodeError as json_decode_error:
+                # No response content, but a successful request was made
+                api.log_warning("WARNING: No content was received for this request.")
+                raise NoContentWarning(headers=response.headers,
+                                       code=response.status_code
+                                       ) from json_decode_error
+
+            except Exception as havoc:  # pylint: disable=W0703
+                # General catch-all for anything coming          ____ ____ _ _      \\       o   o
+                # out of requests or the library itself.         |___ |--<  Y        ||      |\O/|
+                # Pass this error up to the parent try/catch                          \\      \Y/
+                # block residing within our decorator        _  _ ____ _  _ ____ ____         /W\
+                # (force_default) for handling.              |--| |--|  \/  [__] |___  !!   _|WWW|_
+                if pythonic:
+                    # Oh wait, we're pythonic, lets generate
+                    # a regular python error condition instead.
+                    raise havoc
+
+                raise SDKError(message=f"{str(havoc)}", headers=api.debug_headers) from havoc
+    else:
+        raise InvalidMethod
+
+    return returned
+
+
+def log_api_payloads(api: APIRequest, headers: dict):
+    """Log the payloads and API response to the debug log."""
+    if api.log_util:
+        _headers = headers
+        _param_payload = api.param_payload
+        _body_payload = api.body_payload
+        _data_payload = api.data_payload
+        if api.sanitize_log:
+            _headers = sanitize_dictionary(deepcopy(headers))
+            _param_payload = sanitize_dictionary(deepcopy(api.param_payload))
+            _body_payload = sanitize_dictionary(deepcopy(api.body_payload))
+            _data_payload = sanitize_dictionary(deepcopy(api.data_payload))
+        api.log_util.debug("ENDPOINT: %s (%s)", api.endpoint, api.method)
+        api.log_util.debug("HEADERS: %s", _headers)
+        api.log_util.debug("PARAMETERS: %s", _param_payload)
+        api.log_util.debug("BODY: %s", _body_payload)
+        api.log_util.debug("DATA: %s", _data_payload)
+
+
+def log_api_activity(content_return: Union[dict, bytes], content_type: str, api: APIRequest):
+    """Log the payloads and API response to the debug log."""
+    if api.log_util:
+        if isinstance(content_return, dict):
+            _status_code = content_return.get("status_code", None)
+            if _status_code:
+                api.log_util.debug("STATUS CODE: %i", _status_code)
+
+        if content_type.startswith("application/json"):
+            if api.sanitize_log:
+                api.log_util.debug("RESULT: %s", sanitize_dictionary(deepcopy(content_return), api.max_debug))
+            else:
+                api.log_util.debug("RESULT: %s", content_return)
+        elif content_type.startswith("text/plain"):
+            api.log_util.debug("RESULT: %s", content_return)
+        else:
+            api.log_util.debug("RESULT: binary response received from API")
+
+
+def generate_error_result(
+        message: str = "An error has occurred. Check your payloads and try again.",
+        code: int = 500,
+        **kwargs
+        ) -> dict:
+    """Normalize error messages."""
+    return_headers = kwargs.get("headers", {})
+    return Result()(status_code=code, headers=return_headers, body={"errors": [{"message": f"{message}"}], "resources": []})
+
+
+def generate_ok_result(message: str = "Request returned with success", code: int = 200, **kwargs) -> dict:
+    """Normalize OK messages."""
+    return_headers = kwargs.get("headers", {})
+    return Result()(status_code=code, headers=return_headers, body={"message": message, "resources": []})
+
+
+def get_default(types: list, position: int) -> Union[list, str, int, dict, bool]:
+    """I determine the requested default data type and return it."""
+    default_value_names = ["list", "str", "int", "dict", "bool"]
+    default_value_types = [[], "", 0, {}, False]
+    value_count = 0
+    retval = {}  # Default to dictionary data type as that is our most often used
+    for type_ in default_value_names:
+        try:
+            if type_ in types[position]:
+                retval = default_value_types[value_count]
+        except IndexError:
+            # Data type not specified, fall back to dictionary
+            pass
+        value_count += 1
+
+    return retval
+
+
+def args_to_params(payload: dict, passed_arguments: dict, endpoints: list, epname: str) -> dict:
+    """Query String parameter abstraction handler.
+
+    This function reviews arguments passed to the function against arguments accepted by the
+    endpoint. If a valid argument is passed, it is added and returned as part of the QueryString
+    payload dictionary.
+
+    This function will convert passed comma-delimited strings to list data types when necessary.
+
+    The method only handles QueryString parameters, and will skip any Body payload parameters it
+    encounters.
+
+    When using override functionality via the Uber class, this method skips processing. (Override
+    functionality does not support QueryString parameter abstraction.)
+
+    Keyword arguments:
+    payload -- Existing QueryString parameter payload. Dictionary.
+    passed_arguments -- Keywords provided to the calling method.
+    endpoints -- List of API endpoints available to the calling method.
+    epname -- Operation ID to be retrieved from the endpoints list.
+
+    Returns: dictionary representing QueryString parameters.
+    """
+    returned_payload = {}
+    if epname != "Manual":  # pylint: disable=R1702
+        for arg in passed_arguments:
+            eps = [ep[5] for ep in endpoints if epname == ep[0]][0]
+            try:
+                argument = [param for param in eps if param["name"] == arg][0]
+                if argument:
+                    arg_name = argument["name"]
+                    if "type" in argument:  # Body payload parameters do not have a type field
+                        if argument["type"] == "array":
+                            if isinstance(passed_arguments[arg_name], (str)):
+                                passed_arguments[arg_name] = passed_arguments[arg_name].split(",")
+                        # More data type validation can go here
+                        payload[arg_name] = passed_arguments[arg_name]
+            except IndexError:
+                # Unrecognized argument
+                pass
+
+    # Clean up reserved word conversions when passing in an invalid raw payload
+    if payload:
+        for element in payload:
+            if not isinstance(element, str):
+                returned_payload[element.__name__] = payload[element]
+            else:
+                returned_payload[element] = payload[element]
+
+    return returned_payload
+
+
+def process_service_request(calling_object,  # pylint: disable=R0914 # (19/15)
+                            endpoints: list,
+                            operation_id: str,
+                            **kwargs
+                            ) -> dict:
+    """Perform a request originating from a service class module.
+
+    Calculate the target_url based upon the provided operation ID and endpoint list.
+
+    Keyword arguments:
+    endpoints -- list - List of service class endpoints, defined as Endpoints in a service class. [required]
+    operation_id -- The name of the operation ID. Normally this is also the function name from the service class. [required]
+    method -- HTTP method to execute. GET, POST, PATCH, DELETE, PUT accepted. Defaults to GET.
+    keywords -- Dictionary of kwargs that were passed to the function within the service class.
+    params -- Dictionary of parameters passed to the service class function.
+    headers -- Dictionary of headers passed to and calculated by the service class function.
+    body -- Dictionary representing the body payload passed to the service class function.
+    data -- Dictionary representing the data payload passed to the service class function.
+    files -- List of files to be uploaded.
+    partition -- ID of the partition to open (Event Streams API)
+    distinct_field -- Field name to retrieve distinct values for (Sensor Update Policies API)
+    image_id -- Image ID to be deleted (Falcon Container API)
+    body_validator -- Dictionary containing details regarding body payload validation
+    body_required -- List of required body payload parameters
+    expand_result -- Request expanded results output
+    pythonic -- Pythonic responses
+    """
+    # Log the operation ID if we have logging enabled.
+    if calling_object.log:
+        calling_object.log.debug("OPERATION: %s", operation_id)
+    # We have to create our headers dictionary first, as authentication happens here.
+    # For scenarios where cloud region autodiscovery is leveraged, we cannot create
+    # the target URL for our call to requests until we know our correct base_url.
+    passed_headers = kwargs.get("headers", None) if kwargs.get("headers", None) else {}
+    joined_headers = {
+        ** calling_object.headers,
+        ** passed_headers
+    }
+    target_endpoint = [ep for ep in endpoints if operation_id == ep[0]][0]
+    base_url = calling_object.base_url
+    container = False
+    if operation_id in MOCK_OPERATIONS:
+        for base in [burl for burl in dir(BaseURL) if "__" not in burl]:
+            if BaseURL[base].value == calling_object.base_url.replace("https://", ""):
+                base_url = f"https://{ContainerBaseURL[base].value}"
+                container = True
+    target_url = f"{base_url}{target_endpoint[2]}"
+    target_method = target_endpoint[1]
+    passed_partition = kwargs.get("partition", None)
+    if passed_partition or isinstance(passed_partition, int):
+        target_url = target_url.format(str(passed_partition))
+    passed_distinct_field = kwargs.get("distinct_field", None)
+    if passed_distinct_field:
+        target_url = target_url.format(str(passed_distinct_field))
+    passed_image_id = kwargs.get("image_id", None)
+    if passed_image_id:
+        target_url = target_url.format(str(passed_image_id))
+    # Retrieve our keyword arguments
+    passed_keywords = kwargs.get("keywords", None)
+    passed_params = kwargs.get("params", None)
+    parameter_payload = None
+    if passed_keywords or passed_params:
+        parameter_payload = args_to_params(passed_params, passed_keywords, endpoints, operation_id)
+    expand_result = passed_keywords.get("expand_result", False) if passed_keywords else kwargs.get("expand_result", False)
+    new_keywords = {
+        "caller": calling_object,
+        "method": target_method,
+        "endpoint": target_url,
+        "verify": calling_object.ssl_verify,
+        "headers": joined_headers,
+        "params": parameter_payload,
+        "body": kwargs.get("body", None),
+        "data": kwargs.get("data", None),
+        "files": kwargs.get("files", None),
+        "body_validator": kwargs.get("body_validator", None),
+        "body_required": kwargs.get("body_required", None),
+        "expand_result": expand_result,
+        "container": container,
+        "pythonic": kwargs.get("pythonic", None),
+        "perform": True
+    }
+
+    return service_request(**new_keywords)
+
+
+def confirm_base_url(provided_base: Optional[str] = "https://api.crowdstrike.com") -> str:
+    """Confirm the passed base_url value matches URL syntax.
+
+    If it does not, it is looked up in the BaseURL enum. If the value is not found
+    within the enum, https:// is prepended to the value and then it is used for API requests.
+    """
+    # Assume they passed a full URL
+    returned_base = provided_base
+    try:
+        if "://" not in provided_base:
+            # They're passing the name instead of the URL
+            dashed_bases = ["US-1", "US-2", "EU-1", "US-GOV-1"]
+            if provided_base.upper() in dashed_bases:
+                provided_base = provided_base.replace("-", "")  # Strip the dash
+            try:
+                returned_base = f"https://{BaseURL[provided_base.upper()].value}"
+            except KeyError:
+                # Invalid base URL name, fall back to assuming they didn't give us https
+                returned_base = f"https://{provided_base}"
+
+        if returned_base[-1] == "/":  # Issue 558
+            returned_base = returned_base[:-1]
+    except (AttributeError, TypeError) as bad_base_url:
+        raise InvalidBaseURL from bad_base_url
+
+    return returned_base
+
+
+def confirm_base_region(provided_base_url: str = "https://api.crowdstrike.com") -> str:
+    """Retrieve the base url shortname based upon the provided base url value."""
+    try:
+        shortname = BaseURL(provided_base_url.replace("https://", "").lower()).name
+    except (KeyError, ValueError):
+        shortname = "US1"  # Fall back to US-1
+
+    return shortname
+
+
+def return_preferred_default(method_name: str = None, keyword_type: str = "dict"):
+    """Use the PREFER_NONETYPE list lookup to determine the default to use for empty payloads."""
+    default_return = {}
+    if method_name:
+        if keyword_type.lower() == "list":
+            default_return = []
+        if method_name in PREFER_NONETYPE:
+            default_return = None
+
+    return default_return
+
+
+def base_url_regions():
+    """Return a list of available Base URL regions."""
+    return [bu.name for bu in BaseURL]
+
+
+def autodiscover_region(provided_base_url: str, auth_result: dict):
+    """Autodiscovers the correct region for the token response."""
+    new_base_url = confirm_base_url(provided_base_url)
+    # Swap to the correct region if they've provided the incorrect one
+    if "X-Cs-Region" not in auth_result["headers"]:  # pragma: no cover
+        # Starting in v1.2.4, us-gov-1 headers are returned
+        # but autoselection is still unsupported
+        token_region = confirm_base_region(confirm_base_url(provided_base_url))
+    else:
+        token_region = auth_result["headers"]["X-Cs-Region"].replace("-", "")
+    if token_region.upper() in base_url_regions():
+        requested_region = confirm_base_region(confirm_base_url(provided_base_url))
+        if token_region != requested_region:
+            new_base_url = confirm_base_url(token_region.upper())
+
+    return new_base_url
+
+
+def sanitize_dictionary(dirty: Any, record_max: int = MAX_DEBUG_RECORDS) -> dict:
+    """Strip confidential data from logged dictionaries."""
+    cleaned = dirty
+    if isinstance(dirty, dict):  # pylint: disable=R1702
+        # cleaned = deepcopy(dict(dirty))
+        redacted = ["access_token", "client_id", "client_secret", "member_cid", "token"]
+        for redact in redacted:
+            if redact in cleaned:
+                cleaned[redact] = "REDACTED"
+            if "body" in cleaned:
+                if redact in cleaned["body"]:
+                    cleaned["body"][redact] = "REDACTED"
+                if "resources" in cleaned["body"]:
+                    # Log results are limited to MAX_DEBUG_RECORDS
+                    # number of items within the resources list
+                    if cleaned["body"]["resources"]:
+                        if isinstance(cleaned["body"]["resources"], list):
+                            del cleaned["body"]["resources"][max(1, min(record_max,
+                                                                        GLOBAL_API_MAX_RETURN
+                                                                        )):]
+        if "Authorization" in cleaned:
+            cleaned["Authorization"] = "Bearer REDACTED"
+
+    return cleaned
+
+
+# Python 3.6 compatibility warning: Cannot properly type the interface.
+def log_class_startup(interface, log_device: Logger):
+    """Log the startup of one of our interface or Service Classes."""
+    log_device.debug("CREATED: %s interface class", interface.__class__.__name__)
+    log_device.debug("CONFIG: Base URL set to %s", interface.base_url)
+    log_device.debug("CONFIG: SSL verification is set to %s", str(interface.ssl_verify))
+    log_device.debug("CONFIG: Timeout set to %s seconds", str(interface.timeout))
+    log_device.debug("CONFIG: Proxy dictionary: %s", str(interface.proxy))
+    log_device.debug("CONFIG: User-Agent string set to: %s", interface.user_agent)
+    log_device.debug("CONFIG: Token renewal window set to %s seconds",
+                     str(interface.renew_window)
+                     )
+    log_device.debug("CONFIG: Maximum number of records to log: %s",
+                     interface.debug_record_count
+                     )
+    log_device.debug(
+        "CONFIG: Log sanitization is %s", "enabled" if interface.sanitize_log else "disabled"
+        )
+    log_device.debug(
+        "CONFIG: Pythonic responses are %s", "enabled" if interface.pythonic else "disabled"
+        )
diff --git a/src/falconpy/_util/_uber.py b/src/falconpy/_util/_uber.py
new file mode 100644
index 000000000..fa4d862a9
--- /dev/null
+++ b/src/falconpy/_util/_uber.py
@@ -0,0 +1,137 @@
+"""FalconPy Uber Class helper methods.
+
+ _______                        __ _______ __        __ __
+|   _   .----.-----.--.--.--.--|  |   _   |  |_.----|__|  |--.-----.
+|.  1___|   _|  _  |  |  |  |  _  |   1___|   _|   _|  |    <|  -__|
+|.  |___|__| |_____|________|_____|____   |____|__| |__|__|__|_____|
+|:  1   |                         |:  1   |
+|::.. . |   CROWDSTRIKE FALCON    |::.. . |    FalconPy
+`-------'                         `-------'
+
+OAuth2 API - Customer SDK
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <https://unlicense.org>
+"""
+from typing import Tuple
+from ._functions import args_to_params, return_preferred_default
+from .._constant import PREFER_IDS_IN_BODY, MOCK_OPERATIONS
+from .._enum import BaseURL, ContainerBaseURL
+
+
+def create_uber_header_payload(hdrs: dict, passed_arguments: dict) -> dict:
+    """Create the HTTP header payload.
+
+    Creates the HTTP header payload based upon the existing class headers and passed arguments.
+    """
+    payload = hdrs
+    if "headers" in passed_arguments:
+        for item in passed_arguments["headers"]:
+            payload[item] = passed_arguments["headers"][item]
+    # Allow Content-Type to be specified as a keyword.
+    if "content_type" in passed_arguments:
+        payload["Content-Type"] = str(passed_arguments["content_type"])
+
+    return payload
+
+
+def handle_field(tgt: str, kwa: dict, fld: str) -> str:
+    """Embed the distinct_field value (SensorUpdatePolicy) within the endpoint URL."""
+    # Could potentially be zero
+    return tgt.format(str(kwa.get(fld, None))) if kwa.get(fld, None) is not None else tgt
+
+
+def handle_body_payload_ids(kwa: dict) -> dict:
+    """Migrates the IDs parameter list over to the body payload."""
+    if kwa.get("action", None) in PREFER_IDS_IN_BODY:
+        if kwa.get("ids", None):
+            # Handle the GET to POST method redirection for passed IDs
+            if not kwa.get("body", {}).get("ids", None):
+                if "body" not in kwa:
+                    kwa["body"] = {}
+                kwa["body"]["ids"] = kwa["ids"]
+        # Handle any body payload ID lists that are still strings
+        if isinstance(kwa.get("body", {}).get("ids", {}), str):
+            kwa["body"]["ids"] = kwa["body"]["ids"].split(",")
+    return kwa
+
+
+def scrub_target(oper: str, scrubbed: str, kwas: dict) -> str:
+    """Scrubs the endpoint target by performing any outstanding string replacements."""
+    field_mapping = {
+        "image_id": "DeleteImageDetails",
+        "partition": "refreshActiveStreamSession",
+        "distinct_field": "querySensorUpdateKernelsDistinct"
+    }
+    for field_name, field_value in field_mapping.items():
+        if oper == field_value:  # Only perform replacements on mapped operation IDs.
+            scrubbed = handle_field(scrubbed, kwas, field_name)
+
+    return scrubbed
+
+
+def handle_container_operations(kwa: dict, base_string: str) -> Tuple[dict, str, bool]:
+    """Handle Base URLs and keyword arguments for container registry operations."""
+    # Default to non-container registry operations
+    do_container = False
+    if kwa.get("action", None) in MOCK_OPERATIONS:
+        for base in [burl for burl in dir(BaseURL) if "__" not in burl]:
+            if BaseURL[base].value == base_string.replace("https://", ""):
+                base_string = f"https://{ContainerBaseURL[base].value}"
+                do_container = True
+        if kwa.get("action", None) == "ImageMatchesPolicy":
+            if "parameters" not in kwa:
+                kwa["parameters"] = {}
+            kwa["parameters"]["policy_type"] = "image-prevention-policy"
+    return kwa, base_string, do_container
+
+
+def uber_request_keywords(caller,
+                          meth: str,                            # .        o
+                          oper: str,                            # .           o
+                          tgt: str,                             # .      o
+                          kwa: dict,                            # .         O
+                          do_cont: bool                         # .       \/|\/
+                          ) -> dict:                            # .        / \  o
+    """Generate a properly formatted mapping of the keywords for this request."""
+    return {
+        "method": meth,
+        "endpoint": tgt,
+        "body": kwa.get("body", return_preferred_default(oper)),
+        "data": kwa.get("data", return_preferred_default(oper)),
+        "params": args_to_params(kwa.get("parameters", {}), kwa, caller.commands, oper),
+        "headers": create_uber_header_payload(caller.auth_headers, kwa),
+        "files": kwa.get("files", return_preferred_default(oper, "list")),
+        "verify": caller.ssl_verify,
+        "proxy": caller.proxy,
+        "timeout": caller.timeout,
+        "user_agent": caller.user_agent,
+        "expand_result": kwa.get("expand_result", False),
+        "container": do_cont,
+        "log_util": caller.log,
+        "debug_record_count": caller.debug_record_count,
+        "sanitize": caller.sanitize_log,
+        "pythonic": caller.pythonic
+    }
diff --git a/src/falconpy/_version.py b/src/falconpy/_version.py
index 3bc7a55ff..5218c6cec 100644
--- a/src/falconpy/_version.py
+++ b/src/falconpy/_version.py
@@ -35,7 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
-_VERSION = '1.2.16'
+_VERSION = '1.3.0'
 _MAINTAINER = 'Joshua Hiller'
 _AUTHOR = 'CrowdStrike'
 _AUTHOR_EMAIL = 'falconpy@crowdstrike.com'
@@ -45,3 +45,48 @@
 _PROJECT_URL = "https://github.com/CrowdStrike/falconpy"
 _DOCS_URL = "https://www.falconpy.io"
 _KEYWORDS = ["crowdstrike", "falcon", "api", "sdk", "oauth2", "devsecops", "crowdstrike-falcon"]
+
+
+def version(compare: str = None, agent_string: bool = None):
+    """Provide a callable method for checking and comparing the current FalconPy version.
+
+    Keyword arguments
+    ----
+    agent_string: bool
+        Boolean flag indicating that the default User-Agent string should
+        be returned instead.
+    compare: str
+        String representation of the version to compare against.
+        Returns True when the current version is greater or equal to the comparison value.
+        Examples: "1", "1.3" or "1.3.0"
+
+    Returns
+    ----
+    str or bool
+        A string containing the requested version detail or a boolean indicating the status
+        of the requested version comparison.
+    """
+    returned = _VERSION
+    if agent_string:
+        returned = f"{_TITLE}/{str(_VERSION)}"
+
+    if compare:
+        returned = False
+        ver = _VERSION.split(".")
+        chk = compare.split(".")
+        chk_minor = 0
+        chk_patch = 0
+        if chk:
+            chk_major = chk[0]
+        if len(chk) > 1:
+            chk_minor = chk[1]
+        if len(chk) > 2:
+            chk_patch = int(chk[2])
+        major_minor = float(f"{ver[0]}.{ver[1]}")
+        chk_major_minor = float(f"{chk_major}.{chk_minor}")
+        if major_minor > chk_major_minor:
+            returned = True
+        elif major_minor == chk_major_minor and int(ver[2]) >= chk_patch:
+            returned = True
+
+    return returned
diff --git a/src/falconpy/alerts.py b/src/falconpy/alerts.py
index f3d3359e8..192307c8c 100644
--- a/src/falconpy/alerts.py
+++ b/src/falconpy/alerts.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union, Optional, List
 from ._util import force_default, process_service_request
 from ._payload import (
     aggregate_payload, generic_payload_list, update_alerts_payload
@@ -57,7 +58,7 @@ class Alerts(ServiceClass):
     """
 
     @force_default(defaults=["body"], default_types=["list"])
-    def get_aggregate_alerts(self: object, body: list = None, **kwargs) -> dict:
+    def get_aggregate_alerts(self, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve aggregates for Alerts across all CIDs.
 
         Keyword arguments:
@@ -143,7 +144,7 @@ def get_aggregate_alerts(self: object, body: list = None, **kwargs) -> dict:
     # PatchEntitiesAlertsV1 has been **DECOMISSIONED**
 
     # @force_default(defaults=["body"], default_types=["dict"])
-    # def update_alerts(self: object, *args, body: dict = None, **kwargs) -> dict:
+    # def update_alerts(self, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
     #     """Perform actions on alerts identified by detection ID(s) in request.
 
     #     Keyword arguments:
@@ -216,7 +217,11 @@ def get_aggregate_alerts(self: object, body: list = None, **kwargs) -> dict:
     #         )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_alerts(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def update_alerts(self,
+                      *args,
+                      body: Optional[Dict[str, List[Union[str, Dict[str, str]]]]] = None,
+                      **kwargs
+                      ) -> Dict[str, Union[int, dict]]:
         """Perform actions on alerts identified by detection ID(s) in request.
 
         Keyword arguments:
@@ -276,9 +281,12 @@ def update_alerts(self: object, *args, body: dict = None, **kwargs) -> dict:
                 )
 
         # Passing action_parameters overrides other keywords
-        if kwargs.get("action_parameters", None):
-            body["action_parameters"] = kwargs.get("action_parameters", None)
-
+        _action_params: Optional[List[Union[str, Dict[str, str]]]] = kwargs.get("action_parameters", None)
+        if _action_params:
+            body["action_parameters"] = _action_params
+        # Getting this from mypy:
+        # src/falconpy/alerts.py:269: error:
+        # Unsupported target for indexed assignment ("Optional[Dict[str, List[Union[str, Dict[str, str]]]]]")
         return process_service_request(
             calling_object=self,
             endpoints=Endpoints,
@@ -287,7 +295,7 @@ def update_alerts(self: object, *args, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_alerts(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def get_alerts(self, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve all Alerts given their IDs.
 
         Keyword arguments:
@@ -325,7 +333,7 @@ def get_alerts(self: object, *args, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_alerts(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_alerts(self, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for detection IDs that match a given query.
 
         Keyword arguments:
diff --git a/src/falconpy/api_complete.py b/src/falconpy/api_complete.py
index 421edcab7..8f5235e0b 100644
--- a/src/falconpy/api_complete.py
+++ b/src/falconpy/api_complete.py
@@ -35,342 +35,198 @@
 
 For more information, please refer to <https://unlicense.org>
 """
-import time
-from ._util import _ALLOWED_METHODS
+import functools
+from typing import Dict, Union, Callable
+from ._constant import ALLOWED_METHODS
 from ._util import (
-    perform_request,
-    generate_b64cred,
-    generate_error_result,
-    confirm_base_url,
-    args_to_params,
-    return_preferred_default,
-    autodiscover_region,
+    perform_request
+    )
+from ._auth_object import UberInterface
+from ._util import (
+    handle_body_payload_ids,
+    scrub_target,
+    handle_container_operations,
+    uber_request_keywords
+    )
+from ._error import (
+    InvalidOperation,
+    InvalidMethod,
+    TokenNotSpecified,
+    SDKError
     )
-from ._base_url import BaseURL
-from ._container_base_url import ContainerBaseURL
-from ._uber_default_preference import PREFER_IDS_IN_BODY, MOCK_OPERATIONS
-from ._token_fail_reason import TokenFailReason
-from ._endpoint import api_endpoints
-
-
-class APIHarness:
-    """This one does it all. It's like the One Ring with significantly fewer orcs."""
-
-    # pylint: disable=too-many-instance-attributes
-    _token_fail_headers = {}  # Issue #578
-
-    def __init__(self: object,  # pylint: disable=R0913
-                 base_url: str = "https://api.crowdstrike.com",
-                 creds: dict = None,
-                 client_id: str = None,
-                 client_secret: str = None,
-                 member_cid: str = None,
-                 ssl_verify: bool = True,
-                 proxy: dict = None,
-                 timeout: float or tuple = None,
-                 user_agent: str = None,
-                 renew_window: int = 120
-                 ) -> object:
-        """Uber class constructor.
-
-        Instantiates an instance of the class, ingests credentials,
-        the base URL and the SSL verification boolean.
-        Afterwards class attributes are initialized.
-
-        Keyword arguments:
-        base_url: CrowdStrike API URL to use for requests. [Default: US-1]
-        ssl_verify: Boolean specifying if SSL verification should be used or string representing
-                    the path to a CA_BUNDLE file or directory of trusted certificates.
-                    Default: True
-        proxy: Dictionary of proxies to be used for requests.
-        timeout: Float or tuple specifying timeouts to use for requests.
-        creds: Dictionary containing CrowdStrike API credentials.
-               Mutually exclusive to client_id / client_secret.
-               {
-                   "client_id": "CLIENT_ID_HERE",
-                   "client_secret": "CLIENT_SECRET_HERE",
-                   "member_cid": "CHILD_CID_MSSP_ONLY"
-               }
-        client_id: Client ID for the CrowdStrike API. Mutually exclusive to creds.
-        client_secret: Client Secret for the CrowdStrike API. Mutually exclusive to creds.
-        member_cid: Child CID to connect to. (MSSP only) Mutually exclusive to creds.
-        user_agent: User-Agent string to use for all requests made to the CrowdStrike API.
-                    String. Defaults to crowdstrike-falconpy/VERSION.
-        renew_window: Amount of time (in seconds) between now and the token expiration before
-                      a refresh of the token is performed. Default: 120, Max: 1200
-                      Values over 1200 will be reset to the maximum.
-
-        This method only accepts keywords to specify arguments.
-        """
-        if client_id and client_secret and not creds:
-            creds = {
-                "client_id": client_id,
-                "client_secret": client_secret
-            }
-            # Have to pass member_cid the same way you pass client_id / secret
-            # If you use a creds dictionary, pass the member_cid there instead
-            if member_cid:
-                creds["member_cid"] = member_cid
-        elif not creds:
-            creds = {}
-        self.creds = creds
-        self.base_url = confirm_base_url(base_url)
-        self.ssl_verify = ssl_verify
-        self.proxy = proxy
-        self.timeout = timeout
-        self.token = False
-        self.token_expiration = 0
-        self.token_time = time.time()
-        self.authenticated = False
-        self.token_fail_reason = None
-        self.token_status = None
-        self.headers = lambda: {"Authorization": f"Bearer {self.token}"} if self.token else {}
-        self.commands = api_endpoints
-        self.user_agent = user_agent  # Issue #365
-        # Maximum renewal window is 20 minutes, Minimum is 2 minutes
-        self.token_renew_window = max(min(renew_window, 1200), 120)  # in seconds
-
-    def valid_cred_format(self: object) -> bool:
-        """Confirm credential dictionary format.
-
-        Returns a boolean indicating if the client_id and
-        client_secret are present in the creds dictionary.
-        """
-        retval = False
-        if "client_id" in self.creds and "client_secret" in self.creds:
-            retval = True
-
-        return retval
-
-    def token_expired(self: object) -> bool:
-        """Return a boolean based upon the token expiration status."""
-        retval = False
-        if (time.time() - self.token_time) >= (self.token_expiration - self.token_renew_window):
-            retval = True
-
-        return retval
-
-    def authenticate(self: object) -> bool:
-        """Generate an authorization token."""
-        target = self.base_url+'/oauth2/token'
-        data_payload = {}
-        if self.valid_cred_format():
-            data_payload = {
-                'client_id': self.creds['client_id'],
-                'client_secret': self.creds['client_secret']
-            }
-        if "member_cid" in self.creds:
-            data_payload["member_cid"] = self.creds["member_cid"]
-
-        result = perform_request(method="POST",
-                                 endpoint=target,
-                                 data=data_payload,
-                                 headers={},
-                                 verify=self.ssl_verify,
-                                 proxy=self.proxy,
-                                 timeout=self.timeout,
-                                 user_agent=self.user_agent
-                                 )
-        if isinstance(result, dict):  # Issue #433
-            self.token_status = result["status_code"]
-            if self.token_status == 201:
-                self.token = result["body"]["access_token"]
-                self.token_expiration = result["body"]["expires_in"]
-                self.token_time = time.time()
-                self.authenticated = True
-                self.token_fail_reason = None
-                self.base_url = autodiscover_region(self.base_url, result)
-            else:
-                self.authenticated = False
-                self._token_fail_headers = result["headers"]
-                if "errors" in result["body"]:
-                    if result["body"]["errors"]:
-                        self.token_fail_reason = result["body"]["errors"][0]["message"]
-        else:
-            self.authenticated = False
-            self.token_fail_reason = TokenFailReason["UNEXPECTED"].value
-            self.token_status = 403
-
-        return self.authenticated
-
-    def deauthenticate(self: object) -> bool:
-        """Revoke the current authorization token."""
-        target = str(self.base_url)+'/oauth2/revoke'
-        b64cred = generate_b64cred(self.creds["client_id"], self.creds["client_secret"])
-        header_payload = {"Authorization": f"basic {b64cred}"}
-        data_payload = {"token": f"{self.token}"}
-        revoked = False
-        if perform_request(method="POST", endpoint=target, data=data_payload,
-                           headers=header_payload, verify=self.ssl_verify,
-                           proxy=self.proxy, timeout=self.timeout, user_agent=self.user_agent
-                           )["status_code"] == 200:
-            self.authenticated = False
-            self.token = False
-            revoked = True
-        else:
-            revoked = False
-
-        return revoked
-
-    def _create_header_payload(self: object, passed_arguments: dict) -> dict:
-        """Create the HTTP header payload.
-
-        Creates the HTTP header payload based upon the existing class headers and passed arguments.
-        """
-        payload = self.headers()
-        if "headers" in passed_arguments:
-            for item in passed_arguments["headers"]:
-                payload[item] = passed_arguments["headers"][item]
-        if "content_type" in passed_arguments:
-            payload["Content-Type"] = str(passed_arguments["content_type"])
-
-        return payload
-
-    @staticmethod
-    def _handle_partition(tgt: str, kwa: dict):
-        if kwa.get("partition", None) is not None:
-            # Partition needs to be embedded into the endpoint URL
-            tgt = tgt.format(str(kwa.get("partition", None)))
-        return tgt
-
-    @staticmethod
-    def _handle_distinct_field(tgt: str, kwa: dict):
-        if kwa.get("distinct_field", None) is not None:
-            # distinct_field also needs to be embedded into the endpoint URL
-            tgt = tgt.format(str(kwa.get("distinct_field", None)))
-        return tgt
-
-    @staticmethod
-    def _handle_container_image_id(tgt: str, kwa: dict):
-        if kwa.get("image_id", None) is not None:
-            # container image ID also needs to be embedded into the endpoint URL
-            tgt = tgt.format(str(kwa.get("image_id", None)))
-        return tgt
-
-    @staticmethod
-    def _handle_body_payload_ids(kwa: dict):
-        if kwa.get("action", None) in PREFER_IDS_IN_BODY:
-            if kwa.get("ids", None):
-                # Handle the GET to POST method redirection for passed IDs
-                if not kwa.get("body", {}).get("ids", None):
-                    if "body" not in kwa:
-                        kwa["body"] = {}
-                    kwa["body"]["ids"] = kwa["ids"]
-            # Handle any body payload ID lists that are still strings
-            if isinstance(kwa.get("body", {}).get("ids", {}), str):
-                kwa["body"]["ids"] = kwa["body"]["ids"].split(",")
-        return kwa
 
-    def _handle_container_operations(self, kwa: dict, base_string: str):
-        """Handle Base URLs and keyword arguments for container registry operations."""
-        # Default to non-container registry operations
-        do_container = False
-        if kwa.get("action", None) in MOCK_OPERATIONS:
-            for base in [burl for burl in dir(BaseURL) if "__" not in burl]:
-                if BaseURL[base].value == self.base_url.replace("https://", ""):
-                    base_string = f"https://{ContainerBaseURL[base].value}"
-                    do_container = True
-            if kwa.get("action", None) == "ImageMatchesPolicy":
-                if "parameters" not in kwa:
-                    kwa["parameters"] = {}
-                kwa["parameters"]["policy_type"] = "image-prevention-policy"
-        return kwa, base_string, do_container
 
-    def command(self: object, *args, **kwargs) -> dict or bytes:
+def command_error_handler(func: Callable):
+    """Uber class error handling wrapper.
+
+    This method wraps the Uber Class command method and catches errors
+    during processing of the selected operation. If logging is enabled
+    then the error or warning log will be updated accordingly. Regardless
+    of log settings, this method will craft the error response returned
+    based upon the result property of the SDKError derivative.
+
+    Defined here to prevent weirdness in the wrapper behavior.
+    """
+    @functools.wraps(func)
+    def wrapper(caller, *args, **kwargs):
+        """Inner wrapper."""
+        def log_failure(msg, code: int, res: dict = None):
+            if caller.log:
+                caller.log.error(msg)
+                # Warnings shouldn't generate result payloads
+                caller.log.debug("STATUS CODE: %i", code)
+                caller.log.debug("RESULT: %s", res)
+        try:
+            result = func(caller, *args, **kwargs)
+        except (SDKError, InvalidMethod, InvalidOperation) as bad_sdk:
+            result = bad_sdk.result
+            log_failure(bad_sdk.message, bad_sdk.code, result)
+        return result
+    return wrapper
+
+
+class APIHarness(UberInterface):
+    """The FalconPy Uber Class.
+
+    The Uber Class inherits from the UberInterface class, which is a stand alone
+    class that encapsulates the FalconAuth class. This allows the Uber Class to
+    inherit all the functionality from the FalconAuth class while maintaining
+    additional functionality only provided by the Uber Class.
+
+    This means the Uber Class does not include an auth_object, as it is one.
+    As of FalconPy v1.3.0, Object Authentication is still unssupported for
+    Uber Class usage scenarios.
+
+    This one does it all. It's like the One Ring with significantly fewer orcs.
+    """
+
+    #                                 `-.
+    #                     -._ `. `-.`-. `-.
+    #                     _._ `-._`.   .--.  `.
+    #                  .-'   '-.  `-|\/    \|   `-.
+    #                .'         '-._\   (o)O) `-.
+    #               /         /         _.--.) '. `-. `-.
+    #              /|    (    |  /  -. ( -._( -._ '. '.
+    #             /  \    \-.__\ \_.-'`.`.__' .  `-, '. .'
+    #             |  /\    |  / \ \     `--'  /  .-'.'.'
+    #          .._/  /  /  /  / / \ \          .' . .' .'
+    #         /  ___/  |  /   \ \  \ \__       '.'. . .
+    #         \  \___  \ (     \ \  `._ `.     .' . ' .'
+    #          \ `-._\ (  `-.__ | \    )//   .'  .' .-'
+    #           \_-._\  \  `-._\)//    ""_.-' .-' .' .'
+    #             `-'    \ -._\ ""_..--''  .-' .'
+    #                     \/    .' .-'.-'  .-' .-'
+    #                         .-'.' .'  .' .-
+    # pylint: disable=R0912
+    @command_error_handler
+    def command(self, *args, **kwargs) -> Union[Dict[str, Union[int, dict]], bytes]:
         """Uber Class API command method.
 
-        Checks token expiration, renewing when necessary, then performs the request.
-
-        Keyword arguments:
-        action: str = ""                                    - API Operation ID to perform
-        parameters: dict = {}                               - Parameter payload (Query string)
-        body: dict = {}                                     - Body payload (Body)
-        data: dict = {}                                     - Data payload (Data)
-        headers: dict = {}                                  - Headers dictionary (HTTP Headers)
-        ids: list or str = None                             - ID list (IDs to handle)
-        partition: int or str = None                        - Partition number
-        distinct_field: str = None                          - Distinct Field
-        override: str = None   (format: 'METHOD,ENDPOINT')  - Override method and endpoint
-        action_name: str = None                             - Action to perform (API specific)
-        files: list = []                                    - List of files to upload
-        file_name: str = None                               - Name of the file to upload
-        content_type: str = None                            - Content_Type HTTP header
-        expand_result: bool = False                         - Request expanded results (Tuple)
-        image_id: str = None                                - Container image ID (Falcon Container only)
-
+        Performs the specified API operation. The token will be generated
+        if it is not present or expired before the request is made.
+
+        HTTP Method: Any
+
+        Swagger URL
+        ----
+        https://assets.falcon.crowdstrike.com/support/api/swagger.html
+
+        Keyword arguments
+        ----
+        action : str (Default: None)
+            API Operation ID to perform
+        parameters : dict (Default: {})
+            Parameter payload (Query string)
+        body : dict (Default: {})
+            Body payload (Body)
+        data : dict (Default: {})
+            Data payload (Data)
+        headers : dict (Default: {})
+            Headers dictionary (HTTP Headers)
+        ids : list or str (Default: None)
+            ID list (IDs to handle)
+        partition : int or str (Default: None)
+            Partition number (Event Streams only)
+        distinct_field : str (Default: None)
+            Distinct Field (Sensor Update Policy only)
+        override : str (Default: None)
+            Override method and endpoint. Example: 'METHOD,ENDPOINT'
+        action_name : str (Default: None)
+            Action to perform (API specific)
+        files : list (Default: [])
+            List of files to upload
+        file_name : str (Default: None)
+            Name of the file to upload
+        content_type : str (Default: None)
+            Content_Type HTTP header
+        expand_result : bool (Default: False)
+            Request expanded results (returns a tuple)
+        image_id : str (Default: None)
+            Container image ID (Falcon Container only)
+
+        Arguments
+        ----
         The first argument passed to this method is assumed to be 'action'. All others are ignored.
 
-        Returns: dict object containing API response or binary object depending on operation ID.
+        Returns
+        ----
+        dict or bytes
+            Dictionary or binary object containing API response depending on requested operation.
         """
-        if self.token_expired():
-            # Authenticate them if we can
-            self.authenticate()
-
         try:
             if not kwargs.get("action", None):
-                # Assume they're passing it in as the first param
+                # Assume they're passing it in as the first argument.
                 kwargs["action"] = args[0]
         except IndexError:
-            pass  # They didn't specify an action, use the default and try for an override instead
+            pass  # They didn't specify an action, try for an override instead.
 
         uber_command = [a for a in self.commands if a[0] == kwargs.get("action", None)]
         if kwargs.get("override", None):
             uber_command = [["Manual"] + kwargs["override"].split(",")]
         if uber_command:
-            # Retrieve our default base URL
-            url_base = self.base_url
-            # Alter keywords and base URL if we are performing a container registry operation
-            kwargs, url_base, container = self._handle_container_operations(kwargs, url_base)
-            # Retrieve the endpoint URL from the command list and append to our base URL
-            target = f"{url_base}{uber_command[0][2]}"
-            # Container image ID
-            target = self._handle_container_image_id(target, kwargs)
-            # Partition
-            target = self._handle_partition(target, kwargs)
-            # Distinct field
-            target = self._handle_distinct_field(target, kwargs)
+            # Which API operation to perform.
+            operation = uber_command[0][0]
+            # Which HTTP method to execute
+            method = uber_command[0][1].upper()
+            # Check the headers. If we've not logged in yet, this will force our base_url
+            # to point to the correct cloud region.
+            _ = self.auth_headers
+            # Retrieve our base URL and alter keywords if we are performing a container operation.
+            kwargs, url_base, container = handle_container_operations(kwargs, self.base_url)
+            # Retrieve the endpoint from the command list and append to our base URL and
+            # then perform any outstanding string replacements on the target endpoint URL.
+            target = scrub_target(operation, f"{url_base}{uber_command[0][2]}", kwargs)
             # Handle any IDs that are in the wrong payload
-            kwargs = self._handle_body_payload_ids(kwargs)
-            # Check for authentication
-            if self.authenticated:
-                # Which HTTP method to execute
-                selected_method = uber_command[0][1].upper()
-                selected_operation = uber_command[0][0]
-                # Only accept allowed HTTP methods
-                if selected_method in _ALLOWED_METHODS:
-                    returned = perform_request(method=selected_method,
-                                               endpoint=target,
-                                               body=kwargs.get("body", return_preferred_default(selected_operation)),
-                                               data=kwargs.get("data", return_preferred_default(selected_operation)),
-                                               params=args_to_params(kwargs.get("parameters", {}),
-                                                                     kwargs,
-                                                                     self.commands,
-                                                                     selected_operation
-                                                                     ),
-                                               headers=self._create_header_payload(kwargs),
-                                               files=kwargs.get("files",
-                                                                return_preferred_default(selected_operation, "list")
-                                                                ),
-                                               verify=self.ssl_verify,
-                                               proxy=self.proxy,
-                                               timeout=self.timeout,
-                                               user_agent=self.user_agent,
-                                               expand_result=kwargs.get("expand_result", False),
-                                               container=container
-                                               )
+            kwargs = handle_body_payload_ids(kwargs)
+            # Only accept allowed HTTP methods
+            if method in ALLOWED_METHODS:
+                if operation == "oauth2AccessToken":
+                    # Calling the token generation operation directly from the
+                    # Uber Class does not change the underlying auth_object state.
+                    returned = self._login_handler(stateful=False)  # .             CrowdStrike
+                elif operation == "oauth2RevokeToken":              # .                  O   Rocks
+                    # Calling the token revocation operation directly requires a        <|\
+                    # token_value. Doing so in this manner from the Uber Class          (o-"=
+                    # does not change the underlying authentication state.              / \
+                    token_value = kwargs.get("token_value", None)
+                    if not token_value:
+                        raise TokenNotSpecified
+                    returned = self._logout_handler(token_value=token_value, stateful=False)
                 else:
-                    # Bad HTTP method
-                    returned = generate_error_result(message="Invalid HTTP method specified.",
-                                                     code=405
-                                                     )
+                    # Craft our keyword payload for perform_request.
+                    keyword_payload = uber_request_keywords(
+                        self, method, operation, target, kwargs, container
+                        )
+                    # Log the operation we're performing if enabled.
+                    if self.log:
+                        self.log.debug("OPERATION: %s", operation)
+                    # Process the API request normally.
+                    returned = perform_request(**keyword_payload)
             else:
-                # Invalid token / Bad creds
-                returned = generate_error_result(message="Failed to issue token.",
-                                                 code=401,
-                                                 headers=self._token_fail_headers
-                                                 )
+                # Bad HTTP method.
+                raise InvalidMethod
         else:
-            # That command doesn't exist, have a cup of tea instead
-            returned = generate_error_result(message="Invalid API operation specified.", code=418)
+            # That command doesn't exist, have a cup of tea instead.
+            raise InvalidOperation
 
         return returned
diff --git a/src/falconpy/cloud_connect_aws.py b/src/falconpy/cloud_connect_aws.py
index 3c4b2c7dd..f83e43214 100644
--- a/src/falconpy/cloud_connect_aws.py
+++ b/src/falconpy/cloud_connect_aws.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import aws_registration_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class CloudConnectAWS(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_aws_accounts(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_aws_accounts(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for provisioned AWS Accounts by providing an FQL filter and paging details.
 
         Returns a set of AWS accounts which match the filter criteria.
@@ -86,7 +87,7 @@ def query_aws_accounts(self: object, parameters: dict = None, **kwargs) -> dict:
             params=parameters
             )
 
-    def get_aws_settings(self: object) -> dict:
+    def get_aws_settings(self: object) -> Dict[str, Union[int, dict]]:
         """Retrieve a set of Global Settings which are applicable to all provisioned AWS accounts.
 
         This method does not accept arguments or keywords.
@@ -105,7 +106,7 @@ def get_aws_settings(self: object) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_aws_accounts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_aws_accounts(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a set of AWS Accounts by specifying their IDs.
 
         Keyword arguments:
@@ -131,7 +132,7 @@ def get_aws_accounts(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters", "body"], default_types=["dict", "dict"])
-    def provision_aws_accounts(self: object, body: dict, parameters: dict = None, **kwargs) -> dict:
+    def provision_aws_accounts(self: object, body: dict, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Provision AWS Accounts by specifying details about the accounts to provision.
 
         Keyword arguments:
@@ -182,7 +183,7 @@ def provision_aws_accounts(self: object, body: dict, parameters: dict = None, **
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_aws_accounts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_aws_accounts(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a set of AWS Accounts by specifying their IDs.
 
         Keyword arguments:
@@ -208,7 +209,7 @@ def delete_aws_accounts(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_aws_accounts(self: object, body: dict = None, **kwargs) -> dict:
+    def update_aws_accounts(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update AWS Accounts by specifying the ID of the account and details to update.
 
         Keyword arguments:
@@ -254,7 +255,7 @@ def update_aws_accounts(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_or_update_aws_settings(self: object, body: dict = None, **kwargs) -> dict:
+    def create_or_update_aws_settings(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create or update Global Settings which are applicable to all provisioned AWS accounts.
 
         Keyword arguments:
@@ -295,7 +296,7 @@ def verify_aws_account_access(self: object,
                                   body: dict = None,
                                   parameters: dict = None,
                                   **kwargs
-                                  ) -> dict:
+                                  ) -> Dict[str, Union[int, dict]]:
         """Perform an Access Verification check on the specified AWS Account IDs.
 
         Keyword arguments:
@@ -323,7 +324,7 @@ def verify_aws_account_access(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_aws_accounts_for_ids(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_aws_accounts_for_ids(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for provisioned AWS Accounts by providing an FQL filter and paging details.
 
         Returns a set of AWS account IDs which match the filter criteria.
diff --git a/src/falconpy/cspm_registration.py b/src/falconpy/cspm_registration.py
index f680dafbc..7d68e4c99 100644
--- a/src/falconpy/cspm_registration.py
+++ b/src/falconpy/cspm_registration.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 # pylint: disable=R0904, C0302  # Matching API operation counts and allowing the long file for now
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import cspm_registration_payload, cspm_policy_payload, cspm_scan_payload
 from ._service_class import ServiceClass
@@ -56,7 +57,7 @@ class CSPMRegistration(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_aws_account(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_aws_account(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return information about the current status of an AWS account.
 
         Keyword arguments:
@@ -97,7 +98,7 @@ def get_aws_account(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_aws_account(self: object, body: dict = None, **kwargs) -> dict:
+    def create_aws_account(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Register a new AWS account.
 
         Creates a new account in our system for a customer and generates a script
@@ -150,7 +151,7 @@ def create_aws_account(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_aws_account(self: object, parameters: dict = None, **kwargs) -> dict:
+    def delete_aws_account(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete an existing AWS Account or Organization by specifying their IDs.
 
         Keyword arguments:
@@ -179,7 +180,7 @@ def delete_aws_account(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_aws_account(self: object, body: dict = None, **kwargs) -> dict:
+    def update_aws_account(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Patches a existing account in our system for a customer.
 
         Keyword arguments:
@@ -224,7 +225,7 @@ def update_aws_account(self: object, body: dict = None, **kwargs) -> dict:
             body=body
             )
 
-    def get_aws_console_setup_urls(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_aws_console_setup_urls(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve setup URLs for the AWS console.
 
         Returns a URL for customers to visit in their cloud environment
@@ -253,7 +254,7 @@ def get_aws_console_setup_urls(self: object, parameters: dict = None, **kwargs)
             params=parameters
             )
 
-    def get_aws_account_scripts_attachment(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_aws_account_scripts_attachment(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve AWS account scripts.
 
         Return a script for customers to run in their cloud environment
@@ -281,7 +282,7 @@ def get_aws_account_scripts_attachment(self: object, parameters: dict = None, **
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_azure_account(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_azure_account(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return information about Azure account registration.
 
         Keyword arguments:
@@ -316,7 +317,7 @@ def get_azure_account(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_azure_account(self: object, body: dict = None, **kwargs) -> dict:
+    def create_azure_account(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Register new Azure account.
 
         Creates a new account in our system for a customer and generates a script
@@ -363,7 +364,7 @@ def create_azure_account(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_azure_account(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_azure_account(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete an existing Azure Subscription by specifying their IDs.
 
         Keyword arguments:
@@ -395,7 +396,7 @@ def update_azure_account_client_id(self: object,
                                        body: dict = None,
                                        parameters: dict = None,
                                        **kwargs
-                                       ) -> dict:
+                                       ) -> Dict[str, Union[int, dict]]:
         """Update Azure account Client ID.
 
         Update an Azure service account in our system with the
@@ -434,7 +435,7 @@ def update_azure_tenant_default_subscription_id(self: object,
                                                     body: dict = None,
                                                     parameters: dict = None,
                                                     **kwargs
-                                                    ) -> dict:
+                                                    ) -> Dict[str, Union[int, dict]]:
         """Update default subscription ID.
 
         Update an Azure service account in our system with the
@@ -475,7 +476,7 @@ def azure_download_certificate(self: object,
                                    *args,
                                    parameters: dict = None,
                                    **kwargs
-                                   ) -> dict:
+                                   ) -> Dict[str, Union[int, dict]]:
         """Retrieve Azure certificate.
 
         Returns JSON object(s) that contain the base64 encoded certificate for a service principal.
@@ -510,7 +511,7 @@ def get_azure_user_scripts_attachment(self: object,
                                           *args,
                                           parameters: dict = None,
                                           **kwargs
-                                          ) -> dict:
+                                          ) -> Dict[str, Union[int, dict]]:
         """
         Retrieve Azure user script.
 
@@ -547,7 +548,7 @@ def get_azure_user_scripts_attachment(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_behavior_detections(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_behavior_detections(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve list of detected behaviors.
 
         Keyword arguments:
@@ -615,7 +616,7 @@ def get_behavior_detections(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_configuration_detections(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_configuration_detections(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve list of active misconfigurations.
 
         Keyword arguments:
@@ -761,7 +762,7 @@ def get_configuration_detection_ids_v2(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_ioa_events(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_ioa_events(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """For CSPM IOA events, gets list of IOA events.
 
         Keyword arguments:
@@ -797,7 +798,7 @@ def get_ioa_events(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_ioa_users(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_ioa_users(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """For CSPM IOA users, gets list of IOA users.
 
         Keyword arguments:
@@ -828,7 +829,7 @@ def get_ioa_users(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_policy(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_policy(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Given a policy ID, returns detailed policy information.
 
         Keyword arguments:
@@ -880,7 +881,7 @@ def get_policy_details(self: object, *args, parameters: dict = None, **kwargs) -
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_policy_settings(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_policy_settings(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return information about current policy settings.
 
         Keyword arguments:
@@ -936,7 +937,7 @@ def get_policy_settings(self: object, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_policy_settings(self: object, body: dict = None, **kwargs) -> dict:
+    def update_policy_settings(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update a policy setting.
 
         Can be used to override policy severity or to disable a policy entirely.
@@ -988,7 +989,7 @@ def update_policy_settings(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_scan_schedule(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_scan_schedule(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return scan schedule configuration for one or more cloud platforms.
 
         Keyword arguments:
@@ -1017,7 +1018,7 @@ def get_scan_schedule(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_scan_schedule(self: object, body: dict = None, **kwargs) -> dict:
+    def update_scan_schedule(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update scan schedule configuration for one or more cloud platforms.
 
         Keyword arguments:
diff --git a/src/falconpy/custom_ioa.py b/src/falconpy/custom_ioa.py
index 896045803..b739cd73b 100644
--- a/src/falconpy/custom_ioa.py
+++ b/src/falconpy/custom_ioa.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import ioa_custom_payload, generic_payload_list
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class CustomIOA(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_patterns(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_patterns(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get pattern severities by ID.
 
         Keyword arguments:
@@ -81,7 +82,7 @@ def get_patterns(self: object, *args, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_platforms(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_platforms(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get platforms by ID.
 
         Keyword arguments:
@@ -107,7 +108,7 @@ def get_platforms(self: object, *args, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_rule_groups(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_rule_groups(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get rule groups by ID.
 
         Keyword arguments:
@@ -137,7 +138,7 @@ def create_rule_group(self: object,
                           body: dict = None,
                           cs_username: str = None,  # pylint: disable=W0613  # deprecated
                           **kwargs
-                          ) -> dict:
+                          ) -> Dict[str, Union[int, dict]]:
         """Create a rule group for a platform with a name and an optional description.
 
         Returns the rule group.
@@ -174,7 +175,7 @@ def delete_rule_groups(self: object,
                            cs_username: str = None,  # pylint: disable=W0613  # cs_username is deprecated
                            parameters: dict = None,
                            **kwargs
-                           ) -> dict:
+                           ) -> Dict[str, Union[int, dict]]:
         """Delete rule groups by ID.
 
         Keyword arguments:
@@ -205,7 +206,7 @@ def update_rule_group(self: object,
                           body: dict = None,
                           cs_username: str = None,  # pylint: disable=W0613  # deprecated
                           **kwargs
-                          ) -> dict:
+                          ) -> Dict[str, Union[int, dict]]:
         """Update a rule group.
 
         The following properties can be modified: `name`, `description`, `enabled`.
@@ -247,7 +248,7 @@ def update_rule_group(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_rule_types(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_rule_types(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get rule types by ID.
 
         Keyword arguments:
@@ -273,7 +274,7 @@ def get_rule_types(self: object, *args, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_rules_get(self: object, body: dict = None, **kwargs) -> dict:
+    def get_rules_get(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get rules by ID and optionally version in the following format: ID[:version].
 
         Keyword arguments:
@@ -301,7 +302,7 @@ def get_rules_get(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_rules(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_rules(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get rules by ID and optionally version in the following format: ID[:version].
 
         The max number of IDs is constrained by URL size.
@@ -333,7 +334,7 @@ def create_rule(self: object,
                     body: dict = None,
                     cs_username: str = None,  # pylint: disable=W0613  # deprecated
                     **kwargs
-                    ) -> dict:
+                    ) -> Dict[str, Union[int, dict]]:
         """Create a rule within a rule group. Returns the rule.
 
         Keyword arguments:
@@ -408,7 +409,7 @@ def delete_rules(self: object,
                      cs_username: str = None,  # pylint: disable=W0613  # deprecated
                      parameters: dict = None,
                      **kwargs
-                     ) -> dict:
+                     ) -> Dict[str, Union[int, dict]]:
         """Delete rules from a rule group by ID.
 
         Keyword arguments:
@@ -439,7 +440,7 @@ def update_rules(self: object,
                      body: dict = None,
                      cs_username: str = None,  # pylint: disable=W0613  # deprecated
                      **kwargs
-                     ) -> dict:
+                     ) -> Dict[str, Union[int, dict]]:
         """Update rules within a rule group. Return the updated rules.
 
         Keyword arguments:
@@ -526,7 +527,7 @@ def update_rules(self: object,
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def validate(self: object, body: dict = None, **kwargs) -> dict:
+    def validate(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Validate field values and check for matches if a test string is provided.
 
         Keyword arguments:
@@ -580,7 +581,7 @@ def validate(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_patterns(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_patterns(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get all pattern severity IDs.
 
         Keyword arguments:
@@ -608,7 +609,7 @@ def query_patterns(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_platforms(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_platforms(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get all platform IDs.
 
         Keyword arguments:
@@ -636,7 +637,7 @@ def query_platforms(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_rule_groups_full(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_rule_groups_full(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find all rule groups matching the query with optional filter.
 
         Keyword arguments:
@@ -682,7 +683,7 @@ def query_rule_groups_full(self: object, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_rule_groups(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_rule_groups(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find all rule group IDs matching the query with optional filter.
 
         Keyword arguments:
@@ -728,7 +729,7 @@ def query_rule_groups(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_rule_types(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_rule_types(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get all rule type IDs.
 
         Keyword arguments:
@@ -756,7 +757,7 @@ def query_rule_types(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_rules(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_rules(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find all rule IDs matching the query with optional filter.
 
         Keyword arguments:
diff --git a/src/falconpy/d4c_registration.py b/src/falconpy/d4c_registration.py
index ce5cdd90b..b641d9ffc 100644
--- a/src/falconpy/d4c_registration.py
+++ b/src/falconpy/d4c_registration.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import (
     azure_registration_payload,
@@ -59,7 +60,7 @@ class D4CRegistration(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_aws_account(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_aws_account(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return information about the current status of an AWS account.
 
         Keyword arguments:
@@ -94,7 +95,7 @@ def get_aws_account(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_aws_account(self: object, body: dict = None, **kwargs) -> dict:
+    def create_aws_account(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Register a new AWS account.
 
         Creates a new account in our system for a customer and generates a
@@ -141,7 +142,7 @@ def create_aws_account(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_aws_account(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_aws_account(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete an existing AWS account or organization from the tenant.
 
         Keyword arguments:
@@ -168,7 +169,7 @@ def delete_aws_account(self: object, *args, parameters: dict = None, **kwargs) -
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_aws_console_setup(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_aws_console_setup(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return a URL for customer to visit in their cloud environment to grant CrowdStrike access.
 
         Keyword arguments:
@@ -194,7 +195,7 @@ def get_aws_console_setup(self: object, *args, parameters: dict = None, **kwargs
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_aws_account_scripts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_aws_account_scripts(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return a script for customer to run in their cloud environment to grant CrowdStrike access.
 
         Keyword arguments:
@@ -220,7 +221,7 @@ def get_aws_account_scripts(self: object, *args, parameters: dict = None, **kwar
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_azure_account(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_azure_account(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return information about Azure account registration.
 
         Keyword arguments:
@@ -255,7 +256,7 @@ def get_azure_account(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_azure_account(self: object, body: dict = None, **kwargs) -> dict:
+    def create_azure_account(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Register a new Azure account.
 
         Creates a new account in our system for a customer and generates a
@@ -306,7 +307,7 @@ def update_azure_account_client_id(self: object,
                                        *args,
                                        parameters: dict = None,
                                        **kwargs
-                                       ) -> dict:
+                                       ) -> Dict[str, Union[int, dict]]:
         """Update Azure account client ID.
 
         Update an Azure service account in our system by with the
@@ -344,7 +345,7 @@ def update_azure_account_client_id(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_azure_user_scripts_attachment(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_azure_user_scripts_attachment(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve Azure user script attachment.
 
         Return a script for customer to run in their cloud environment to
@@ -377,7 +378,7 @@ def get_azure_user_scripts_attachment(self: object, parameters: dict = None, **k
             params=parameters
             )
 
-    def get_azure_user_scripts(self: object) -> dict:
+    def get_azure_user_scripts(self: object) -> Dict[str, Union[int, dict]]:
         """Retrieve Azure user script.
 
         Return a script for customer to run in their cloud
@@ -399,7 +400,7 @@ def get_azure_user_scripts(self: object) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_gcp_account(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_gcp_account(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return information about the current status of an GCP account.
 
         Keyword arguments:
@@ -430,7 +431,7 @@ def get_gcp_account(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_gcp_account(self: object, body: dict = None, **kwargs) -> dict:
+    def create_gcp_account(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Register new GCP account.
 
         Creates a new account in our system for a customer and generates a new service
@@ -469,7 +470,7 @@ def create_gcp_account(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def azure_download_certificate(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def azure_download_certificate(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Download Azure Certificate.
 
         Returns JSON object(s) that contain the base64 encoded certificate for a service principal.
@@ -517,7 +518,7 @@ def get_azure_tenant_ids(self: object) -> dict:
             operation_id="GetDiscoverCloudAzureTenantIDs"
             )
 
-    def get_gcp_user_scripts_attachment(self: object) -> dict:
+    def get_gcp_user_scripts_attachment(self: object) -> Dict[str, Union[int, dict]]:
         """Retrieve GCP user script attachment.
 
         Return a script for customer to run in their cloud environment to
@@ -539,7 +540,7 @@ def get_gcp_user_scripts_attachment(self: object) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_gcp_user_scripts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_gcp_user_scripts(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve GCP user script.
 
         Return a script for customer to run in their cloud
@@ -568,7 +569,7 @@ def get_gcp_user_scripts(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_aws_horizon_scripts(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_aws_horizon_scripts(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return a script for customer to run in their cloud environment to grant CrowdStrike access.
 
         Keyword arguments:
diff --git a/src/falconpy/debug.py b/src/falconpy/debug.py
index 4b3a03889..ba6d9f3bd 100644
--- a/src/falconpy/debug.py
+++ b/src/falconpy/debug.py
@@ -39,8 +39,9 @@
 import sys
 import importlib
 import atexit
-from os.path import dirname, join
-import glob
+from logging import Logger, basicConfig, getLogger, DEBUG
+# from os.path import dirname, join
+# import glob
 from . import oauth2 as FalconAuth
 
 
@@ -57,20 +58,19 @@ def help(item=None):  # pylint: disable=W0622
 
     AVAILABLE VARIABLES
         'DEBUG_TOKEN' - your OAuth2 token.
-        'AUTH_OBJECT' - an instance of the OAuth2 authorization class (authenticated).
+        'AUTH' - an instance of the OAuth2 authorization object (authenticated).
 
-    LISTING AVAILABLE SERVICE CLASSES
-    Use list_modules() to retrieve a list of all available service classes.
+    LISTING AVAILABLE CLASSES
+    Use list_modules() to retrieve a list of all available classes.
 
-    IMPORTING MODULES
-    Use import_module("MODULE_NAME") to import any of the available service classes.
+    ALL CLASSES ARE IMPORTED AND AVAILABLE FOR TESTING.
 
-    Import hosts module and query for a specific host:
-    In [1]: hosts = import_module("hosts")
-    In [2]: hosts.QueryDevicesByFilter(filter="hostname:'whatever'")
+    Create an instance of the Hosts Service Class and query for devices:
+    In [1]: hosts = Hosts(auth_object=AUTH)
+    In [2]: hosts.query_devices_by_filter_scroll(filter="hostname:'whatever'")
 
-    Importing the detects module and querying for all available detections with one command:
-    In [1]: import_module("detects").QueryDetects()
+    Using the Detects Service Class to query for all available detections with one command:
+    In [1]: Detects(auth_object=AUTH).query_detects()
 
     EXIT THE DEBUGGER
     Use exit / quit / CTRL-D to exit the debugger.
@@ -91,18 +91,31 @@ def embed():
     ipshell()
 
 
+def setup_logging() -> Logger:
+    """Configure simple logging."""
+    log_util = getLogger("log_testing")
+    basicConfig(level=DEBUG, format="%(asctime)s %(levelname)-8s %(name)s %(funcName)s %(message)s")
+
+    return log_util
+
+
 def list_modules():
     """List all available Service Classes."""
-    modules = glob.glob(join(dirname(__file__), "*.py"))
-    result = []
-    for key in modules:
-        branched = key.split("/")
-        position = len(branched)-1
-        module_name = branched[position].replace(".py", "")
-        if "_" not in module_name[0] and module_name not in ["debug", "api_complete"]:
-            result.append(module_name)
+    # modules = glob.glob(join(dirname(__file__), "*.py"))
+    # Only importing within this method to load the classes for the debugger not-package code.
+    # pylint: disable=C0415,E0401
+    import src.falconpy
+    result = [x for x in dir(src.falconpy) if ("_" not in x and not x.islower())]
+    # result = []
+    # for key in modules:
+    #     branched = key.split("/")
+    #     position = len(branched)-1
+    #     module_name = branched[position].replace(".py", "")
+    #     if "_" not in module_name[0] and module_name not in ["debug", "api_complete"]:
+    #         result.append(module_name)
     result.sort()
-    print("Available modules")
+    print("\nAvailable FalconPy classes")
+    print(f"{'=' * 65}")
     msg = ""
     for idx, val in enumerate(result):
         msg = f"{msg}%-35s" % val
@@ -114,6 +127,36 @@ def list_modules():
     print("\nLoad modules with import_module('MODULE_NAME')")
 
 
+def import_all():
+    """Inspect the package folder and import all available classes from all modules."""
+    # Only importing within this method to load the classes for the debugger not-package code.
+    # pylint: disable=C0415,E0401,R1702
+    try:
+        import src.falconpy as sdk
+    except ImportError:
+        # We're running via the package prolly
+        import falconpy as sdk
+    import inspect
+    loaded = []
+    for name, obj in inspect.getmembers(sdk, inspect.isclass):
+        # This is uh... interesting.
+        mod_name = f"{obj}".replace("<class", "").replace(">", "").replace("'", "").strip().replace(f".{name}", "")
+        if "enum" not in mod_name:
+            try:
+                module = importlib.import_module(mod_name)
+                for attribute_name in [x for x in dir(module) if "__" not in x]:
+                    attribute = getattr(module, attribute_name)
+                    if inspect.isclass(attribute):
+                        if attribute_name not in loaded:
+                            globals()[attribute_name] = attribute
+                            log.debug("Loaded %s class", attribute_name)
+                            loaded.append(attribute_name)
+
+            except ImportError:
+                # Probably one of the aliases
+                log.debug("Skipped %s alias", name)
+
+
 def import_module(module: str = None):
     """Dynamically imports the module requested and returns an authenticated instance of the Service Class."""
     returned_object = False
@@ -138,7 +181,7 @@ def import_module(module: str = None):
             for key in dir(current_module):
                 if isinstance(getattr(current_module, key), type) and not key == "ServiceClass" and "_" not in key:
                     _.append(getattr(_[0], key))
-                    returned_object = _[1](auth_object=AUTH_OBJECT)
+                    returned_object = _[1](auth_object=AUTH)
                     print(f"Service Class {key} imported successfully.")
     else:
         print("No module specified.")
@@ -148,18 +191,18 @@ def import_module(module: str = None):
 
 def exit_handler():
     """Revoke the DEBUG_TOKEN and gracefully quit the debugger. Overrides the built in python function."""
-    if AUTH_OBJECT:
+    if AUTH:
         print("Discarding token")
-        AUTH_OBJECT.revoke(token=DEBUG_TOKEN)
+        AUTH.revoke(token=DEBUG_TOKEN)
     sys.exit(0)
 
 
 def startup(dbg_falcon_client_id: str, dbg_falcon_client_secret: str):
     """Authenticate using the credentials provided and return the token / authentication object."""
-    auth_object = FalconAuth.OAuth2(creds={
-        'client_id': dbg_falcon_client_id,
-        'client_secret': dbg_falcon_client_secret
-    })
+    auth_object = FalconAuth.OAuth2(client_id=dbg_falcon_client_id,
+                                    client_secret=dbg_falcon_client_secret,
+                                    debug=True
+                                    )
 
     try:
         debug_token = auth_object.token()["body"]["access_token"]
@@ -180,8 +223,8 @@ def init(dbg_falcon_client_id: str = None, dbg_falcon_client_secret: str = None,
         dbg_falcon_client_id = os.environ["FALCON_CLIENT_ID"]
         dbg_falcon_client_secret = os.environ["FALCON_CLIENT_SECRET"]
 
-    global DEBUG_TOKEN, AUTH_OBJECT  # pylint: disable=W0603
-    DEBUG_TOKEN, AUTH_OBJECT = startup(dbg_falcon_client_id, dbg_falcon_client_secret)
+    global DEBUG_TOKEN, AUTH  # pylint: disable=W0603
+    DEBUG_TOKEN, AUTH = startup(dbg_falcon_client_id, dbg_falcon_client_secret)
     embed()
 
 
@@ -189,7 +232,7 @@ def init(dbg_falcon_client_id: str = None, dbg_falcon_client_secret: str = None,
 python_help = help
 
 # Configure our banner
-BANNER = """
+BANNER = r"""
 ,---.     |                   ,--.      |
 |__. ,---.|    ,---.,---.,---.|   |,---.|---..   .,---.
 |    ,---||    |    |   ||   ||   ||---'|   ||   ||   |
@@ -197,24 +240,25 @@ def init(dbg_falcon_client_id: str = None, dbg_falcon_client_secret: str = None,
                                                   `---'
             CrowdStrike Python 3 Debug Interface
 
-This shell-like interface allows for quick learning,
-demoing, and prototyping of API operations using
-the CrowdStrike FalconPy SDK and Python 3.
-
-Please type help() to learn more.
-                         |
-     _____________   __ -+- _____________
-     \\_____     /   /_ \\ |   \\     _____/
-       \\_____   \\____/  \\____/    _____/
-         \\_____    FalconPy      _____/
-           \\___________  ___________/
-                     /____\\
+This shell-like interface allows for quick demoing and prototyping
+of API operations using the CrowdStrike FalconPy SDK and Python 3.
+
+                             |
+         _____________   __ -+- _____________
+         \_____     /   /_ \ |   \     _____/
+           \_____   \____/  \____/    _____/
+             \_____    FalconPy      _____/
+               \___________  ___________/
+                         /____\
+
+           Please type help() to learn more.
 """
 
 # Default our debug token and auth object to False
 DEBUG_TOKEN = False
-AUTH_OBJECT = False
+AUTH = False
 
 atexit.register(exit_handler)
-
+log = setup_logging()
+import_all()
 init()
diff --git a/src/falconpy/detects.py b/src/falconpy/detects.py
index 8abc60466..859a6297d 100644
--- a/src/falconpy/detects.py
+++ b/src/falconpy/detects.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request
 from ._payload import generic_payload_list, update_detects_payload
 from ._payload import aggregate_payload
@@ -56,7 +57,7 @@ class Detects(ServiceClass):
     """
 
     @force_default(defaults=["body"], default_types=["list"])
-    def get_aggregate_detects(self: object, body: list = None, **kwargs) -> dict:
+    def get_aggregate_detects(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get detect aggregates as specified via json in request body.
 
         Keyword arguments:
@@ -140,7 +141,7 @@ def get_aggregate_detects(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_detects_by_ids(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def update_detects_by_ids(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Modify the state, assignee, and visibility of detections.
 
         Keyword arguments:
@@ -210,7 +211,7 @@ def update_detects_by_ids(self: object, *args, body: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_detect_summaries(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def get_detect_summaries(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """View information about detections.
 
         Keyword arguments:
@@ -248,7 +249,7 @@ def get_detect_summaries(self: object, *args, body: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_detects(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_detects(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for detection IDs that match a given query.
 
         Keyword arguments:
diff --git a/src/falconpy/device_control_policies.py b/src/falconpy/device_control_policies.py
index 58c6de837..abe839bc0 100644
--- a/src/falconpy/device_control_policies.py
+++ b/src/falconpy/device_control_policies.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import generate_error_result, force_default, args_to_params
 from ._util import process_service_request, handle_single_argument
 from ._payload import generic_payload_list, device_policy_payload, default_device_policy_config_payload
@@ -56,7 +57,7 @@ class DeviceControlPolicies(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for a Device Control Policy members and return full detail.
 
         Search for members of a Device Control Policy in your environment by
@@ -92,7 +93,7 @@ def query_combined_policy_members(self: object, parameters: dict = None, **kwarg
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for a Device Control Policies and return full detail.
 
         Search for Device Control Policies in your environment by providing an FQL filter and
@@ -209,7 +210,7 @@ def update_default_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters", "body"], default_types=["dict", "dict"])
-    def perform_action(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def perform_action(self: object, body: dict = None, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Perform a Device Control Policy action.
 
         Keyword arguments:
@@ -277,7 +278,7 @@ def perform_action(self: object, body: dict = None, parameters: dict = None, **k
         return returned
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def set_precedence(self: object, body: dict = None, **kwargs) -> dict:
+    def set_precedence(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Set Device Control Policy precedence.
 
         Sets the precedence of Device Control Policies based on the order of IDs specified in
@@ -319,7 +320,7 @@ def set_precedence(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a set of Device Control Policies by specifying their IDs.
 
         Keyword arguments:
@@ -346,7 +347,7 @@ def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def create_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create Device Control Policies by specifying details about the policy to create.
 
         Keyword arguments:
@@ -430,7 +431,7 @@ def create_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a set of Device Control Policies by specifying their IDs.
 
         Keyword arguments:
@@ -457,7 +458,7 @@ def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def update_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update Device Control Policies by specifying the ID of the policy and details to update.
 
         Keyword arguments:
@@ -539,7 +540,7 @@ def update_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for a Device Control Policy members and return their IDs.
 
         Search for members of a Device Control Policy in your environment by providing
@@ -575,7 +576,7 @@ def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for a Device Control Policies and return their IDs.
 
         Search for Device Control Policies in your environment by providing an
diff --git a/src/falconpy/discover.py b/src/falconpy/discover.py
index e62015c2b..7631e32f3 100644
--- a/src/falconpy/discover.py
+++ b/src/falconpy/discover.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default, handle_single_argument
 from ._service_class import ServiceClass
 from ._endpoint._discover import _discover_endpoints as Endpoints
@@ -54,7 +55,7 @@ class Discover(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_accounts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_accounts(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on accounts by providing one or more IDs.
 
         Find account IDs with `query_accounts`.
@@ -82,7 +83,7 @@ def get_accounts(self: object, *args, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_applications(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_applications(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on applications by providing one or more IDs.
 
         Find application IDs with `query_applications`.
@@ -110,7 +111,7 @@ def get_applications(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_hosts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_hosts(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on assets by providing one or more IDs.
 
         Find asset IDs with `query_hosts`.
@@ -138,7 +139,7 @@ def get_hosts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_logins(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_logins(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on logins by providing one or more IDs.
 
         Find login IDs with `query_logins`.
@@ -166,7 +167,7 @@ def get_logins(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_accounts(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_accounts(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for accounts in your environment.
 
         Supports providing a FQL (Falcon Query Language) filter and paging details.
@@ -220,7 +221,7 @@ def query_accounts(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_applications(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_applications(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for applications in your environment.
 
         Supports providing a FQL (Falcon Query Language) filter and paging details.
@@ -255,7 +256,7 @@ def query_applications(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_hosts(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_hosts(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for assets in your environment.
 
         Supports providing a FQL (Falcon Query Language) filter and paging details.
@@ -316,7 +317,7 @@ def query_hosts(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_logins(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_logins(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for logins in your environment.
 
         Supports providing a FQL (Falcon Query Language) filter and paging details.
diff --git a/src/falconpy/event_streams.py b/src/falconpy/event_streams.py
index 0cc53714a..e51fca632 100644
--- a/src/falconpy/event_streams.py
+++ b/src/falconpy/event_streams.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request
 from ._service_class import ServiceClass
 from ._endpoint._event_streams import _event_streams_endpoints as Endpoints
@@ -59,7 +60,7 @@ def refresh_active_stream(self: object,
                               parameters: dict = None,
                               body: dict = None,
                               **kwargs
-                              ) -> dict:
+                              ) -> Dict[str, Union[int, dict]]:
         """Refresh an active event stream.
 
         Use the URL shown in a listAvailableStreamsOAuth2 response.
@@ -97,7 +98,7 @@ def refresh_active_stream(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def list_available_streams(self: object, parameters: dict = None, **kwargs) -> dict:
+    def list_available_streams(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Discover all event streams in your environment.
 
         Keyword arguments:
diff --git a/src/falconpy/falcon_complete_dashboard.py b/src/falconpy/falcon_complete_dashboard.py
index e151b2eeb..6fea29388 100644
--- a/src/falconpy/falcon_complete_dashboard.py
+++ b/src/falconpy/falcon_complete_dashboard.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default
 from ._payload import aggregate_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class CompleteDashboard(ServiceClass):
     """
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_allow_list(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_allow_list(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve aggregate allowlist ticket values based on the matched filter.
 
         Keyword arguments:
@@ -131,7 +132,7 @@ def aggregate_allow_list(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_block_list(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_block_list(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve aggregate blocklist ticket values based on the matched filter.
 
         Keyword arguments:
@@ -217,7 +218,7 @@ def aggregate_block_list(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_detections(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_detections(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve aggregate detection values based on the matched filter.
 
         Keyword arguments:
@@ -303,7 +304,7 @@ def aggregate_detections(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_device_count_collection(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_device_count_collection(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve aggregate host/devices count based on the matched filter.
 
         Keyword arguments:
@@ -391,7 +392,7 @@ def aggregate_device_count_collection(self: object, body: list = None, **kwargs)
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_escalations(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_escalations(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve aggregate escalation ticket values based on the matched filter.
 
         Keyword arguments:
@@ -477,7 +478,7 @@ def aggregate_escalations(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_fc_incidents(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_fc_incidents(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve aggregate incident values based on the matched filter.
 
         Keyword arguments:
@@ -563,7 +564,7 @@ def aggregate_fc_incidents(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_remediations(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_remediations(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve aggregate remediation ticket values based on the matched filter.
 
         Keyword arguments:
@@ -649,7 +650,7 @@ def aggregate_remediations(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_allow_list_filter(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_allow_list_filter(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve allowlist tickets that match the provided filter criteria with scrolling enabled.
 
         Keyword arguments:
@@ -679,7 +680,7 @@ def query_allow_list_filter(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_block_list_filter(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_block_list_filter(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve block listtickets that match the provided filter criteria with scrolling enabled.
 
         Keyword arguments:
@@ -709,7 +710,7 @@ def query_block_list_filter(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_detection_ids_by_filter(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_detection_ids_by_filter(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve DetectionsIds that match the provided FQL filter criteria with scrolling enabled.
 
         Keyword arguments:
@@ -740,7 +741,10 @@ def query_detection_ids_by_filter(self: object, parameters: dict = None, **kwarg
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_device_count_collection_queries_by_filter(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_device_count_collection_queries_by_filter(self: object,
+                                                      parameters: dict = None,
+                                                      **kwargs
+                                                      ) -> Dict[str, Union[int, dict]]:
         """Retrieve device count collection Ids that match the provided FQL filter, criteria with scrolling enabled.
 
         Keyword arguments:
@@ -771,7 +775,7 @@ def get_device_count_collection_queries_by_filter(self: object, parameters: dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_escalations_filter(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_escalations_filter(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve escalation tickets that match the provided filter criteria with scrolling enabled.
 
         Keyword arguments:
@@ -802,7 +806,7 @@ def query_escalations_filter(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_incident_ids_by_filter(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_incident_ids_by_filter(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve incidents that match the provided filter criteria with scrolling enabled.
 
         Keyword arguments:
@@ -833,7 +837,7 @@ def query_incident_ids_by_filter(self: object, parameters: dict = None, **kwargs
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_remediations_filter(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_remediations_filter(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve remediation tickets that match the provided filter criteria with scrolling enabled.
 
         Keyword arguments:
diff --git a/src/falconpy/falcon_container.py b/src/falconpy/falcon_container.py
index f251af1b8..26dc19134 100644
--- a/src/falconpy/falcon_container.py
+++ b/src/falconpy/falcon_container.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default, handle_single_argument
 from ._payload import image_payload, registry_payload
 from ._service_class import ServiceClass
@@ -54,7 +55,7 @@ class FalconContainer(ServiceClass):
     - a valid token provided by the authentication service class (oauth2.py)
     """
 
-    def get_credentials(self: object) -> dict:
+    def get_credentials(self: object) -> Dict[str, Union[int, dict]]:
         """Retrieve the registry credentials.
 
         HTTP Method: GET
@@ -83,7 +84,7 @@ def get_credentials(self: object) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def read_image_vulnerabilities(self: object, body: dict = None, **kwargs) -> dict:
+    def read_image_vulnerabilities(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve an assessment report for an image by specifying repository and tag.
 
         HTTP Method: POST
@@ -155,7 +156,7 @@ def read_image_vulnerabilities(self: object, body: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_assessment(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_assessment(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve an assessment report for an image by specifying repository and tag.
 
         If you specify both sets of parameters, the scan report is searched using the image ID
@@ -195,7 +196,7 @@ def get_assessment(self: object, parameters: dict = None, **kwargs) -> dict:
             params=parameters
             )
 
-    def delete_image_details(self: object, *args, image_id: str = None) -> dict:
+    def delete_image_details(self: object, *args, image_id: str = None) -> Dict[str, Union[int, dict]]:
         """Delete image details from the CrowdStrike registry.
 
         HTTP Method: DELETE
@@ -230,7 +231,7 @@ def delete_image_details(self: object, *args, image_id: str = None) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def image_matches_policy(self: object, parameters: dict = None, **kwargs) -> dict:
+    def image_matches_policy(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Check if an image matches a policy by specifying repository and tag.
 
         HTTP Method: GET
diff --git a/src/falconpy/falconx_sandbox.py b/src/falconpy/falconx_sandbox.py
index 8b21a7198..a578cd03e 100644
--- a/src/falconpy/falconx_sandbox.py
+++ b/src/falconpy/falconx_sandbox.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 import json
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import generic_payload_list, falconx_payload
 from ._service_class import ServiceClass
@@ -189,7 +190,7 @@ def get_memory_dump(self: object, *args, parameters: dict = None, **kwargs) -> o
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_summary_reports(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_summary_reports(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a short summary version of a sandbox report.
 
         Keyword arguments:
@@ -215,7 +216,7 @@ def get_summary_reports(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_submissions(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_submissions(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Check the status of a sandbox analysis.
 
         Time required for analysis varies but is usually less than 15 minutes.
@@ -245,7 +246,7 @@ def get_submissions(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def submit(self: object, body: dict = None, **kwargs) -> dict:
+    def submit(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Submit an uploaded file or a URL for sandbox analysis.
 
         The sample file must have been previously uploaded through `upload_sample`.
@@ -331,7 +332,7 @@ def submit(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_reports(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_reports(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find sandbox reports by providing an FQL filter and paging details.
 
         Returns a set of report IDs that match your criteria.
@@ -363,7 +364,7 @@ def query_reports(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_submissions(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_submissions(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find submission IDs for uploaded files by providing an FQL filter and paging details.
 
         Returns a set of submission IDs that match your criteria.
@@ -400,7 +401,7 @@ def upload_sample(self: object,
                       body: dict = None,
                       parameters: dict = None,
                       **kwargs
-                      ) -> dict:
+                      ) -> Dict[str, Union[int, dict]]:
         """Upload a file for sandbox analysis.
 
         After uploading, use `submit` to start analyzing the file.
@@ -499,7 +500,7 @@ def get_reports(self: object, *args, parameters: dict = None, **kwargs) -> objec
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_report(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_report(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a report based on the report ID.
 
         Operation can be checked for success by polling for the report ID on the get_summary_reports endpoint.
@@ -562,7 +563,7 @@ def get_sample(self: object, *args, parameters: dict = None, **kwargs) -> object
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_sample(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_sample(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Remove a sample, including file, meta and submissions from the collection.
 
         Keyword arguments:
@@ -590,7 +591,7 @@ def delete_sample(self: object, *args, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def query_sample(self: object, body: dict = None, **kwargs) -> dict:
+    def query_sample(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a list with sha256 of samples that exist and customer has rights to access.
 
         Maximum number of accepted items is 200.
diff --git a/src/falconpy/filevantage.py b/src/falconpy/filevantage.py
index 22e2af8f0..8dc7e021d 100644
--- a/src/falconpy/filevantage.py
+++ b/src/falconpy/filevantage.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default, handle_single_argument
 from ._service_class import ServiceClass
 from ._endpoint._filevantage import _filevantage_endpoints as Endpoints
@@ -54,7 +55,7 @@ class FileVantage(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_changes(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_changes(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve information on changes.
 
         Keyword arguments:
@@ -80,7 +81,7 @@ def get_changes(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_changes(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_changes(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for changes within your environment. Returns one or more change IDs.
 
         Keyword arguments:
diff --git a/src/falconpy/firewall_management.py b/src/falconpy/firewall_management.py
index 73407585b..26f3cf22c 100644
--- a/src/falconpy/firewall_management.py
+++ b/src/falconpy/firewall_management.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 # pylint: disable=C0302,R0904
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import (
     aggregate_payload,
@@ -65,7 +66,7 @@ class FirewallManagement(ServiceClass):
     """
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_events(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_events(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Aggregate events for customer.
 
         Keyword arguments:
@@ -150,7 +151,7 @@ def aggregate_events(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_policy_rules(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_policy_rules(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Aggregate rules within a policy for customer.
 
         Keyword arguments:
@@ -235,7 +236,7 @@ def aggregate_policy_rules(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_rule_groups(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_rule_groups(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Aggregate rule groups for customer.
 
         Keyword arguments:
@@ -320,7 +321,7 @@ def aggregate_rule_groups(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_rules(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_rules(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Aggregate rules for customer.
 
         Keyword arguments:
@@ -405,7 +406,7 @@ def aggregate_rules(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_events(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_events(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get events entities by ID and optionally version.
 
         Keyword arguments:
@@ -431,7 +432,7 @@ def get_events(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_firewall_fields(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_firewall_fields(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get the firewall field specifications by ID.
 
         Keyword arguments:
@@ -912,7 +913,7 @@ def delete_network_locations(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_platforms(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_platforms(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get platforms by ID, e.g., windows or mac or droid.
 
         Keyword arguments:
@@ -938,7 +939,7 @@ def get_platforms(self: object, *args, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_policy_containers(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_policy_containers(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get policy container entities by policy ID.
 
         Keyword arguments:
@@ -968,7 +969,7 @@ def update_policy_container_v1(self: object,
                                    body: dict = None,
                                    cs_username: str = None,  # pylint: disable=W0613  # deprecated
                                    **kwargs
-                                   ) -> dict:
+                                   ) -> Dict[str, Union[int, dict]]:
         """Update an identified policy container.
 
         **DEPRECATED**
@@ -1024,7 +1025,7 @@ def update_policy_container(self: object,
                                 body: dict,
                                 cs_username: str = None,  # pylint: disable=W0613  # deprecated
                                 **kwargs
-                                ) -> dict:
+                                ) -> Dict[str, Union[int, dict]]:
         """Update an identified policy container.
 
         Keyword arguments:
@@ -1074,7 +1075,7 @@ def update_policy_container(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_rule_groups(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_rule_groups(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get rule group entities by ID.
 
         These groups do not contain their rule entites, just the rule IDs in precedence order.
@@ -1107,7 +1108,7 @@ def create_rule_group(self: object,
                           cs_username: str = None,  # pylint: disable=W0613  # cs_username is deprecated
                           parameters: dict = None,
                           **kwargs
-                          ) -> dict:
+                          ) -> Dict[str, Union[int, dict]]:
         """Create new rule group on a platform for a customer with a name and description.
 
         Returns the ID.
@@ -1298,7 +1299,7 @@ def delete_rule_groups(self: object,
                            cs_username: str = None,  # pylint: disable=W0613  # cs_username is deprecated
                            parameters: dict = None,
                            **kwargs
-                           ) -> dict:
+                           ) -> Dict[str, Union[int, dict]]:
         """Delete rule group entities by ID.
 
         Keyword arguments:
@@ -1329,7 +1330,7 @@ def update_rule_group(self: object,
                           cs_username: str = None,  # pylint: disable=W0613  # deprecated
                           parameters: dict = None,
                           **kwargs
-                          ) -> dict:
+                          ) -> Dict[str, Union[int, dict]]:
         """Update name, description, or enabled status of a rule group and underlying rules.
 
         Can also create, edit, delete, or reorder rules.
@@ -1389,7 +1390,11 @@ def update_rule_group(self: object,
             )
 
     @force_default(defaults=["body", "parameters"], default_types=["dict", "dict"])
-    def create_rule_group_validation(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def create_rule_group_validation(self: object,
+                                     body: dict = None,
+                                     parameters: dict = None,
+                                     **kwargs
+                                     ) -> Dict[str, Union[int, dict]]:
         """Validate the request for creating a new rule group on a platform for a customer with a name and description.
 
         Keyword arguments:
@@ -1498,7 +1503,7 @@ def update_rule_group_validation(self: object,
                                      cs_username: str = None,  # pylint: disable=W0613  # deprecated
                                      parameters: dict = None,
                                      **kwargs
-                                     ) -> dict:
+                                     ) -> Dict[str, Union[int, dict]]:
         """Validate the request.
 
         Validates the request of updating name, description, or enabled status
@@ -1559,7 +1564,7 @@ def update_rule_group_validation(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_rules(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_rules(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get rule entities by ID or Family ID.
 
         ID = 64-bit unsigned int as decimal string
@@ -1588,7 +1593,7 @@ def get_rules(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def validate_filepath_pattern(self: object, body: dict = None, **kwargs) -> dict:
+    def validate_filepath_pattern(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Validate that the test pattern matches the executable filepath glob pattern.
 
         Keyword arguments:
@@ -1621,7 +1626,7 @@ def validate_filepath_pattern(self: object, body: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_events(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_events(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find all event IDs matching the query with filter.
 
         Keyword arguments:
@@ -1663,7 +1668,7 @@ def query_events(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_firewall_fields(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_firewall_fields(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get the firewall field specification IDs for the provided platform.
 
         Keyword arguments:
@@ -1723,7 +1728,7 @@ def query_network_locations(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_platforms(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_platforms(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get the list of platform names.
 
         Keyword arguments:
@@ -1749,7 +1754,7 @@ def query_platforms(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policy_rules(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policy_rules(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find all firewall rule IDs matching the query with filter.
 
         Results are returned in precedence order.
@@ -1793,7 +1798,7 @@ def query_policy_rules(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_rule_groups(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_rule_groups(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find all rule group IDs matching the query with filter.
 
         Keyword arguments:
@@ -1835,7 +1840,7 @@ def query_rule_groups(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_rules(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_rules(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find all rule IDs matching the query with filter.
 
         Keyword arguments:
diff --git a/src/falconpy/firewall_policies.py b/src/falconpy/firewall_policies.py
index 29fb2ef75..274eeb53b 100644
--- a/src/falconpy/firewall_policies.py
+++ b/src/falconpy/firewall_policies.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, generate_error_result, force_default
 from ._util import args_to_params, handle_single_argument
 from ._payload import generic_payload_list, firewall_policy_payload
@@ -56,7 +57,7 @@ class FirewallPolicies(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Firewall Policy in your environment by providing an FQL filter and paging details.
 
         Returns a set of host details which match the filter criteria.
@@ -89,7 +90,7 @@ def query_combined_policy_members(self: object, parameters: dict = None, **kwarg
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Firewall Policies in your environment by providing an FQL filter and paging details.
 
         Returns a set of Firewall Policies which match the filter criteria.
@@ -126,7 +127,7 @@ def query_combined_policies(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters", "body"], default_types=["dict", "dict"])
-    def perform_action(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def perform_action(self: object, body: dict = None, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Perform the specified action on the Firewall Policies specified in the request.
 
         Keyword arguments:
@@ -193,7 +194,7 @@ def perform_action(self: object, body: dict = None, parameters: dict = None, **k
         return returned
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def set_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def set_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Set the precedence of Firewall Policies based on the order of IDs specified in the request.
 
         The first ID specified will have the highest precedence and the last ID specified
@@ -233,7 +234,7 @@ def set_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a set of Firewall Policies by specifying their IDs.
 
         Keyword arguments:
@@ -259,7 +260,7 @@ def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def create_policies(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def create_policies(self: object, body: dict = None, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create Firewall Policies by specifying details about the policy to create.
 
         Keyword arguments:
@@ -301,7 +302,7 @@ def create_policies(self: object, body: dict = None, parameters: dict = None, **
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a set of Firewall Policies by specifying their IDs.
 
         Keyword arguments:
@@ -327,7 +328,7 @@ def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def update_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update Firewall Policies by specifying the ID of the policy and details to update.
 
         Keyword arguments:
@@ -365,7 +366,7 @@ def update_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Firewall Policy in your environment by providing an FQL filter and paging details.
 
         Returns a set of Agent IDs which match the filter criteria.
@@ -398,7 +399,7 @@ def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Firewall Policies in your environment by providing an FQL filter and paging details.
 
         Returns a set of Firewall Policy IDs which match the filter criteria.
diff --git a/src/falconpy/host_group.py b/src/falconpy/host_group.py
index 15ee87f27..490663f1f 100644
--- a/src/falconpy/host_group.py
+++ b/src/falconpy/host_group.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import generate_error_result, force_default, args_to_params
 from ._util import handle_single_argument, process_service_request
 from ._payload import host_group_create_payload, host_group_update_payload
@@ -57,7 +58,7 @@ class HostGroup(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_group_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_group_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Host Group in your environment.
 
         Provide a FQL filter and paging details.
@@ -94,7 +95,7 @@ def query_combined_group_members(self: object, parameters: dict = None, **kwargs
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_host_groups(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_host_groups(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Host Groups in your environment by providing an FQL filter and paging details.
 
         Returns a set of Host Groups which match the filter criteria.
@@ -139,7 +140,7 @@ def perform_group_action(self: object,
                              body: dict = None,
                              parameters: dict = None,
                              **kwargs
-                             ) -> dict:
+                             ) -> Dict[str, Union[int, dict]]:
         """Perform the specified action on the Host Groups specified in the request.
 
         Keyword arguments:
@@ -203,7 +204,7 @@ def perform_group_action(self: object,
         return returned
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_host_groups(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_host_groups(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a set of Host Groups by specifying their IDs.
 
         Keyword arguments:
@@ -229,7 +230,7 @@ def get_host_groups(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_host_groups(self: object, body: dict = None, **kwargs) -> dict:
+    def create_host_groups(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create Host Groups by specifying details about the group to create.
 
         Keyword arguments:
@@ -269,7 +270,7 @@ def create_host_groups(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_host_groups(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_host_groups(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a set of Host Groups by specifying their IDs.
 
         Keyword arguments:
@@ -295,7 +296,7 @@ def delete_host_groups(self: object, *args, parameters: dict = None, **kwargs) -
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_host_groups(self: object, body: dict = None, **kwargs) -> dict:
+    def update_host_groups(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update Host Groups by specifying the ID of the group and details to update.
 
         Keyword arguments:
@@ -335,7 +336,7 @@ def update_host_groups(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_group_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_group_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Host Group in your environment.
 
         Provide a FQL filter and paging details.
@@ -371,7 +372,7 @@ def query_group_members(self: object, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_host_groups(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_host_groups(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Host Groups in your environment by providing an FQL filter and paging details.
 
         Returns a set of Host Group IDs which match the filter criteria.
diff --git a/src/falconpy/hosts.py b/src/falconpy/hosts.py
index 414c87e12..50a5251d5 100644
--- a/src/falconpy/hosts.py
+++ b/src/falconpy/hosts.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import generate_error_result, force_default, args_to_params
 from ._util import process_service_request, handle_single_argument
 from ._payload import generic_payload_list, simple_action_parameter
@@ -56,7 +57,7 @@ class Hosts(ServiceClass):
     """
 
     @force_default(defaults=["parameters", "body"], default_types=["dict"])
-    def perform_action(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def perform_action(self: object, body: dict = None, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Take various actions on the hosts in your environment.
 
         Contain or lift containment on a host. Delete or restore a host.
@@ -174,7 +175,7 @@ def update_device_tags(self: object,
                            action_name: str,
                            ids: list or str,
                            tags: list or str
-                           ) -> dict:
+                           ) -> Dict[str, Union[int, dict]]:
         """Append or remove one or more Falcon Grouping Tags on one or more hosts.
 
         Keyword arguments:
@@ -235,7 +236,7 @@ def update_device_tags(self: object,
         return returned
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_device_details_v1(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_device_details_v1(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on one or more hosts by providing agent IDs (AID).
 
         You can get a host's agent IDs (AIDs) from query_devices_by_filter,
@@ -264,7 +265,7 @@ def get_device_details_v1(self: object, *args, parameters: dict = None, **kwargs
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_device_details_v2(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_device_details_v2(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on one or more hosts by providing agent IDs (AID).
 
         You can get a host's agent IDs (AIDs) from query_devices_by_filter,
@@ -301,7 +302,7 @@ def get_device_details(self: object,
                            body: dict = None,
                            parameters: dict = None,
                            **kwargs
-                           ) -> dict:
+                           ) -> Dict[str, Union[int, dict]]:
         """Get details on one or more hosts by providing agent IDs (AID).
 
         You can get a host's agent IDs (AIDs) from query_devices_by_filter,
@@ -353,7 +354,7 @@ def get_device_details(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_online_state(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_online_state(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get the online status for one or more hosts by specifying each host’s unique ID.
 
         Successful requests return an HTTP 200 response and the status for each host identified
@@ -384,7 +385,7 @@ def get_online_state(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_hidden_devices(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_hidden_devices(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve hidden hosts that match the provided filter criteria.
 
         Keyword arguments:
@@ -430,7 +431,7 @@ def query_hidden_devices(self: object, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_devices_by_filter_scroll(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_devices_by_filter_scroll(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for hosts in your environment by platform, hostname, IP, and other criteria.
 
         Provides continuous pagination capability (based on offset pointer which expires after
@@ -479,7 +480,7 @@ def query_devices_by_filter_scroll(self: object, parameters: dict = None, **kwar
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_devices_by_filter(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_devices_by_filter(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for hosts in your environment by platform, hostname, IP, and other criteria.
 
         Keyword arguments:
@@ -525,7 +526,7 @@ def query_devices_by_filter(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def query_device_login_history(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def query_device_login_history(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve details about recent login sessions for a set of devices.
 
         Keyword arguments:
@@ -563,7 +564,7 @@ def query_device_login_history(self: object, *args, body: dict = None, **kwargs)
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def query_network_address_history(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def query_network_address_history(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve history of IP and MAC addresses of devices.
 
         Keyword arguments:
diff --git a/src/falconpy/identity_protection.py b/src/falconpy/identity_protection.py
index 49a86949b..39e3c3691 100644
--- a/src/falconpy/identity_protection.py
+++ b/src/falconpy/identity_protection.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default
 from ._service_class import ServiceClass
 from ._endpoint._identity_protection import _identity_protection_endpoints as Endpoints
@@ -54,7 +55,7 @@ class IdentityProtection(ServiceClass):
     """
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def graphql(self: object, body: dict = None, **kwargs) -> dict:
+    def graphql(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         r"""Identity Protection GraphQL API.
 
         Allows to retrieve entities, timeline activities, identity-based incidents and
diff --git a/src/falconpy/incidents.py b/src/falconpy/incidents.py
index 5977fd560..bd42f8453 100644
--- a/src/falconpy/incidents.py
+++ b/src/falconpy/incidents.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request
 from ._payload import generic_payload_list, incident_action_parameters
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class Incidents(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def crowdscore(self: object, parameters: dict = None, **kwargs) -> dict:
+    def crowdscore(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query environment wide CrowdScore and return the entity data.
 
         Keyword arguments:
@@ -85,7 +86,7 @@ def crowdscore(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_behaviors(self: object, body: dict = None, **kwargs) -> dict:
+    def get_behaviors(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on behaviors by providing behavior IDs.
 
         Keyword arguments:
@@ -117,7 +118,11 @@ def get_behaviors(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body", "parameters"], default_types=["dict", "dict"])
-    def perform_incident_action(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def perform_incident_action(self: object,
+                                body: dict = None,
+                                parameters: dict = None,
+                                **kwargs
+                                ) -> Dict[str, Union[int, dict]]:
         """Perform a set of actions on one or more incidents.
 
         Such as: adding tags or updating the incident name or description.
@@ -195,7 +200,7 @@ def perform_incident_action(self: object, body: dict = None, parameters: dict =
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_incidents(self: object, body: dict = None, **kwargs) -> dict:
+    def get_incidents(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on incidents by providing incident IDs.
 
         Keyword arguments:
@@ -227,7 +232,7 @@ def get_incidents(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_behaviors(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_behaviors(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for behaviors by providing an FQL filter, sorting, and paging details.
 
         Keyword arguments:
@@ -257,7 +262,7 @@ def query_behaviors(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_incidents(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_incidents(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for incidents by providing an FQL filter, sorting, and paging details.
 
         Keyword arguments:
diff --git a/src/falconpy/installation_tokens.py b/src/falconpy/installation_tokens.py
index 18ddd425b..b21f0aff7 100644
--- a/src/falconpy/installation_tokens.py
+++ b/src/falconpy/installation_tokens.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import installation_token_payload, token_settings_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class InstallationTokens(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def audit_events_read(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def audit_events_read(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get the details of one or more audit events by id.
 
         Keyword arguments:
@@ -80,7 +81,7 @@ def audit_events_read(self: object, *args, parameters: dict = None, **kwargs) ->
             params=handle_single_argument(args, parameters, "ids")
             )
 
-    def customer_settings_read(self: object) -> dict:
+    def customer_settings_read(self: object) -> Dict[str, Union[int, dict]]:
         """Check current installation token settings.
 
         This method does not accept arguments or keywords.
@@ -99,7 +100,7 @@ def customer_settings_read(self: object) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def tokens_read(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def tokens_read(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get the details of one or more tokens by id.
 
         Keyword arguments:
@@ -125,7 +126,7 @@ def tokens_read(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def tokens_create(self: object, body: dict = None, **kwargs) -> dict:
+    def tokens_create(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create a token.
 
         Keyword arguments:
@@ -161,7 +162,7 @@ def tokens_create(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def tokens_delete(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def tokens_delete(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a token immediately. To revoke a token, use PATCH tokens_update instead.
 
         Keyword arguments:
@@ -187,7 +188,7 @@ def tokens_delete(self: object, *args, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters", "body"], default_types=["dict", "dict"])
-    def tokens_update(self: object, body: dict, parameters: dict = None, **kwargs) -> dict:  # pylint: disable=C0103
+    def tokens_update(self: object, body: dict, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update one or more tokens.
 
         Use this endpoint to edit labels, change expiration, revoke, or restore.
@@ -228,7 +229,7 @@ def tokens_update(self: object, body: dict, parameters: dict = None, **kwargs) -
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def audit_events_query(self: object, parameters: dict = None, **kwargs) -> dict:
+    def audit_events_query(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for audit events by providing an FQL filter and paging details.
 
         Keyword arguments:
@@ -259,7 +260,7 @@ def audit_events_query(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def tokens_query(self: object, parameters: dict = None, **kwargs) -> dict:
+    def tokens_query(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for tokens by providing an FQL filter and paging details.
 
         Keyword arguments:
diff --git a/src/falconpy/intel.py b/src/falconpy/intel.py
index 6775214ca..239beb5be 100644
--- a/src/falconpy/intel.py
+++ b/src/falconpy/intel.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import generic_payload_list
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class Intel(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_actor_entities(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_actor_entities(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get info about actors that match provided FQL filters.
 
         Keyword arguments:
@@ -107,7 +108,7 @@ def query_actor_entities(self: object, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_indicator_entities(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_indicator_entities(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get info about indicators that match provided FQL filters.
 
         Keyword arguments:
@@ -154,7 +155,7 @@ def query_indicator_entities(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_report_entities(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_report_entities(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get info about reports that match provided FQL filters.
 
         Keyword arguments:
@@ -206,7 +207,7 @@ def query_report_entities(self: object, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_actor_entities(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_actor_entities(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve specific actors using their actor IDs.
 
         Keyword arguments:
@@ -235,7 +236,7 @@ def get_actor_entities(self: object, *args, parameters: dict = None, **kwargs) -
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_indicator_entities(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def get_indicator_entities(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve specific indicators using their indicator IDs.
 
         Keyword arguments:
@@ -273,7 +274,7 @@ def get_indicator_entities(self: object, *args, body: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_mitre_report(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_mitre_report(self: object, parameters: dict = None, **kwargs) -> Union[Dict[str, Union[int, dict]], bytes]:
         """Export Mitre ATT&CK information for a given actor.
 
         Keyword arguments:
@@ -299,7 +300,7 @@ def get_mitre_report(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def mitre_attacks(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def mitre_attacks(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve reports and observable IDs associated with the given actor and attacks.
 
         Keyword arguments:
@@ -363,7 +364,7 @@ def get_report_pdf(self: object, *args, parameters: dict = None, **kwargs) -> ob
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_report_entities(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_report_entities(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve specific reports using their report IDs.
 
         Keyword arguments:
@@ -450,7 +451,7 @@ def get_latest_rule_file(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_rule_entities(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_rule_entities(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve details for rule sets for the specified ids.
 
         Keyword arguments:
@@ -476,7 +477,7 @@ def get_rule_entities(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_actor_ids(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_actor_ids(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get actor IDs that match provided FQL filters.
 
         Keyword arguments:
@@ -525,7 +526,7 @@ def query_actor_ids(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_indicator_ids(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_indicator_ids(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get indicators IDs that match provided FQL filters.
 
         Keyword arguments:
@@ -569,7 +570,7 @@ def query_indicator_ids(self: object, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_mitre_attacks(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def query_mitre_attacks(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get MITRE tactics and techniques for the given actor.
 
         Keyword arguments:
@@ -595,7 +596,7 @@ def query_mitre_attacks(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_report_ids(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_report_ids(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get report IDs that match provided FQL filters.
 
         Keyword arguments:
@@ -644,7 +645,7 @@ def query_report_ids(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_rule_ids(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_rule_ids(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for rule IDs that match provided filter criteria.
 
         Keyword arguments:
diff --git a/src/falconpy/ioa_exclusions.py b/src/falconpy/ioa_exclusions.py
index 02cefb7bb..689f2222e 100644
--- a/src/falconpy/ioa_exclusions.py
+++ b/src/falconpy/ioa_exclusions.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, handle_single_argument, process_service_request
 from ._service_class import ServiceClass
 from ._endpoint._ioa_exclusions import _ioa_exclusions_endpoints as Endpoints
@@ -55,7 +56,7 @@ class IOAExclusions(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a set of IOA Exclusions by specifying their IDs.
 
         Keyword arguments:
@@ -81,7 +82,7 @@ def get_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_exclusions(self: object, body: dict = None, **kwargs) -> dict:
+    def create_exclusions(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create the IOA exclusions.
 
         Keyword arguments:
@@ -129,7 +130,7 @@ def create_exclusions(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_exclusions(self: object, parameters: dict = None, **kwargs) -> dict:  # pylint: disable=C0103
+    def delete_exclusions(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete the IOA Exclusions by ID.
 
         Keyword arguments:
@@ -156,7 +157,7 @@ def delete_exclusions(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_exclusions(self: object, body: dict = None, **kwargs) -> dict:
+    def update_exclusions(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update the IOA Exclusions.
 
         Keyword arguments:
@@ -209,7 +210,10 @@ def update_exclusions(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_exclusions(self: object, parameters: dict = None, **kwargs) -> dict:  # pylint: disable=C0103
+    def query_exclusions(self: object,
+                         parameters: dict = None,
+                         **kwargs
+                         ) -> Dict[str, Union[int, dict]]:
         """Search for IOA Exclusions.
 
         Keyword arguments:
diff --git a/src/falconpy/ioc.py b/src/falconpy/ioc.py
index bd1dd8517..5b6e55334 100644
--- a/src/falconpy/ioc.py
+++ b/src/falconpy/ioc.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import (
     aggregate_payload,
@@ -61,7 +62,7 @@ class IOC(ServiceClass):
     """
 
     @force_default(defaults=["body", "parameters"], default_types=["dict", "dict"])
-    def indicator_aggregate(self: object, parameters: dict = None, body: dict = None, **kwargs) -> dict:
+    def indicator_aggregate(self: object, parameters: dict = None, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get indicator aggregates as specified via json in request body.
 
         Keyword arguments:
@@ -146,7 +147,7 @@ def indicator_aggregate(self: object, parameters: dict = None, body: dict = None
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def indicator_combined(self: object, parameters: dict = None, **kwargs) -> dict:
+    def indicator_combined(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get Combined for Indicators.
 
         Keyword arguments:
@@ -196,7 +197,7 @@ def indicator_combined(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def action_get(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def action_get(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get Actions by IDs.
 
         Keyword arguments:
@@ -222,7 +223,7 @@ def action_get(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_indicators_report(self: object, body: dict = None, **kwargs) -> dict:
+    def get_indicators_report(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Launch an indicators report creation job.
 
         Keyword arguments:
@@ -272,7 +273,7 @@ def get_indicators_report(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def indicator_get(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def indicator_get(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get Indicators by IDs.
 
         Keyword arguments:
@@ -302,7 +303,7 @@ def indicator_create(self: object,
                          body: dict = None,
                          parameters: dict = None,
                          **kwargs
-                         ) -> dict:
+                         ) -> Dict[str, Union[int, dict]]:
         """Create Indicators.
 
         Keyword arguments:
@@ -381,7 +382,7 @@ def indicator_create(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def indicator_delete(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def indicator_delete(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete Indicators by IDs.
 
         Keyword arguments:
@@ -408,7 +409,7 @@ def indicator_delete(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters", "body"], default_types=["dict", "dict"])
-    def indicator_update(self: object, body: dict, parameters: dict = None, **kwargs) -> dict:
+    def indicator_update(self: object, body: dict, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update Indicators.
 
         Keyword arguments:
@@ -510,7 +511,7 @@ def indicator_update(self: object, body: dict, parameters: dict = None, **kwargs
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def action_query(self: object, parameters: dict = None, **kwargs) -> dict:
+    def action_query(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query Actions.
 
         Keyword arguments:
@@ -536,7 +537,7 @@ def action_query(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def indicator_search(self: object, parameters: dict = None, **kwargs) -> dict:
+    def indicator_search(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Indicators.
 
         Keyword arguments:
@@ -586,7 +587,7 @@ def indicator_search(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def ioc_type_query(self: object, parameters: dict = None, **kwargs) -> dict:
+    def ioc_type_query(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query IOC types.
 
         Keyword arguments:
@@ -612,7 +613,7 @@ def ioc_type_query(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def platform_query(self: object, parameters: dict = None, **kwargs) -> dict:
+    def platform_query(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query platforms.
 
         Keyword arguments:
@@ -638,7 +639,7 @@ def platform_query(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def severity_query(self: object, parameters: dict = None, **kwargs) -> dict:
+    def severity_query(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query severities.
 
         Keyword arguments:
@@ -665,7 +666,7 @@ def severity_query(self: object, parameters: dict = None, **kwargs) -> dict:
 
     # These methods are ported from the legacy IOCS Service Class, as they have not been deprecated
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def devices_count(self: object, parameters: dict = None, **kwargs) -> dict:
+    def devices_count(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return the number of hosts in your customer account that have observed a given custom IOC.
 
         Keyword arguments:
@@ -697,7 +698,7 @@ def devices_count(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def devices_ran_on(self: object, parameters: dict = None, **kwargs) -> dict:
+    def devices_ran_on(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find hosts that have observed a given custom IOC.
 
         For details about those hosts, use the hosts API interface.
@@ -735,7 +736,7 @@ def devices_ran_on(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def processes_ran_on(self: object, parameters: dict = None, **kwargs) -> dict:
+    def processes_ran_on(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for processes associated with a custom IOC.
 
         Keyword arguments:
@@ -774,7 +775,7 @@ def processes_ran_on(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def entities_processes(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def entities_processes(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """For the provided ProcessID retrieve the process details.
 
         Keyword arguments:
diff --git a/src/falconpy/iocs.py b/src/falconpy/iocs.py
index a2ff47783..913b85a33 100644
--- a/src/falconpy/iocs.py
+++ b/src/falconpy/iocs.py
@@ -41,6 +41,7 @@
 # this class will eventually be dropped.
 # Allowing unused params and kwargs to prevent breaking change, no self use is ok
 # pylint: disable=W0613
+from typing import Dict, Union
 from ._util import force_default, handle_single_argument
 from ._util import process_service_request, generate_error_result
 from ._service_class import ServiceClass
@@ -61,7 +62,7 @@ class Iocs(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def devices_count(self: object, parameters: dict = None, **kwargs) -> dict:
+    def devices_count(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get the number of hosts in your customer account that have observed a given custom IOC.
 
         Keyword arguments:
@@ -93,7 +94,7 @@ def devices_count(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_ioc(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_ioc(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get an IOC by providing a type and value.
 
         * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * *
@@ -112,7 +113,7 @@ def get_ioc(self: object, parameters: dict = None, **kwargs) -> dict:
             "IOC.indicator_get to perform this operation."
             )
 
-    def create_ioc(self: object, body: dict) -> dict:
+    def create_ioc(self: object, body: dict) -> Dict[str, Union[int, dict]]:
         """Create a new IOC.
 
         * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * *
@@ -132,7 +133,7 @@ def create_ioc(self: object, body: dict) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_ioc(self: object, parameters: dict = None, **kwargs) -> dict:
+    def delete_ioc(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete an IOC by providing a type and value.
 
         * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * *
@@ -152,7 +153,7 @@ def delete_ioc(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def update_ioc(self: object, body: dict, parameters: dict = None, **kwargs) -> dict:
+    def update_ioc(self: object, body: dict, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update an IOC by providing a type and value.
 
         * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * *
@@ -172,7 +173,7 @@ def update_ioc(self: object, body: dict, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def devices_ran_on(self: object, parameters: dict = None, **kwargs) -> dict:
+    def devices_ran_on(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find hosts that have observed a given custom IOC.
 
         For details about those hosts, use the hosts API interface.
@@ -210,7 +211,7 @@ def devices_ran_on(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_iocs(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_iocs(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search the custom IOCs in your customer account.
 
         * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * * DEPRECATED METHOD * * *
@@ -230,7 +231,7 @@ def query_iocs(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def processes_ran_on(self: object, parameters: dict = None, **kwargs) -> dict:
+    def processes_ran_on(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for processes associated with a custom IOC.
 
         Keyword arguments:
@@ -269,7 +270,7 @@ def processes_ran_on(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def entities_processes(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def entities_processes(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """For the provided ProcessID retrieve the process details.
 
         Keyword arguments:
diff --git a/src/falconpy/kubernetes_protection.py b/src/falconpy/kubernetes_protection.py
index 5d00e230c..b988db280 100644
--- a/src/falconpy/kubernetes_protection.py
+++ b/src/falconpy/kubernetes_protection.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default, handle_single_argument
 from ._service_class import ServiceClass
 from ._endpoint._kubernetes_protection import _kubernetes_protection_endpoints as Endpoints
@@ -54,7 +55,7 @@ class KubernetesProtection(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_aws_accounts(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_aws_accounts(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Provide a list of AWS accounts.
 
         Keyword arguments:
@@ -85,7 +86,7 @@ def get_aws_accounts(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_aws_account(self: object, body: dict = None, **kwargs) -> dict:
+    def create_aws_account(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create a new AWS customer account in our system and generates the installation script.
 
         Keyword arguments:
@@ -126,7 +127,7 @@ def create_aws_account(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_aws_accounts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_aws_accounts(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete AWS accounts.
 
         Keyword arguments:
@@ -152,7 +153,7 @@ def delete_aws_accounts(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def update_aws_account(self: object, parameters: dict = None, **kwargs) -> dict:
+    def update_aws_account(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update the AWS account per the query parameters provided.
 
         Keyword arguments:
@@ -178,7 +179,7 @@ def update_aws_account(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def list_azure_accounts(self: object, parameters: dict = None, **kwargs) -> dict:
+    def list_azure_accounts(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Provide a list of registered Azure subscriptions.
 
         Keyword arguments:
@@ -210,7 +211,7 @@ def list_azure_accounts(self: object, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_azure_subscription(self: object, body: dict = None, **kwargs) -> dict:
+    def create_azure_subscription(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create a new Azure subscription.
 
         Keyword arguments:
@@ -251,7 +252,7 @@ def create_azure_subscription(self: object, body: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_azure_subscription(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_azure_subscription(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete an Azure subscription.
 
         Keyword arguments:
@@ -277,7 +278,7 @@ def delete_azure_subscription(self: object, *args, parameters: dict = None, **kw
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_locations(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_locations(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Provide the cloud locations acknowledged by the Kubernetes Protection service.
 
         Keyword arguments:
@@ -434,7 +435,7 @@ def get_static_scripts(self: object, parameters: dict = None) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_helm_values_yaml(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_helm_values_yaml(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Provide a sample Helm values.yaml file to install alongside the agent Helm chart.
 
         Keyword arguments:
@@ -462,7 +463,7 @@ def get_helm_values_yaml(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def regenerate(self: object, body: dict = None) -> dict:
+    def regenerate(self: object, body: dict = None) -> Dict[str, Union[int, dict]]:
         """Regenerate API key for docker registry integrations.
 
         Keyword arguments:
@@ -485,7 +486,7 @@ def regenerate(self: object, body: dict = None) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_clusters(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_clusters(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Provide the clusters acknowledged by the Kubernetes Protection service.
 
         Keyword arguments:
@@ -524,7 +525,7 @@ def trigger_scan(self: object,
                      body: dict = None,
                      parameters: dict = None,
                      **kwargs
-                     ) -> dict:
+                     ) -> Dict[str, Union[int, dict]]:
         """Trigger a dry run or a full scan of a customer's kubernetes footprint.
 
         Keyword arguments:
@@ -553,7 +554,7 @@ def trigger_scan(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def update_azure_service_principal(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def update_azure_service_principal(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Add the client ID for a given tenant ID to the subscription.
 
         Keyword arguments:
diff --git a/src/falconpy/malquery.py b/src/falconpy/malquery.py
index 386023dcf..b9f0df1fe 100644
--- a/src/falconpy/malquery.py
+++ b/src/falconpy/malquery.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default, handle_single_argument
 from ._payload import malquery_fuzzy_payload, generic_payload_list
 from ._payload import malquery_exact_search_payload, malquery_hunt_payload
@@ -55,7 +56,7 @@ class MalQuery(ServiceClass):
     - a valid token provided by the authentication service class (OAuth2.token())
     """
 
-    def get_quotas(self: object) -> dict:
+    def get_quotas(self: object) -> Dict[str, Union[int, dict]]:
         """Get information about search and download quotas in your environment.
 
         This method does not accept arguments or keywords.
@@ -74,7 +75,7 @@ def get_quotas(self: object) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def fuzzy_search(self: object, body: dict = None, **kwargs) -> dict:
+    def fuzzy_search(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search Falcon MalQuery quickly, but with more potential for false positives.
 
         Search for a combination of hex patterns and strings in order to identify
@@ -153,7 +154,7 @@ def get_download(self: object, *args, parameters: dict = None, **kwargs) -> obje
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_metadata(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_metadata(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve indexed files metadata by their hash.
 
         Keyword arguments:
@@ -179,7 +180,7 @@ def get_metadata(self: object, *args, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_request(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_request(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Check the status and results of an asynchronous request, such as hunt or exact-search.
 
         Supports a single request id at this time.
@@ -235,7 +236,7 @@ def get_samples(self: object, *args, parameters: dict = None, **kwargs) -> objec
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def samples_multidownload(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def samples_multidownload(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Schedule samples for download.
 
         Use the result id with the /request endpoint to check if the download is ready
@@ -274,7 +275,7 @@ def samples_multidownload(self: object, *args, body: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def exact_search(self: object, body: dict = None, **kwargs) -> dict:
+    def exact_search(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Perform a MalQuery Exact Search.
 
         Search Falcon MalQuery for a combination of hex patterns
@@ -340,7 +341,7 @@ def exact_search(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def hunt(self: object, body: dict = None, **kwargs) -> dict:
+    def hunt(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Schedule a YARA-based search for execution.
 
         Returns a request id which can be used with the /request endpoint.
diff --git a/src/falconpy/message_center.py b/src/falconpy/message_center.py
index b5ff6fd4e..fc7cea629 100644
--- a/src/falconpy/message_center.py
+++ b/src/falconpy/message_center.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 import json
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import generic_payload_list, aggregate_payload, activity_payload, case_payload
 from ._service_class import ServiceClass
@@ -56,7 +57,7 @@ class MessageCenter(ServiceClass):
     """
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_cases(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_cases(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve aggregate case values based on the matched filter.
 
         Keyword arguments:
@@ -127,7 +128,7 @@ def aggregate_cases(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_case_activity(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def get_case_activity(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve activities for given case IDs.
 
         Keyword arguments:
@@ -163,7 +164,7 @@ def get_case_activity(self: object, *args, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def add_case_activity(self: object, body: dict = None, **kwargs) -> dict:
+    def add_case_activity(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Add an activity to case. Only activities of type comment are allowed via API.
 
         Keyword arguments:
@@ -236,7 +237,7 @@ def add_case_attachment(self: object,
                             body: dict = None,
                             parameters: dict = None,
                             **kwargs
-                            ) -> dict:
+                            ) -> Dict[str, Union[int, dict]]:
         """Upload an attachment for the case.
 
         Keyword arguments:
@@ -284,7 +285,7 @@ def add_case_attachment(self: object,
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_case(self: object, body: dict = None, **kwargs) -> dict:
+    def create_case(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create a new case.
 
         Keyword arguments:
@@ -339,7 +340,7 @@ def create_case(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_case(self: object, body: dict = None, **kwargs) -> dict:
+    def update_case(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update an existing case.
 
         Keyword arguments:
@@ -390,7 +391,7 @@ def update_case(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_case_v2(self: object, body: dict = None, **kwargs) -> dict:
+    def create_case_v2(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create a new case.
 
         Keyword arguments:
@@ -446,7 +447,7 @@ def create_case_v2(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_cases(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def get_cases(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve message center cases.
 
         Keyword arguments:
@@ -483,7 +484,7 @@ def get_cases(self: object, *args, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_activities(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_activities(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve activities IDs for a case.
 
         Keyword arguments:
@@ -516,7 +517,7 @@ def query_activities(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_cases(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_cases(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve case IDs that match the provided filter criteria.
 
         Keyword arguments:
diff --git a/src/falconpy/ml_exclusions.py b/src/falconpy/ml_exclusions.py
index 902975285..7b6f36501 100644
--- a/src/falconpy/ml_exclusions.py
+++ b/src/falconpy/ml_exclusions.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import exclusion_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class MLExclusions(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a set of ML Exclusions by specifying their IDs.
 
         Keyword arguments:
@@ -81,7 +82,7 @@ def get_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def create_exclusions(self: object, body: dict = None, **kwargs) -> dict:
+    def create_exclusions(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create the ML exclusions.
 
         Keyword arguments:
@@ -123,7 +124,7 @@ def create_exclusions(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_exclusions(self: object, parameters: dict = None, **kwargs) -> dict:  # pylint: disable=C0103 # Matching API
+    def delete_exclusions(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete the ML Exclusions by ID.
 
         Keyword arguments:
@@ -150,7 +151,7 @@ def delete_exclusions(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def update_exclusions(self: object, body: dict = None, **kwargs) -> dict:
+    def update_exclusions(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update the ML Exclusions.
 
         Keyword arguments:
@@ -190,7 +191,7 @@ def update_exclusions(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_exclusions(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_exclusions(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for ML Exclusions.
 
         Keyword arguments:
diff --git a/src/falconpy/mobile_enrollment.py b/src/falconpy/mobile_enrollment.py
index d98ff6856..80b5be743 100644
--- a/src/falconpy/mobile_enrollment.py
+++ b/src/falconpy/mobile_enrollment.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default
 from ._service_class import ServiceClass
 from ._endpoint._mobile_enrollment import _mobile_enrollment_endpoints as Endpoints
@@ -56,7 +57,7 @@ class MobileEnrollment(ServiceClass):
     """
 
     @force_default(defaults=["body", "parameters"], default_types=["dict", "dict"])
-    def device_enroll(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def device_enroll(self: object, body: dict = None, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Trigger on-boarding process for a mobile device.
 
         HTTP Method: POST
diff --git a/src/falconpy/mssp.py b/src/falconpy/mssp.py
index e76a83841..d93157875 100644
--- a/src/falconpy/mssp.py
+++ b/src/falconpy/mssp.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 # pylint: disable=C0302,R0904  # Matching API operation counts
+from typing import Dict, Union
 from ._util import force_default, handle_single_argument, process_service_request
 from ._payload import generic_payload_list, mssp_payload
 from ._service_class import ServiceClass
@@ -56,7 +57,7 @@ class FlightControl(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_children(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_children(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get link to child customer by child CID(s).
 
         Keyword arguments:
@@ -178,7 +179,7 @@ def get_cid_group_members_by(self: object, *args, parameters: dict = None, **kwa
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def add_cid_group_members(self: object, body: dict = None, **kwargs) -> dict:
+    def add_cid_group_members(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Add new CID Group member.
 
         Keyword arguments:
@@ -219,7 +220,7 @@ def add_cid_group_members(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def delete_cid_group_members(self: object, body: dict = None, **kwargs) -> dict:
+    def delete_cid_group_members(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete CID Group members entry.
 
         Keyword arguments:
@@ -320,7 +321,7 @@ def get_cid_group_by_id(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_cid_groups(self: object, body: dict = None, **kwargs) -> dict:
+    def create_cid_groups(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create new CID Group(s). Maximum 500 CID Group(s) allowed.
 
         Keyword arguments:
@@ -360,7 +361,7 @@ def create_cid_groups(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_cid_groups(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_cid_groups(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete CID Group(s) by ID(s).
 
         Keyword arguments:
@@ -387,7 +388,7 @@ def delete_cid_groups(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_cid_groups(self: object, body: dict = None, **kwargs) -> dict:
+    def update_cid_groups(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update existing CID Group(s).
 
         CID Group ID is expected for each CID Group definition provided in request body.
@@ -431,7 +432,7 @@ def update_cid_groups(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_roles_by_id(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_roles_by_id(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get MSSP Role assignment(s).
 
         MSSP Role assignment is of the format <user_group_id>:<cid_group_id>.
@@ -460,7 +461,7 @@ def get_roles_by_id(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def add_role(self: object, body: dict = None, **kwargs) -> dict:
+    def add_role(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Assign new MSSP Role(s) between User Group and CID Group.
 
         It does not revoke existing role(s) between User Group and CID Group.
@@ -505,7 +506,7 @@ def add_role(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def delete_roles(self: object, body: dict = None, **kwargs) -> dict:
+    def delete_roles(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete MSSP Role assignment(s) between User Group and CID Group.
 
         User Group ID and CID Group ID have to be specified in request.
@@ -589,7 +590,7 @@ def get_user_group_members_by_id(self: object,
                                      *args,
                                      parameters: dict = None,
                                      **kwargs
-                                     ) -> dict:
+                                     ) -> Dict[str, Union[int, dict]]:
         """Get User Group members by User Group ID(s).
 
         Keyword arguments:
@@ -620,7 +621,7 @@ def get_user_group_members_by_id(self: object,
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def add_user_group_members(self: object, body: dict = None, **kwargs) -> dict:
+    def add_user_group_members(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Add new User Group member. Maximum 500 members allowed per User Group.
 
         Keyword arguments:
@@ -658,7 +659,7 @@ def add_user_group_members(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def delete_user_group_members(self: object, body: dict = None, **kwargs) -> dict:
+    def delete_user_group_members(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete User Group members entry.
 
         Keyword arguments:
@@ -756,7 +757,7 @@ def get_user_groups_by_id(self: object, *args, parameters: dict = None, **kwargs
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_user_groups(self: object, body: dict = None, **kwargs) -> dict:
+    def create_user_groups(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create new User Group(s). Maximum 500 User Group(s) allowed per customer.
 
         Keyword arguments:
@@ -796,7 +797,7 @@ def create_user_groups(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_user_groups(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_user_groups(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete User Group(s) by ID(s).
 
         Keyword arguments:
@@ -823,7 +824,7 @@ def delete_user_groups(self: object, *args, parameters: dict = None, **kwargs) -
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_user_groups(self: object, body: dict = None, **kwargs) -> dict:
+    def update_user_groups(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update existing User Group(s).
 
         User Group ID is expected for each User Group definition provided in request body.
@@ -867,7 +868,7 @@ def update_user_groups(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_children(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_children(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query for customers linked as children.
 
         Keyword arguments:
@@ -897,7 +898,7 @@ def query_children(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_cid_group_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_cid_group_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query a CID Groups members by associated CID.
 
         Keyword arguments:
@@ -927,7 +928,7 @@ def query_cid_group_members(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_cid_groups(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_cid_groups(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query a CID Groups.
 
         Keyword arguments:
@@ -957,7 +958,7 @@ def query_cid_groups(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_roles(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_roles(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query links between user groups and CID groups.
 
         At least one of CID Group ID or User Group ID should also be provided. Role ID is optional.
@@ -991,7 +992,7 @@ def query_roles(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_user_group_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_user_group_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query User Group member by User UUID.
 
         Keyword arguments:
@@ -1021,7 +1022,7 @@ def query_user_group_members(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_user_groups(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_user_groups(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query User Groups.
 
         Keyword arguments:
diff --git a/src/falconpy/oauth2.py b/src/falconpy/oauth2.py
index 5cc99dbdd..b733ce415 100644
--- a/src/falconpy/oauth2.py
+++ b/src/falconpy/oauth2.py
@@ -35,161 +35,193 @@
 
 For more information, please refer to <https://unlicense.org>
 """
-import time
+# pylint: disable=R0902,R0913
+from typing import Dict, Optional, Union
+from ._auth_object import FalconInterface
+from ._error import CannotRevokeToken
 from ._util import (
-    perform_request,
-    generate_b64cred,
     confirm_base_url,
-    generate_error_result,
-    autodiscover_region,
+    generate_ok_result,
     )
-from ._token_fail_reason import TokenFailReason
-from ._endpoint._oauth2 import _oauth2_endpoints as Endpoints
 
 
-class OAuth2:
-    """To create an instance of this class, you must pass your client_id and client_secret.
+class OAuth2(FalconInterface):
+    """OAuth2 Service Class.
 
-    OR a properly formatted dictionary containing your client_id and client_secret
-    for the key you wish to use to connect to the API.
+    To create an instance of this class you must provide either:
+        - your client_id and client_secret.
+        - a properly formatted dictionary containing your client_id and client_secret
+          Example:
+          {
+              "client_id": FALCON_CLIENT_ID,
+              "client_secret": FALCON_CLIENT_SECRET,
+              "member_cid": OPTIONAL_CHILD_CID
+          }
+        - a valid access_token
 
-    Credential dictionary example:
-    {
-        "client_id": FALCON_CLIENT_ID,
-        "client_secret": FALCON_CLIENT_SECRET
-    }
+    All other class constructor arguments are optional.
+
+    OAuth2 is the only Service Class that inherits directly from the FalconAuth object.
+    This means the OAuth2 class does not maintain an auth_object, as it is one.
     """
 
-    # pylint: disable=too-many-instance-attributes,too-many-arguments
-    def __init__(self: object, base_url: str = "https://api.crowdstrike.com",
-                 ssl_verify: bool = True, proxy: dict = None, timeout: float or tuple = None,
-                 creds: dict = None, client_id: str = None, client_secret: str = None,
-                 user_agent: str = None, member_cid: str = None, renew_window: int = 120):
-        """Class constructor.
+    def __init__(self,
+                 access_token: Optional[Union[str, bool]] = False,
+                 base_url: Optional[str] = "https://api.crowdstrike.com",
+                 ssl_verify: Optional[bool] = True,
+                 proxy: Optional[Dict[str, str]] = None,
+                 timeout: Optional[Union[float, tuple]] = None,
+                 creds: Optional[Dict[str, str]] = None,
+                 client_id: Optional[str] = None,
+                 client_secret: Optional[str] = None,
+                 user_agent: Optional[str] = None,
+                 member_cid: Optional[str] = None,
+                 renew_window: Optional[int] = 120,
+                 debug: Optional[bool] = False,
+                 debug_record_count: Optional[int] = None,
+                 sanitize_log: Optional[bool] = None,
+                 pythonic: Optional[bool] = None
+                 ):
+        """Construct an instance of the class.
 
         Initializes the base class by ingesting credentials,
-        the proxies dictionary and specifications
-        for the base URL, SSL verification, and timeouts.
-
-        Keyword arguments:
-        base_url: CrowdStrike API URL to use for requests. [Default: US-1]
-        ssl_verify: Boolean specifying if SSL verification should be used. [Default: True]
-        proxy: Dictionary of proxies to be used for requests.
-        timeout: Float or tuple specifying timeouts to use for requests.
-        creds: Dictionary containing CrowdStrike API credentials.
-               Mutually exclusive to client_id / client_secret.
-        client_id: Client ID for the CrowdStrike API. Mutually exclusive to creds.
-        client_secret: Client Secret for the CrowdStrike API. Mutually exclusive to creds.
-        member_cid: Child CID to connect to. Mutually exclusive to creds.
-        renew_window: Amount of time (in seconds) between now and the token expiration before
-                      a refresh of the token is performed. Default: 120, Max: 1200
-                      Values over 1200 will be reset to the maximum.
-
+        the proxy dictionary and specifications for other attributes
+        such as the base URL, SSL verification, and timeout.
+
+        Keyword arguments
+        ----
+        base_url : str
+            CrowdStrike API URL to use for requests. [Default: US-1]
+        ssl_verify : bool
+            Flag specifying if SSL verification should be used. [Default: True]
+        proxy : dict
+            Dictionary of proxies to be used for requests.
+        timeout : float or tuple
+            Value specifying timeouts to use for requests.
+        creds : dict
+            Dictionary containing CrowdStrike API credentials.
+            Mutually exclusive to client_id / client_secret.
+        client_id : str
+            Client ID for the CrowdStrike API. Mutually exclusive to creds.
+        client_secret : str
+            Client Secret for the CrowdStrike API. Mutually exclusive to creds.
+        member_cid : str
+            Child CID to connect to. Mutually exclusive to creds.
+        renew_window : int
+            Amount of time (in seconds) between now and the token expiration before
+            a refresh of the token is performed. Default: 120, Max: 1200
+            Values over 1200 will be reset to the maximum.
+
+        Arguments
+        ----
         This method only supports keywords to specify arguments.
-        """
-        if client_id and client_secret and not creds:
-            creds = {
-                "client_id": client_id,
-                "client_secret": client_secret
-            }
-            # Have to pass member_cid the same way you pass client_id / secret
-            # If you use a creds dictionary, pass the member_cid there instead
-            if member_cid:
-                creds["member_cid"] = member_cid
-        elif not creds:
-            creds = {}
-
-        self.creds = creds
-        self.base_url = confirm_base_url(base_url)
-        self.ssl_verify = ssl_verify
-        self.timeout = timeout
-        self.proxy = proxy
-        self.user_agent = user_agent
-        self.token_expiration = 0
-        # Maximum renewal window is 20 minutes, Minimum is 2 minutes
-        self.token_renew_window = max(min(renew_window, 1200), 120)
-        self.token_time = time.time()
-        self.token_value = False
-        self.token_expired = lambda: bool(
-            (time.time() - self.token_time) >= (self.token_expiration - self.token_renew_window)
-            )
-        self.token_fail_reason = None
-        self.token_status = None
-        self.authenticated = lambda: not bool(self.token_expired())
-
-    def token(self: object) -> dict:
-        """Generate an authorization token.
 
-        This method does not accept arguments or keywords.
-
-        Returns: dict object containing API response.
+        Returns
+        ----
+        class (OAuth2)
+            A constructed instance of the OAuth2 Service Class.
+        """
+        super().__init__(base_url=confirm_base_url(base_url),
+                         ssl_verify=ssl_verify,
+                         timeout=timeout,
+                         proxy=proxy,
+                         user_agent=user_agent,
+                         access_token=access_token,
+                         creds=creds,
+                         client_id=client_id,
+                         client_secret=client_secret,
+                         member_cid=member_cid,             # |
+                         renew_window=renew_window,         # /\
+                         debug=debug,                      # |o
+                         debug_record_count=debug_record_count,
+                         sanitize_log=sanitize_log,
+                         pythonic=pythonic
+                         )
+
+    def logout(self) -> Dict[str, Union[int, dict]]:
+        """Revoke the current token.
+
+        Keyword arguments
+        ----
+        This method does not accept keyword arguments.
+
+        Arguments
+        ----
+        This method does not accept arguments.
+
+        Returns
+        ----
+        dict
+            Dictionary object containing API response.
         """
-        operation_id = "oauth2AccessToken"
-        target_url = f"{self.base_url}{[ep[2] for ep in Endpoints if operation_id in ep[0]][0]}"
-        header_payload = {}
-        if "client_id" in self.creds and "client_secret" in self.creds:
-            data_payload = {
-                'client_id': self.creds['client_id'],
-                'client_secret': self.creds['client_secret']
-            }
-            if "member_cid" in self.creds:
-                data_payload["member_cid"] = self.creds["member_cid"]
-            returned = perform_request(method="POST", endpoint=target_url, data=data_payload,
-                                       headers=header_payload, verify=self.ssl_verify,
-                                       proxy=self.proxy, timeout=self.timeout,
-                                       user_agent=self.user_agent)
-            if isinstance(returned, dict):  # Issue #433
-                self.token_status = returned["status_code"]
-                if self.token_status == 201:
-                    self.token_expiration = returned["body"]["expires_in"]
-                    self.token_time = time.time()
-                    self.token_value = returned["body"]["access_token"]
-                    self.token_fail_reason = None
-                    self.base_url = autodiscover_region(self.base_url, returned)
-                else:
-                    if "errors" in returned["body"]:
-                        if returned["body"]["errors"]:
-                            self.token_fail_reason = returned["body"]["errors"][0]["message"]
+        try:
+            returned: dict = super().logout()
+            if returned["status_code"] == 200:
+                returned = generate_ok_result(message="Current token successfully revoked.",
+                                              headers=returned["headers"]
+                                              )
             else:
-                returned = generate_error_result("Unexpected API response received", 403)
-                self.token_fail_reason = TokenFailReason["UNEXPECTED"].value
-                self.token_status = 403
-        else:
-            returned = generate_error_result("Invalid credentials specified", 403)
-            self.token_fail_reason = TokenFailReason["INVALID"].value
-            self.token_status = 403
+                raise CannotRevokeToken(returned["status_code"], returned["body"]["errors"][0]["message"], returned["headers"])
+        except CannotRevokeToken as unable_to_revoke:
+            if self.log:
+                self.log.warning("Token revocation operation failed.")
+            returned = unable_to_revoke.result
 
         return returned
 
-    def revoke(self: object, token: str, client_id: str = None) -> dict:
+    def revoke(self, token: str, alter_state: bool = False, client_id: str = None) -> Dict[str, Union[int, dict]]:
         """Revoke the specified authorization token.
 
-        Keyword arguments:
-        token: Token string to be revoked.
-        client_id: The OAuth2 client ID you are revoking the token for.
+        HTTP Method: POST
+
+        Swagger URL
+        ----
+        https://assets.falcon.crowdstrike.com/support/api/swagger.html#/oauth2/oauth2RevokeToken
+
+        Keyword arguments
+        ----
+        client_id : str
+            Client ID of the token to be revoked.
+        token : str
+            Token string to be revoked.
+        alter_state : bool
+            Flag indicating if the underlying authentication state is changed by this request.
 
+        Arguments
+        ----
         When not specified as a keyword, token is assumed as the only accepted argument.
 
-        Returns: dict object containing API response.
+        Returns
+        ----
+        dict
+            Dictionary containing API response.
         """
-        operation_id = "oauth2RevokeToken"
-        target_url = f"{self.base_url}{[ep[2] for ep in Endpoints if operation_id in ep[0]][0]}"
-        if "client_id" in self.creds and "client_secret" in self.creds:
-            b64cred = generate_b64cred(self.creds["client_id"], self.creds["client_secret"])
-            header_payload = {"Authorization": f"basic {b64cred}"}
-            data_payload = {"token": f"{token}"}
-            if client_id:
-                data_payload["client_id"] = client_id
-            returned = perform_request(method="POST", endpoint=target_url, data=data_payload,
-                                       headers=header_payload, verify=self.ssl_verify,
-                                       proxy=self.proxy, timeout=self.timeout,
-                                       user_agent=self.user_agent)
-            self.token_expiration = 0
-            self.token_value = False
-        else:
-            returned = generate_error_result("Invalid credentials specified", 403)
+        return self._logout_handler(token, not alter_state, client_id)
 
-        return returned
+    def token(self, alter_state: bool = False) -> Dict[str, Union[int, dict]]:
+        """Generate an authorization token.
+
+        HTTP Method: POST
+
+        Swagger URL
+        ----
+        https://assets.falcon.crowdstrike.com/support/api/swagger.html#/oauth2/oauth2AccessToken
+
+        Keyword arguments
+        ----
+        alter_state : bool
+            Flag indicating if the underlying authentication state is changed by this request.
+
+        Arguments
+        ----
+        When not specified as a keyword, alter_state is assumed as the only accepted argument.
+
+        Returns
+        ----
+        dict
+            Dictionary object containing API response.
+        """
+        return self._login_handler(not alter_state)
 
     # These method names align to the operation IDs in the API but
     # do not conform to snake_case / PEP8 and are defined here for
diff --git a/src/falconpy/overwatch_dashboard.py b/src/falconpy/overwatch_dashboard.py
index e6b5853a7..a34b566bc 100644
--- a/src/falconpy/overwatch_dashboard.py
+++ b/src/falconpy/overwatch_dashboard.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, handle_single_argument, process_service_request
 from ._payload import aggregate_payload
 from ._service_class import ServiceClass
@@ -59,7 +60,7 @@ def aggregates_detections_global_counts(self: object,
                                             *args,
                                             parameters: dict = None,
                                             **kwargs
-                                            ) -> dict:
+                                            ) -> Dict[str, Union[int, dict]]:
         """Get the total number of detections pushed across all customers.
 
         Keyword arguments:
@@ -85,7 +86,7 @@ def aggregates_detections_global_counts(self: object,
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregates_events_collections(self: object, body: list = None, **kwargs) -> dict:
+    def aggregates_events_collections(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get OverWatch detection event collection info by providing an aggregate query.
 
         Keyword arguments:
@@ -170,7 +171,7 @@ def aggregates_events_collections(self: object, body: list = None, **kwargs) ->
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregates_events(self: object, body: list = None, **kwargs) -> dict:
+    def aggregates_events(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get aggregate OverWatch detection event info by providing an aggregate query.
 
         Keyword arguments:
@@ -259,7 +260,7 @@ def aggregates_incidents_global_counts(self: object,
                                            *args,
                                            parameters: dict = None,
                                            **kwargs
-                                           ) -> dict:
+                                           ) -> Dict[str, Union[int, dict]]:
         """Get the total number of incidents pushed across all customers.
 
         Keyword arguments:
@@ -289,7 +290,7 @@ def aggregates_events_global_counts(self: object,
                                         *args,
                                         parameters: dict = None,
                                         **kwargs
-                                        ) -> dict:
+                                        ) -> Dict[str, Union[int, dict]]:
         """Get the total number of incidents pushed across all customers.
 
         Keyword arguments:
diff --git a/src/falconpy/prevention_policy.py b/src/falconpy/prevention_policy.py
index 0d6536b25..5915d0515 100644
--- a/src/falconpy/prevention_policy.py
+++ b/src/falconpy/prevention_policy.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, handle_single_argument, process_service_request
 from ._payload import generic_payload_list, prevention_policy_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class PreventionPolicy(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Prevention Policy by providing an FQL filter and paging details.
 
         Returns a set of host details which match the filter criteria.
@@ -89,7 +90,7 @@ def query_combined_policy_members(self: object, parameters: dict = None, **kwarg
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Prevention Policies by providing an FQL filter and paging details.
 
         Returns a set of Prevention Policies which match the filter criteria.
@@ -130,7 +131,7 @@ def perform_policies_action(self: object,
                                 body: dict = None,
                                 parameters: dict = None,
                                 **kwargs
-                                ) -> dict:
+                                ) -> Dict[str, Union[int, dict]]:
         """Perform the specified action on the Prevention Policies specified in the request.
 
         Keyword arguments:
@@ -189,7 +190,7 @@ def perform_policies_action(self: object,
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def set_policies_precedence(self: object, body: dict = None, **kwargs) -> dict:
+    def set_policies_precedence(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Set the precedence of Prevention Policies based on the order of IDs in the request.
 
         The first ID specified will have the highest precedence and the last ID specified will
@@ -230,7 +231,7 @@ def set_policies_precedence(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a set of Prevention Policies by specifying their IDs.
 
         Keyword arguments:
@@ -256,7 +257,7 @@ def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def create_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create Prevention Policies by specifying details about the policy to create.
 
         Keyword arguments:
@@ -308,7 +309,7 @@ def create_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a set of Prevention Policies by specifying their IDs.
 
         Keyword arguments:
@@ -334,7 +335,7 @@ def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def update_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update Prevention Policies by specifying the ID of the policy and details to update.
 
         Keyword arguments:
@@ -383,7 +384,7 @@ def update_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Prevention Policy by providing a FQL filter and paging details.
 
         Returns a set of Agent IDs which match the filter criteria.
@@ -417,7 +418,7 @@ def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Prevention Policies by providing an FQL filter and paging details.
 
         Returns a set of Prevention Policy IDs which match the filter criteria.
diff --git a/src/falconpy/quarantine.py b/src/falconpy/quarantine.py
index 17f60f3a9..8fe18b439 100644
--- a/src/falconpy/quarantine.py
+++ b/src/falconpy/quarantine.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import generic_payload_list, aggregate_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class Quarantine(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def action_update_count(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def action_update_count(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Return the count of potentially affected quarantined files for each action.
 
         Keyword arguments:
@@ -82,7 +83,7 @@ def action_update_count(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_aggregate_files(self: object, body: dict = None, **kwargs) -> dict:
+    def get_aggregate_files(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get quarantine file aggregates as specified via json in request body.
 
         Keyword arguments:
@@ -163,7 +164,7 @@ def get_aggregate_files(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_quarantine_files(self: object, body: dict = None, **kwargs) -> dict:
+    def get_quarantine_files(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get quarantine file metadata for specified ids.
 
         Keyword arguments:
@@ -198,7 +199,7 @@ def get_quarantine_files(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_quarantined_detects_by_id(self: object, body: dict = None, **kwargs) -> dict:
+    def update_quarantined_detects_by_id(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Apply action by quarantine file ids.
 
         Keyword arguments:
@@ -241,7 +242,7 @@ def update_quarantined_detects_by_id(self: object, body: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_quarantine_files(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_quarantine_files(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get quarantine file ids that match the provided filter criteria.
 
         Keyword arguments:
@@ -297,7 +298,7 @@ def query_quarantine_files(self: object, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def update_quarantined_detects_by_query(self: object, body: dict = None, **kwargs) -> dict:
+    def update_quarantined_detects_by_query(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Apply quarantine file actions by query.
 
         Keyword arguments:
diff --git a/src/falconpy/quick_scan.py b/src/falconpy/quick_scan.py
index e97ae1722..0bef6de17 100644
--- a/src/falconpy/quick_scan.py
+++ b/src/falconpy/quick_scan.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import generic_payload_list, aggregate_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class QuickScan(ServiceClass):
     """
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_scans_aggregates(self: object, body: dict = None, **kwargs) -> dict:
+    def get_scans_aggregates(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get scans aggregations as specified via json in request body.
 
         Keyword arguments:
@@ -125,7 +126,7 @@ def get_scans_aggregates(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_scans(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_scans(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Check the status of a volume scan.
 
         Time required for analysis increases with the number of samples in a volume
@@ -154,7 +155,7 @@ def get_scans(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def scan_samples(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def scan_samples(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get scans aggregations as specified via json in request body.
 
         Keyword arguments:
@@ -193,7 +194,7 @@ def scan_samples(self: object, *args, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_submissions(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_submissions(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find IDs for submitted scans by providing an FQL filter and paging details.
 
         Returns a set of volume IDs that match your criteria.
diff --git a/src/falconpy/real_time_response.py b/src/falconpy/real_time_response.py
index df637540d..faff857bc 100644
--- a/src/falconpy/real_time_response.py
+++ b/src/falconpy/real_time_response.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 # pylint: disable=R0904  # Aligning method count to API service collection operation count
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import aggregate_payload, command_payload, generic_payload_list
 from ._service_class import ServiceClass
@@ -56,7 +57,7 @@ class RealTimeResponse(ServiceClass):
     """
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_sessions(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_sessions(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get aggregates on session data.
 
         Supported aggregations:
@@ -149,7 +150,7 @@ def batch_active_responder_command(self: object,
                                        body: dict = None,
                                        parameters: dict = None,
                                        **kwargs
-                                       ) -> dict:
+                                       ) -> Dict[str, Union[int, dict]]:
         """Batch executes a RTR active-responder command across hosts mapped to a given batch ID.
 
         Keyword arguments:
@@ -204,7 +205,7 @@ def batch_active_responder_command(self: object,
             )
 
     @force_default(defaults=["parameters", "body"], default_types=["dict", "dict"])
-    def batch_command(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def batch_command(self: object, body: dict = None, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Batch executes a RTR read-only command across the hosts mapped to the given batch ID.
 
         Keyword arguments:
@@ -259,7 +260,7 @@ def batch_command(self: object, body: dict = None, parameters: dict = None, **kw
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def batch_get_command_status(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def batch_get_command_status(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve the status of the specified batch get command.
 
         Will return successful files when they are finished processing.
@@ -296,7 +297,7 @@ def batch_get_command(self: object,
                           body: dict = None,
                           parameters: dict = None,
                           **kwargs
-                          ) -> dict:
+                          ) -> Dict[str, Union[int, dict]]:
         """Batch executes `get` command across hosts to retrieve files.
 
         After this call is made batch_get_command_status is used to query for the results.
@@ -352,7 +353,7 @@ def batch_init_sessions(self: object,
                             body: dict = None,
                             parameters: dict = None,
                             **kwargs
-                            ) -> dict:
+                            ) -> Dict[str, Union[int, dict]]:
         """Batch initialize a RTR session on multiple hosts.
 
         Before any RTR commands can be used, an active session is needed on the host.
@@ -409,7 +410,7 @@ def batch_refresh_sessions(self: object,
                                body: dict = None,
                                parameters: dict = None,
                                **kwargs
-                               ) -> dict:
+                               ) -> Dict[str, Union[int, dict]]:
         """Batch refresh a RTR session on multiple hosts.
 
         RTR sessions will expire after 10 minutes unless refreshed.
@@ -458,7 +459,7 @@ def check_active_responder_command_status(self: object,
                                               *args,
                                               parameters: dict = None,
                                               **kwargs
-                                              ) -> dict:
+                                              ) -> Dict[str, Union[int, dict]]:
         """Get status of an executed active-responder command on a single host.
 
         Keyword arguments:
@@ -490,7 +491,7 @@ def check_active_responder_command_status(self: object,
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def execute_active_responder_command(self: object, body: dict = None, **kwargs) -> dict:
+    def execute_active_responder_command(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Execute an active responder command on a single host.
 
         Keyword arguments:
@@ -532,7 +533,7 @@ def execute_active_responder_command(self: object, body: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def check_command_status(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def check_command_status(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get status of an executed command on a single host.
 
         Keyword arguments:
@@ -563,7 +564,7 @@ def check_command_status(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def execute_command(self: object, body: dict = None, **kwargs) -> dict:
+    def execute_command(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Execute a command on a single host.
 
         Keyword arguments:
@@ -605,7 +606,7 @@ def execute_command(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_extracted_file_contents(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_extracted_file_contents(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get RTR extracted file contents for specified session and sha256.
 
         Keyword arguments:
@@ -633,7 +634,7 @@ def get_extracted_file_contents(self: object, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def list_files(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def list_files(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a list of files for the specified RTR session.
 
         Keyword arguments:
@@ -659,7 +660,7 @@ def list_files(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def list_files_v2(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def list_files_v2(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a list of files for the specified RTR session.
 
         Keyword arguments:
@@ -685,7 +686,7 @@ def list_files_v2(self: object, *args, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_file(self: object, parameters: dict = None, **kwargs) -> dict:
+    def delete_file(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a RTR session file.
 
         Keyword arguments:
@@ -711,7 +712,7 @@ def delete_file(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_file_v2(self: object, parameters: dict = None, **kwargs) -> dict:
+    def delete_file_v2(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a RTR session file.
 
         Keyword arguments:
@@ -737,7 +738,7 @@ def delete_file_v2(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def pulse_session(self: object, body: dict = None, **kwargs) -> dict:
+    def pulse_session(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Refresh a session timeout on a single host.
 
         Keyword arguments:
@@ -772,7 +773,7 @@ def pulse_session(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def list_sessions(self: object, body: dict = None, **kwargs) -> dict:
+    def list_sessions(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get session metadata by session id.
 
         Keyword arguments:
@@ -806,7 +807,7 @@ def list_sessions(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def list_queued_sessions(self: object, body: dict = None, **kwargs) -> dict:
+    def list_queued_sessions(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get session metadata by session id.
 
         Keyword arguments:
@@ -840,7 +841,7 @@ def list_queued_sessions(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def init_session(self: object, body: dict = None, **kwargs) -> dict:
+    def init_session(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Initialize a new session with the RTR cloud.
 
         Keyword arguments:
@@ -880,7 +881,7 @@ def init_session(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_session(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_session(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a session.
 
         Keyword arguments:
@@ -907,7 +908,7 @@ def delete_session(self: object, *args, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_queued_session(self: object, parameters: dict = None, **kwargs) -> dict:
+    def delete_queued_session(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a queued session.
 
         Keyword arguments:
@@ -933,7 +934,7 @@ def delete_queued_session(self: object, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def list_all_sessions(self: object, parameters: dict = None, **kwargs) -> dict:
+    def list_all_sessions(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a list of session_ids.
 
         Keyword arguments:
diff --git a/src/falconpy/real_time_response_admin.py b/src/falconpy/real_time_response_admin.py
index 32bbd70e9..e9b0c05ae 100644
--- a/src/falconpy/real_time_response_admin.py
+++ b/src/falconpy/real_time_response_admin.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import command_payload, data_payload
 from ._service_class import ServiceClass
@@ -59,7 +60,7 @@ def batch_admin_command(self: object,
                             body: dict = None,
                             parameters: dict = None,
                             **kwargs
-                            ) -> dict:
+                            ) -> Dict[str, Union[int, dict]]:
         """Batch executes a RTR administrator command across the hosts mapped to a given batch ID.
 
         Keyword arguments:
@@ -114,7 +115,7 @@ def batch_admin_command(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def check_admin_command_status(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def check_admin_command_status(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get status of an executed RTR administrator command on a single host.
 
         Keyword arguments:
@@ -146,7 +147,7 @@ def check_admin_command_status(self: object, *args, parameters: dict = None, **k
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def execute_admin_command(self: object, body: dict = None, **kwargs) -> dict:
+    def execute_admin_command(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Execute a RTR administrator command on a single host.
 
         Keyword arguments:
@@ -189,7 +190,7 @@ def execute_admin_command(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_put_files(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_put_files(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get put-files based on the ID's given. These are used for the RTR `put` command.
 
         Keyword arguments:
@@ -215,7 +216,7 @@ def get_put_files(self: object, *args, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_put_files_v2(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_put_files_v2(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get put-files based on the ID's given. These are used for the RTR `put` command.
 
         Keyword arguments:
@@ -241,7 +242,7 @@ def get_put_files_v2(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["data"], default_types=["dict"])
-    def create_put_files(self: object, files: list, data: dict = None, **kwargs) -> dict:
+    def create_put_files(self: object, files: list, data: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Upload a new put-file to use for the RTR `put` command.
 
         Keyword arguments:
@@ -278,7 +279,7 @@ def create_put_files(self: object, files: list, data: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_put_files(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_put_files(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a put-file based on the ID given. Can only delete one file at a time.
 
         Keyword arguments:
@@ -304,7 +305,7 @@ def delete_put_files(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_scripts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_scripts(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get custom-scripts based on the ID's given.
 
         These are used for the RTR `runscript` command.
@@ -332,7 +333,7 @@ def get_scripts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_scripts_v2(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_scripts_v2(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get custom-scripts based on the ID's given.
 
         These are used for the RTR `runscript` command.
@@ -360,7 +361,7 @@ def get_scripts_v2(self: object, *args, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["data", "files"], default_types=["dict", "list"])
-    def create_scripts(self: object, data: dict = None, files: list = None, **kwargs) -> dict:
+    def create_scripts(self: object, data: dict = None, files: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Upload a new custom-script to use for the RTR `runscript` command.
 
         Keyword arguments:
@@ -408,7 +409,7 @@ def create_scripts(self: object, data: dict = None, files: list = None, **kwargs
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_scripts(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_scripts(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a custom-script based on the ID given. Can only delete one script at a time.
 
         Keyword arguments:
@@ -434,7 +435,7 @@ def delete_scripts(self: object, *args, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["data", "files"], default_types=["dict", "list"])
-    def update_scripts(self: object, data: dict = None, files: list = None, **kwargs) -> dict:
+    def update_scripts(self: object, data: dict = None, files: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Upload a new scripts to replace an existing one.
 
         Keyword arguments:
@@ -484,7 +485,7 @@ def update_scripts(self: object, data: dict = None, files: list = None, **kwargs
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def list_put_files(self: object, parameters: dict = None, **kwargs) -> dict:
+    def list_put_files(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a list of put-file ID's that are available to the user for the `put` command.
 
         Keyword arguments:
@@ -514,7 +515,7 @@ def list_put_files(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def list_scripts(self: object, parameters: dict = None, **kwargs) -> dict:
+    def list_scripts(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a list of custom-script ID's that are available for the `runscript` command.
 
         Only displays scripts the user has permissions to access.
diff --git a/src/falconpy/recon.py b/src/falconpy/recon.py
index 4ff2431b8..9538ca37f 100644
--- a/src/falconpy/recon.py
+++ b/src/falconpy/recon.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 # pylint: disable=C0302,R0904
+from typing import Dict, Union
 from ._util import process_service_request, force_default, handle_single_argument
 from ._payload import (
     recon_rules_payload,
@@ -148,7 +149,7 @@ def aggregate_notifications_exposed_data_records(self: object, body: list = None
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def aggregate_notifications(self: object, body: list = None, **kwargs) -> dict:
+    def aggregate_notifications(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get notification aggregates as specified via JSON in request body.
 
         Keyword arguments:
@@ -232,7 +233,7 @@ def aggregate_notifications(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def preview_rule(self: object, body: dict = None, **kwargs) -> dict:
+    def preview_rule(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get notification aggregates as specified via JSON in request body.
 
         Keyword arguments:
@@ -264,7 +265,7 @@ def preview_rule(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_actions(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_actions(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get actions based on their IDs. IDs can be retrieved using the GET query_actions.
 
         Keyword arguments:
@@ -290,7 +291,7 @@ def get_actions(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_actions(self: object, body: dict = None, **kwargs) -> dict:
+    def create_actions(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create actions for a monitoring rule.
 
         Accepts a list of actions that will be attached to the monitoring rule.
@@ -350,7 +351,7 @@ def create_actions(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_action(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_action(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete an action from a monitoring rule based on the action ID.
 
         Keyword arguments:
@@ -376,7 +377,7 @@ def delete_action(self: object, *args, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_action(self: object, body: dict = None, **kwargs) -> dict:
+    def update_action(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update an action for a monitoring rule.
 
         Keyword arguments:
@@ -552,7 +553,7 @@ def get_notifications_detailed_translated(self: object,
                                               *args,
                                               parameters: dict = None,
                                               **kwargs
-                                              ) -> dict:
+                                              ) -> Dict[str, Union[int, dict]]:
         """Get detailed notifications based on their IDs.
 
         These include the raw intelligence content that generated the match.
@@ -583,7 +584,7 @@ def get_notifications_detailed_translated(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_notifications_detailed(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_notifications_detailed(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get detailed notifications based on their IDs.
 
         These include the raw intelligence content that generated the match.
@@ -641,7 +642,7 @@ def get_notifications_translated(self: object,
                                      *args,
                                      parameters: dict = None,
                                      **kwargs
-                                     ) -> dict:
+                                     ) -> Dict[str, Union[int, dict]]:
         """Get notifications based on their IDs.
 
         IDs can be retrieved using query_notifications.
@@ -671,7 +672,7 @@ def get_notifications_translated(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_notifications(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_notifications(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get notifications based on their IDs.
 
         IDs can be retrieved using get_notifications.
@@ -699,7 +700,7 @@ def get_notifications(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_notifications(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_notifications(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete notifications based on IDs.
 
         Notifications cannot be recovered after they are deleted.
@@ -727,7 +728,7 @@ def delete_notifications(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def update_notifications(self: object, body: list = None, **kwargs) -> dict:
+    def update_notifications(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update notification status or assignee. Accepts bulk requests.
 
         Keyword arguments:
@@ -765,7 +766,7 @@ def update_notifications(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_rules(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_rules(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get monitoring rules rules by provided IDs.
 
         Keyword arguments:
@@ -791,7 +792,7 @@ def get_rules(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["list"])
-    def create_rules(self: object, body: list = None, **kwargs) -> dict:
+    def create_rules(self: object, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create monitoring rules.
 
         Keyword arguments:
@@ -837,7 +838,7 @@ def create_rules(self: object, body: list = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_rules(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_rules(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete monitoring rules.
 
         Keyword arguments:
@@ -864,7 +865,7 @@ def delete_rules(self: object, *args, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_rules(self: object, body: dict = None, **kwargs) -> dict:
+    def update_rules(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update monitoring rules.
 
         Keyword arguments:
@@ -910,7 +911,7 @@ def update_rules(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_actions(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_actions(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query actions based on provided criteria.
 
         Use the IDs from this response to get the action entities with get_actions.
@@ -1009,7 +1010,7 @@ def query_notifications_exposed_data_records(self: object, parameters: dict = No
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_notifications(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_notifications(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query notifications based on provided criteria.
 
         Use the IDs from this response to get the notification
@@ -1049,7 +1050,7 @@ def query_notifications(self: object, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_rules(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_rules(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query monitoring rules based on provided criteria.
 
         Use the IDs from this response to fetch the rules with get_rules.
diff --git a/src/falconpy/report_executions.py b/src/falconpy/report_executions.py
index 7ded465d0..732cbd8d6 100644
--- a/src/falconpy/report_executions.py
+++ b/src/falconpy/report_executions.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import reports_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class ReportExecutions(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_download(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_download(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get report entity download.
 
         Keyword arguments:
@@ -80,8 +81,8 @@ def get_download(self: object, *args, parameters: dict = None, **kwargs) -> dict
             params=handle_single_argument(args, parameters, "ids")
             )
 
-    @force_default(defaults=["body"], default_types=["dict"])
-    def retry_reports(self: object, *args, body: dict = None, **kwargs) -> dict:
+    @force_default(defaults=["body"], default_types=["list"])
+    def retry_reports(self: object, *args, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retries a report execution.
 
         Keyword arguments:
@@ -114,7 +115,7 @@ def retry_reports(self: object, *args, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_reports(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_reports(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve report details for the provided report IDs.
 
         Keyword arguments:
@@ -140,7 +141,7 @@ def get_reports(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_reports(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_reports(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find all report execution IDs matching the query with filter.
 
         Keyword arguments:
diff --git a/src/falconpy/response_policies.py b/src/falconpy/response_policies.py
index 15ee63211..b0fa4abe8 100644
--- a/src/falconpy/response_policies.py
+++ b/src/falconpy/response_policies.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default, handle_single_argument
 from ._payload import generic_payload_list, response_policy_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class ResponsePolicies(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Response policy by providing an FQL filter and paging details.
 
         Returns a set of host details which match the filter criteria.
@@ -88,7 +89,7 @@ def query_combined_policy_members(self: object, parameters: dict = None, **kwarg
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Response Policies by providing an FQL filter and paging details.
 
         Returns a set of Response Policies which match the filter criteria.
@@ -124,7 +125,7 @@ def perform_policies_action(self: object,
                                 body: dict = None,
                                 parameters: dict = None,
                                 **kwargs
-                                ) -> dict:
+                                ) -> Dict[str, Union[int, dict]]:
         """Perform the specified action on the Response Policies specified in the request.
 
         Keyword arguments:
@@ -182,7 +183,7 @@ def perform_policies_action(self: object,
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def set_policies_precedence(self: object, body: dict = None, **kwargs) -> dict:
+    def set_policies_precedence(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Set the precedence of Response Policies based on the order of IDs in the request.
 
         The first ID specified will have the highest precedence and the last ID specified will
@@ -222,7 +223,7 @@ def set_policies_precedence(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a set of Response Policies by specifying their IDs.
 
         Keyword arguments:
@@ -248,7 +249,7 @@ def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def create_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create Response Policies by specifying details about the policy to create.
 
         Keyword arguments:
@@ -299,7 +300,7 @@ def create_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a set of Response Policies by specifying their IDs.
 
         Keyword arguments:
@@ -325,7 +326,7 @@ def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def update_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update Response Policies by specifying the ID of the policy and details to update.
 
         Keyword arguments:
@@ -374,7 +375,7 @@ def update_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Response policy by providing an FQL filter and paging details.
 
         Returns a set of Agent IDs which match the filter criteria.
@@ -407,7 +408,7 @@ def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Response Policies by providing an FQL filter with sort and/or paging details.
 
         This returns a set of Response Policy IDs that match the given criteria.
diff --git a/src/falconpy/sample_uploads.py b/src/falconpy/sample_uploads.py
index 9a064966a..f0b6807b3 100644
--- a/src/falconpy/sample_uploads.py
+++ b/src/falconpy/sample_uploads.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 import json
+from typing import Dict, Union
 from ._util import (
     force_default,
     process_service_request,
@@ -403,7 +404,7 @@ def upload_sample(self: object,
                       body: dict = None,
                       parameters: dict = None,
                       **kwargs
-                      ) -> dict:
+                      ) -> Dict[str, Union[int, dict]]:
         """Upload a file for further cloud analysis.
 
         After uploading, call the specific analysis API endpoint.
@@ -473,7 +474,7 @@ def upload_sample(self: object,
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_sample(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_sample(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Remove a sample, including file, meta and submissions from the collection.
 
         Keyword arguments:
diff --git a/src/falconpy/scheduled_reports.py b/src/falconpy/scheduled_reports.py
index 7fcd74238..c52ca3354 100644
--- a/src/falconpy/scheduled_reports.py
+++ b/src/falconpy/scheduled_reports.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import reports_payload
 from ._service_class import ServiceClass
@@ -54,8 +55,8 @@ class ScheduledReports(ServiceClass):
     - a valid token provided by the authentication service class (oauth2.py)
     """
 
-    @force_default(defaults=["body"], default_types=["dict"])
-    def launch(self: object, *args, body: dict = None, **kwargs) -> dict:
+    @force_default(defaults=["body"], default_types=["list"])
+    def launch(self: object, *args, body: list = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Launch scheduled report executions for the provided ID(s).
 
         Keyword arguments:
@@ -88,7 +89,7 @@ def launch(self: object, *args, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_reports(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_reports(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve scheduled reports for the provided report IDs.
 
         Keyword arguments:
@@ -114,7 +115,7 @@ def get_reports(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_reports(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_reports(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Find all report IDs matching the query with filter.
 
         Keyword arguments:
diff --git a/src/falconpy/sensor_download.py b/src/falconpy/sensor_download.py
index 45422f168..cee590223 100644
--- a/src/falconpy/sensor_download.py
+++ b/src/falconpy/sensor_download.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 import os
+from typing import Dict, Union
 from ._util import generate_ok_result, force_default
 from ._util import handle_single_argument, process_service_request
 from ._service_class import ServiceClass
@@ -59,7 +60,7 @@ class SensorDownload(ServiceClass):
     def get_combined_sensor_installers_by_query(self: object,
                                                 parameters: dict = None,
                                                 **kwargs
-                                                ) -> dict:
+                                                ) -> Dict[str, Union[int, dict]]:
         """Retrieve all metadata for installers from provided query.
 
         Keyword arguments:
@@ -164,7 +165,7 @@ def get_sensor_installer_entities(self: object,
             params=handle_single_argument(args, parameters, "ids")
             )
 
-    def get_sensor_installer_ccid(self: object) -> dict:
+    def get_sensor_installer_ccid(self: object) -> Dict[str, Union[int, dict]]:
         """Retrieve the CID for the current oauth environment.
 
         This method does not accept arguments.
@@ -183,7 +184,7 @@ def get_sensor_installer_ccid(self: object) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_sensor_installers_by_query(self: object, parameters: dict = None, **kwargs) -> dict:
+    def get_sensor_installers_by_query(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a list of SHA256 for installers based on the filter.
 
         Keyword arguments:
diff --git a/src/falconpy/sensor_update_policy.py b/src/falconpy/sensor_update_policy.py
index 90c39b9f0..8bd876bd3 100644
--- a/src/falconpy/sensor_update_policy.py
+++ b/src/falconpy/sensor_update_policy.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import generate_error_result, args_to_params, force_default
 from ._util import handle_single_argument, process_service_request
 from ._payload import generic_payload_list, sensor_policy_payload
@@ -56,7 +57,7 @@ class SensorUpdatePolicy(ServiceClass):
     """
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def reveal_uninstall_token(self: object, body: dict = None, **kwargs) -> dict:
+    def reveal_uninstall_token(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Reveals an uninstall token for a specific device.
 
         To retrieve the bulk maintenance token pass the value
@@ -94,7 +95,7 @@ def reveal_uninstall_token(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_builds(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_builds(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve available builds for use with Sensor Update Policies.
 
         Keyword arguments:
@@ -123,7 +124,7 @@ def query_combined_builds(self: object, *args, parameters: dict = None, **kwargs
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_kernels(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_kernels(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve kernel compatibility info for Sensor Update Builds.
 
         Keyword arguments:
@@ -153,7 +154,7 @@ def query_combined_kernels(self: object, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Sensor Update Policy by providing a FQL filter and paging detail.
 
         Returns a set of host details which match the filter criteria.
@@ -187,7 +188,7 @@ def query_combined_policy_members(self: object, parameters: dict = None, **kwarg
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Sensor Update Policies by providing an FQL filter and paging details.
 
         Returns a set of Sensor Update Policies which match the filter criteria.
@@ -224,7 +225,7 @@ def query_combined_policies(self: object, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_combined_policies_v2(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_combined_policies_v2(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Sensor Update Policies by providing an FQL filter and paging details.
 
         Provides additional support for uninstall protection.
@@ -266,7 +267,7 @@ def perform_policies_action(self: object,
                                 body: dict = None,
                                 parameters: dict = None,
                                 **kwargs
-                                ) -> dict:
+                                ) -> Dict[str, Union[int, dict]]:
         """Perform the specified action on the Sensor Update Policies specified in the request.
 
         Keyword arguments:
@@ -334,7 +335,7 @@ def perform_policies_action(self: object,
         return returned
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def set_policies_precedence(self: object, body: dict = None, **kwargs) -> dict:
+    def set_policies_precedence(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Set the precedence of Sensor Update Policies based on the order of IDs in the request.
 
         The first ID specified will have the highest precedence and the last ID specified will have
@@ -375,7 +376,7 @@ def set_policies_precedence(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a set of Sensor Update Policies by specifying their IDs.
 
         Keyword arguments:
@@ -401,7 +402,7 @@ def get_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def create_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create Sensor Update Policies by specifying details about the policy to create.
 
         Keyword arguments:
@@ -449,7 +450,7 @@ def create_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a set of Sensor Update Policies by specifying their IDs.
 
         Keyword arguments:
@@ -476,7 +477,7 @@ def delete_policies(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_policies(self: object, body: dict = None, **kwargs) -> dict:
+    def update_policies(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update Sensor Update Policies by specifying the ID of the policy and details to update.
 
         Keyword arguments:
@@ -524,7 +525,7 @@ def update_policies(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_policies_v2(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_policies_v2(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Retrieve a set of Sensor Update Policies by specifying their IDs.
 
         Provides additional support for uninstall protection.
@@ -553,7 +554,7 @@ def get_policies_v2(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_policies_v2(self: object, body: dict = None, **kwargs) -> dict:
+    def create_policies_v2(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create Sensor Update Policies by specifying details about the policy.
 
         Provides additional support for uninstall protection.
@@ -651,7 +652,7 @@ def create_policies_v2(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_policies_v2(self: object, body: dict = None, **kwargs) -> dict:
+    def update_policies_v2(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update Sensor Update Policies by specifying the ID of the policy and update details.
 
         Provides additional support for uninstall protection.
@@ -727,7 +728,11 @@ def update_policies_v2(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_kernels(self: object, distinct_field: str = "id", parameters: dict = None, **kwargs) -> dict:
+    def query_kernels(self: object,
+                      distinct_field: str = "id",
+                      parameters: dict = None,
+                      **kwargs
+                      ) -> Dict[str, Union[int, dict]]:
         """Retrieve kernel compatibility info for Sensor Update Builds.
 
         Keyword arguments:
@@ -760,7 +765,7 @@ def query_kernels(self: object, distinct_field: str = "id", parameters: dict = N
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policy_members(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for members of a Sensor Update Policy by providing a FQL filter and paging detail.
 
         Returns a set of Agent IDs which match the filter criteria.
@@ -794,7 +799,7 @@ def query_policy_members(self: object, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_policies(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_policies(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Sensor Update Policies by providing a FQL filter and paging details.
 
         Returns a set of Sensor Update Policy IDs which match the filter criteria.
diff --git a/src/falconpy/sensor_visibility_exclusions.py b/src/falconpy/sensor_visibility_exclusions.py
index b316513a5..2de2642c5 100644
--- a/src/falconpy/sensor_visibility_exclusions.py
+++ b/src/falconpy/sensor_visibility_exclusions.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import exclusion_payload
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class SensorVisibilityExclusions(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a set of Sensor Visibility Exclusions by specifying their IDs.
 
         Keyword arguments:
@@ -81,7 +82,7 @@ def get_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_exclusions(self: object, body: dict = None, **kwargs) -> dict:
+    def create_exclusions(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create the Sensor Visibility exclusions.
 
         Keyword arguments:
@@ -117,7 +118,7 @@ def create_exclusions(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_exclusions(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete the Sensor Visibility exclusions by ID.
 
         Keyword arguments:
@@ -144,7 +145,7 @@ def delete_exclusions(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def update_exclusions(self: object, body: dict = None, **kwargs) -> dict:
+    def update_exclusions(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Update the Sensor Visibility Exclusions.
 
         Keyword arguments:
@@ -184,7 +185,7 @@ def update_exclusions(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_exclusions(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_exclusions(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Sensor Visibility Exclusions.
 
         Keyword arguments:
diff --git a/src/falconpy/spotlight_evaluation_logic.py b/src/falconpy/spotlight_evaluation_logic.py
index 53f377ed2..b22849682 100644
--- a/src/falconpy/spotlight_evaluation_logic.py
+++ b/src/falconpy/spotlight_evaluation_logic.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request
 from ._util import handle_single_argument, generate_error_result
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class SpotlightEvaluationLogic(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_evaluation_logic_combined(self: object, parameters: dict = None,  **kwargs) -> dict:
+    def query_evaluation_logic_combined(self: object, parameters: dict = None,  **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for evaluation logic in your environment by providing a FQL filter and paging details.
 
         Returns a set of evaluation logic entities which match the filter criteria.
@@ -104,7 +105,7 @@ def query_evaluation_logic_combined(self: object, parameters: dict = None,  **kw
         return returned
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_evaluation_logic(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_evaluation_logic(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on evaluation logic items by providing one or more IDs.
 
         Keyword arguments:
@@ -130,7 +131,7 @@ def get_evaluation_logic(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_evaluation_logic(self: object, parameters: dict = None,  **kwargs) -> dict:
+    def query_evaluation_logic(self: object, parameters: dict = None,  **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for evaluation logic in your environment by providing a FQL filter and paging details.
 
         Returns a set of evaluation logic IDs which match the filter criteria.
diff --git a/src/falconpy/spotlight_vulnerabilities.py b/src/falconpy/spotlight_vulnerabilities.py
index 73c2f7b91..cff5c4493 100644
--- a/src/falconpy/spotlight_vulnerabilities.py
+++ b/src/falconpy/spotlight_vulnerabilities.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request
 from ._util import handle_single_argument, generate_error_result
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class SpotlightVulnerabilities(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_vulnerabilities_combined(self: object, parameters: dict = None,  **kwargs) -> dict:
+    def query_vulnerabilities_combined(self: object, parameters: dict = None,  **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Vulnerabilities by providing an FQL filter and paging details.
 
         Returns a set of Vulnerability IDs which match the filter criteria.
@@ -108,7 +109,7 @@ def query_vulnerabilities_combined(self: object, parameters: dict = None,  **kwa
         return returned
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_vulnerabilities(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_vulnerabilities(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on vulnerabilities by providing one or more IDs.
 
         Keyword arguments:
@@ -134,7 +135,7 @@ def get_vulnerabilities(self: object, *args, parameters: dict = None, **kwargs)
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_vulnerabilities(self: object, parameters: dict = None,  **kwargs) -> dict:
+    def query_vulnerabilities(self: object, parameters: dict = None,  **kwargs) -> Dict[str, Union[int, dict]]:
         """Search for Vulnerabilities by providing an FQL filter and paging details.
 
         Returns a set of Vulnerability IDs which match the filter criteria.
@@ -170,7 +171,7 @@ def query_vulnerabilities(self: object, parameters: dict = None,  **kwargs) -> d
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_remediations(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_remediations(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on remediations by providing one or more IDs.
 
         Keyword arguments:
@@ -196,7 +197,7 @@ def get_remediations(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_remediations_v2(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_remediations_v2(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get details on remediations by providing one or more IDs.
 
         Keyword arguments:
diff --git a/src/falconpy/tailored_intelligence.py b/src/falconpy/tailored_intelligence.py
index dc2795224..da268b634 100644
--- a/src/falconpy/tailored_intelligence.py
+++ b/src/falconpy/tailored_intelligence.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import process_service_request, force_default, handle_single_argument
 from ._payload import generic_payload_list
 from ._service_class import ServiceClass
@@ -55,7 +56,7 @@ class TailoredIntelligence(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_event_body(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_event_body(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get the event body for the provided event ID.
 
         Keyword arguments:
@@ -81,7 +82,7 @@ def get_event_body(self: object, *args, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_event_entities(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def get_event_entities(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get events entities for specified IDs.
 
         Keyword arguments:
@@ -117,7 +118,7 @@ def get_event_entities(self: object, *args, body: dict = None, **kwargs) -> dict
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_events(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_events(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query for event IDs that match the provided filter criteria.
 
         Keyword arguments:
@@ -148,7 +149,7 @@ def query_events(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def get_rule_entities(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def get_rule_entities(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get rule entities for specified IDs.
 
         Keyword arguments:
@@ -184,7 +185,7 @@ def get_rule_entities(self: object, *args, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_rules(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_rules(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Query for rule IDs that match the provided filter criteria.
 
         Keyword arguments:
diff --git a/src/falconpy/user_management.py b/src/falconpy/user_management.py
index 19a9d9cc6..551e6c191 100644
--- a/src/falconpy/user_management.py
+++ b/src/falconpy/user_management.py
@@ -36,6 +36,7 @@
 For more information, please refer to <https://unlicense.org>
 """
 # pylint: disable=R0904,C0302
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._payload import generic_payload_list
 from ._service_class import ServiceClass
@@ -58,7 +59,7 @@ class UserManagement(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_user_grants(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_user_grants(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get User Grant(s).
 
         This operation lists both direct as well as flight control grants
@@ -112,7 +113,7 @@ def get_user_grants(self: object, *args, parameters: dict = None, **kwargs) -> d
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_roles_mssp(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_roles_mssp(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get information about a role, supports Flight Control.
 
         HTTP Method: GET
@@ -150,7 +151,7 @@ def get_roles_mssp(self: object, *args, parameters: dict = None, **kwargs) -> di
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def user_action(self: object, body: dict = None, **kwargs) -> dict:
+    def user_action(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Apply actions to one or more users.
 
         HTTP Method: POST
@@ -208,7 +209,7 @@ def user_action(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def user_roles_action(self: object, body: dict = None, **kwargs) -> dict:
+    def user_roles_action(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Grant or Revoke one or more role(s) to a user against a CID.
 
         HTTP Method: POST
@@ -266,7 +267,7 @@ def user_roles_action(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def retrieve_users(self: object, *args, body: dict = None, **kwargs) -> dict:
+    def retrieve_users(self: object, *args, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get info about users including their name, UID and CID by providing user UUIDs.
 
         HTTP Method: POST
@@ -314,7 +315,7 @@ def retrieve_users(self: object, *args, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_user_mssp(self: object, body: dict = None, **kwargs) -> dict:
+    def create_user_mssp(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create a new user. Supports Flight Control.
 
         After creating a user, assign one or more roles with `user_roles_action`.
@@ -380,7 +381,7 @@ def create_user_mssp(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_user_mssp(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_user_mssp(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a user permanently. Supports Flight Control.
 
         HTTP Method: DELETE
@@ -415,7 +416,7 @@ def delete_user_mssp(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters", "body"], default_types=["dict", "dict"])
-    def update_user_mssp(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def update_user_mssp(self: object, body: dict = None, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Modify an existing user's first or last name. Supports Flight Control.
 
         HTTP Method: PATCH
@@ -467,7 +468,7 @@ def update_user_mssp(self: object, body: dict = None, parameters: dict = None, *
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_roles(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def query_roles(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Show role IDs for all roles available in your customer account. Supports Flight Control.
 
         For more information on each role, provide the role ID to `get_roles_mssp`.
@@ -509,7 +510,7 @@ def query_roles(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def query_users(self: object, parameters: dict = None, **kwargs) -> dict:
+    def query_users(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """List user IDs for all users in your customer account.
 
         For more information on each user, provide the user ID to `retrieve_users`.
@@ -553,7 +554,7 @@ def query_users(self: object, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_roles(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_roles(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get information about a role.
 
         DEPRECATED: Please use entitiesRolesV1 instead.
@@ -590,7 +591,7 @@ def get_roles(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters", "body"], default_types=["dict", "dict"])
-    def grant_user_role_ids(self: object, body: dict, parameters: dict = None, **kwargs) -> dict:
+    def grant_user_role_ids(self: object, body: dict, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Assign one or more roles to a user.
 
         DEPRECATED: Please use userActionV1 instead.
@@ -645,7 +646,7 @@ def grant_user_role_ids(self: object, body: dict, parameters: dict = None, **kwa
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def revoke_user_role_ids(self: object, parameters: dict = None, **kwargs) -> dict:
+    def revoke_user_role_ids(self: object, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Revoke one or more roles from a user.
 
         DEPRECATED: Please use userActionV1 instead.
@@ -682,7 +683,7 @@ def revoke_user_role_ids(self: object, parameters: dict = None, **kwargs) -> dic
             params=parameters
             )
 
-    def get_available_role_ids(self: object) -> dict:
+    def get_available_role_ids(self: object) -> Dict[str, Union[int, dict]]:
         """Show role IDs for all roles available in your customer account.
 
         For more information on each role, provide the role ID to get_roles.
@@ -714,7 +715,7 @@ def get_available_role_ids(self: object) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_user_role_ids(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_user_role_ids(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Show role IDs of roles assigned to a user.
 
         For more information on each role, provide the role ID to `get_role`.
@@ -753,7 +754,7 @@ def get_user_role_ids(self: object, *args, parameters: dict = None, **kwargs) ->
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def retrieve_user(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def retrieve_user(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get information about a user.
 
         DEPRECATED: Please use retrieveUsersGETV1 instead.
@@ -790,7 +791,7 @@ def retrieve_user(self: object, *args, parameters: dict = None, **kwargs) -> dic
             )
 
     @force_default(defaults=["body"], default_types=["dict"])
-    def create_user(self: object, body: dict = None, **kwargs) -> dict:
+    def create_user(self: object, body: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Create a new user.
 
         After creating a user, assign one or more roles with `grant_user_role_ids`.
@@ -852,7 +853,7 @@ def create_user(self: object, body: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def delete_user(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def delete_user(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Delete a user permanently.
 
         DEPRECATED: Please use deleteUserV1 instead.
@@ -889,7 +890,7 @@ def delete_user(self: object, *args, parameters: dict = None, **kwargs) -> dict:
             )
 
     @force_default(defaults=["parameters", "body"], default_types=["dict", "dict"])
-    def update_user(self: object, body: dict = None, parameters: dict = None, **kwargs) -> dict:
+    def update_user(self: object, body: dict = None, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Modify an existing user.
 
         DEPRECATED: Please use updateUserV1 instead.
@@ -942,7 +943,7 @@ def update_user(self: object, body: dict = None, parameters: dict = None, **kwar
             params=parameters
             )
 
-    def retrieve_emails_by_cid(self: object) -> dict:
+    def retrieve_emails_by_cid(self: object) -> Dict[str, Union[int, dict]]:
         """List the usernames (usually an email address) for all users in your customer account.
 
         DEPRECATED: Please use retrieveUsersGETV1 instead.
@@ -971,7 +972,7 @@ def retrieve_emails_by_cid(self: object) -> dict:
             operation_id="RetrieveEmailsByCID"
             )
 
-    def retrieve_user_uuids_by_cid(self: object) -> dict:
+    def retrieve_user_uuids_by_cid(self: object) -> Dict[str, Union[int, dict]]:
         """List user IDs for all users in your customer account.
 
         For more information on each user, provide the user ID to `retrieve_user`.
@@ -1003,7 +1004,7 @@ def retrieve_user_uuids_by_cid(self: object) -> dict:
             )
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def retrieve_user_uuid(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def retrieve_user_uuid(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get a user's ID by providing a username (usually an email address).
 
         DEPRECATED: Please use queryUserV1 instead.
diff --git a/src/falconpy/zero_trust_assessment.py b/src/falconpy/zero_trust_assessment.py
index b939931f0..fc1d55b23 100644
--- a/src/falconpy/zero_trust_assessment.py
+++ b/src/falconpy/zero_trust_assessment.py
@@ -35,6 +35,7 @@
 
 For more information, please refer to <https://unlicense.org>
 """
+from typing import Dict, Union
 from ._util import force_default, process_service_request, handle_single_argument
 from ._service_class import ServiceClass
 from ._endpoint._zero_trust_assessment import _zero_trust_assessment_endpoints as Endpoints
@@ -54,7 +55,7 @@ class ZeroTrustAssessment(ServiceClass):
     """
 
     @force_default(defaults=["parameters"], default_types=["dict"])
-    def get_assessment(self: object, *args, parameters: dict = None, **kwargs) -> dict:
+    def get_assessment(self: object, *args, parameters: dict = None, **kwargs) -> Dict[str, Union[int, dict]]:
         """Get Zero Trust Assessment data for one or more hosts by providing agent IDs (AID).
 
         Keyword arguments:
@@ -80,7 +81,7 @@ def get_assessment(self: object, *args, parameters: dict = None, **kwargs) -> di
             params=handle_single_argument(args, parameters, "ids")
             )
 
-    def get_audit(self: object) -> dict:
+    def get_audit(self: object) -> Dict[str, Union[int, dict]]:
         """Get the Zero Trust Assessment audit report for one customer ID (CID).
 
         This method does not accept arguments.
diff --git a/util/lint.sh b/util/lint.sh
index d9d157cb9..f650390ca 100755
--- a/util/lint.sh
+++ b/util/lint.sh
@@ -1,9 +1,22 @@
 #!/bin/bash
+
 if ! [[ -z "$1" ]]
 then
 	TARGET=$1
 else
 	TARGET="src/falconpy"
 fi
-flake8 $TARGET --count --exit-zero --max-complexity=15 --max-line-length=127 --statistics
-pylint $TARGET --exit-zero --max-line-length=127 --disable=R0801
+
+function splat() ( echo "--------------------------------------------------------"; )
+
+echo -e "\nFormatting"
+splat
+flake8 $TARGET --count --statistics
+
+echo -e "\nCode style and syntax"
+splat
+pylint $TARGET
+
+echo "Docstring style and syntax"
+splat
+pydocstyle $TARGET
diff --git a/util/set-debug.sh b/util/set-debug.sh
new file mode 100755
index 000000000..d46b139c8
--- /dev/null
+++ b/util/set-debug.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+#
+# Set the debug environment flag.
+# 
+#
+if [ -z "$1" ]
+then
+  echo "No setting specified, disabling. (To enable: util/set-debug.sh debug)"
+  export FALCONPY_UNIT_TEST_DEBUG="DISABLED"
+else
+  export FALCONPY_UNIT_TEST_DEBUG=$1
+  echo "Debugging flag set to $1"
+fi


Test patch:
diff --git a/.github/workflows/unit_testing_macos.yml b/.github/workflows/unit_testing_macos.yml
index 30c6fa6ca..8c4e672aa 100644
--- a/.github/workflows/unit_testing_macos.yml
+++ b/.github/workflows/unit_testing_macos.yml
@@ -18,8 +18,8 @@ jobs:
     strategy:
       matrix:
         # os: [macos-latest, windows-latest, ubuntu-latest]
-        # python-version: ['3.6', '3.7', '3.8', '3.9']
-        python-version: ['3.10']
+        # python-version: ['3.6', '3.7', '3.8', '3.9', '3.10', ]
+        python-version: ['3.11']
     # runs-on: ${{ matrix.os }}
     runs-on: macos-latest
     steps:
diff --git a/.github/workflows/unit_testing_ubuntu_py3.6.yml b/.github/workflows/unit_testing_ubuntu_py3.6.yml
index a01a30ab2..12b4d0340 100644
--- a/.github/workflows/unit_testing_ubuntu_py3.6.yml
+++ b/.github/workflows/unit_testing_ubuntu_py3.6.yml
@@ -20,7 +20,7 @@ jobs:
     strategy:
       matrix:
         # os: [macos-latest, windows-latest, ubuntu-latest]
-        python-version: ['3.6']  # , '3.11-dev'
+        python-version: ['3.6']
     # runs-on: ${{ matrix.os }}
     runs-on: ubuntu-20.04
     steps:
@@ -42,4 +42,4 @@ jobs:
         CROSS_DEBUG_SECRET: ${{ secrets.CROSS_DEBUG_SECRET }}
       run: |
         coverage run --source=src --omit=src/falconpy/debug.py -m pytest -s --ignore-glob=**/manual/*
-        coverage report
\ No newline at end of file
+        coverage report
diff --git a/.github/workflows/unit_testing_windows.yml b/.github/workflows/unit_testing_windows.yml
index 5f1143aa9..39950e561 100644
--- a/.github/workflows/unit_testing_windows.yml
+++ b/.github/workflows/unit_testing_windows.yml
@@ -19,7 +19,7 @@ jobs:
       matrix:
         # os: [macos-latest, windows-latest, ubuntu-latest]
         # python-version: ['3.6', '3.7', '3.8', '3.9', '3.10']
-        python-version: ['3.10']
+        python-version: ['3.11']
     # runs-on: ${{ matrix.os }}
     runs-on: windows-latest
     steps:
diff --git a/tests/test_authentications.py b/tests/test_authentications.py
index aed877eaf..2a378a322 100644
--- a/tests/test_authentications.py
+++ b/tests/test_authentications.py
@@ -3,24 +3,38 @@
 import os
 import sys
 import pytest
+# from datetime import datetime
+# from logging import (
+#     getLogger,
+#     basicConfig,
+#     DEBUG,
+#     WARNING,
+#     ERROR,
+#     INFO,
+#     )
+from logging.handlers import RotatingFileHandler
 # Authentication via the test_authorization.py
 from tests import test_authorization as Authorization
 # Import our sibling src folder into the path
 sys.path.append(os.path.abspath('src'))
 # Classes to test - manually imported from sibling folder
-from falconpy import ZeroTrustAssessment, CloudConnectAWS, OAuth2, APIHarness
+from falconpy import ZeroTrustAssessment, CloudConnectAWS, OAuth2, APIHarness, version, InvalidCredentialFormat, Hosts
 from falconpy._util import confirm_base_region
 from falconpy._version import _TITLE, _VERSION
 
 auth = Authorization.TestAuthorization()
 auth.serviceAuth()
 AllowedResponses = [200, 401, 403, 429]
-
+_DEBUG = os.getenv("FALCONPY_UNIT_TEST_DEBUG", None)
+if _DEBUG:
+    _DEBUG = True
 
 class TestAuthentications:
 
     def serviceAny_TestCredentialAuthFailure(self):
-        bad_falcon = ZeroTrustAssessment(creds={"client_id": "This", "client_secret": "WontWork"})
+        bad_falcon = ZeroTrustAssessment(creds={"client_id": "This", "client_secret": "WontWork"}, debug=_DEBUG)
+        # Check the service class login code path at the same time
+        bad_falcon.login()
         result = bad_falcon.getAssessmentV1(ids='12345678')
 
         if result["status_code"] in AllowedResponses:
@@ -29,20 +43,19 @@ def serviceAny_TestCredentialAuthFailure(self):
             return False
 
     def serviceAny_TestBadCredRevoke(self):
-        bad_falcon = OAuth2()
-        result = bad_falcon.revoke("Will generate a 403")
+        bad_falcon = OAuth2(client_id="this_is", client_secret=["garbage"], debug=_DEBUG, sanitize_log=False)  # Generate a hard error
+        result = bad_falcon.revoke(token="whatevers")
         if result["status_code"] in AllowedResponses:
             return True
         else:
             return False
 
     def serviceAny_TestStaleObjectAuth(self):
-
         falcon = CloudConnectAWS(auth_object=OAuth2(creds={"client_id": auth.config["falcon_client_id"],
                                                            "client_secret": auth.config["falcon_client_secret"]
                                                            },
-                                                    base_url = "us-1"  # Testing dashed base specifier
-                                                    ))
+                                                    base_url = "us-1",  # Testing dashed base specifier
+                                                    debug=_DEBUG))
         result = falcon.QueryAWSAccounts()
         if result["status_code"] in AllowedResponses:
             return True
@@ -52,13 +65,13 @@ def serviceAny_TestStaleObjectAuth(self):
     def serviceAny_forceCrossCloudResponseFailure(self):
         falcon = OAuth2(client_id=os.environ["CROSS_DEBUG_KEY"],
                         client_secret="will_not_work",
-                        base_url="us1"
+                        base_url="us1", debug=_DEBUG
                         )
         result = falcon.token()
         if result["status_code"] == 403:
             falcon = APIHarness(client_id=os.environ["CROSS_DEBUG_KEY"],
                                 client_secret="will_not_work",
-                                base_url="us1"
+                                base_url="us1", debug=_DEBUG
                                 )
             t_creds = {
                 "client_id": os.environ["CROSS_DEBUG_KEY"],
@@ -75,7 +88,7 @@ def serviceAny_forceCrossCloudResponseFailure(self):
     def serviceAny_forceCrossCloudResponseGovFailure(self):
         falcon = OAuth2(client_id=os.environ["CROSS_DEBUG_KEY"],
                         client_secret=os.environ["CROSS_DEBUG_SECRET"],
-                        base_url="us1"
+                        base_url="us1", debug=_DEBUG
                         )
         result = falcon.token()
         if result["status_code"] == 403:
@@ -86,7 +99,7 @@ def serviceAny_forceCrossCloudResponseGovFailure(self):
     def serviceAny_checkRegionNameLookups(self):
         falcon = OAuth2(client_id=auth.config["falcon_client_id"],
                         client_secret=auth.config["falcon_client_secret"],
-                        base_url="usgov1"
+                        base_url="usgov1", debug=_DEBUG
                         )
         result = falcon.token()
         if result["status_code"] == 400:
@@ -106,13 +119,14 @@ def serviceAny_reallyBadBaseURL(self):
     def serviceAny_forceGovCloudAutoSelectFailure(self):
         falcon = OAuth2(client_id=os.environ["CROSS_DEBUG_KEY"],
                         client_secret=os.environ["CROSS_DEBUG_SECRET"],
-                        base_url="usgov1"
+                        base_url="usgov1", debug=_DEBUG
                         )
         result = falcon.token()
         if result["status_code"] == 201:
             falcon = APIHarness(client_id=os.environ["CROSS_DEBUG_KEY"],
                                 client_secret=os.environ["CROSS_DEBUG_SECRET"],
-                                base_url="https://api.laggar.gcw.crowdstrike.com/"  # Testing for issue 558
+                                base_url="https://api.laggar.gcw.crowdstrike.com/",  # Testing for issue 558
+                                debug=_DEBUG
                                 )
             t_creds = {
                 "client_id": os.environ["CROSS_DEBUG_KEY"],
@@ -123,7 +137,8 @@ def serviceAny_forceGovCloudAutoSelectFailure(self):
                 falcon = CloudConnectAWS(client_id=os.environ["CROSS_DEBUG_KEY"],
                                          client_secret=os.environ["CROSS_DEBUG_SECRET"],
                                          base_url="usgov1",
-                                         renew_window=300
+                                         renew_window=300,
+                                         debug=_DEBUG
                                          )
                 result = falcon.auth_object.token()
                 if result["status_code"] == 429:
@@ -138,22 +153,48 @@ def serviceAny_forceGovCloudAutoSelectFailure(self):
             return False
 
     def serviceAny_TestObjectAuth(self):
+        _returned = True
         # Should also test direct auth in the authentication class
         auth_obj = OAuth2(client_id=auth.config["falcon_client_id"],
-                          client_secret=auth.config["falcon_client_secret"]
+                          client_secret=auth.config["falcon_client_secret"],
+                          debug=_DEBUG
                           )
         auth_obj.token()
         # While we're at it, test user_agent override
-        falcon = CloudConnectAWS(auth_object=auth_obj, user_agent=f"{_TITLE}/{str(_VERSION)}")
+        falcon = CloudConnectAWS(auth_object=auth_obj, user_agent=f"{_TITLE}/{str(_VERSION)}", debug=_DEBUG)
         result = falcon.QueryAWSAccounts()
-        if result["status_code"] in AllowedResponses:
-            return True
-        else:
-            return False
+        if result["status_code"] not in AllowedResponses:
+            _returned = False
+        # And test the new built in logout functionality
+        falcon.logout()
+        # Garf up our creds and do it again to force an error
+        auth_obj.creds = {"client_id" : "Invalid", "client_secret": "Credential"}
+        falcon.logout()
+        # Now test the override property setters
+        falcon.proxy = {"https": "https://notreallyaproxy.com:8888"}
+        falcon.timeout = (5, 5)
+        # The BearerToken object now maintains a minimum of 120 seconds
+        # for a token renewal window across all objects. This is true
+        # regardless of whether the property `renew_window` or the
+        # deprecated property `token_renew_window` is used.
+        falcon.token_renew_window = 340
+        falcon.user_agent = "falconpy-unit-testing/1337.1"
+        # Finally test the property getters
+        if not falcon.proxy["https"] == "https://notreallyaproxy.com:8888":
+            _returned = False
+        if not falcon.timeout == (5, 5):
+            _returned = False
+        if not falcon.token_renew_window == 340:
+            _returned = False
+        if not falcon.user_agent == "falconpy-unit-testing/1337.1":
+            _returned = False
+
+        return _returned
+
 
     def serviceAny_TestBadObjectAuth(self):
         # Should also test bad direct auth in the authentication class
-        falcon = CloudConnectAWS(auth_object=OAuth2())
+        falcon = CloudConnectAWS(auth_object=OAuth2(debug=_DEBUG))
         result = falcon.QueryAWSAccounts()
         if result["status_code"] in AllowedResponses:
             return True
@@ -162,9 +203,10 @@ def serviceAny_TestBadObjectAuth(self):
 
     def serviceAny_TestEasyObjectAuth(self):
         auth_obj = ZeroTrustAssessment(client_id=auth.config["falcon_client_id"],
-                          client_secret=auth.config["falcon_client_secret"]
+                          client_secret=auth.config["falcon_client_secret"],
+                          debug=_DEBUG
                           )
-        #auth_obj.token()
+        # auth_obj.token()
         # Test passing just the service class object, not the auth_object attribute
         # Service Class base object should detect and handle this.
         falcon = CloudConnectAWS(auth_object=auth_obj)
@@ -212,3 +254,68 @@ def test_crossGovCloudSelectGovFailure(self):
 
     def test_ObjectAuth(self):
         assert self.serviceAny_TestObjectAuth() is True
+
+    def test_NoSecret(self):
+        # Disable any environment keys that could trigger environment authentication
+        save_id = os.getenv("FALCON_CLIENT_ID")
+        save_key = os.getenv("FALCON_CLIENT_SECRET")
+        if save_id or save_key:
+            os.environ["FALCON_CLIENT_ID"] = ""
+            os.environ["FALCON_CLIENT_SECRET"] = ""
+        thing = OAuth2(client_id="Whatever", debug=_DEBUG)
+        result = thing.login()
+        if save_id or save_key:
+            os.environ["FALCON_CLIENT_ID"] = save_id
+            os.environ["FALCON_CLIENT_SECRET"] = save_key
+        assert bool(result["status_code"] == 403)
+
+    def test_version_check(self):
+        vers = version()
+        assert bool(len(vers) > 3)
+
+    def test_version_compare(self):
+        assert bool(version("1.2.16"))  # Will be true as this method is released in 1.3+
+
+    def test_version_compare_exact_match(self):
+        assert bool(version(version()))  # Should be a while before we hit that...
+
+    def test_legacy_token_lookup(self):
+        test_object = Hosts(auth_object=auth.authorization)
+        assert bool(test_object.token)
+
+    def test_EnvironmentAuthentication(self):
+        _returned = False
+        save_id = os.getenv("FALCON_CLIENT_ID")
+        save_key = os.getenv("FALCON_CLIENT_SECRET")
+        if save_id or save_key:
+            thing = Hosts(debug=_DEBUG)
+            result = thing.login()
+            if thing.token_status == 201:
+                _returned = True
+            assert _returned
+        else:
+            pytest.skip("Required environment credentials not present")
+
+    @pytest.mark.skipif(auth.authorization.base_url == "https://api.laggar.gcw.crowdstrike.com",
+                        reason="Test unsupported in GovCloud"
+                        )
+    def test_string_credentials_dictionary(self):
+        key = auth.config["falcon_client_id"]
+        the_other_bit = auth.config["falcon_client_secret"]
+        test_string = "{" + f"'client_id': '{key}', 'client_secret': '{the_other_bit}'" + "}"
+        test_object = Hosts(creds=test_string)
+        test_object.login()
+        assert bool(test_object.authenticated())
+
+    def test_bad_credentials_dictionary(self):
+        _success = False
+        test = "Bob"
+        try:
+            test_object = Hosts(creds=test)
+        except InvalidCredentialFormat:
+            test = 2
+            try:
+                test_object = Hosts(creds=test)
+            except InvalidCredentialFormat:
+                _success = True
+        assert _success
diff --git a/tests/test_authorization.py b/tests/test_authorization.py
index 507d4293a..d9e95bfcc 100644
--- a/tests/test_authorization.py
+++ b/tests/test_authorization.py
@@ -26,6 +26,9 @@
 from falconpy import Hosts
 
 shared_token = None
+_DEBUG = os.getenv("FALCONPY_UNIT_TEST_DEBUG", None)
+if _DEBUG:
+    _DEBUG = True
 
 # The TestAuthorization class tests authentication and deauthentication
 # for both the Uber and Service classes.
@@ -39,7 +42,7 @@ def getConfigObject(self):
                 "client_id": self.config["falcon_client_id"],
                 "client_secret": self.config["falcon_client_secret"]
             },
-            base_url = self.config["falcon_base_url"])
+            base_url = self.config["falcon_base_url"], debug=_DEBUG)
         try:
             global shared_token
             if not shared_token:
@@ -68,7 +71,7 @@ def getConfigExtended(self):
                     "client_id": self.config["falcon_client_id"],
                     "client_secret": self.config["falcon_client_secret"]
                 },
-                base_url = self.config["falcon_base_url"])
+                base_url = self.config["falcon_base_url"], debug=_DEBUG)
             try:
                 self.token = self.authorization.token()['body']['access_token']
                 os.environ["FALCONPY_DEBUG_TOKEN"] = self.token
@@ -110,7 +113,7 @@ def uberAuth(self):
             self.falcon = APIHarness(creds={
                     "client_id": self.config["falcon_client_id"],
                     "client_secret": self.config["falcon_client_secret"],
-                }, base_url=self.config["falcon_base_url"], renew_window=300
+                }, base_url=self.config["falcon_base_url"], renew_window=300, debug=_DEBUG
             )
             self.falcon.authenticate()
             if self.falcon.authenticated:
@@ -128,7 +131,7 @@ def failUberMSSPAuth(self):
         if status:
             self.falcon = APIHarness(client_id=self.config["falcon_client_id"],
                                      client_secret=self.config["falcon_client_secret"],
-                                     member_cid="1234567890ABCDEFG"
+                                     member_cid="1234567890ABCDEFG", debug=_DEBUG
                                      )
             self.falcon.authenticate()
             if not self.falcon.authenticated:
@@ -148,7 +151,7 @@ def serviceAuth(self):
                 'client_id': self.config["falcon_client_id"],
                 'client_secret': self.config["falcon_client_secret"]
                 },
-                base_url=self.config["falcon_base_url"]
+                base_url=self.config["falcon_base_url"], debug=_DEBUG
             )
 
             try:
@@ -174,7 +177,7 @@ def serviceAuthNoSSL(self):
             self.authorization = Hosts(creds={
                 'client_id': self.config["falcon_client_id"],
                 'client_secret': self.config["falcon_client_secret"]
-            }, ssl_verify=False, base_url=self.config["falcon_base_url"])
+            }, ssl_verify=False, base_url=self.config["falcon_base_url"], debug=_DEBUG)
 
             check = self.authorization.auth_object.token()
             if check["status_code"] == 429:
@@ -193,7 +196,7 @@ def serviceMSSPAuth(self):
         if status:
             authorization = OAuth2(client_id=self.config["falcon_client_id"],
                                    client_secret=self.config["falcon_client_secret"],
-                                   member_cid='1234567890ABCDEFG'
+                                   member_cid='1234567890ABCDEFG', debug=_DEBUG
                                    )
             try:
                 req = authorization.token()
@@ -208,7 +211,7 @@ def failServiceAuth(self):
         self.authorization = Hosts(client_id="BadClientID",
                                    client_secret="BadClientSecret",
                                    member_cid="123456789ABCDEFG",
-                                   base_url = "us3"
+                                   base_url = "us3", debug=_DEBUG
                                    )
         # self.authorization.auth_object.base_url = "nowhere"
         try:
@@ -277,7 +280,7 @@ def test_base_url_lookup(self):
         test_falcon = OAuth2(
             client_id=self.config["falcon_client_id"],
             client_secret=self.config["falcon_client_secret"],
-            base_url="us1"
+            base_url="us1", debug=_DEBUG
         )
         assert bool(
             test_falcon.token()["status_code"] == 201
@@ -288,7 +291,7 @@ def test_fail_base_url_lookup(self):
         test_falcon = OAuth2(
             client_id=self.config["falcon_client_id"],
             client_secret=self.config["falcon_client_secret"],
-            base_url="nowhere"
+            base_url="nowhere", debug=_DEBUG
         )
         assert bool(
             test_falcon.token()["status_code"] != 201
diff --git a/tests/test_cloud_connect_aws.py b/tests/test_cloud_connect_aws.py
index a49a30f13..75b23ef7c 100644
--- a/tests/test_cloud_connect_aws.py
+++ b/tests/test_cloud_connect_aws.py
@@ -28,14 +28,16 @@
     }
 falconWithCreds = None
 falconWithObject = None
-
+_DEBUG = os.getenv("FALCONPY_UNIT_TEST_DEBUG", None)
+if _DEBUG:
+    _DEBUG = True
 
 class TestCloudConnectAWS:
     def serviceCCAWS_AuthWithCreds(self):
         falconWithCreds = CloudConnectAWS(creds={
             'client_id': auth.config["falcon_client_id"],
             'client_secret': auth.config["falcon_client_secret"]
-        }, base_url=auth.config["falcon_base_url"])
+        }, base_url=auth.config["falcon_base_url"], debug=_DEBUG)
         check = falconWithCreds.auth_object.token()
         if check["status_code"] == 429:
             pytest.skip("Rate limit hit")
@@ -45,7 +47,7 @@ def serviceCCAWS_AuthWithObject(self):
         falconWithObject = CloudConnectAWS(auth_object=FalconAuth.OAuth2(creds={
             'client_id': auth.config["falcon_client_id"],
             'client_secret': auth.config["falcon_client_secret"]
-        }, base_url=auth.config["falcon_base_url"]))
+        }, base_url=auth.config["falcon_base_url"], debug=_DEBUG))
         check = falconWithObject.auth_object.token()
         if check["status_code"] == 429:
             pytest.skip("Rate limit hit")
@@ -55,7 +57,7 @@ def serviceCCAWS_RefreshToken(self):
         falconWithObject = CloudConnectAWS(auth_object=FalconAuth.OAuth2(creds={
             'client_id': auth.config["falcon_client_id"],
             'client_secret': auth.config["falcon_client_secret"]
-        }, base_url=auth.config["falcon_base_url"]))
+        }, base_url=auth.config["falcon_base_url"], debug=_DEBUG))
         check = falconWithObject.auth_object.token()
         if check["status_code"] == 429:
             pytest.skip("Rate limit hit")
@@ -74,7 +76,7 @@ def serviceCCAWS_InvalidPayloads(self):
         falconWithObject = CloudConnectAWS(auth_object=FalconAuth.OAuth2(creds={
             'client_id': auth.config["falcon_client_id"],
             'client_secret': auth.config["falcon_client_secret"]
-        }, base_url=auth.config["falcon_base_url"]))
+        }, base_url=auth.config["falcon_base_url"], debug=_DEBUG))
         check = falconWithObject.auth_object.token()
         if check["status_code"] == 429:
             pytest.skip("Rate limit hit")
diff --git a/tests/test_cspm_registration.py b/tests/test_cspm_registration.py
index 9e6f5d5e7..6b82e6570 100644
--- a/tests/test_cspm_registration.py
+++ b/tests/test_cspm_registration.py
@@ -53,7 +53,9 @@ def cspm_generate_errors(self):
             "delete_aws_account_org": falcon.DeleteCSPMAwsAccount(organization_ids='12345678'),
             "get_azure_account": falcon.GetCSPMAzureAccount(ids='12345678', scan_type="dry"),
             "create_azure_account": falcon.CreateCSPMAzureAccount(tenant_id="12345678",
-                                                                  subscription_id="12345678"
+                                                                  subscription_id="12345678",
+                                                                  behavior_assessment_enabled=True,
+                                                                  years_valid=3
                                                                   ),
             "delete_azure_account": falcon.DeleteCSPMAzureAccount(ids='12345678'),
             "update_azure_account_client_id": falcon.UpdateCSPMAzureAccountClientID(tenant_id="12345678", id="12345678"),
diff --git a/tests/test_d4c_registration.py b/tests/test_d4c_registration.py
index a46108854..7548001ec 100644
--- a/tests/test_d4c_registration.py
+++ b/tests/test_d4c_registration.py
@@ -92,7 +92,7 @@ def d4c_generate_errors(self):
             "get_cgp_account": falcon.GetCSPMCGPAccount(ids='12345678', parameters={'scan_type': 'dry'}),
             "get_gcp_acocunt": falcon.GetCSPMGCPAccount(ids='12345678'),  # Test the typo fix version
             "create_gcp_account": falcon.CreateCSPMGCPAccount(body={}, parent_id="12345678"),
-            "create_azure_account": falcon.CreateCSPMAzureAccount(body={}, subscription_id="12345678", tenant_id="12345678"),
+            "create_azure_account": falcon.CreateCSPMAzureAccount(body={}, subscription_id="12345678", tenant_id="12345678", years_valid=3, default_subscription=False),
             "azure_download_certificate": falcon.DiscoverCloudAzureDownloadCertificate("12345678"),  # Also testing arg handling
             "GetD4CAwsAccount": falcon.get_aws_account("123456789", scan_type="dry"),
             "CreateD4CAwsAccount": falcon.create_aws_account(account_id="123456789",
diff --git a/tests/test_detects.py b/tests/test_detects.py
index 3bdd256b1..066fc64c1 100644
--- a/tests/test_detects.py
+++ b/tests/test_detects.py
@@ -89,7 +89,9 @@ def service_detects_test_all(self):
         return error_checks
 
     def service_detects_test_comment(self):
-        if falcon.update_detects_by_ids(ids=falcon.query_detects(limit=1)["body"]["resources"], comment="FalconPy Unit Testing")["status_code"] == 200:
+        # Unrelated to v1.3 updates
+        # It appears the assigned_to_uuid value must be specified in order for this test to pass
+        if falcon.update_detects_by_ids(ids=falcon.query_detects(limit=1)["body"]["resources"], comment="FalconPy Unit Testing")["status_code"] in [200, 400]:
             return True
         else:
             return False
@@ -115,14 +117,14 @@ def test_validation_failure(self):
         assert bool(
             falcon.update_detects_by_ids(body={
                             "bananas": "Are yellow or green"
-                            })["status_code"] == 500
+                            })["status_code"] in AllowedResponses
         ) is True
 
     def test_validation_datatype_failure(self):
         assert bool(
             falcon.update_detects_by_ids(body={
                             "ids": "This should be a list"
-                            })["status_code"] == 500
+                            })["status_code"] in AllowedResponses
         ) is True
 
     def test_validation_invalid_param_failure(self):
@@ -130,7 +132,7 @@ def test_validation_invalid_param_failure(self):
             falcon.get_detect_summaries(body={
                             "ids": ["123456789"],
                             "coffee": "Is delicious"
-                            })["status_code"] == 500
+                            })["status_code"] in AllowedResponses
         ) is True
 
     def test_validation_disable(self):
diff --git a/tests/test_falcon_container.py b/tests/test_falcon_container.py
index 39fe25927..402a22fcb 100644
--- a/tests/test_falcon_container.py
+++ b/tests/test_falcon_container.py
@@ -18,7 +18,7 @@
                   client_secret=falcon.auth_object.creds["client_secret"],
                   base_url=falcon.auth_object.base_url
                   )
-AllowedResponses = [200, 201, 400, 403, 404, 429, 500, 502]  # Allowing no content returned as code paths are confirmed
+AllowedResponses = [200, 201, 204, 400, 403, 404, 429, 500, 502]  # Allowing no content returned as code paths are confirmed
 
 
 class TestFalconContainer:
@@ -26,10 +26,10 @@ def run_tests(self):
         error_checks = True
 
         tests = {
-            "GetAssessment": falcon.get_assessment(repository="whatever", tag="whatever"),
+            "GetAssessment": falcon.get_assessment(repository="misp", tag="latest"),
             "DeleteImageDetails": falcon.delete_image_details("whatever"),
             "ImageMatchesPolicy": falcon.image_matches_policy(repository="whatever", tag="whatever", body={}),
-            "GetAssessmentUber": uber.command("GetImageAssessmentReport", repository="whatever", tag="whatever"),
+            "GetAssessmentUber": uber.command("GetImageAssessmentReport", repository="misp", tag="latest"),
             "DeleteImageDetailsUber": uber.command("DeleteImageDetails", image_id="12345678"),
             "ImageMatchesPolicyUber": uber.command("ImageMatchesPolicy", repository="whatever", tag="whatever"),
             "read_image_vulnerabilities": falcon.read_image_vulnerabilities(osversion="Windows", packages={"LayerIndex": 1}),
diff --git a/tests/test_falconx_sandbox.py b/tests/test_falconx_sandbox.py
index 629b80cae..bb96a61fb 100644
--- a/tests/test_falconx_sandbox.py
+++ b/tests/test_falconx_sandbox.py
@@ -51,9 +51,11 @@ def falconx_generate_errors(self):
         }
         for key in tests:
             if tests[key]["status_code"] not in AllowedResponses:
-                error_checks = False
+                # Temp allow 500s from the memory dump operations
+                if key not in ["get_memory_dump", "get_hex_dump", "get_extracted_strings"]:
+                    error_checks = False
 
-                # print(f"{key} operation returned {tests[key]}")
+                    # print(f"{key} operation returned {tests[key]}")
 
         return error_checks
 
diff --git a/tests/test_firewall_management.py b/tests/test_firewall_management.py
index c803e1c11..7fe42c077 100644
--- a/tests/test_firewall_management.py
+++ b/tests/test_firewall_management.py
@@ -64,7 +64,8 @@ def firewall_test_all_code_paths(self):
                                                                       enforce=False,
                                                                       is_default_policy=False,
                                                                       test_mode=True,
-                                                                      rule_group_ids="12345,67890"
+                                                                      rule_group_ids="12345,67890",
+                                                                      local_logging=False
                                                                       ),
             "update_policy_container_v1": falcon.update_policy_container_v1(default_inbound="something",
                                                                             default_outbound="something_else",
diff --git a/tests/test_identity_protection.py b/tests/test_identity_protection.py
index a96f9119e..2ad11d5c4 100644
--- a/tests/test_identity_protection.py
+++ b/tests/test_identity_protection.py
@@ -16,35 +16,40 @@
 config = auth.getConfigObject()
 
 falcon = IdentityProtection(auth_object=config)
-AllowedResponses = [200, 429]  # Adding rate-limiting as an allowed response for now
+AllowedResponses = [200, 429]
 
+TEST_QUERY = """
+query ($after: Cursor) {
+  entities(types: [USER], archived: false, learned: false, first: 5, after: $after) {
+    nodes {
+      primaryDisplayName
+      secondaryDisplayName
+      accounts {
+        ... on ActiveDirectoryAccountDescriptor {
+          domain
+        }
+      }
+    }
+    pageInfo {
+      hasNextPage
+      endCursor
+    }
+  }
+}
+"""
 
 class TestIdentityProtection:
     def idp_graphql(self):
         payload = {"query":"{\n  entities(first: 1)\n  {\n    nodes {\n      entityId    \n    }\n  }\n}"}
-        result = falcon.GraphQL(body=payload)
+        result = falcon.GraphQL(query=TEST_QUERY, variables={"after", ""})
         if not isinstance(result, dict):
             result = json.loads(result.decode())
         else:
             result = result["body"]
-        if "extensions" in result:
-            if result["extensions"]["remainingPoints"] > 0:
-                return True
-            else:
-                pytest.skip("Identity protection API failure")
-                # return False
-        else:
-            # Prolly failed login, check yer API key
-            # return False
-            pytest.skip("Identity protection API failure")
+        if result.get("data", {}).get("entities", {}).get("pageInfo", {}).get("hasNextPage", None):
+            next_page = result["data"].get("entities", {}).get("pageInfo", {}).get("endCursor", None)
+            result = falcon.graphql(query=TEST_QUERY, variables={"after": next_page})["body"]
 
-    def idp_graphql_keywords(self):
-        test_query = "{\n  entities(first: 1)\n  {\n    nodes {\n      entityId    \n    }\n  }\n}"
-        result = falcon.graphql(query=test_query, variables={"after": "whatever"})
-        if not isinstance(result, dict):
-            result = json.loads(result.decode())
-        else:
-            result = result["body"]
         if "extensions" in result:
             if result["extensions"]["remainingPoints"] > 0:
                 return True
@@ -56,14 +61,10 @@ def idp_graphql_keywords(self):
             # return False
             pytest.skip("Identity protection API failure")
 
+
     @pytest.mark.skipif(falcon.base_url.lower() in ["https://api.laggar.gcw.crowdstrike.com","usgov1"],
                         reason="Unit testing unavailable on US-GOV-1"
                         )
     def test_graphql(self):
         assert self.idp_graphql() is True
 
-    @pytest.mark.skipif(falcon.base_url.lower() in ["https://api.laggar.gcw.crowdstrike.com","usgov1"],
-                        reason="Unit testing unavailable on US-GOV-1"
-                        )
-    def test_graphql_keywords(self):
-        assert self.idp_graphql_keywords() is True
diff --git a/tests/test_intel.py b/tests/test_intel.py
index 1603df712..78ed8bb97 100644
--- a/tests/test_intel.py
+++ b/tests/test_intel.py
@@ -52,7 +52,9 @@ def intel_test_all_code_paths(self):
                     if key != "get_mitre_report":
                         error_checks = False
                     # print(key)
-                    # print(tests[key])
+                    # print(tests[key]) 
+
+
             # print(f"{key} operation returned a {tests[key]} status code")
 
         return error_checks
diff --git a/tests/test_ioc.py b/tests/test_ioc.py
index 386b64362..5d24ac626 100644
--- a/tests/test_ioc.py
+++ b/tests/test_ioc.py
@@ -63,7 +63,7 @@ def ioc_run_all_tests(self):
             "entities_processes": falcon.entities_processes(ids=['12345678']),
             "indicator_aggregate": falcon.indicator_aggregate(),
             "action_get": falcon.action_get("123456789"),
-            "GetIndicatorsReport": falcon.get_indicators_report(filter="FQL something", search={"filter": "FQL"}),
+            "GetIndicatorsReport": falcon.get_indicators_report(filter="FQL something", search={"filter": "FQL"}, from_parent=False),
             "action_query": falcon.action_query(),
             "ioc_type_query": falcon.ioc_type_query(),
             "platform_query": falcon.platform_query(),
diff --git a/tests/test_prevention_policy.py b/tests/test_prevention_policy.py
index 4a740adad..086ed5ab1 100644
--- a/tests/test_prevention_policy.py
+++ b/tests/test_prevention_policy.py
@@ -28,7 +28,7 @@ def prev_queryPreventionPolicies(self):
 
     def prev_queryPreventionPolicyMembers(self):
         policies = falcon.queryPreventionPolicies(limit=1)
-        if policies["status_code"] != 500 and "resources" in policies["body"]:
+        if policies["status_code"] not in [500, 429] and "resources" in policies["body"]:
             check = falcon.queryPreventionPolicyMembers(
                     parameters={"id": policies["body"]["resources"][0]}
                     )
@@ -38,7 +38,11 @@ def prev_queryPreventionPolicyMembers(self):
                 pytest.skip("API communication failure")
                 # return False
         else:
-            return True  # Can't hit the API for some reason
+            if policies["status_code"] == 420:
+                pytest.skip("Rate limit met")
+            else:
+                # Can't hit the API for some reason
+                return True
 
     def prev_getPreventionPolicies(self):
         policies = falcon.queryPreventionPolicies(parameters={"limit": 1})
@@ -64,7 +68,7 @@ def prev_queryCombinedPreventionPolicies(self):
 
     def prev_queryCombinedPreventionPolicyMembers(self):
         policies = falcon.queryCombinedPreventionPolicies(parameters={"limit": 1})
-        if policies["status_code"] != 500 and "resources" in policies["body"]:
+        if policies["status_code"] not in [500, 429] and "resources" in policies["body"]:
             if falcon.queryCombinedPreventionPolicyMembers(
                     parameters={"id": policies["body"]["resources"][0]["id"]}
                     )["status_code"] in AllowedResponses:
@@ -72,7 +76,11 @@ def prev_queryCombinedPreventionPolicyMembers(self):
             else:
                 return False
         else:
-            return True  # Can't hit the API
+            # Can't hit the API
+            if policies["status_code"] == 420:
+                pytest.skip("Rate limit met")
+            else:
+                return True
 
     def prev_remaining_paths(self):
         ran_string = ''.join(random.choices(string.ascii_lowercase + string.digits, k=10))
diff --git a/tests/test_recon.py b/tests/test_recon.py
index d83f2d3f4..7687d12c9 100644
--- a/tests/test_recon.py
+++ b/tests/test_recon.py
@@ -27,7 +27,7 @@ def service_recon_run_all_tests(self):
             "preview_rule": falcon.preview_rule(body={}),
             "preview_rule_jr": falcon.preview_rule(filter="something", topic="somethingElse"),
             "get_actions": falcon.get_actions(ids='12345678'),
-            "create_actions": falcon.create_actions(body={}),
+            "create_actions": falcon.create_actions(body={}, recipients="12345,67890", trigger_matchless=False),
             "create_actions_alternatively": falcon.create_actions(frequency="whenevers",
                                                                   recipients=["123456"],
                                                                   type="TheGoodKind"
@@ -45,11 +45,16 @@ def service_recon_run_all_tests(self):
                                                                      assigned_to_uuid="1234567",
                                                                      status="new"
                                                                      ),
-            "update_action": falcon.update_action(body={"id": "1234567"}),
+            "update_action": falcon.update_action(body={"id": "1234567",
+                                                        "frequency": "whatever",
+                                                        "recipients": ["definitely bob"],
+                                                        "status": "OhSoVeryUrgent"
+                                                        }),
             "update_action_as_well": falcon.update_action(id="1234567",
                                                           frequency="often",
                                                           status="new",
-                                                          recipients="123456,654321"
+                                                          recipients="123456,654321",
+                                                          trigger_matchless=False
                                                           ),
             "get_notifications_detailed_translated": falcon.get_notifications_detailed_translated(ids="1234567"),
             "get_notfications_detailed": falcon.get_notifications_detailed(ids="1234567"),
@@ -90,7 +95,8 @@ def service_recon_run_all_tests(self):
                                                      permissions="private",
                                                      priority="moderate",
                                                      name="MelloYellow",
-                                                     topic="whatevers"
+                                                     topic="whatevers",
+                                                     breach_monitoring_enabled=False
                                                      ),
             "query_actions": falcon.query_actions(),
             "query_notifications_exposed": falcon.query_notifications_exposed_data_records(),
diff --git a/tests/test_result_object.py b/tests/test_result_object.py
new file mode 100644
index 000000000..48b0101cc
--- /dev/null
+++ b/tests/test_result_object.py
@@ -0,0 +1,728 @@
+"""
+test_results.py -  This class tests the Results class
+"""
+import os
+import sys
+import pytest
+import hashlib
+# Authentication via the test_authorization.py
+from tests import test_authorization as Authorization
+
+# Import our sibling src folder into the path
+sys.path.append(os.path.abspath('src'))
+# Classes to test - manually imported from sibling folder
+# We'll use Hosts to retrieve data to test results with
+from falconpy import (
+    Hosts,
+    Result,
+    APIError,
+    RegionSelectError,
+    SSLDisabledWarning,
+    BaseDictionary,
+    RawBody,
+    ResponseComponent,
+    BaseResource,
+    Errors,
+    SampleUploads,
+    CSPMRegistration
+    )
+from falconpy._result._base_dictionary import UnsupportedPythonVersion
+
+auth = Authorization.TestAuthorization()
+config = auth.getConfigObject()
+# Force debug logging here so we can test those code paths
+falcon = Hosts(auth_object=config, debug=True, pythonic=True)
+#samples = SampleUploads(auth_object=config, debug=True, pythonic=True)
+AllowedResponses = [200, 202, 429]  # Adding rate-limiting as an allowed response for now
+_OBJECT: Result = None
+_RATE_LIMITED: bool = False
+not_supported = pytest.mark.skipif(
+    sys.version_info.minor <= 7, reason="Experimental functionality unavailable in this version of Python."
+)
+experimental = pytest.mark.xfail
+_DATA = ["This", "is", "a", "test", "of", "the", "list", "functionality"]
+_DICT_DATA = {"Thing1": "Not very helpful",
+              "Thing2": "Extremely unhelpful",
+              "Thing3": "Maliciously unhelpful"
+              }
+_SAMPLES: SampleUploads = None
+
+
+
+class SimpleResource(BaseResource):
+    """Simple resource example"""
+    pass
+
+
+class TestResults:
+    """
+    Results Class test harness
+    """
+
+    @not_supported
+    def test_python_result_object(self):
+        global _OBJECT, _RATE_LIMITED
+        # _OBJECT = Result(full=falcon.query_devices_by_filter(limit=50))
+        try:
+            _OBJECT = falcon.query_devices_by_filter(limit=50)
+        except APIError as api_error:
+            if api_error.code == 429:
+                _RATE_LIMITED = True
+                pytest.skip("Rate limited")
+        assert bool(_OBJECT.total)
+
+
+    @not_supported
+    def test_property_offset(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.offset)
+
+
+    @not_supported
+    def test_property_limit(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.limit)
+
+
+    @not_supported
+    def test_property_query_time(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.query_time)
+
+
+    @not_supported
+    def test_property_powered_by(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.powered_by)
+
+
+    @not_supported
+    def test_property_trace_id(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.trace_id)
+
+
+    @not_supported
+    def test_property_content_encoding(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.content_encoding)
+
+
+    @not_supported
+    def test_property_content_length(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.content_length)
+
+
+    @not_supported
+    def test_property_content_type(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.content_type)
+
+
+    @not_supported
+    def test_property_date(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.date)
+
+
+    @not_supported
+    def test_property_region(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.region)
+
+
+    @not_supported
+    def test_property_ratelimit_limit(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.ratelimit_limit)
+
+
+    @not_supported
+    def test_property_ratelimit_remaining(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.ratelimit_remaining)
+
+
+    @not_supported
+    def test_property_based_result_expansion(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.tupled)
+
+
+    @not_supported
+    def test_property_data(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.data)
+
+
+    @not_supported
+    def test_property_full_return(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.full_return)
+
+
+    @not_supported
+    def test_property_status_code(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.status_code)
+
+
+    @not_supported
+    def test_property_meta_object(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(not _OBJECT.meta_object)
+
+
+    @not_supported
+    def test_property_headers_object(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(not _OBJECT.headers_object)
+    
+
+    @not_supported
+    def test_property_meta_binary(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(not _OBJECT.meta.binary)
+    
+
+    @not_supported
+    def test_property_meta_data(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.meta.data)
+    
+
+    @not_supported
+    def test_property_meta_expires_at(self):
+        # QueryDevicesByFilter doesn't return `expires_at`
+        # _temp = Result(full=falcon.query_devices_by_filter_scroll(limit=50))
+        global _RATE_LIMITED
+        try:
+            _temp = falcon.query_devices_by_filter_scroll(limit=50)
+        except APIError as api_error:
+            if api_error.code == 429:
+                _RATE_LIMITED = True
+                pytest.skip("Rate limited")
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")                
+        assert bool(_temp.meta.expires_at)
+    
+
+    @not_supported
+    def test_property_meta_limit(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.meta.limit)
+    
+
+    @not_supported
+    def test_property_meta_offset(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.meta.offset)
+    
+    
+    @not_supported
+    # def test_property_meta_limit(self):
+    #     assert bool(_OBJECT.meta.limit)
+    
+
+    @not_supported
+    def test_property_meta_pagination(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.meta.pagination)
+    
+
+    @not_supported
+    def test_property_meta_query_time(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.meta.query_time)
+    
+
+    @not_supported
+    def test_property_meta_powered_by(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.meta.powered_by)
+    
+
+    @not_supported
+    def test_property_meta_trace_id(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.meta.trace_id)
+
+
+    @not_supported
+    def test_property_debug_mode(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(falcon.debug)
+
+
+    @not_supported
+    def test_property_headers_content_encoding(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.headers.content_encoding)
+
+
+    @not_supported
+    def test_property_headers_content_length(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.headers.content_length)
+
+
+    @not_supported
+    def test_property_headers_content_type(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.headers.content_type)
+
+
+    @not_supported
+    def test_property_headers_date(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.headers.date)
+
+
+    @not_supported
+    def test_property_headers_region(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.headers.region)
+
+
+    @not_supported
+    def test_property_headers_ratelimit_limit(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.headers.ratelimit_limit)
+
+
+    @not_supported
+    def test_property_headers_ratelimit_remaining(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.headers.ratelimit_remaining)
+
+
+    @not_supported
+    def test_property_body(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.body)
+
+
+    @not_supported
+    def test_property_length(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(len(_OBJECT))
+
+
+    @not_supported
+    def test_contains_search(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        search_for = _OBJECT.data[0]
+ 
+        assert bool(search_for in _OBJECT)
+
+
+    @not_supported
+    def test_object_repr(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(str(_OBJECT))
+
+
+    @not_supported
+    def test_prune(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        search_for = _OBJECT.data[0]
+
+        assert(bool(len(_OBJECT.prune(search_for)) == 1))
+
+
+    @not_supported
+    def test_deprecated_result_expansion(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        resp = _OBJECT.tupled
+        assert bool(isinstance(resp, tuple))
+        # resp = _OBJECT.full_return
+        # assert bool(ExpandedResult()(resp.get("status_code"),
+        #                              resp.get("headers"),
+        #                              resp
+        #                              ))
+
+
+    @not_supported
+    def test_forward_iteration(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        _success = False
+        _count = 0
+        for _ in _OBJECT:
+            if _:
+                _success = True
+                break
+            _count += 1
+        assert bool(_success)
+
+
+    @not_supported
+    def test_reverse_iteration(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        _success = False
+        _count = 0
+        for _ in reversed(_OBJECT):
+            if _:
+                _success = True
+                break
+            _count += 1
+
+
+
+        assert bool(_success)
+
+
+
+    @not_supported
+    def test_bad_component_property(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        assert bool(not _OBJECT.headers.get_property("a_new_car"))
+
+
+    @not_supported
+    def test_component_repr(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(str(_OBJECT.headers))
+
+
+
+    @not_supported
+    def test_component_data(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")        
+        assert bool(_OBJECT.headers.data)
+
+
+    @not_supported
+    def test_object_next(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        _success = False
+        _success2 = False
+        _success3 = False
+        global _OBJECT
+        try:
+            while True:
+                next(_OBJECT)
+        except StopIteration:
+            _success = True
+        _success2 = bool(_OBJECT[0])
+        # try to iterate an empty list
+        _OBJECT = Result(full=falcon.query_devices(filter="hostname:'ThisWontMatch'"))
+        try:
+            while True:
+                print(f"|{next(_OBJECT)}|")
+        except StopIteration:
+            _success3 = True
+
+        assert bool((_success and _success2 and _success3))
+
+    @not_supported
+    def test_error_simple_response(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        try:
+            raise RegionSelectError(code=418,
+                                    message="Don't worry, this is only a test.",
+                                    headers={"CrowdStrike": "WE STOP BREACHES"})
+        except RegionSelectError as oopsies:
+            assert bool((oopsies and oopsies.simple))
+
+
+    @not_supported
+    def test_warning_simple_response(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        try:
+            raise SSLDisabledWarning(code=418,
+                                     message="SSL verification isn't really turned off. I mean... unless you did it?",
+                                     headers={"CrowdStrike": "WE STOP BREACHES"})
+        except SSLDisabledWarning as kerblammo:
+            assert bool((kerblammo and kerblammo.simple))
+
+    @not_supported
+    def test_base_resource_iteration(self):
+        count = 0
+        for word in SimpleResource(data=_DATA):
+            if count >= 2 and word == _DATA[count]:
+                break
+            count += 1
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")            
+        assert bool(count)
+
+    @not_supported
+    def test_base_resource_reverse_iteration(self):
+        count = len(_DATA) - 1
+        _success = False
+        for word in reversed(SimpleResource(data=_DATA)):
+            if count <= 1 and word == _DATA[count]:
+                _success = True
+                break
+            count -= 1
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")            
+        assert (_success)
+
+    @not_supported
+    def test_base_resource_next(self):
+        _resource = SimpleResource(data=_DATA)
+        listlen = len(_resource)
+        endmark = 2 if listlen >= 2 else listlen
+        _success = False
+        for count in range(0, endmark):
+            _success = bool(next(_resource))
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")            
+        assert bool((_success and count))
+
+    @not_supported
+    def test_base_resource_next_stop_empty(self):
+        _success = False
+        try:
+            _success = bool(next(SimpleResource(data=[])))
+        except StopIteration:
+            _success = True
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")            
+        assert bool(_success)
+
+    @not_supported
+    def test_base_resource_next_stop(self):
+        _success = False
+        try:
+            _resource = SimpleResource(data=["Just One Thing"])
+            for _ in range(0, 2):
+                _success = bool(next(_resource))
+        except StopIteration:
+            _success = True
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")            
+        assert bool(_success)
+
+    @not_supported
+    def test_base_dictionary_iteration(self):
+        _dictionary = BaseDictionary(data=_DICT_DATA)
+        count = 0
+        for _ in _dictionary:
+            if count == 2:
+                break
+            count += 1
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")            
+        assert bool(count)
+
+    @not_supported
+    def test_base_dictionary_reverse_iteration(self):
+        _success = False
+        try:
+            _dictionary = BaseDictionary(data=_DICT_DATA)
+            count = len(_dictionary) -1
+            for _ in reversed(_dictionary):
+                if count == 3:
+                    break
+                count -= 1
+            _success = bool(count and _dictionary["Thing1"])
+        except UnsupportedPythonVersion:
+            _success = True
+
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        assert bool(_success)
+
+    @not_supported
+    def test_base_dictionary_item_iteration(self):
+        _dictionary = BaseDictionary(data=_DICT_DATA)
+        count = 1
+        _success = False
+        for item, value in _dictionary.items():
+            if count == 3:
+                break
+            if item and value is _DICT_DATA[item]:
+                if item == f"Thing{count}":
+                    _success = True
+            count += 1
+
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        assert bool((_success and _dictionary.data))
+
+    @not_supported
+    def test_base_dictionary_next(self):
+        _dictionary = BaseDictionary(data=_DICT_DATA)
+        listlen = len(_dictionary)
+        endmark = 2 if listlen >= 2 else listlen
+        _success = False
+        for count in range(0, endmark):
+            _success = bool(next(_dictionary))
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")            
+        assert bool((_success and count))
+
+    @not_supported
+    def test_base_dictionary_next_stop(self):
+        _success = False
+        _dictionary = BaseDictionary(data={})
+        try:
+            _success = bool(next(_dictionary))
+        except StopIteration:
+            _success = True
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")            
+        assert bool(_success)
+
+    @not_supported
+    def test_raw_body_next(self):
+        _dictionary = RawBody(data=_DICT_DATA)
+        listlen = len(_dictionary)
+        endmark = 2 if listlen >= 2 else listlen
+        _success = False
+        for count in range(0, endmark):
+            _success = bool(next(_dictionary))
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")            
+        assert bool((_success and count and _dictionary["Thing1"]))
+
+    @not_supported
+    def test_raw_body_reverse_iteration(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        _success = False
+        try:
+            _dictionary = RawBody(data=_DICT_DATA)
+            count = len(_dictionary) -1
+            for _ in reversed(_dictionary):
+                if count == 3:
+                    break
+                count -= 1
+            _success = bool(count and _dictionary["Thing2"])
+        except UnsupportedPythonVersion:
+            _success = True
+
+        assert bool(_success)
+    
+    @not_supported
+    def test_response_component_data(self):
+        thing = ResponseComponent(data=_DATA)
+        assert thing.data
+
+    @not_supported
+    def test_errors_fallback(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        thing = Errors(data=_DATA)
+
+        assert bool(thing.data)
+
+    @not_supported
+    def test_init_variations(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        _headers ={"X-Something-Something-Something": "Darkside"}
+        _access_body = {"access_token": "OneSingularIndividualGoldenTicket"}
+        result1 = Result(status_code=204, headers=_headers, body="  ")
+        result2 = Result(status_code=204, headers=_headers, body=_access_body)
+
+        assert bool((result1.full_return and result2.full_return))
+
+
+    @not_supported
+    def test_retrieve_and_confirm_binary(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        global _SAMPLES
+        _SAMPLES = SampleUploads(auth_object=config, pythonic=True, debug=True)
+
+        hash1 = hashlib.sha256()
+        with open("tests/testfile.png", 'rb') as file_to_hash:
+            while True:
+                data = file_to_hash.read(65536)
+                if not data:
+                    break
+                hash1.update(data)
+        hash1 = hash1.hexdigest()
+        # download_parts = _SAMPLES.get_sample(hash1, expand_result=True)
+        # result: Result = Result(status_code=download_parts[0],
+        #                         headers=download_parts[1],
+        #                         body=download_parts[2]
+        #                         )
+        #print(_SAMPLES.get_sample(hash1))
+        try:
+            result: Result = _SAMPLES.get_sample(hash1)
+        except APIError as not_found:
+            pytest.skip(not_found.message)
+        #print(result)
+
+        assert bool((result.full_return and result.binary))
+
+
+    @not_supported
+    def test_pythonic_error(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        _success = False
+        try:
+            _SAMPLES.get_sample("ThisIDDoesNotExit")
+        except APIError:
+            _success = True
+
+        assert bool(_success)
+
+    @not_supported
+    def test_batch_init_id_without_a_session(self):
+        if _RATE_LIMITED:
+            pytest.skip("Rate limited")
+        test_object: Result = Result(status_code=200, headers={"someheader": "somevalue"}, body={"batch_id": "123456"})
+        assert bool(test_object.full_return.get("body", {}).get("batch_id")=="123456")
+
+    def test_unusual_response_formatting(self):
+        _returned = False
+        cspm = CSPMRegistration(auth_object=config)
+        result = cspm.get_configuration_detections(limit=1)["body"]["resources"]
+        if isinstance(result, dict):
+            _returned = True
+        assert _returned
diff --git a/tests/test_sample_uploads.py b/tests/test_sample_uploads.py
index 0312b1c6b..04192cf77 100644
--- a/tests/test_sample_uploads.py
+++ b/tests/test_sample_uploads.py
@@ -42,7 +42,7 @@ def sample_upload_download_delete(self, style: str = "file_data", expanded_resul
             response = falcon.UploadSampleV3(file_name=SOURCE, file_data=PAYLOAD)
         try:
             sha = response["body"]["resources"][0]["sha256"]
-        except KeyError:
+        except (KeyError, IndexError):
             sha = None
         if sha:
             response = falcon.GetSampleV3(ids=sha, expand_result=expanded_result)
diff --git a/tests/test_sensor_update_policy.py b/tests/test_sensor_update_policy.py
index b8ffeed75..ed8f892e3 100644
--- a/tests/test_sensor_update_policy.py
+++ b/tests/test_sensor_update_policy.py
@@ -129,7 +129,10 @@ def serviceSensorUpdate_GenerateErrors(self):
                                                             name="Unit test",
                                                             platform_name="Windowz",
                                                             build="1309",
-                                                            uninstall_protection="DISABLED"
+                                                            uninstall_protection="DISABLED",
+                                                            scheduler={"enabled": False},
+                                                            show_early_adopter_builds=True,
+                                                            variants=[{"build": "1309", "platform": "Windows"}]
                                                             ),
             "perform_action": falcon.perform_policies_action(action_name="disable",
                                                              ids="12345678",
diff --git a/tests/test_service_class.py b/tests/test_service_class.py
new file mode 100644
index 000000000..c360444b1
--- /dev/null
+++ b/tests/test_service_class.py
@@ -0,0 +1,378 @@
+"""
+test_results.py -  This class tests Service Class functionality
+"""
+import os
+import sys
+import pytest
+from json import loads
+from time import time
+import logging
+from random import randrange
+# Authentication via the test_authorization.py
+from tests import test_authorization as Authorization
+
+# Import our sibling src folder into the path
+sys.path.append(os.path.abspath('src'))
+# Classes to test - manually imported from sibling folder
+from falconpy import (
+    Hosts,
+    OAuth2,
+    BaseServiceClass,
+    FunctionalityNotImplemented,
+    SSLDisabledWarning,
+    APIError,
+    NoAuthenticationMechanism,
+    Result,
+    ExpandedResult,
+    InvalidBaseURL
+    )
+
+auth = Authorization.TestAuthorization()
+config = auth.getConfigObject()
+AllowedResponses = [200, 202, 401, 429]  # Adding rate-limiting as an allowed response for now
+_OBJECT: OAuth2 = None
+_CLEAN: Hosts = None
+_HOSTS: Hosts = None
+_DEBUG = os.getenv("FALCONPY_UNIT_TEST_DEBUG", None)
+if _DEBUG:
+    _DEBUG = True
+_RATE_LIMITED: bool = False
+rate_limited = pytest.mark.skipif(
+    _RATE_LIMITED, reason="Rate limit met, skipping"
+)
+not_supported = pytest.mark.skipif(
+    sys.version_info.minor <= 7, reason="Experimental functionality unavailable in this version of Python."
+)
+class SimpleServiceClass(BaseServiceClass):
+    """I'm just here to test extensibility."""
+
+    def init(self, access_token, proxy, timeout, renew_window, user_agent):
+        super().__init__(access_token=access_token,
+                         proxy=proxy,
+                         timeout=timeout,
+                         renew_window=renew_window,
+                         user_agent=user_agent,
+                         debug=_DEBUG
+                         )
+
+    def login(self):
+        raise FunctionalityNotImplemented(message="I would say something funny here")
+
+    def logout(self):
+        raise FunctionalityNotImplemented(message="but unfortunately that's not yet implemented.")
+
+
+class ExtremelyThinServiceClass(BaseServiceClass):
+    """I'm just here to test extensibility."""
+
+    def init(self, client_id, client_secret, proxy, timeout, renew_window, user_agent):
+        super().__init__(client_id=client_id,
+                         client_secret=client_secret,
+                         proxy=proxy,
+                         timeout=timeout,
+                         renew_window=renew_window,
+                         user_agent=user_agent,
+                         debug=_DEBUG
+                         )
+
+    def login(self):
+        raise FunctionalityNotImplemented(message="I would say something funny here")
+
+    def logout(self):
+        raise FunctionalityNotImplemented(message="but unfortunately that's not yet implemented.")
+
+
+class TestServiceClass:
+    """Service Class test harness."""
+
+    @rate_limited
+    @not_supported
+    def test_log_setup(self):
+        global _OBJECT
+        # Create an auth object with debug enabled
+        _OBJECT = OAuth2(creds=config.creds, debug=True)
+        if _OBJECT.token_status == 429:
+            global _RATE_LIMITED  # Don't think this will actually get hit
+            _RATE_LIMITED = True
+        # Force it off in a regular Service Class
+        debug_off = Hosts(auth=_OBJECT, debug=False)
+        # Force it back on with another Service Class (and disable sanitization)
+        debug_back_on = Hosts(auth=debug_off.auth_object, debug=True, debug_record_count=42, sanitize_log=False)
+        # Change the debug record count while we're here
+        debug_back_on.debug_record_count = 1
+        debug_off.sanitize_log = True
+        debug_back_on.sanitize_log = True
+        assert bool(debug_back_on.debug
+                    and debug_back_on.debug_record_count == 1
+                    and not debug_off.debug
+                    and debug_back_on.log  # Confirm the property
+                    and _OBJECT.sanitize_log
+                    and debug_back_on.sanitize_log
+                    )
+
+    @rate_limited
+    @not_supported
+    def test_property_debug_record_count(self):
+        global _CLEAN
+        _CLEAN = Hosts(creds=config.creds, user_agent="clean/1.0", timeout=120, proxy={})
+        if _CLEAN.token_status == 429:
+            global _RATE_LIMITED
+            _RATE_LIMITED = True
+
+        assert bool(_CLEAN.debug_record_count)
+
+    @rate_limited
+    @not_supported
+    def test_property_refreshable(self):
+        assert bool(_CLEAN.refreshable)
+
+    @rate_limited
+    @not_supported
+    def test_property_token_fail_reason(self):
+        _CLEAN.login()
+        assert bool(not _CLEAN.token_fail_reason or "Region autodiscovery failure" in _CLEAN.token_fail_reason)
+
+    @rate_limited
+    @not_supported
+    def test_property_token_status(self):
+        assert bool(_CLEAN.token_status)
+
+    @rate_limited
+    @not_supported
+    def test_property_headers(self):
+        assert bool(_CLEAN.headers)
+
+    @rate_limited
+    @not_supported
+    def test_property_user_agent(self):
+        assert bool(_CLEAN.user_agent)
+
+    @rate_limited
+    @not_supported
+    def test_property_user_agent_setter(self):
+        _CLEAN.user_agent = "XYZZY"
+        assert bool(_CLEAN.user_agent == "XYZZY")
+
+    @rate_limited
+    @not_supported
+    def test_property_renew_window(self):
+        assert bool(_CLEAN.renew_window)
+
+    @rate_limited
+    @not_supported
+    def test_property_renew_window_setter(self):
+        _CLEAN.renew_window = 1137
+        assert bool(_CLEAN.renew_window == 1137)
+
+    @rate_limited
+    @not_supported
+    def test_property_timeout(self):
+        assert bool(_CLEAN.timeout)
+
+    @rate_limited
+    @not_supported
+    def test_property_timeout_setter(self):
+        _CLEAN.timeout = (42,378)
+        assert bool(_CLEAN.timeout[0] == 42 and _CLEAN.timeout[1] == 378)
+
+    @rate_limited
+    @not_supported
+    def test_property_proxy(self):
+        assert bool(not _CLEAN.proxy)
+
+    @rate_limited
+    @not_supported
+    def test_property_proxy_setter(self):
+        _CLEAN.proxy = {"https": "https://we-stop-breaches:8000"}
+        _returned = bool(_CLEAN.proxy["https"] == "https://we-stop-breaches:8000")
+        assert bool(_returned)
+
+    @rate_limited
+    @not_supported
+    def test_disable_ssl_verify_dynamic(self):
+        _CLEAN.ssl_verify = False
+        assert bool(not _CLEAN.ssl_verify)
+
+    @rate_limited
+    @not_supported
+    def test_property_base_service_class_proxy(self):
+        _OBJECT.login()
+        _SIMPLE: SimpleServiceClass = SimpleServiceClass(
+            access_token=_OBJECT.token_value,
+            proxy={"CrowdStrike": "WE STOP BREACHES"},
+            timeout=(42,99),
+            renew_window=777,
+            user_agent="crowdstrike-falconpy-base-testing/1.2.3",
+            debug_record_count=43,
+            debug=_DEBUG
+            )
+        _success = False
+        try:
+            _SIMPLE.user_agent = "this-is-different/3.0"
+            _SIMPLE.proxy = {"CrowdStrike" : "STILL STOPPING BREACHES"}
+            _SIMPLE.renew_window = 1234
+            _SIMPLE.debug_record_count = 42
+            _SIMPLE.timeout = (100, 101)
+
+        except FunctionalityNotImplemented:
+            # Should crash because we're inheriting the base
+            # he doesn't implement a setter for proxy or user_agent
+            _success = True
+
+        assert bool(_success)
+        #assert _success
+            
+    @rate_limited
+    @not_supported
+    def test_auth_object_direct_change(self):
+        _right_error = False
+        _DIRECT: ExtremelyThinServiceClass = ExtremelyThinServiceClass(
+            client_id=os.getenv("DEBUG_API_ID"),
+            client_secret=os.getenv("DEBUG_API_SECRET"),
+            proxy={"CrowdStrike": "WE STOP BREACHES WITH PYTHON"},
+            timeout=1137,
+            renew_window=333,
+            user_agent="crowdstrike-testing/5.4.2",
+            debug=_DEBUG
+            )
+        try:
+            _DIRECT.proxy = {"CrowdStrike": "WE STOP BREACHES"}
+        except FunctionalityNotImplemented:
+            _right_error = True
+        assert bool(_DIRECT.headers
+                    and _DIRECT.timeout
+                    and _DIRECT.renew_window
+                    and _DIRECT.user_agent
+                    and "WITH PYTHON" in _DIRECT.proxy["CrowdStrike"]
+                    and _right_error
+                     )
+
+    @rate_limited
+    @not_supported
+    def test_auth_object_pythonic_failure(self):
+        # Disable any environment keys that could trigger environment authentication
+        save_id = os.getenv("FALCON_CLIENT_ID")
+        save_key = os.getenv("FALCON_CLIENT_SECRET")
+        if save_id or save_key:
+            os.environ["FALCON_CLIENT_ID"] = ""
+            os.environ["FALCON_CLIENT_SECRET"] = ""
+
+        with pytest.warns(NoAuthenticationMechanism):
+            _will_fail = OAuth2(debug=_DEBUG, pythonic=True)
+            _will_fail.proxy = {"CrowdStrike": "WE STOP BREACHES"}
+            _will_fail.timeout = (18, 42)
+            _will_fail.user_agent = "crowdstrike-testing/1.2.3"
+            _will_fail.debug_record_count = 142
+            _will_fail.sanitize_log = True
+            _will_fail.token_time = time()
+            _will_fail.token_fail_reason = "Just Because"
+            _will_fail.token_value = "no cash value"
+            _will_fail.pythonic = True
+
+        if save_id or save_key:
+            os.environ["FALCON_CLIENT_ID"] = save_id
+            os.environ["FALCON_CLIENT_SECRET"] = save_key
+
+
+        assert (_will_fail.config
+                and _will_fail.proxy["CrowdStrike"] == "WE STOP BREACHES"
+                and _will_fail.timeout[1] == 42
+                and "crowdstrike" in _will_fail.user_agent
+                and _will_fail.debug_record_count == 142
+                and _will_fail.sanitize_log
+                )
+
+    @rate_limited
+    @not_supported
+    def test_auth_object_invalid_config(self):
+        _success = False
+        _thing = OAuth2(creds=config.creds, debug=_DEBUG)
+        try:
+            _thing.config = {"This really should": "not work"}
+        except ValueError:
+            if _thing.log:
+                _thing.log.error("Invalid value specified for Interface Configuration")
+            _success = True
+
+        assert _success
+
+    @rate_limited
+    @not_supported
+    def test_log_facility_shutdown(self):
+        _thing = OAuth2(creds=config.creds, debug=True)
+        if _thing.log_facility.active:
+            _thing.log_facility.deactivate_log()
+
+        assert not _thing.log
+
+    @rate_limited
+    @not_supported
+    def test_truly_ridiculous_base_url(self):
+        _exploding_banana: logging.Logger = logging.getLogger(__name__)
+        try:
+            _ = OAuth2(creds=config.creds, debug=_DEBUG, base_url=_exploding_banana)
+        except InvalidBaseURL as bad_base:
+            _OBJECT.log.error(bad_base.message)
+            _success = True
+
+        assert _success
+
+    @rate_limited
+    @not_supported
+    def test_legacy_result_expansion(self):
+        global _HOSTS
+        _HOSTS = Hosts(creds=config.creds, debug=_DEBUG)
+        _result = _HOSTS.query_devices(limit=1)
+        _expanded_result = ExpandedResult()(status_code=_result["status_code"],
+                                            headers=_result["headers"],
+                                            content={"body": _result["body"]}
+                                            )
+
+        assert bool(_expanded_result[0] in AllowedResponses and _expanded_result[1])
+
+    @rate_limited
+    @not_supported
+    def test_raw_result_repr(self):
+        _raw_face = {"access_token": {"CrowdStrike": "WE STOP BREACHES"}}
+        _raw_result = Result(status_code=200, headers={"Random": "HeaderThing"}, body=_raw_face)
+        # Force it thru the repr method
+        assert loads(str(_raw_result).replace("'", '"'))["body"]["access_token"]["CrowdStrike"] == "WE STOP BREACHES"
+
+    @rate_limited
+    @not_supported
+    def test_list_response_component_get_property(self):
+        with pytest.warns(SSLDisabledWarning):
+            _no_ssl = Hosts(creds=config.creds, pythonic=True, debug=_DEBUG, ssl_verify=False)
+            try:
+                _thing: Result = _no_ssl.query_devices(limit=3)
+            except APIError:
+                pytest.skip("SSL required for GovCloud testing.")
+            # Check log sanitization code path
+            _HOSTS.sanitize_log = False
+            _HOSTS.query_devices(limit=1)
+            _HOSTS.sanitize_log = True
+            # Revoke the dirty token
+            _HOSTS.logout()
+
+        position = randrange(0, len(_thing.resources), 1)
+        assert bool(_thing.resources.get_property(position) == _thing.resources[position])
+
+
+    @rate_limited
+    @not_supported
+    def test_list_response_component_get_property_fail(self):
+        with pytest.warns(SSLDisabledWarning):
+            _no_ssl = Hosts(creds=config.creds, pythonic=True, debug=_DEBUG, ssl_verify=False)
+            try:
+                _thing: Result = _no_ssl.query_devices(limit=3)
+            except APIError:
+                pytest.skip("SSL required for GovCloud testing.")
+
+        position = 5
+        _success = False
+        try:
+            _success = bool(_thing.resources.get_property(position))
+        except IndexError:
+            _success = True
+
+        assert(_success)
diff --git a/tests/test_uber_api_complete.py b/tests/test_uber_api_complete.py
index ffcaf5fa7..420c6dc64 100644
--- a/tests/test_uber_api_complete.py
+++ b/tests/test_uber_api_complete.py
@@ -17,8 +17,10 @@
 from falconpy._util import perform_request, force_default
 
 
-AllowedResponses = [200, 400, 401, 404, 405, 415, 418, 429]
-
+AllowedResponses = [200, 400, 401, 403, 404, 405, 415, 418, 429]
+_DEBUG = os.getenv("FALCONPY_UNIT_TEST_DEBUG", None)
+if _DEBUG:
+    _DEBUG = True
 if "DEBUG_API_ID" in os.environ and "DEBUG_API_SECRET" in os.environ:
     config = {}
     config["falcon_client_id"] = os.getenv("DEBUG_API_ID")
@@ -38,7 +40,7 @@
 falcon = APIHarness(
     client_id=config["falcon_client_id"],
     client_secret=config["falcon_client_secret"],
-    base_url=config["falcon_base_url"]
+    base_url=config["falcon_base_url"], debug=_DEBUG
     )
 
 
@@ -174,11 +176,12 @@ def uberCCAWS_TestMSSP(self):
             pytest.skip("Rate limit hit")
         falcon.creds["member_cid"] = "1234567890ABCDEFG"
         if not falcon.authenticate():
-            falcon.creds.pop("member_cid")
-            return True
+            returned = True
         else:
-            falcon.creds.pop("member_cid")
-            return False
+            returned = False
+        falcon.creds.pop("member_cid")
+
+        return returned
 
     def uberCCAWS_BadMethod(self):
         if falcon.command(action="", override="BANANA,/cloud-connect-aws/combined/accounts/v1",
@@ -211,7 +214,7 @@ def uberCCHosts_GenerateActionNameError(self, params: dict = None):
             return False
 
     def uberCCAWS_GenerateInvalidOperationIDError(self):
-        if perform_request(method="FETCH", endpoint="/somewhere/interesting")["status_code"] in AllowedResponses:
+        if perform_request(method="FETCH", endpoint="/somewhere/interesting", debug=_DEBUG, log_util=falcon.log)["status_code"] in AllowedResponses:
             return True
         else:
             return False
@@ -224,14 +227,15 @@ def uberCCAWS_GenerateTokenError(self):
         hold_id = falcon.creds["client_id"]
         falcon.creds["client_id"] = "Gonna Crash"
         if not falcon.deauthenticate():
-            falcon.creds["client_id"] = hold_id
-            return True
+            returned = True
         else:
-            falcon.creds["client_id"] = hold_id
-            return False
+            returned = False
+        falcon.creds["client_id"] = hold_id
+
+        return returned
 
     def uberCCAWS_BadAuthentication(self):
-        falcon = APIHarness()
+        falcon = APIHarness(debug=_DEBUG)
         if falcon.command("QueryAWSAccounts", parameters={"limit": 1})["status_code"] in AllowedResponses:
             return True
         else:
@@ -242,7 +246,7 @@ def uberCCAWS_DisableSSLVerify(self):
             creds={
                 "client_id": config["falcon_client_id"],
                 "client_secret": config["falcon_client_secret"]
-            }, ssl_verify=False, base_url=config["falcon_base_url"]
+            }, ssl_verify=False, base_url=config["falcon_base_url"], debug=_DEBUG
         )
         if falcon.command("QueryAWSAccounts", parameters={"limit": 1})["status_code"] in AllowedResponses:
             return True
@@ -334,3 +338,34 @@ def test_BadAuthentication(self):
     @pytest.mark.filterwarnings("ignore:Unverified HTTPS request is being made.*")
     def test_DisableSSLVerify(self):
         assert self.uberCCAWS_DisableSSLVerify() is True
+
+    def test_uber_deprecated_methods(self):
+        assert bool(falcon.valid_cred_format()
+                    and falcon.headers()
+                    and falcon.token
+                    )
+
+    def test_uber_deprecated_attributes(self):
+        _success = False
+        falcon.token_renew_window = 180
+        if falcon.token_renew_window == 180:
+            _success = True
+        assert _success
+
+    def test_uber_properties(self):
+        # Force a new object so we can flip the debug flag
+        temp_falcon = APIHarness(client_id=config["falcon_client_id"],
+                                 client_secret=config["falcon_client_secret"],
+                                 base_url=config["falcon_base_url"],
+                                 debug=True
+                                 )
+
+        assert bool(temp_falcon.debug)
+
+    def test_uber_revoke_failure(self):
+        assert bool(falcon.command("oauth2RevokeToken")["status_code"] == 400)
+
+    def test_uber_revoke_success(self):
+        assert(bool(
+            falcon.command("oauth2RevokeToken", token_value=falcon.token_value)["status_code"]==200
+            ))
diff --git a/util/run-tests.sh b/util/run-tests.sh
index 560025372..bd0a64f58 100755
--- a/util/run-tests.sh
+++ b/util/run-tests.sh
@@ -9,6 +9,11 @@ then
     DO_MANUAL=""
   fi
 fi
-coverage run --rcfile=util/coverage.config -m pytest -s -v $DO_MANUAL
+DO_DEBUG=""
+if [[ ("$FALCONPY_UNIT_TEST_DEBUG" != "" && $(echo $FALCONPY_UNIT_TEST_DEBUG | tr [:lower:] [:upper:]) != "DISABLED") ]]
+then
+  DO_DEBUG="--log-cli-level $FALCONPY_UNIT_TEST_DEBUG"
+fi
+coverage run --rcfile=util/coverage.config -m pytest -s -v $DO_MANUAL $DO_DEBUG
 coverage report
 bandit -r src
diff --git a/util/unit-test.sh b/util/unit-test.sh
index 31fe3e20b..5826e926d 100755
--- a/util/unit-test.sh
+++ b/util/unit-test.sh
@@ -16,7 +16,13 @@ then
     	TARGET="tests/test_$1.py"	
     fi
 fi
+DO_DEBUG=""
+if [[ ("$FALCONPY_UNIT_TEST_DEBUG" != "" && $(echo $FALCONPY_UNIT_TEST_DEBUG | tr [:lower:] [:upper:]) != "DISABLED") ]]
+then
+  DO_DEBUG="--log-cli-level $FALCONPY_UNIT_TEST_DEBUG"
+fi
+
 
-coverage run --rcfile=util/coverage.config -m pytest -s -v $TARGET
+coverage run --rcfile=util/coverage.config -m pytest -s -v $TARGET $DO_DEBUG
 coverage report
 # pytest -s -v $TARGET