diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index f2bba6dc45422b0a1f932a9d072dcf772a5e7ae8..91788c4076b6fa60fd167e0b405bceac67ddb741 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -10,7 +10,7 @@ jobs:
   build:
     strategy:
       matrix:
-        os: [windows-2022]
+        os: [windows-2022, macos-11]
         configuration: [RelWithDebInfoOS]
         addrsize: [64]
         include:
@@ -48,5 +48,6 @@ jobs:
       - name: Build
         shell: bash
         run: |
+          pip install llsd # Required by viewer tests
           autobuild configure
           autobuild build --no-configure
diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp
index 7ee36a9ea6ace696a16c22c078cb6574c1174b60..60005fc6a9570c92d50970ed3eb23e1cee3d6e5b 100644
--- a/indra/llcommon/tests/llleap_test.cpp
+++ b/indra/llcommon/tests/llleap_test.cpp
@@ -109,7 +109,7 @@ namespace tut
                    "import os\n"
                    "import sys\n"
                    "\n"
-                   "from llbase import llsd\n"
+                   "import llsd\n"
                    "\n"
                    "class ProtocolError(Exception):\n"
                    "    def __init__(self, msg, data):\n"
diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp
index c246f5ee56da7879998115a5cbbece6a2713f442..be7ec120949c677ea60aa971269033617a265510 100644
--- a/indra/llcommon/tests/llsdserialize_test.cpp
+++ b/indra/llcommon/tests/llsdserialize_test.cpp
@@ -1706,7 +1706,7 @@ namespace tut
             // scanner.
             import_llsd("import os.path\n"
                         "import sys\n"
-                        "from llbase import llsd\n")
+                        "import llsd\n")
         {}
         ~TestPythonCompatible() {}
 
diff --git a/indra/llcorehttp/tests/test_llcorehttp_peer.py b/indra/llcorehttp/tests/test_llcorehttp_peer.py
index 778de909627cc59cfdd1a190e168621ef151ead8..b9992538bae13724ba36a245f6700aaf3359522d 100755
--- a/indra/llcorehttp/tests/test_llcorehttp_peer.py
+++ b/indra/llcorehttp/tests/test_llcorehttp_peer.py
@@ -38,8 +38,7 @@
 from http.server import HTTPServer, BaseHTTPRequestHandler
 
 
-from llbase.fastest_elementtree import parse as xml_parse
-from llbase import llsd
+import llsd
 
 # we're in llcorehttp/tests ; testrunner.py is found in llmessage/tests
 sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir,
diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py
index 5ba0749e3168fd9e92dab5d9162a7c0ca95f0cff..ff8f40a1449d6d7a6a7486dd4768b6853967a9c6 100755
--- a/indra/llmessage/tests/test_llsdmessage_peer.py
+++ b/indra/llmessage/tests/test_llsdmessage_peer.py
@@ -33,8 +33,7 @@
 import sys
 from http.server import HTTPServer, BaseHTTPRequestHandler
 
-from llbase.fastest_elementtree import parse as xml_parse
-from llbase import llsd
+import llsd
 from testrunner import freeport, run, debug, VERBOSE
 import time
 
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 3327ecfb563ae51df328a48464c0c0a21a741049..30b0d23a93c940d4c03866e082bd8536b82b0228 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -49,7 +49,7 @@
 # indra.util.llmanifest under their system Python!
 sys.path.insert(0, os.path.join(viewer_dir, os.pardir, "lib", "python"))
 from indra.util.llmanifest import LLManifest, main, path_ancestors, CHANNEL_VENDOR_BASE, RELEASE_CHANNEL, ManifestError, MissingError
-from llbase import llsd
+import llsd
 
 class ViewerManifest(LLManifest):
     def is_packaging_viewer(self):
diff --git a/scripts/metrics/slp_conv.py b/scripts/metrics/slp_conv.py
index 27f922b74ac3dd66e8015fbef72f80e81851f905..25f9a8c060f45db007feddf9611684476027ea98 100644
--- a/scripts/metrics/slp_conv.py
+++ b/scripts/metrics/slp_conv.py
@@ -29,7 +29,7 @@
 $/LicenseInfo$
 """
 
-from llbase import llsd
+import llsd
 import argparse
 
 parser = argparse.ArgumentParser(
diff --git a/scripts/metrics/viewer_asset_logs.py b/scripts/metrics/viewer_asset_logs.py
index 036593618851b3cd94a4c29755b1465f14c887b1..bd996dff79e648f32b3cec9fb038bc2adad7c480 100644
--- a/scripts/metrics/viewer_asset_logs.py
+++ b/scripts/metrics/viewer_asset_logs.py
@@ -28,7 +28,7 @@
 
 import argparse
 from lxml import etree
-from llbase import llsd
+import llsd
 
 def get_metrics_record(infiles):
     for filename in args.infiles:
diff --git a/scripts/metrics/viewerstats.py b/scripts/metrics/viewerstats.py
index 7e19539e158d160c54c1e957350824c54d74bd96..e64343329cc2ea3e3695893c8d21c9f3d6180090 100755
--- a/scripts/metrics/viewerstats.py
+++ b/scripts/metrics/viewerstats.py
@@ -31,7 +31,7 @@
 import pandas as pd
 import json
 from collections import Counter, defaultdict
-from llbase import llsd
+import llsd
 import io
 import re
 import os