diff --git a/src/pyjen/jenkins.py b/src/pyjen/jenkins.py
index 0f46fa8..cbbf69d 100644
--- a/src/pyjen/jenkins.py
+++ b/src/pyjen/jenkins.py
@@ -164,6 +164,20 @@ class Jenkins(object):
 
         return retval
 
+    @property
+    def jobs(self):
+        """Gets all jobs managed by this Jenkins instance
+
+        :rtype:  :class:`list` of :class:`~.job.Job` objects
+        """
+        data = self._api.get_api_data(query_params="depth=2")
+
+        retval = list()
+        for j in data['jobs']:
+            retval.append(Job.instantiate(j, self._api))
+
+        return retval
+
     def prepare_shutdown(self):
         """Starts a "quiet down" and prevents new builds from executing
 
diff --git a/src/pyjen/plugins/multibranch_pipeline.py b/src/pyjen/plugins/multibranch_pipeline.py
new file mode 100644
index 0000000..28f565f
--- /dev/null
+++ b/src/pyjen/plugins/multibranch_pipeline.py
@@ -0,0 +1,78 @@
+"""Primitives that manage Jenkins job of type 'multibranch pipeline'"""
+from pyjen.job import Job
+
+
+class MultibranchPipelineJob(Job):
+    """Jenkins job of type 'multibranch pipeline'"""
+
+    @property
+    def jobs(self):
+        """Gets all branch jobs managed by this multibranch pipeline
+
+        :rtype: :class:`list` of :class:`pyjen.plugins.pipelinejob.PipelineJob`
+        """
+        data = self._api.get_api_data(query_params="depth=2")
+
+        retval = list()
+        for j in data["jobs"]:
+            retval.append(Job.instantiate(j, self._api))
+
+        return retval
+
+    # --------------------------------------------------------------- PLUGIN API
+    @staticmethod
+    def get_jenkins_plugin_name():
+        """Gets the name of the Jenkins plugin associated with this PyJen plugin
+
+        This static method is used by the PyJen plugin API to associate this
+        class with a specific Jenkins plugin, as it is encoded in the config.xml
+
+        :rtype: :class:`str`
+        """
+        return "org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject"
+
+    @staticmethod
+    def template_config_xml():
+        return """<org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject plugin="workflow-multibranch@2.21">
+    <actions/>
+    <description/>
+    <properties>
+        <org.jenkinsci.plugins.pipeline.modeldefinition.config.FolderConfig plugin="pipeline-model-definition@1.3.8">
+            <dockerLabel/>
+            <registry plugin="docker-commons@1.14"/>
+        </org.jenkinsci.plugins.pipeline.modeldefinition.config.FolderConfig>
+    </properties>
+    <folderViews class="jenkins.branch.MultiBranchProjectViewHolder" plugin="branch-api@2.4.0">
+        <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/>
+    </folderViews>
+    <healthMetrics>
+        <com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric plugin="cloudbees-folder@6.8">
+            <nonRecursive>false</nonRecursive>
+        </com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric>
+    </healthMetrics>
+    <icon class="jenkins.branch.MetadataActionFolderIcon" plugin="branch-api@2.4.0">
+        <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/>
+    </icon>
+    <orphanedItemStrategy class="com.cloudbees.hudson.plugins.folder.computed.DefaultOrphanedItemStrategy" plugin="cloudbees-folder@6.8">
+        <pruneDeadBranches>true</pruneDeadBranches>
+        <daysToKeep>-1</daysToKeep>
+        <numToKeep>-1</numToKeep>
+    </orphanedItemStrategy>
+    <triggers/>
+    <disabled>false</disabled>
+    <sources class="jenkins.branch.MultiBranchProject$BranchSourceList" plugin="branch-api@2.4.0">
+        <data/>
+        <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/>
+    </sources>
+    <factory class="org.jenkinsci.plugins.workflow.multibranch.WorkflowBranchProjectFactory">
+        <owner class="org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject" reference="../.."/>
+        <scriptPath>Jenkinsfile</scriptPath>
+    </factory>
+</org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject>"""
+
+
+PluginClass = MultibranchPipelineJob
+
+if __name__ == "__main__":  # pragma: no cover
+    pass
+
diff --git a/src/pyjen/plugins/multijob.py b/src/pyjen/plugins/multijob.py
new file mode 100644
index 0000000..f9fa0c1
--- /dev/null
+++ b/src/pyjen/plugins/multijob.py
@@ -0,0 +1,51 @@
+"""Primitives that manage Jenkins job of type 'MultiJob'"""
+from pyjen.job import Job
+
+
+class MultiJob(Job):
+    """Custom job type provided by the jenkins-multijob-plugin plugin
+
+    https://plugins.jenkins.io/jenkins-multijob-plugin
+    """
+    @staticmethod
+    def get_jenkins_plugin_name():
+        """Gets the name of the Jenkins plugin associated with this PyJen plugin
+
+        This static method is used by the PyJen plugin API to associate this
+        class with a specific Jenkins plugin, as it is encoded in the config.xml
+
+        :rtype: :class:`str`
+        """
+        return "com.tikal.jenkins.plugins.multijob.MultiJobProject"
+
+    @staticmethod
+    def template_config_xml():
+        return """<com.tikal.jenkins.plugins.multijob.MultiJobProject plugin="jenkins-multijob-plugin@1.32">
+    <description/>
+    <keepDependencies>false</keepDependencies>
+    <properties>
+        <hudson.plugins.buildblocker.BuildBlockerProperty plugin="build-blocker-plugin@1.7.3">
+            <useBuildBlocker>false</useBuildBlocker>
+            <blockLevel>GLOBAL</blockLevel>
+            <scanQueueFor>DISABLED</scanQueueFor>
+            <blockingJobs/>
+        </hudson.plugins.buildblocker.BuildBlockerProperty>
+    </properties>
+    <scm class="hudson.scm.NullSCM"/>
+    <canRoam>true</canRoam>
+    <disabled>false</disabled>
+    <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
+    <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
+    <triggers/>
+    <concurrentBuild>false</concurrentBuild>
+    <builders/>
+    <publishers/>
+    <buildWrappers/>
+    <pollSubjobs>false</pollSubjobs>
+    </com.tikal.jenkins.plugins.multijob.MultiJobProject>"""
+
+
+PluginClass = MultiJob
+
+if __name__ == "__main__":  # pragma: no cover
+    pass

Add getter to retrieve all jobs on a Jenkins build farm
It was recently brought to my attention that there is no easy way to get a list of all jobs managed by a Jenkins build farm. This should be fixed.
diff --git a/tests/conftest.py b/tests/conftest.py
index a5103bf..bffb7a9 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -43,6 +43,7 @@ JENKINS_PLUGINS = [
     "conditional-buildstep",
     "parameterized-trigger",
     "build-blocker-plugin",
+    "jenkins-multijob-plugin",
 ]
 
 
diff --git a/tests/test_jenkins.py b/tests/test_jenkins.py
index 81426e6..98c5539 100644
--- a/tests/test_jenkins.py
+++ b/tests/test_jenkins.py
@@ -173,6 +173,25 @@ def test_get_plugin_manager(jenkins_env):
     assert pm is not None
 
 
+def test_get_no_jobs(jenkins_env):
+    jk = Jenkins(jenkins_env["url"], (jenkins_env["admin_user"], jenkins_env["admin_token"]))
+    res = jk.jobs
+
+    assert res is not None
+    assert isinstance(res, list)
+    assert len(res) == 0
+
+
+def test_get_one_job(jenkins_env):
+    jk = Jenkins(jenkins_env["url"], (jenkins_env["admin_user"], jenkins_env["admin_token"]))
+    jb = jk.create_job("test_get_one_job", FreestyleJob)
+    with clean_job(jb):
+        res = jk.jobs
+
+        assert len(res) == 1
+        assert res[0] == jb
+
+
 def test_create_job(jenkins_env):
     jk = Jenkins(jenkins_env["url"], (jenkins_env["admin_user"], jenkins_env["admin_token"]))
     jb = jk.create_job("test_create_job", FreestyleJob)
diff --git a/tests/test_jobs/test_multibranch_pipeline_job.py b/tests/test_jobs/test_multibranch_pipeline_job.py
new file mode 100644
index 0000000..e2a2419
--- /dev/null
+++ b/tests/test_jobs/test_multibranch_pipeline_job.py
@@ -0,0 +1,29 @@
+import pytest
+from ..utils import clean_job
+from pyjen.jenkins import Jenkins
+from pyjen.plugins.multibranch_pipeline import MultibranchPipelineJob
+
+
+def test_create_multibranch_pipeline_job(jenkins_env):
+    jk = Jenkins(jenkins_env["url"], (jenkins_env["admin_user"], jenkins_env["admin_token"]))
+    expected_name = "test_create_multibranch_pipeline_job"
+    jb = jk.create_job(expected_name, MultibranchPipelineJob)
+    with clean_job(jb):
+        assert jb is not None
+        assert jb.name == expected_name
+
+
+def test_get_branch_jobs(jenkins_env):
+    jk = Jenkins(jenkins_env["url"], (jenkins_env["admin_user"], jenkins_env["admin_token"]))
+    expected_name = "test_get_branch_jobs"
+    jb = jk.create_job(expected_name, MultibranchPipelineJob)
+    with clean_job(jb):
+        res = jb.jobs
+
+        assert res is not None
+        assert isinstance(res, list)
+        assert len(res) == 0
+
+
+if __name__ == "__main__":
+    pytest.main([__file__, "-v", "-s"])
diff --git a/tests/test_jobs/test_multijob_job.py b/tests/test_jobs/test_multijob_job.py
new file mode 100644
index 0000000..0a3c146
--- /dev/null
+++ b/tests/test_jobs/test_multijob_job.py
@@ -0,0 +1,17 @@
+import pytest
+from ..utils import clean_job
+from pyjen.jenkins import Jenkins
+from pyjen.plugins.multijob import MultiJob
+
+
+def test_create_multijob_job(jenkins_env):
+    jk = Jenkins(jenkins_env["url"], (jenkins_env["admin_user"], jenkins_env["admin_token"]))
+    expected_name = "test_create_multijob_job"
+    jb = jk.create_job(expected_name, MultiJob)
+    with clean_job(jb):
+        assert jb is not None
+        assert jb.name == expected_name
+
+
+if __name__ == "__main__":
+    pytest.main([__file__, "-v", "-s"])

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov pytest-timeout mock docker
3.6
tests/python3.reqs
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
astroid==2.11.7
attrs==22.2.0
certifi==2021.5.30
charset-normalizer==2.0.12
coverage==6.2
dill==0.3.4
distlib==0.3.9
docker==5.0.3
filelock==3.4.1
idna==3.10
importlib-metadata==4.8.3
importlib-resources==5.4.0
iniconfig==1.1.1
isort==5.10.1
lazy-object-proxy==1.7.1
mccabe==0.7.0
mock==5.2.0
packaging==21.3
platformdirs==2.4.0
pluggy==1.0.0
py==1.11.0
-e git+https://github.com/TheFriendlyCoder/pyjen.git@4c8d047389fa73e047b70f360c4173eab7631e9b#egg=pyjen
pylint==2.13.9
pyparsing==3.1.4
pytest==7.0.1
pytest-cov==4.0.0
pytest-timeout==2.1.0
requests==2.27.1
six==1.17.0
toml==0.10.2
tomli==1.2.3
tox==3.28.0
tqdm==4.64.1
typed-ast==1.5.5
typing_extensions==4.1.1
urllib3==1.26.20
virtualenv==20.17.1
websocket-client==1.3.1
wrapt==1.16.0
zipp==3.6.0

name: pyjen
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - astroid==2.11.7
      - attrs==22.2.0
      - charset-normalizer==2.0.12
      - coverage==6.2
      - dill==0.3.4
      - distlib==0.3.9
      - docker==5.0.3
      - filelock==3.4.1
      - idna==3.10
      - importlib-metadata==4.8.3
      - importlib-resources==5.4.0
      - iniconfig==1.1.1
      - isort==5.10.1
      - lazy-object-proxy==1.7.1
      - mccabe==0.7.0
      - mock==5.2.0
      - packaging==21.3
      - platformdirs==2.4.0
      - pluggy==1.0.0
      - py==1.11.0
      - pylint==2.13.9
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - pytest-timeout==2.1.0
      - requests==2.27.1
      - six==1.17.0
      - toml==0.10.2
      - tomli==1.2.3
      - tox==3.28.0
      - tqdm==4.64.1
      - typed-ast==1.5.5
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - virtualenv==20.17.1
      - websocket-client==1.3.1
      - wrapt==1.16.0
      - zipp==3.6.0
prefix: /opt/conda/envs/pyjen

tests/test_jenkins.py::test_not_connected tests/test_jenkins.py::test_failed_connection_check
src/pyjen/jenkins.py src/pyjen/plugins/multijob.py src/pyjen/plugins/multibranch_pipeline.py
src/pyjen/jenkins.py src/pyjen/plugins/multijob.py src/pyjen/plugins/multibranch_pipeline.py