diff --git a/src/bundles/pdb/src/pdb.py b/src/bundles/pdb/src/pdb.py
index 05ceec21e..2e7519b72 100644
--- a/src/bundles/pdb/src/pdb.py
+++ b/src/bundles/pdb/src/pdb.py
@@ -125,10 +125,18 @@ _pdb_sources = {
     # "pdbj": "https://pdbj.org/rest/downloadPDBfile?format=pdb&id=%s",
 }
 
-def fetch_pdb(session, pdb_id, *, fetch_source="rcsb", ignore_cache=False, **kw):
+def fetch_pdb(session, pdb_id, *, fetch_source="rcsb", ignore_cache=False,
+        structure_factors=False, over_sampling=1.5, # for ChimeraX-Clipper plugin
+        **kw):
     if len(pdb_id) != 4:
         from chimerax.core.errors import UserError
         raise UserError('PDB identifiers are 4 characters long, got "%s"' % pdb_id)
+    if structure_factors:
+        try:
+            from chimerax.clipper.io import fetch_cif
+        except ImportError:
+            raise UserError('Working with structure factors requires the '
+                'ChimeraX_Clipper plugin, available from the Tool Shed')
     import os
     pdb_id = pdb_id.lower()
     # check on local system -- TODO: configure location
@@ -149,6 +157,18 @@ def fetch_pdb(session, pdb_id, *, fetch_source="rcsb", ignore_cache=False, **kw)
     session.logger.status("Opening PDB %s" % (pdb_id,))
     from chimerax.core import io
     models, status = io.open_data(session, filename, format='pdb', name=pdb_id, **kw)
+    if structure_factors:
+        sf_file = fetch_cif.fetch_structure_factors(session, pdb_id, fetch_source=fetch_source,
+            ignore_cache=ignore_cache)
+        from chimerax.clipper import get_map_mgr
+        mmgr = get_map_mgr(models[0], create=True)
+        if over_sampling < 1:
+            warn_str = ('Map over-sampling rate cannot be less than 1. Resetting to 1.0')
+            session.logger.warning(warn_str)
+            over_sampling = 1
+        mmgr.add_xmapset_from_file(sf_file, oversampling_rate = over_sampling)
+        return [mmgr.crystal_mgr], status
+
     return models, status
 
 def fetch_pdb_pdbe(session, pdb_id, **kw):
@@ -587,4 +607,3 @@ def _process_src(src, caption):
             html += '   <td>%s</td>\n' % formatted
             html += '  </tr>\n'
     return html
-
