treewide: introduce osbase package and move things around

All except localregistry moved from metropolis/pkg to osbase,
localregistry moved to metropolis/test as its only used there anyway.

Change-Id: If1a4bf377364bef0ac23169e1b90379c71b06d72
Reviewed-on: https://review.monogon.dev/c/monogon/+/3079
Tested-by: Jenkins CI
Reviewed-by: Serge Bazanski <serge@monogon.tech>
diff --git a/cloud/agent/BUILD.bazel b/cloud/agent/BUILD.bazel
index 6f5ce82..e228ca4 100644
--- a/cloud/agent/BUILD.bazel
+++ b/cloud/agent/BUILD.bazel
@@ -19,16 +19,16 @@
         "//metropolis/node/build/mkimage/osimage",
         "//metropolis/node/core/devmgr",
         "//metropolis/node/core/network",
-        "//metropolis/pkg/blockdev",
-        "//metropolis/pkg/bootparam",
-        "//metropolis/pkg/efivarfs",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/nvme",
-        "//metropolis/pkg/pki",
-        "//metropolis/pkg/scsi",
-        "//metropolis/pkg/smbios",
-        "//metropolis/pkg/supervisor",
         "//net/proto",
+        "//osbase/blockdev",
+        "//osbase/bootparam",
+        "//osbase/efivarfs",
+        "//osbase/logtree",
+        "//osbase/nvme",
+        "//osbase/pki",
+        "//osbase/scsi",
+        "//osbase/smbios",
+        "//osbase/supervisor",
         "@com_github_cenkalti_backoff_v4//:backoff",
         "@com_github_mdlayher_ethtool//:ethtool",
         "@com_github_vishvananda_netlink//:netlink",
diff --git a/cloud/agent/agent.go b/cloud/agent/agent.go
index 8efafd0..e014ac0 100644
--- a/cloud/agent/agent.go
+++ b/cloud/agent/agent.go
@@ -22,8 +22,8 @@
 	bpb "source.monogon.dev/cloud/bmaas/server/api"
 	"source.monogon.dev/metropolis/node/core/devmgr"
 	"source.monogon.dev/metropolis/node/core/network"
-	"source.monogon.dev/metropolis/pkg/pki"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/pki"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // This is similar to rpc.NewEphemeralCredentials, but that only deals with
diff --git a/cloud/agent/e2e/BUILD.bazel b/cloud/agent/e2e/BUILD.bazel
index d05031b..f903386 100644
--- a/cloud/agent/e2e/BUILD.bazel
+++ b/cloud/agent/e2e/BUILD.bazel
@@ -12,8 +12,8 @@
     deps = [
         "//cloud/agent/api",
         "//cloud/bmaas/server/api",
-        "//metropolis/pkg/pki",
         "//metropolis/proto/api",
+        "//osbase/pki",
         "@com_github_cavaliergopher_cpio//:cpio",
         "@com_github_klauspost_compress//zstd",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
diff --git a/cloud/agent/e2e/main_test.go b/cloud/agent/e2e/main_test.go
index 3a27803..ec1ee0c 100644
--- a/cloud/agent/e2e/main_test.go
+++ b/cloud/agent/e2e/main_test.go
@@ -30,8 +30,8 @@
 
 	apb "source.monogon.dev/cloud/agent/api"
 	bpb "source.monogon.dev/cloud/bmaas/server/api"
-	"source.monogon.dev/metropolis/pkg/pki"
 	mpb "source.monogon.dev/metropolis/proto/api"
+	"source.monogon.dev/osbase/pki"
 )
 
 type fakeServer struct {
diff --git a/cloud/agent/hwreport.go b/cloud/agent/hwreport.go
index 33a7149..da50749 100644
--- a/cloud/agent/hwreport.go
+++ b/cloud/agent/hwreport.go
@@ -18,9 +18,9 @@
 	"golang.org/x/sys/unix"
 
 	"source.monogon.dev/cloud/agent/api"
-	"source.monogon.dev/metropolis/pkg/nvme"
-	"source.monogon.dev/metropolis/pkg/scsi"
-	"source.monogon.dev/metropolis/pkg/smbios"
+	"source.monogon.dev/osbase/nvme"
+	"source.monogon.dev/osbase/scsi"
+	"source.monogon.dev/osbase/smbios"
 )
 
 type hwReportContext struct {
diff --git a/cloud/agent/install.go b/cloud/agent/install.go
index 126d365..6082337 100644
--- a/cloud/agent/install.go
+++ b/cloud/agent/install.go
@@ -15,10 +15,10 @@
 
 	bpb "source.monogon.dev/cloud/bmaas/server/api"
 	"source.monogon.dev/metropolis/node/build/mkimage/osimage"
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/efivarfs"
-	"source.monogon.dev/metropolis/pkg/logtree"
 	npb "source.monogon.dev/net/proto"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/efivarfs"
+	"source.monogon.dev/osbase/logtree"
 )
 
 //go:embed metropolis/node/core/abloader/abloader_bin.efi
diff --git a/cloud/agent/main.go b/cloud/agent/main.go
index 45c3e52..511e688 100644
--- a/cloud/agent/main.go
+++ b/cloud/agent/main.go
@@ -8,9 +8,9 @@
 
 	"golang.org/x/sys/unix"
 
-	"source.monogon.dev/metropolis/pkg/bootparam"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/bootparam"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 var validTTYRegexp = regexp.MustCompile(`^[a-zA-Z0-9]+$`)
diff --git a/cloud/agent/takeover/BUILD.bazel b/cloud/agent/takeover/BUILD.bazel
index 2727f19..49e12ac 100644
--- a/cloud/agent/takeover/BUILD.bazel
+++ b/cloud/agent/takeover/BUILD.bazel
@@ -16,10 +16,10 @@
     visibility = ["//visibility:private"],
     deps = [
         "//cloud/agent/api",
-        "//metropolis/pkg/bootparam",
-        "//metropolis/pkg/kexec",
         "//net/dump",
         "//net/proto",
+        "//osbase/bootparam",
+        "//osbase/kexec",
         "@com_github_cavaliergopher_cpio//:cpio",
         "@com_github_klauspost_compress//zstd",
         "@org_golang_google_protobuf//proto",
diff --git a/cloud/agent/takeover/e2e/BUILD.bazel b/cloud/agent/takeover/e2e/BUILD.bazel
index 1cdd840..2b9a200 100644
--- a/cloud/agent/takeover/e2e/BUILD.bazel
+++ b/cloud/agent/takeover/e2e/BUILD.bazel
@@ -10,8 +10,8 @@
     ],
     deps = [
         "//cloud/agent/api",
-        "//metropolis/pkg/fat32",
-        "//metropolis/pkg/freeport",
+        "//osbase/fat32",
+        "//osbase/freeport",
         "@com_github_pkg_sftp//:sftp",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
         "@org_golang_google_protobuf//proto",
diff --git a/cloud/agent/takeover/e2e/main_test.go b/cloud/agent/takeover/e2e/main_test.go
index 6d489eb..a8c8686 100644
--- a/cloud/agent/takeover/e2e/main_test.go
+++ b/cloud/agent/takeover/e2e/main_test.go
@@ -22,8 +22,8 @@
 
 	"source.monogon.dev/cloud/agent/api"
 
-	"source.monogon.dev/metropolis/pkg/fat32"
-	"source.monogon.dev/metropolis/pkg/freeport"
+	"source.monogon.dev/osbase/fat32"
+	"source.monogon.dev/osbase/freeport"
 )
 
 func TestE2E(t *testing.T) {
diff --git a/cloud/agent/takeover/takeover.go b/cloud/agent/takeover/takeover.go
index 645b27e..ffc3a6e 100644
--- a/cloud/agent/takeover/takeover.go
+++ b/cloud/agent/takeover/takeover.go
@@ -32,10 +32,10 @@
 	"google.golang.org/protobuf/proto"
 
 	"source.monogon.dev/cloud/agent/api"
-	"source.monogon.dev/metropolis/pkg/bootparam"
-	"source.monogon.dev/metropolis/pkg/kexec"
 	netdump "source.monogon.dev/net/dump"
 	netapi "source.monogon.dev/net/proto"
+	"source.monogon.dev/osbase/bootparam"
+	"source.monogon.dev/osbase/kexec"
 )
 
 //go:embed third_party/linux/bzImage
diff --git a/cloud/lib/component/BUILD.bazel b/cloud/lib/component/BUILD.bazel
index 71c1ab4..2714ef3 100644
--- a/cloud/lib/component/BUILD.bazel
+++ b/cloud/lib/component/BUILD.bazel
@@ -10,7 +10,7 @@
     importpath = "source.monogon.dev/cloud/lib/component",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/pki",
+        "//osbase/pki",
         "@com_github_adrg_xdg//:xdg",
         "@com_github_cockroachdb_cockroach_go_v2//testserver",
         "@com_github_golang_migrate_migrate_v4//:migrate",
diff --git a/cloud/lib/component/devcerts.go b/cloud/lib/component/devcerts.go
index 32d809c..2a5f60a 100644
--- a/cloud/lib/component/devcerts.go
+++ b/cloud/lib/component/devcerts.go
@@ -13,7 +13,7 @@
 
 	"k8s.io/klog/v2"
 
-	"source.monogon.dev/metropolis/pkg/pki"
+	"source.monogon.dev/osbase/pki"
 )
 
 // GetDevCerts returns paths to this component's development certificate, key
diff --git a/go/net/psample/BUILD.bazel b/go/net/psample/BUILD.bazel
index 36e19d3..1634ba9 100644
--- a/go/net/psample/BUILD.bazel
+++ b/go/net/psample/BUILD.bazel
@@ -1,5 +1,5 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "psample",
diff --git a/go/net/tinylb/BUILD.bazel b/go/net/tinylb/BUILD.bazel
index a238bd3..ac65693 100644
--- a/go/net/tinylb/BUILD.bazel
+++ b/go/net/tinylb/BUILD.bazel
@@ -10,8 +10,8 @@
     visibility = ["//visibility:public"],
     deps = [
         "//go/types/mapsets",
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/supervisor",
+        "//osbase/event",
+        "//osbase/supervisor",
     ],
 )
 
@@ -20,7 +20,7 @@
     srcs = ["tinylb_test.go"],
     embed = [":tinylb"],
     deps = [
-        "//metropolis/pkg/event/memory",
-        "//metropolis/pkg/supervisor",
+        "//osbase/event/memory",
+        "//osbase/supervisor",
     ],
 )
diff --git a/go/net/tinylb/tinylb.go b/go/net/tinylb/tinylb.go
index 67a639e..439628e 100644
--- a/go/net/tinylb/tinylb.go
+++ b/go/net/tinylb/tinylb.go
@@ -16,8 +16,8 @@
 	"sync"
 
 	"source.monogon.dev/go/types/mapsets"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // Backend is to be implemented by different kinds of loadbalancing backends, eg.
diff --git a/go/net/tinylb/tinylb_test.go b/go/net/tinylb/tinylb_test.go
index 322be69..5b7fb16 100644
--- a/go/net/tinylb/tinylb_test.go
+++ b/go/net/tinylb/tinylb_test.go
@@ -9,8 +9,8 @@
 	"testing"
 	"time"
 
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 func TestLoadbalancer(t *testing.T) {
diff --git a/metropolis/cli/dbg/BUILD.bazel b/metropolis/cli/dbg/BUILD.bazel
index 46ac991..39f19a3 100644
--- a/metropolis/cli/dbg/BUILD.bazel
+++ b/metropolis/cli/dbg/BUILD.bazel
@@ -6,9 +6,9 @@
     importpath = "source.monogon.dev/metropolis/cli/dbg",
     visibility = ["//visibility:private"],
     deps = [
-        "//metropolis/pkg/logtree",
         "//metropolis/proto/api",
         "//metropolis/proto/common",
+        "//osbase/logtree",
         "@io_k8s_cli_runtime//pkg/genericclioptions",
         "@io_k8s_component_base//cli",
         "@io_k8s_kubectl//pkg/cmd",
diff --git a/metropolis/cli/dbg/main.go b/metropolis/cli/dbg/main.go
index f087313..3bb762e 100644
--- a/metropolis/cli/dbg/main.go
+++ b/metropolis/cli/dbg/main.go
@@ -32,7 +32,7 @@
 	"k8s.io/kubectl/pkg/cmd/plugin"
 	"k8s.io/kubectl/pkg/cmd/util"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 
 	apb "source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
diff --git a/metropolis/cli/metroctl/BUILD.bazel b/metropolis/cli/metroctl/BUILD.bazel
index 37f4b56..e390ff8 100644
--- a/metropolis/cli/metroctl/BUILD.bazel
+++ b/metropolis/cli/metroctl/BUILD.bazel
@@ -46,12 +46,12 @@
         "//metropolis/node/core/identity",
         "//metropolis/node/core/rpc",
         "//metropolis/node/core/rpc/resolver",
-        "//metropolis/pkg/blkio",
-        "//metropolis/pkg/fat32",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/logtree/proto",
         "//metropolis/proto/api",
         "//metropolis/proto/common",
+        "//osbase/blkio",
+        "//osbase/fat32",
+        "//osbase/logtree",
+        "//osbase/logtree/proto",
         "//version",
         "@com_github_adrg_xdg//:xdg",
         "@com_github_spf13_cobra//:cobra",
diff --git a/metropolis/cli/metroctl/cmd_install.go b/metropolis/cli/metroctl/cmd_install.go
index fc463b4..992da3e 100644
--- a/metropolis/cli/metroctl/cmd_install.go
+++ b/metropolis/cli/metroctl/cmd_install.go
@@ -17,8 +17,8 @@
 	cpb "source.monogon.dev/metropolis/proto/common"
 
 	"source.monogon.dev/metropolis/cli/metroctl/core"
-	"source.monogon.dev/metropolis/pkg/blkio"
-	"source.monogon.dev/metropolis/pkg/fat32"
+	"source.monogon.dev/osbase/blkio"
+	"source.monogon.dev/osbase/fat32"
 )
 
 var installCmd = &cobra.Command{
diff --git a/metropolis/cli/metroctl/cmd_node_logs.go b/metropolis/cli/metroctl/cmd_node_logs.go
index 77dd8c2..5b8cef9 100644
--- a/metropolis/cli/metroctl/cmd_node_logs.go
+++ b/metropolis/cli/metroctl/cmd_node_logs.go
@@ -8,10 +8,10 @@
 	"github.com/spf13/cobra"
 
 	"source.monogon.dev/metropolis/cli/metroctl/core"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
 	"source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
+	"source.monogon.dev/osbase/logtree"
+	lpb "source.monogon.dev/osbase/logtree/proto"
 )
 
 type metroctlLogFlags struct {
diff --git a/metropolis/cli/metroctl/core/BUILD.bazel b/metropolis/cli/metroctl/core/BUILD.bazel
index 1795765..36f02c3 100644
--- a/metropolis/cli/metroctl/core/BUILD.bazel
+++ b/metropolis/cli/metroctl/core/BUILD.bazel
@@ -16,10 +16,10 @@
         "//metropolis/node/core/curator/proto/api",
         "//metropolis/node/core/rpc",
         "//metropolis/node/core/rpc/resolver",
-        "//metropolis/pkg/blockdev",
-        "//metropolis/pkg/fat32",
-        "//metropolis/pkg/gpt",
         "//metropolis/proto/api",
+        "//osbase/blockdev",
+        "//osbase/fat32",
+        "//osbase/gpt",
         "@io_k8s_client_go//pkg/apis/clientauthentication/v1:clientauthentication",
         "@io_k8s_client_go//tools/clientcmd",
         "@io_k8s_client_go//tools/clientcmd/api",
diff --git a/metropolis/cli/metroctl/core/install.go b/metropolis/cli/metroctl/core/install.go
index 223e773..4175e22 100644
--- a/metropolis/cli/metroctl/core/install.go
+++ b/metropolis/cli/metroctl/core/install.go
@@ -9,10 +9,10 @@
 
 	"google.golang.org/protobuf/proto"
 
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/fat32"
-	"source.monogon.dev/metropolis/pkg/gpt"
 	"source.monogon.dev/metropolis/proto/api"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/fat32"
+	"source.monogon.dev/osbase/gpt"
 )
 
 type MakeInstallerImageArgs struct {
diff --git a/metropolis/cli/metroctl/test/BUILD.bazel b/metropolis/cli/metroctl/test/BUILD.bazel
index 23bbc4a..9b9c4cc 100644
--- a/metropolis/cli/metroctl/test/BUILD.bazel
+++ b/metropolis/cli/metroctl/test/BUILD.bazel
@@ -13,10 +13,10 @@
     rundir = ".",
     deps = [
         "//metropolis/node",
-        "//metropolis/pkg/cmd",
-        "//metropolis/test/launch/cluster",
+        "//metropolis/test/launch",
         "//metropolis/test/util",
         "//metropolis/version",
+        "//osbase/cmd",
         "//version",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
     ],
@@ -28,10 +28,10 @@
     importpath = "source.monogon.dev/metropolis/cli/metroctl/test",
     visibility = ["//visibility:private"],
     deps = [
-        "//metropolis/pkg/cmd",
-        "//metropolis/test/launch/cluster",
+        "//metropolis/test/launch",
         "//metropolis/test/util",
         "//metropolis/version",
+        "//osbase/cmd",
         "//version",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
     ],
diff --git a/metropolis/cli/metroctl/test/test.go b/metropolis/cli/metroctl/test/test.go
index 7b31918..f601811 100644
--- a/metropolis/cli/metroctl/test/test.go
+++ b/metropolis/cli/metroctl/test/test.go
@@ -15,9 +15,9 @@
 
 	mversion "source.monogon.dev/metropolis/version"
 
-	"source.monogon.dev/metropolis/pkg/cmd"
-	"source.monogon.dev/metropolis/test/launch/cluster"
+	mlaunch "source.monogon.dev/metropolis/test/launch"
 	"source.monogon.dev/metropolis/test/util"
+	"source.monogon.dev/osbase/cmd"
 	"source.monogon.dev/version"
 )
 
@@ -95,10 +95,10 @@
 	ctx, ctxC := context.WithCancel(context.Background())
 	defer ctxC()
 
-	co := cluster.ClusterOptions{
+	co := mlaunch.ClusterOptions{
 		NumNodes: 2,
 	}
-	cl, err := cluster.LaunchCluster(context.Background(), co)
+	cl, err := mlaunch.LaunchCluster(context.Background(), co)
 	if err != nil {
 		t.Fatalf("LaunchCluster failed: %v", err)
 	}
@@ -109,7 +109,7 @@
 		}
 	}()
 
-	socksRemote := fmt.Sprintf("localhost:%d", cl.Ports[cluster.SOCKSPort])
+	socksRemote := fmt.Sprintf("localhost:%d", cl.Ports[mlaunch.SOCKSPort])
 	var clusterEndpoints []string
 	// Use node starting order for endpoints
 	for _, ep := range cl.NodeIDs {
@@ -118,7 +118,7 @@
 
 	ownerPem := pem.EncodeToMemory(&pem.Block{
 		Type:  "METROPOLIS INITIAL OWNER PRIVATE KEY",
-		Bytes: cluster.InsecurePrivateKey,
+		Bytes: mlaunch.InsecurePrivateKey,
 	})
 	if err := os.WriteFile("owner-key.pem", ownerPem, 0644); err != nil {
 		log.Fatal("Couldn't write owner-key.pem")
diff --git a/metropolis/installer/BUILD.bazel b/metropolis/installer/BUILD.bazel
index f94d134..a0d1993 100644
--- a/metropolis/installer/BUILD.bazel
+++ b/metropolis/installer/BUILD.bazel
@@ -16,9 +16,9 @@
     visibility = ["//visibility:private"],
     deps = [
         "//metropolis/node/build/mkimage/osimage",
-        "//metropolis/pkg/blockdev",
-        "//metropolis/pkg/efivarfs",
-        "//metropolis/pkg/sysfs",
+        "//osbase/blockdev",
+        "//osbase/efivarfs",
+        "//osbase/sysfs",
         "@org_golang_x_sys//unix",
     ],
 )
diff --git a/metropolis/installer/main.go b/metropolis/installer/main.go
index a35a734..0ae7dd6 100644
--- a/metropolis/installer/main.go
+++ b/metropolis/installer/main.go
@@ -35,9 +35,9 @@
 	"golang.org/x/sys/unix"
 
 	"source.monogon.dev/metropolis/node/build/mkimage/osimage"
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/efivarfs"
-	"source.monogon.dev/metropolis/pkg/sysfs"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/efivarfs"
+	"source.monogon.dev/osbase/sysfs"
 )
 
 //go:embed metropolis/node/core/abloader/abloader_bin.efi
diff --git a/metropolis/installer/test/BUILD.bazel b/metropolis/installer/test/BUILD.bazel
index 0f3583a..7f71218 100644
--- a/metropolis/installer/test/BUILD.bazel
+++ b/metropolis/installer/test/BUILD.bazel
@@ -22,8 +22,8 @@
     deps = [
         "//metropolis/cli/metroctl/core",
         "//metropolis/node/build/mkimage/osimage",
-        "//metropolis/pkg/cmd",
         "//metropolis/proto/api",
+        "//osbase/cmd",
         "@com_github_diskfs_go_diskfs//:go-diskfs",
         "@com_github_diskfs_go_diskfs//disk",
         "@com_github_diskfs_go_diskfs//partition/gpt",
diff --git a/metropolis/installer/test/main.go b/metropolis/installer/test/main.go
index b2fb8dc..f2c1f46 100644
--- a/metropolis/installer/test/main.go
+++ b/metropolis/installer/test/main.go
@@ -39,7 +39,7 @@
 
 	mctl "source.monogon.dev/metropolis/cli/metroctl/core"
 	"source.monogon.dev/metropolis/node/build/mkimage/osimage"
-	"source.monogon.dev/metropolis/pkg/cmd"
+	"source.monogon.dev/osbase/cmd"
 )
 
 // Each variable in this block points to either a test dependency or a side
diff --git a/metropolis/node/build/fwprune/BUILD.bazel b/metropolis/node/build/fwprune/BUILD.bazel
index bc22665..e29ac7e 100644
--- a/metropolis/node/build/fwprune/BUILD.bazel
+++ b/metropolis/node/build/fwprune/BUILD.bazel
@@ -7,7 +7,7 @@
     visibility = ["//visibility:private"],
     deps = [
         "//metropolis/node/build/fsspec",
-        "//metropolis/pkg/kmod",
+        "//osbase/kmod",
         "@org_golang_google_protobuf//encoding/prototext",
         "@org_golang_google_protobuf//proto",
     ],
diff --git a/metropolis/node/build/fwprune/main.go b/metropolis/node/build/fwprune/main.go
index 4f26fa0..e76e5d0 100644
--- a/metropolis/node/build/fwprune/main.go
+++ b/metropolis/node/build/fwprune/main.go
@@ -20,7 +20,7 @@
 	"google.golang.org/protobuf/proto"
 
 	"source.monogon.dev/metropolis/node/build/fsspec"
-	"source.monogon.dev/metropolis/pkg/kmod"
+	"source.monogon.dev/osbase/kmod"
 )
 
 // linkRegexp parses the Link: lines in the WHENCE file. This does not have
diff --git a/metropolis/node/build/kconfig-patcher/BUILD.bazel b/metropolis/node/build/kconfig-patcher/BUILD.bazel
index e838f9e..278db21 100644
--- a/metropolis/node/build/kconfig-patcher/BUILD.bazel
+++ b/metropolis/node/build/kconfig-patcher/BUILD.bazel
@@ -12,7 +12,7 @@
     embed = [":kconfig-patcher_lib"],
     visibility = [
         "//metropolis/node:__pkg__",
-        "//metropolis/test/ktest:__pkg__",
+        "//osbase/test/ktest:__pkg__",
     ],
 )
 
diff --git a/metropolis/node/build/mkerofs/BUILD.bazel b/metropolis/node/build/mkerofs/BUILD.bazel
index 73fda98..0befb4c 100644
--- a/metropolis/node/build/mkerofs/BUILD.bazel
+++ b/metropolis/node/build/mkerofs/BUILD.bazel
@@ -7,7 +7,7 @@
     visibility = ["//visibility:public"],
     deps = [
         "//metropolis/node/build/fsspec",
-        "//metropolis/pkg/erofs",
+        "//osbase/erofs",
     ],
 )
 
diff --git a/metropolis/node/build/mkerofs/main.go b/metropolis/node/build/mkerofs/main.go
index ac0042a..b5d5568 100644
--- a/metropolis/node/build/mkerofs/main.go
+++ b/metropolis/node/build/mkerofs/main.go
@@ -30,7 +30,7 @@
 	"strings"
 
 	"source.monogon.dev/metropolis/node/build/fsspec"
-	"source.monogon.dev/metropolis/pkg/erofs"
+	"source.monogon.dev/osbase/erofs"
 )
 
 func (spec *entrySpec) writeRecursive(w *erofs.Writer, pathname string) {
diff --git a/metropolis/node/build/mkimage/BUILD.bazel b/metropolis/node/build/mkimage/BUILD.bazel
index ad88acb..41ce603 100644
--- a/metropolis/node/build/mkimage/BUILD.bazel
+++ b/metropolis/node/build/mkimage/BUILD.bazel
@@ -10,8 +10,8 @@
     visibility = ["//visibility:private"],
     deps = [
         "//metropolis/node/build/mkimage/osimage",
-        "//metropolis/pkg/blkio",
-        "//metropolis/pkg/blockdev",
+        "//osbase/blkio",
+        "//osbase/blockdev",
     ],
 )
 
diff --git a/metropolis/node/build/mkimage/main.go b/metropolis/node/build/mkimage/main.go
index 7de951e..3695054 100644
--- a/metropolis/node/build/mkimage/main.go
+++ b/metropolis/node/build/mkimage/main.go
@@ -34,8 +34,8 @@
 	"os"
 
 	"source.monogon.dev/metropolis/node/build/mkimage/osimage"
-	"source.monogon.dev/metropolis/pkg/blkio"
-	"source.monogon.dev/metropolis/pkg/blockdev"
+	"source.monogon.dev/osbase/blkio"
+	"source.monogon.dev/osbase/blockdev"
 )
 
 //go:embed metropolis/node/core/abloader/abloader_bin.efi
diff --git a/metropolis/node/build/mkimage/osimage/BUILD.bazel b/metropolis/node/build/mkimage/osimage/BUILD.bazel
index cfbf736..9799b81 100644
--- a/metropolis/node/build/mkimage/osimage/BUILD.bazel
+++ b/metropolis/node/build/mkimage/osimage/BUILD.bazel
@@ -6,10 +6,10 @@
     importpath = "source.monogon.dev/metropolis/node/build/mkimage/osimage",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/blockdev",
-        "//metropolis/pkg/efivarfs",
-        "//metropolis/pkg/fat32",
-        "//metropolis/pkg/gpt",
+        "//osbase/blockdev",
+        "//osbase/efivarfs",
+        "//osbase/fat32",
+        "//osbase/gpt",
         "@com_github_google_uuid//:uuid",
     ],
 )
diff --git a/metropolis/node/build/mkimage/osimage/osimage.go b/metropolis/node/build/mkimage/osimage/osimage.go
index d0ccaef..f877ded 100644
--- a/metropolis/node/build/mkimage/osimage/osimage.go
+++ b/metropolis/node/build/mkimage/osimage/osimage.go
@@ -25,10 +25,10 @@
 
 	"github.com/google/uuid"
 
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/efivarfs"
-	"source.monogon.dev/metropolis/pkg/fat32"
-	"source.monogon.dev/metropolis/pkg/gpt"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/efivarfs"
+	"source.monogon.dev/osbase/fat32"
+	"source.monogon.dev/osbase/gpt"
 )
 
 var (
diff --git a/metropolis/node/build/mkverity/BUILD.bazel b/metropolis/node/build/mkverity/BUILD.bazel
index caabc26..a748b86 100644
--- a/metropolis/node/build/mkverity/BUILD.bazel
+++ b/metropolis/node/build/mkverity/BUILD.bazel
@@ -15,5 +15,5 @@
     srcs = ["mkverity.go"],
     importpath = "source.monogon.dev/metropolis/node/build/mkverity",
     visibility = ["//visibility:private"],
-    deps = ["//metropolis/pkg/verity"],
+    deps = ["//osbase/verity"],
 )
diff --git a/metropolis/node/build/mkverity/mkverity.go b/metropolis/node/build/mkverity/mkverity.go
index f44b601..ff2807b 100644
--- a/metropolis/node/build/mkverity/mkverity.go
+++ b/metropolis/node/build/mkverity/mkverity.go
@@ -19,7 +19,7 @@
 // outputs a Verity mapping table on success.
 //
 // For more information, see:
-// - source.monogon.dev/metropolis/pkg/verity
+// - source.monogon.dev/osbase/verity
 // - https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity
 package main
 
@@ -30,7 +30,7 @@
 	"log"
 	"os"
 
-	"source.monogon.dev/metropolis/pkg/verity"
+	"source.monogon.dev/osbase/verity"
 )
 
 // createImage creates a dm-verity target image by combining the input image
diff --git a/metropolis/node/core/BUILD.bazel b/metropolis/node/core/BUILD.bazel
index 8605534..938a7d7 100644
--- a/metropolis/node/core/BUILD.bazel
+++ b/metropolis/node/core/BUILD.bazel
@@ -34,13 +34,13 @@
         "//metropolis/node/core/rpc/resolver",
         "//metropolis/node/core/time",
         "//metropolis/node/core/update",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/pstore",
-        "//metropolis/pkg/supervisor",
-        "//metropolis/pkg/sysctl",
-        "//metropolis/pkg/tpm",
         "//metropolis/proto/api",
         "//metropolis/version",
+        "//osbase/logtree",
+        "//osbase/pstore",
+        "//osbase/supervisor",
+        "//osbase/sysctl",
+        "//osbase/tpm",
         "//version",
         "@com_github_cenkalti_backoff_v4//:backoff",
         "@com_github_containerd_containerd//:containerd",
diff --git a/metropolis/node/core/cluster/BUILD.bazel b/metropolis/node/core/cluster/BUILD.bazel
index 4da6c76..665f94d 100644
--- a/metropolis/node/core/cluster/BUILD.bazel
+++ b/metropolis/node/core/cluster/BUILD.bazel
@@ -21,10 +21,10 @@
         "//metropolis/node/core/rpc",
         "//metropolis/node/core/rpc/resolver",
         "//metropolis/node/core/update",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/api",
         "//metropolis/proto/common",
         "//metropolis/proto/private",
+        "//osbase/supervisor",
         "@com_github_cenkalti_backoff_v4//:backoff",
         "@org_golang_google_grpc//:go_default_library",
         "@org_golang_google_protobuf//proto",
diff --git a/metropolis/node/core/cluster/cluster.go b/metropolis/node/core/cluster/cluster.go
index 323c8ca..1d3135c 100644
--- a/metropolis/node/core/cluster/cluster.go
+++ b/metropolis/node/core/cluster/cluster.go
@@ -34,9 +34,9 @@
 	"source.monogon.dev/metropolis/node/core/network"
 	"source.monogon.dev/metropolis/node/core/roleserve"
 	"source.monogon.dev/metropolis/node/core/update"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	apb "source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type Manager struct {
diff --git a/metropolis/node/core/cluster/cluster_bootstrap.go b/metropolis/node/core/cluster/cluster_bootstrap.go
index 3e5f745..0c9d7fe 100644
--- a/metropolis/node/core/cluster/cluster_bootstrap.go
+++ b/metropolis/node/core/cluster/cluster_bootstrap.go
@@ -30,7 +30,7 @@
 	"source.monogon.dev/metropolis/node/core/curator"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/roleserve"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 
 	apb "source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
diff --git a/metropolis/node/core/cluster/cluster_join.go b/metropolis/node/core/cluster/cluster_join.go
index cdbf0b3..18cfa4e 100644
--- a/metropolis/node/core/cluster/cluster_join.go
+++ b/metropolis/node/core/cluster/cluster_join.go
@@ -14,9 +14,9 @@
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
 	"source.monogon.dev/metropolis/node/core/rpc/resolver"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	cpb "source.monogon.dev/metropolis/proto/common"
 	ppb "source.monogon.dev/metropolis/proto/private"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // join implements Join Flow of an already registered node.
diff --git a/metropolis/node/core/cluster/cluster_register.go b/metropolis/node/core/cluster/cluster_register.go
index 2389eaf..36f7394 100644
--- a/metropolis/node/core/cluster/cluster_register.go
+++ b/metropolis/node/core/cluster/cluster_register.go
@@ -17,7 +17,7 @@
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
 	"source.monogon.dev/metropolis/node/core/rpc/resolver"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	apb "source.monogon.dev/metropolis/proto/api"
diff --git a/metropolis/node/core/clusternet/BUILD.bazel b/metropolis/node/core/clusternet/BUILD.bazel
index 1ccce66..5ab1d8a 100644
--- a/metropolis/node/core/clusternet/BUILD.bazel
+++ b/metropolis/node/core/clusternet/BUILD.bazel
@@ -1,5 +1,5 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "clusternet",
@@ -16,9 +16,9 @@
         "//metropolis/node/core/curator/watcher",
         "//metropolis/node/core/localstorage",
         "//metropolis/node/core/network",
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/common",
+        "//osbase/event",
+        "//osbase/supervisor",
         "@com_github_cenkalti_backoff_v4//:backoff",
         "@com_github_vishvananda_netlink//:netlink",
         "@com_zx2c4_golang_wireguard_wgctrl//:wgctrl",
@@ -36,10 +36,10 @@
         "//metropolis/node/core/localstorage",
         "//metropolis/node/core/localstorage/declarative",
         "//metropolis/node/core/network",
-        "//metropolis/pkg/event/memory",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/common",
         "//metropolis/test/util",
+        "//osbase/event/memory",
+        "//osbase/supervisor",
         "@com_zx2c4_golang_wireguard_wgctrl//:wgctrl",
         "@com_zx2c4_golang_wireguard_wgctrl//wgtypes",
     ],
diff --git a/metropolis/node/core/clusternet/clusternet.go b/metropolis/node/core/clusternet/clusternet.go
index cde3e0e..1c3c7b3 100644
--- a/metropolis/node/core/clusternet/clusternet.go
+++ b/metropolis/node/core/clusternet/clusternet.go
@@ -34,8 +34,8 @@
 	"source.monogon.dev/metropolis/node/core/curator/watcher"
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/network"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/supervisor"
 
 	apb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
diff --git a/metropolis/node/core/clusternet/clusternet_test.go b/metropolis/node/core/clusternet/clusternet_test.go
index 7089cc7..f07f3e5 100644
--- a/metropolis/node/core/clusternet/clusternet_test.go
+++ b/metropolis/node/core/clusternet/clusternet_test.go
@@ -17,9 +17,9 @@
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/localstorage/declarative"
 	"source.monogon.dev/metropolis/node/core/network"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	"source.monogon.dev/metropolis/test/util"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 
 	apb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
diff --git a/metropolis/node/core/consensus/BUILD.bazel b/metropolis/node/core/consensus/BUILD.bazel
index 359b6dc..eeb8d3b 100644
--- a/metropolis/node/core/consensus/BUILD.bazel
+++ b/metropolis/node/core/consensus/BUILD.bazel
@@ -16,13 +16,13 @@
         "//metropolis/node/core/consensus/client",
         "//metropolis/node/core/identity",
         "//metropolis/node/core/localstorage",
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/event/memory",
-        "//metropolis/pkg/logbuffer",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/logtree/unraw",
-        "//metropolis/pkg/pki",
-        "//metropolis/pkg/supervisor",
+        "//osbase/event",
+        "//osbase/event/memory",
+        "//osbase/logbuffer",
+        "//osbase/logtree",
+        "//osbase/logtree/unraw",
+        "//osbase/pki",
+        "//osbase/supervisor",
         "@io_etcd_go_etcd_client_v3//:client",
         "@io_etcd_go_etcd_server_v3//embed",
     ],
@@ -45,10 +45,10 @@
     deps = [
         "//metropolis/node/core/localstorage",
         "//metropolis/node/core/localstorage/declarative",
-        "//metropolis/pkg/logbuffer",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/supervisor",
         "//metropolis/test/util",
+        "//osbase/logbuffer",
+        "//osbase/logtree",
+        "//osbase/supervisor",
         "@com_github_google_go_cmp//cmp",
     ],
 )
diff --git a/metropolis/node/core/consensus/configuration.go b/metropolis/node/core/consensus/configuration.go
index dc3cd06..bb3db82 100644
--- a/metropolis/node/core/consensus/configuration.go
+++ b/metropolis/node/core/consensus/configuration.go
@@ -15,7 +15,7 @@
 	"source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/localstorage"
-	"source.monogon.dev/metropolis/pkg/pki"
+	"source.monogon.dev/osbase/pki"
 )
 
 // Config describes the startup configuration of a consensus instance.
diff --git a/metropolis/node/core/consensus/consensus.go b/metropolis/node/core/consensus/consensus.go
index 3244972..e749f7b 100644
--- a/metropolis/node/core/consensus/consensus.go
+++ b/metropolis/node/core/consensus/consensus.go
@@ -102,11 +102,11 @@
 
 	"source.monogon.dev/metropolis/node/core/consensus/client"
 	"source.monogon.dev/metropolis/node/core/identity"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/logtree/unraw"
-	"source.monogon.dev/metropolis/pkg/pki"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/logtree/unraw"
+	"source.monogon.dev/osbase/pki"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 var (
diff --git a/metropolis/node/core/consensus/consensus_test.go b/metropolis/node/core/consensus/consensus_test.go
index 1866ff5..85df62e 100644
--- a/metropolis/node/core/consensus/consensus_test.go
+++ b/metropolis/node/core/consensus/consensus_test.go
@@ -29,8 +29,8 @@
 
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/localstorage/declarative"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	"source.monogon.dev/metropolis/test/util"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type boilerplate struct {
diff --git a/metropolis/node/core/consensus/logparser.go b/metropolis/node/core/consensus/logparser.go
index dbd3b1d..b403423 100644
--- a/metropolis/node/core/consensus/logparser.go
+++ b/metropolis/node/core/consensus/logparser.go
@@ -8,9 +8,9 @@
 	"strings"
 	"time"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/logtree/unraw"
+	"source.monogon.dev/osbase/logbuffer"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/logtree/unraw"
 )
 
 // etcdLogEntry is a JSON-encoded, structured log entry received from a running
diff --git a/metropolis/node/core/consensus/logparser_test.go b/metropolis/node/core/consensus/logparser_test.go
index c53c13d..cfe6fea 100644
--- a/metropolis/node/core/consensus/logparser_test.go
+++ b/metropolis/node/core/consensus/logparser_test.go
@@ -6,8 +6,8 @@
 
 	"github.com/google/go-cmp/cmp"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logbuffer"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // TestParsing exercises the parseEtcdLogEntry function.
diff --git a/metropolis/node/core/consensus/status.go b/metropolis/node/core/consensus/status.go
index 44562bf..994e9f7 100644
--- a/metropolis/node/core/consensus/status.go
+++ b/metropolis/node/core/consensus/status.go
@@ -13,8 +13,8 @@
 	"source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/consensus/client"
 	"source.monogon.dev/metropolis/node/core/identity"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/pki"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/pki"
 )
 
 // ServiceHandle is implemented by Service and should be the type expected by
diff --git a/metropolis/node/core/consensus/testhelpers.go b/metropolis/node/core/consensus/testhelpers.go
index 3522e06..3471e3c 100644
--- a/metropolis/node/core/consensus/testhelpers.go
+++ b/metropolis/node/core/consensus/testhelpers.go
@@ -6,7 +6,7 @@
 
 	clientv3 "go.etcd.io/etcd/client/v3"
 
-	"source.monogon.dev/metropolis/pkg/event/memory"
+	"source.monogon.dev/osbase/event/memory"
 )
 
 type testServiceHandle struct {
diff --git a/metropolis/node/core/curator/BUILD.bazel b/metropolis/node/core/curator/BUILD.bazel
index e8c3746..f619d4b 100644
--- a/metropolis/node/core/curator/BUILD.bazel
+++ b/metropolis/node/core/curator/BUILD.bazel
@@ -31,13 +31,13 @@
         "//metropolis/node/core/identity",
         "//metropolis/node/core/rpc",
         "//metropolis/node/kubernetes/pki",
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/event/etcd",
-        "//metropolis/pkg/event/memory",
-        "//metropolis/pkg/pki",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/api",
         "//metropolis/proto/common",
+        "//osbase/event",
+        "//osbase/event/etcd",
+        "//osbase/event/memory",
+        "//osbase/pki",
+        "//osbase/supervisor",
         "@com_github_google_cel_go//cel:go_default_library",
         "@com_github_google_cel_go//checker/decls:go_default_library",
         "@com_github_google_cel_go//common/types:go_default_library",
@@ -73,13 +73,13 @@
         "//metropolis/node/core/curator/proto/private",
         "//metropolis/node/core/identity",
         "//metropolis/node/core/rpc",
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/pki",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/api",
         "//metropolis/proto/common",
         "//metropolis/test/util",
+        "//osbase/event",
+        "//osbase/logtree",
+        "//osbase/pki",
+        "//osbase/supervisor",
         "@com_github_google_go_cmp//cmp",
         "@io_etcd_go_etcd_client_v3//:client",
         "@io_etcd_go_etcd_tests_v3//integration",
diff --git a/metropolis/node/core/curator/bootstrap.go b/metropolis/node/core/curator/bootstrap.go
index ac2a4de..e092c63 100644
--- a/metropolis/node/core/curator/bootstrap.go
+++ b/metropolis/node/core/curator/bootstrap.go
@@ -9,7 +9,7 @@
 
 	"source.monogon.dev/metropolis/node/core/consensus/client"
 	"source.monogon.dev/metropolis/node/core/identity"
-	"source.monogon.dev/metropolis/pkg/pki"
+	"source.monogon.dev/osbase/pki"
 
 	ppb "source.monogon.dev/metropolis/node/core/curator/proto/private"
 )
diff --git a/metropolis/node/core/curator/curator.go b/metropolis/node/core/curator/curator.go
index 149cb18..665fea1 100644
--- a/metropolis/node/core/curator/curator.go
+++ b/metropolis/node/core/curator/curator.go
@@ -27,8 +27,8 @@
 	"source.monogon.dev/metropolis/node/core/consensus/client"
 	ppb "source.monogon.dev/metropolis/node/core/curator/proto/private"
 	"source.monogon.dev/metropolis/node/core/identity"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // Config is the configuration of the curator.
diff --git a/metropolis/node/core/curator/curator_test.go b/metropolis/node/core/curator/curator_test.go
index 6cd3f84..841a813 100644
--- a/metropolis/node/core/curator/curator_test.go
+++ b/metropolis/node/core/curator/curator_test.go
@@ -14,10 +14,10 @@
 
 	"source.monogon.dev/metropolis/node/core/consensus"
 	"source.monogon.dev/metropolis/node/core/identity"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	"source.monogon.dev/metropolis/test/util"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 var (
diff --git a/metropolis/node/core/curator/impl_follower.go b/metropolis/node/core/curator/impl_follower.go
index 5963737..2a7f45e 100644
--- a/metropolis/node/core/curator/impl_follower.go
+++ b/metropolis/node/core/curator/impl_follower.go
@@ -11,7 +11,7 @@
 	cpb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
-	"source.monogon.dev/metropolis/pkg/event/memory"
+	"source.monogon.dev/osbase/event/memory"
 )
 
 type curatorFollower struct {
diff --git a/metropolis/node/core/curator/impl_leader_aaa.go b/metropolis/node/core/curator/impl_leader_aaa.go
index c9eb08f..8f4eb84 100644
--- a/metropolis/node/core/curator/impl_leader_aaa.go
+++ b/metropolis/node/core/curator/impl_leader_aaa.go
@@ -13,8 +13,8 @@
 	ppb "source.monogon.dev/metropolis/node/core/curator/proto/private"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
-	"source.monogon.dev/metropolis/pkg/pki"
 	apb "source.monogon.dev/metropolis/proto/api"
+	"source.monogon.dev/osbase/pki"
 )
 
 const (
diff --git a/metropolis/node/core/curator/impl_leader_cluster_networking.go b/metropolis/node/core/curator/impl_leader_cluster_networking.go
index 52d8c12..5dab657 100644
--- a/metropolis/node/core/curator/impl_leader_cluster_networking.go
+++ b/metropolis/node/core/curator/impl_leader_cluster_networking.go
@@ -12,8 +12,8 @@
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/event/etcd"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/event/etcd"
 )
 
 // preapreClusternetCacheUnlocked makes sure the leader's clusternetCache exists,
diff --git a/metropolis/node/core/curator/impl_leader_curator.go b/metropolis/node/core/curator/impl_leader_curator.go
index d81f4eb..126ba49 100644
--- a/metropolis/node/core/curator/impl_leader_curator.go
+++ b/metropolis/node/core/curator/impl_leader_curator.go
@@ -19,10 +19,10 @@
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/event/etcd"
-	"source.monogon.dev/metropolis/pkg/pki"
 	cpb "source.monogon.dev/metropolis/proto/common"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/event/etcd"
+	"source.monogon.dev/osbase/pki"
 )
 
 // leaderCurator implements the Curator gRPC API (ipb.Curator) as a curator
diff --git a/metropolis/node/core/curator/impl_leader_test.go b/metropolis/node/core/curator/impl_leader_test.go
index 5c3c337..a5d1ea1 100644
--- a/metropolis/node/core/curator/impl_leader_test.go
+++ b/metropolis/node/core/curator/impl_leader_test.go
@@ -31,10 +31,10 @@
 	ppb "source.monogon.dev/metropolis/node/core/curator/proto/private"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/pki"
 	apb "source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/pki"
 )
 
 // fakeLeader creates a curatorLeader without any underlying leader election, in
diff --git a/metropolis/node/core/curator/listener.go b/metropolis/node/core/curator/listener.go
index 77fe0e0..ede28bb 100644
--- a/metropolis/node/core/curator/listener.go
+++ b/metropolis/node/core/curator/listener.go
@@ -16,9 +16,9 @@
 	cpb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	apb "source.monogon.dev/metropolis/proto/api"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // listener is the curator runnable responsible for listening for gRPC
diff --git a/metropolis/node/core/curator/state_node.go b/metropolis/node/core/curator/state_node.go
index 5e5ef2e..0cfc87e 100644
--- a/metropolis/node/core/curator/state_node.go
+++ b/metropolis/node/core/curator/state_node.go
@@ -33,7 +33,7 @@
 	"source.monogon.dev/metropolis/node/core/consensus"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
-	"source.monogon.dev/metropolis/pkg/pki"
+	"source.monogon.dev/osbase/pki"
 
 	ppb "source.monogon.dev/metropolis/node/core/curator/proto/private"
 	cpb "source.monogon.dev/metropolis/proto/common"
diff --git a/metropolis/node/core/curator/state_pki.go b/metropolis/node/core/curator/state_pki.go
index 2384158..7eb3f76 100644
--- a/metropolis/node/core/curator/state_pki.go
+++ b/metropolis/node/core/curator/state_pki.go
@@ -2,7 +2,7 @@
 
 import (
 	"source.monogon.dev/metropolis/node/core/identity"
-	"source.monogon.dev/metropolis/pkg/pki"
+	"source.monogon.dev/osbase/pki"
 )
 
 var (
diff --git a/metropolis/node/core/debug_service_disabled.go b/metropolis/node/core/debug_service_disabled.go
index da64266..815a0dd 100644
--- a/metropolis/node/core/debug_service_disabled.go
+++ b/metropolis/node/core/debug_service_disabled.go
@@ -5,7 +5,7 @@
 
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/roleserve"
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // runDebugService runs the debug service if this is a debug build. Otherwise
diff --git a/metropolis/node/core/debug_service_enabled.go b/metropolis/node/core/debug_service_enabled.go
index 75e92bc..4759dab 100644
--- a/metropolis/node/core/debug_service_enabled.go
+++ b/metropolis/node/core/debug_service_enabled.go
@@ -34,8 +34,8 @@
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/mgmt"
 	"source.monogon.dev/metropolis/node/core/roleserve"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 
 	common "source.monogon.dev/metropolis/node"
 	apb "source.monogon.dev/metropolis/proto/api"
diff --git a/metropolis/node/core/devmgr/BUILD.bazel b/metropolis/node/core/devmgr/BUILD.bazel
index 15b8065..bc4a293 100644
--- a/metropolis/node/core/devmgr/BUILD.bazel
+++ b/metropolis/node/core/devmgr/BUILD.bazel
@@ -6,8 +6,8 @@
     importpath = "source.monogon.dev/metropolis/node/core/devmgr",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/kmod",
-        "//metropolis/pkg/supervisor",
+        "//osbase/kmod",
+        "//osbase/supervisor",
         "@com_github_mdlayher_kobject//:kobject",
     ],
 )
diff --git a/metropolis/node/core/devmgr/devmgr.go b/metropolis/node/core/devmgr/devmgr.go
index 8133c77..b5c1835 100644
--- a/metropolis/node/core/devmgr/devmgr.go
+++ b/metropolis/node/core/devmgr/devmgr.go
@@ -15,8 +15,8 @@
 
 	"github.com/mdlayher/kobject"
 
-	"source.monogon.dev/metropolis/pkg/kmod"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/kmod"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type Service struct{}
diff --git a/metropolis/node/core/localstorage/BUILD.bazel b/metropolis/node/core/localstorage/BUILD.bazel
index 075a07c..4249297 100644
--- a/metropolis/node/core/localstorage/BUILD.bazel
+++ b/metropolis/node/core/localstorage/BUILD.bazel
@@ -15,11 +15,11 @@
         "//metropolis/node/core/localstorage/crypt",
         "//metropolis/node/core/localstorage/declarative",
         "//metropolis/node/core/update",
-        "//metropolis/pkg/tpm",
         "//metropolis/proto/api",
         "//metropolis/proto/common",
         "//metropolis/proto/private",
         "//net/proto",
+        "//osbase/tpm",
         "@org_golang_google_protobuf//proto",
         "@org_golang_x_sys//unix",
     ],
diff --git a/metropolis/node/core/localstorage/crypt/BUILD.bazel b/metropolis/node/core/localstorage/crypt/BUILD.bazel
index d8e9881..39b6a53 100644
--- a/metropolis/node/core/localstorage/crypt/BUILD.bazel
+++ b/metropolis/node/core/localstorage/crypt/BUILD.bazel
@@ -1,5 +1,5 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "crypt",
@@ -14,12 +14,12 @@
     visibility = ["//metropolis/node/core/localstorage:__subpackages__"],
     deps = [
         "//metropolis/node/core/update",
-        "//metropolis/pkg/blockdev",
-        "//metropolis/pkg/devicemapper",
-        "//metropolis/pkg/efivarfs",
-        "//metropolis/pkg/gpt",
-        "//metropolis/pkg/supervisor",
-        "//metropolis/pkg/sysfs",
+        "//osbase/blockdev",
+        "//osbase/devicemapper",
+        "//osbase/efivarfs",
+        "//osbase/gpt",
+        "//osbase/supervisor",
+        "//osbase/sysfs",
         "@com_github_google_uuid//:uuid",
         "@org_golang_x_sys//unix",
     ],
diff --git a/metropolis/node/core/localstorage/crypt/blockdev.go b/metropolis/node/core/localstorage/crypt/blockdev.go
index d021d9c..6466afc 100644
--- a/metropolis/node/core/localstorage/crypt/blockdev.go
+++ b/metropolis/node/core/localstorage/crypt/blockdev.go
@@ -28,11 +28,11 @@
 	"golang.org/x/sys/unix"
 
 	"source.monogon.dev/metropolis/node/core/update"
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/efivarfs"
-	"source.monogon.dev/metropolis/pkg/gpt"
-	"source.monogon.dev/metropolis/pkg/supervisor"
-	"source.monogon.dev/metropolis/pkg/sysfs"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/efivarfs"
+	"source.monogon.dev/osbase/gpt"
+	"source.monogon.dev/osbase/supervisor"
+	"source.monogon.dev/osbase/sysfs"
 )
 
 // NodeDataPartitionType is the partition type value for a Metropolis Node
diff --git a/metropolis/node/core/localstorage/crypt/crypt.go b/metropolis/node/core/localstorage/crypt/crypt.go
index 0336832..bd20efd 100644
--- a/metropolis/node/core/localstorage/crypt/crypt.go
+++ b/metropolis/node/core/localstorage/crypt/crypt.go
@@ -38,7 +38,7 @@
 import (
 	"fmt"
 
-	"source.monogon.dev/metropolis/pkg/blockdev"
+	"source.monogon.dev/osbase/blockdev"
 )
 
 // Mode of block device encryption and/or authentication, if any. See the
diff --git a/metropolis/node/core/localstorage/crypt/crypt_encryption.go b/metropolis/node/core/localstorage/crypt/crypt_encryption.go
index c5f246c..fb8a129 100644
--- a/metropolis/node/core/localstorage/crypt/crypt_encryption.go
+++ b/metropolis/node/core/localstorage/crypt/crypt_encryption.go
@@ -7,8 +7,8 @@
 
 	"golang.org/x/sys/unix"
 
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/devicemapper"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/devicemapper"
 )
 
 func encryptionDevPath(name string) string {
diff --git a/metropolis/node/core/localstorage/crypt/crypt_integrity.go b/metropolis/node/core/localstorage/crypt/crypt_integrity.go
index 7276a3e..b2e43f8 100644
--- a/metropolis/node/core/localstorage/crypt/crypt_integrity.go
+++ b/metropolis/node/core/localstorage/crypt/crypt_integrity.go
@@ -7,8 +7,8 @@
 
 	"golang.org/x/sys/unix"
 
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/devicemapper"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/devicemapper"
 )
 
 func integrityDevPath(name string) string {
diff --git a/metropolis/node/core/localstorage/directory_data.go b/metropolis/node/core/localstorage/directory_data.go
index 5607e0a..7637056 100644
--- a/metropolis/node/core/localstorage/directory_data.go
+++ b/metropolis/node/core/localstorage/directory_data.go
@@ -25,9 +25,9 @@
 
 	"source.monogon.dev/metropolis/node/core/localstorage/crypt"
 	"source.monogon.dev/metropolis/node/core/localstorage/declarative"
-	"source.monogon.dev/metropolis/pkg/tpm"
 	cpb "source.monogon.dev/metropolis/proto/common"
 	ppb "source.monogon.dev/metropolis/proto/private"
+	"source.monogon.dev/osbase/tpm"
 )
 
 var keySize uint16 = 256 / 8
diff --git a/metropolis/node/core/localstorage/storage_esp.go b/metropolis/node/core/localstorage/storage_esp.go
index 945e6ca..8fc71d0 100644
--- a/metropolis/node/core/localstorage/storage_esp.go
+++ b/metropolis/node/core/localstorage/storage_esp.go
@@ -24,11 +24,11 @@
 	"google.golang.org/protobuf/proto"
 
 	"source.monogon.dev/metropolis/node/core/localstorage/declarative"
-	"source.monogon.dev/metropolis/pkg/tpm"
 	apb "source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
 	ppb "source.monogon.dev/metropolis/proto/private"
 	npb "source.monogon.dev/net/proto"
+	"source.monogon.dev/osbase/tpm"
 )
 
 // ESPDirectory is the EFI System Partition. It is a cleartext partition
diff --git a/metropolis/node/core/main.go b/metropolis/node/core/main.go
index 9a7e39e..e9d1ad1 100644
--- a/metropolis/node/core/main.go
+++ b/metropolis/node/core/main.go
@@ -36,10 +36,10 @@
 	"source.monogon.dev/metropolis/node/core/rpc/resolver"
 	timesvc "source.monogon.dev/metropolis/node/core/time"
 	"source.monogon.dev/metropolis/node/core/update"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
-	"source.monogon.dev/metropolis/pkg/tpm"
 	mversion "source.monogon.dev/metropolis/version"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
+	"source.monogon.dev/osbase/tpm"
 	"source.monogon.dev/version"
 )
 
diff --git a/metropolis/node/core/metrics/BUILD.bazel b/metropolis/node/core/metrics/BUILD.bazel
index 9169ae6..6385bb8 100644
--- a/metropolis/node/core/metrics/BUILD.bazel
+++ b/metropolis/node/core/metrics/BUILD.bazel
@@ -15,7 +15,7 @@
         "//metropolis/node/core/curator/proto/api",
         "//metropolis/node/core/curator/watcher",
         "//metropolis/node/core/identity",
-        "//metropolis/pkg/supervisor",
+        "//osbase/supervisor",
     ],
 )
 
@@ -30,9 +30,9 @@
     deps = [
         "//metropolis/node",
         "//metropolis/node/core/curator/proto/api",
-        "//metropolis/pkg/freeport",
-        "//metropolis/pkg/supervisor",
         "//metropolis/test/util",
+        "//osbase/freeport",
+        "//osbase/supervisor",
         "@com_zx2c4_golang_wireguard_wgctrl//wgtypes",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
     ],
diff --git a/metropolis/node/core/metrics/discovery.go b/metropolis/node/core/metrics/discovery.go
index ff3fcf1..116291e 100644
--- a/metropolis/node/core/metrics/discovery.go
+++ b/metropolis/node/core/metrics/discovery.go
@@ -9,7 +9,7 @@
 
 	"source.monogon.dev/go/types/mapsets"
 	"source.monogon.dev/metropolis/node/core/curator/watcher"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 )
diff --git a/metropolis/node/core/metrics/exporters.go b/metropolis/node/core/metrics/exporters.go
index c14abcc..2dd2cfc 100644
--- a/metropolis/node/core/metrics/exporters.go
+++ b/metropolis/node/core/metrics/exporters.go
@@ -6,7 +6,7 @@
 	"net/http"
 
 	"source.monogon.dev/metropolis/node"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // An Exporter is a Prometheus binary running under the Metrics service which
diff --git a/metropolis/node/core/metrics/metrics.go b/metropolis/node/core/metrics/metrics.go
index bd229fa..b07a980 100644
--- a/metropolis/node/core/metrics/metrics.go
+++ b/metropolis/node/core/metrics/metrics.go
@@ -11,7 +11,7 @@
 
 	"source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/identity"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // Service is the Metropolis Metrics Service.
diff --git a/metropolis/node/core/metrics/metrics_test.go b/metropolis/node/core/metrics/metrics_test.go
index b0a9310..06b1d4e 100644
--- a/metropolis/node/core/metrics/metrics_test.go
+++ b/metropolis/node/core/metrics/metrics_test.go
@@ -18,9 +18,9 @@
 	apb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 
 	"source.monogon.dev/metropolis/node"
-	"source.monogon.dev/metropolis/pkg/freeport"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	"source.monogon.dev/metropolis/test/util"
+	"source.monogon.dev/osbase/freeport"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 func fakeExporter(name, value string) *Exporter {
diff --git a/metropolis/node/core/mgmt/BUILD.bazel b/metropolis/node/core/mgmt/BUILD.bazel
index ecec6d1..65a54a6 100644
--- a/metropolis/node/core/mgmt/BUILD.bazel
+++ b/metropolis/node/core/mgmt/BUILD.bazel
@@ -14,11 +14,11 @@
         "//metropolis/node/core/identity",
         "//metropolis/node/core/rpc",
         "//metropolis/node/core/update",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/logtree/proto",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/api",
         "//metropolis/proto/common",
+        "//osbase/logtree",
+        "//osbase/logtree/proto",
+        "//osbase/supervisor",
         "@com_github_vishvananda_netlink//:netlink",
         "@org_golang_google_grpc//:go_default_library",
         "@org_golang_google_grpc//codes",
@@ -32,10 +32,10 @@
     srcs = ["svc_logs_test.go"],
     embed = [":mgmt"],
     deps = [
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/logtree/proto",
         "//metropolis/proto/api",
         "//metropolis/proto/common",
+        "//osbase/logtree",
+        "//osbase/logtree/proto",
         "@com_github_google_go_cmp//cmp",
         "@org_golang_google_grpc//:go_default_library",
         "@org_golang_google_grpc//credentials/insecure",
diff --git a/metropolis/node/core/mgmt/mgmt.go b/metropolis/node/core/mgmt/mgmt.go
index e9c3f91..b0632bb 100644
--- a/metropolis/node/core/mgmt/mgmt.go
+++ b/metropolis/node/core/mgmt/mgmt.go
@@ -14,8 +14,8 @@
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
 	"source.monogon.dev/metropolis/node/core/update"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 
 	apb "source.monogon.dev/metropolis/proto/api"
 )
diff --git a/metropolis/node/core/mgmt/svc_logs.go b/metropolis/node/core/mgmt/svc_logs.go
index 1a884b3..ef5c1d7 100644
--- a/metropolis/node/core/mgmt/svc_logs.go
+++ b/metropolis/node/core/mgmt/svc_logs.go
@@ -7,10 +7,10 @@
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
-	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
 	"source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
+	"source.monogon.dev/osbase/logtree"
+	lpb "source.monogon.dev/osbase/logtree/proto"
 )
 
 const (
diff --git a/metropolis/node/core/mgmt/svc_logs_test.go b/metropolis/node/core/mgmt/svc_logs_test.go
index 162de57..dec1459 100644
--- a/metropolis/node/core/mgmt/svc_logs_test.go
+++ b/metropolis/node/core/mgmt/svc_logs_test.go
@@ -16,10 +16,10 @@
 	"google.golang.org/grpc/test/bufconn"
 	"google.golang.org/protobuf/testing/protocmp"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
-	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
 	"source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
+	"source.monogon.dev/osbase/logtree"
+	lpb "source.monogon.dev/osbase/logtree/proto"
 )
 
 func dut(t *testing.T) (*Service, *grpc.ClientConn) {
diff --git a/metropolis/node/core/network/BUILD.bazel b/metropolis/node/core/network/BUILD.bazel
index 52e4614..07120e4 100644
--- a/metropolis/node/core/network/BUILD.bazel
+++ b/metropolis/node/core/network/BUILD.bazel
@@ -14,11 +14,11 @@
         "//metropolis/node/core/network/dhcp4c",
         "//metropolis/node/core/network/dhcp4c/callback",
         "//metropolis/node/core/network/dns",
-        "//metropolis/pkg/event/memory",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/supervisor",
-        "//metropolis/pkg/sysctl",
         "//net/proto",
+        "//osbase/event/memory",
+        "//osbase/logtree",
+        "//osbase/supervisor",
+        "//osbase/sysctl",
         "@com_github_google_nftables//:nftables",
         "@com_github_google_nftables//expr",
         "@com_github_insomniacslk_dhcp//dhcpv4",
diff --git a/metropolis/node/core/network/dhcp4c/BUILD.bazel b/metropolis/node/core/network/dhcp4c/BUILD.bazel
index d514f2d..24dbe83 100644
--- a/metropolis/node/core/network/dhcp4c/BUILD.bazel
+++ b/metropolis/node/core/network/dhcp4c/BUILD.bazel
@@ -15,7 +15,7 @@
     ],
     deps = [
         "//metropolis/node/core/network/dhcp4c/transport",
-        "//metropolis/pkg/supervisor",
+        "//osbase/supervisor",
         "@com_github_cenkalti_backoff_v4//:backoff",
         "@com_github_insomniacslk_dhcp//dhcpv4",
         "@com_github_insomniacslk_dhcp//iana",
diff --git a/metropolis/node/core/network/dhcp4c/callback/BUILD.bazel b/metropolis/node/core/network/dhcp4c/callback/BUILD.bazel
index d841c6e..89ad035 100644
--- a/metropolis/node/core/network/dhcp4c/callback/BUILD.bazel
+++ b/metropolis/node/core/network/dhcp4c/callback/BUILD.bazel
@@ -1,5 +1,5 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "callback",
diff --git a/metropolis/node/core/network/dhcp4c/dhcpc.go b/metropolis/node/core/network/dhcp4c/dhcpc.go
index 76347e8..d14dee8 100644
--- a/metropolis/node/core/network/dhcp4c/dhcpc.go
+++ b/metropolis/node/core/network/dhcp4c/dhcpc.go
@@ -37,7 +37,7 @@
 	"github.com/insomniacslk/dhcp/iana"
 
 	"source.monogon.dev/metropolis/node/core/network/dhcp4c/transport"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type state int
diff --git a/metropolis/node/core/network/dns/BUILD.bazel b/metropolis/node/core/network/dns/BUILD.bazel
index 4dccf49..6d51db1 100644
--- a/metropolis/node/core/network/dns/BUILD.bazel
+++ b/metropolis/node/core/network/dns/BUILD.bazel
@@ -9,8 +9,8 @@
     importpath = "source.monogon.dev/metropolis/node/core/network/dns",
     visibility = ["//metropolis/node:__subpackages__"],
     deps = [
-        "//metropolis/pkg/fileargs",
-        "//metropolis/pkg/supervisor",
+        "//osbase/fileargs",
+        "//osbase/supervisor",
         "@org_golang_x_sys//unix",
     ],
 )
diff --git a/metropolis/node/core/network/dns/coredns.go b/metropolis/node/core/network/dns/coredns.go
index af4562b..472ab5c 100644
--- a/metropolis/node/core/network/dns/coredns.go
+++ b/metropolis/node/core/network/dns/coredns.go
@@ -29,8 +29,8 @@
 
 	"golang.org/x/sys/unix"
 
-	"source.monogon.dev/metropolis/pkg/fileargs"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/fileargs"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 const corefileBase = `
diff --git a/metropolis/node/core/network/hostsfile/BUILD.bazel b/metropolis/node/core/network/hostsfile/BUILD.bazel
index 51b7f4f..2490493 100644
--- a/metropolis/node/core/network/hostsfile/BUILD.bazel
+++ b/metropolis/node/core/network/hostsfile/BUILD.bazel
@@ -10,9 +10,9 @@
         "//metropolis/node/core/curator/watcher",
         "//metropolis/node/core/localstorage",
         "//metropolis/node/core/network",
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/common",
+        "//osbase/event",
+        "//osbase/supervisor",
         "@org_golang_google_grpc//:go_default_library",
         "@org_golang_google_protobuf//proto",
         "@org_golang_x_sys//unix",
diff --git a/metropolis/node/core/network/hostsfile/hostsfile.go b/metropolis/node/core/network/hostsfile/hostsfile.go
index c09ea29..883d8cf 100644
--- a/metropolis/node/core/network/hostsfile/hostsfile.go
+++ b/metropolis/node/core/network/hostsfile/hostsfile.go
@@ -30,8 +30,8 @@
 	"source.monogon.dev/metropolis/node/core/curator/watcher"
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/network"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/supervisor"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
diff --git a/metropolis/node/core/network/main.go b/metropolis/node/core/network/main.go
index cc57aa5..487a0eb 100644
--- a/metropolis/node/core/network/main.go
+++ b/metropolis/node/core/network/main.go
@@ -30,9 +30,9 @@
 	"source.monogon.dev/metropolis/node/core/network/dhcp4c"
 	dhcpcb "source.monogon.dev/metropolis/node/core/network/dhcp4c/callback"
 	"source.monogon.dev/metropolis/node/core/network/dns"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
-	"source.monogon.dev/metropolis/pkg/sysctl"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
+	"source.monogon.dev/osbase/sysctl"
 
 	netpb "source.monogon.dev/net/proto"
 )
diff --git a/metropolis/node/core/network/quirks.go b/metropolis/node/core/network/quirks.go
index 6dd5808..6a3f5cc 100644
--- a/metropolis/node/core/network/quirks.go
+++ b/metropolis/node/core/network/quirks.go
@@ -9,7 +9,7 @@
 	"github.com/vishvananda/netlink"
 	"golang.org/x/sys/unix"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // applyQuirks applies settings to drivers and/or hardware to make it work
diff --git a/metropolis/node/core/network/static.go b/metropolis/node/core/network/static.go
index 0bbbab6..d69815c 100644
--- a/metropolis/node/core/network/static.go
+++ b/metropolis/node/core/network/static.go
@@ -19,9 +19,9 @@
 	"source.monogon.dev/metropolis/node/core/network/dhcp4c"
 	dhcpcb "source.monogon.dev/metropolis/node/core/network/dhcp4c/callback"
 	"source.monogon.dev/metropolis/node/core/network/dns"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
-	"source.monogon.dev/metropolis/pkg/sysctl"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
+	"source.monogon.dev/osbase/sysctl"
 
 	netpb "source.monogon.dev/net/proto"
 )
diff --git a/metropolis/node/core/nodeparams.go b/metropolis/node/core/nodeparams.go
index cb365d5..bc3c5f0 100644
--- a/metropolis/node/core/nodeparams.go
+++ b/metropolis/node/core/nodeparams.go
@@ -16,7 +16,7 @@
 	apb "source.monogon.dev/metropolis/proto/api"
 
 	"source.monogon.dev/metropolis/node/core/localstorage"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 func nodeParamsFWCFG(ctx context.Context) (*apb.NodeParameters, error) {
diff --git a/metropolis/node/core/panichandler.go b/metropolis/node/core/panichandler.go
index b336103..8a6ef6c 100644
--- a/metropolis/node/core/panichandler.go
+++ b/metropolis/node/core/panichandler.go
@@ -14,7 +14,7 @@
 
 	"golang.org/x/sys/unix"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // This hooks into a global variable which is checked by runtime.write and used
diff --git a/metropolis/node/core/pstore.go b/metropolis/node/core/pstore.go
index c8863e5..dfa30f0 100644
--- a/metropolis/node/core/pstore.go
+++ b/metropolis/node/core/pstore.go
@@ -3,8 +3,8 @@
 import (
 	"context"
 
-	"source.monogon.dev/metropolis/pkg/pstore"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/pstore"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // dumpAndCleanPstore dumps all files accumulated in the pstore into the log
diff --git a/metropolis/node/core/roleserve/BUILD.bazel b/metropolis/node/core/roleserve/BUILD.bazel
index afad843..5d72c70 100644
--- a/metropolis/node/core/roleserve/BUILD.bazel
+++ b/metropolis/node/core/roleserve/BUILD.bazel
@@ -36,13 +36,13 @@
         "//metropolis/node/kubernetes",
         "//metropolis/node/kubernetes/containerd",
         "//metropolis/node/kubernetes/pki",
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/event/memory",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/pki",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/common",
         "//metropolis/version",
+        "//osbase/event",
+        "//osbase/event/memory",
+        "//osbase/logtree",
+        "//osbase/pki",
+        "//osbase/supervisor",
         "@org_golang_google_grpc//:go_default_library",
         "@org_golang_google_protobuf//encoding/prototext",
         "@org_golang_google_protobuf//proto",
@@ -60,10 +60,10 @@
         "//metropolis/node/core/consensus",
         "//metropolis/node/core/curator",
         "//metropolis/node/core/curator/proto/api",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/common",
         "//metropolis/test/util",
         "//metropolis/version",
+        "//osbase/supervisor",
         "@com_github_cenkalti_backoff_v4//:backoff",
         "@com_github_google_go_cmp//cmp",
         "@org_golang_google_grpc//:go_default_library",
diff --git a/metropolis/node/core/roleserve/roleserve.go b/metropolis/node/core/roleserve/roleserve.go
index ad8207b..f03a83b 100644
--- a/metropolis/node/core/roleserve/roleserve.go
+++ b/metropolis/node/core/roleserve/roleserve.go
@@ -47,10 +47,10 @@
 	"source.monogon.dev/metropolis/node/core/network"
 	"source.monogon.dev/metropolis/node/core/rpc/resolver"
 	"source.monogon.dev/metropolis/node/core/update"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	cpb "source.monogon.dev/metropolis/proto/common"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // Config is the configuration of the role server.
diff --git a/metropolis/node/core/roleserve/worker_clusternet.go b/metropolis/node/core/roleserve/worker_clusternet.go
index 1eb5649..a2db859 100644
--- a/metropolis/node/core/roleserve/worker_clusternet.go
+++ b/metropolis/node/core/roleserve/worker_clusternet.go
@@ -7,8 +7,8 @@
 	"source.monogon.dev/metropolis/node/core/clusternet"
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/network"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 )
diff --git a/metropolis/node/core/roleserve/worker_controlplane.go b/metropolis/node/core/roleserve/worker_controlplane.go
index 777f887..dbae49f 100644
--- a/metropolis/node/core/roleserve/worker_controlplane.go
+++ b/metropolis/node/core/roleserve/worker_controlplane.go
@@ -12,11 +12,11 @@
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/rpc/resolver"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/pki"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	cpb "source.monogon.dev/metropolis/proto/common"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/pki"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // workerControlPlane is the Control Plane Worker, responsible for maintaining a
diff --git a/metropolis/node/core/roleserve/worker_heartbeat.go b/metropolis/node/core/roleserve/worker_heartbeat.go
index 6ba07c5..7a77cb9 100644
--- a/metropolis/node/core/roleserve/worker_heartbeat.go
+++ b/metropolis/node/core/roleserve/worker_heartbeat.go
@@ -9,8 +9,8 @@
 	"source.monogon.dev/metropolis/node/core/curator"
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	"source.monogon.dev/metropolis/node/core/network"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // workerHeartbeat is a service that periodically updates node's heartbeat
diff --git a/metropolis/node/core/roleserve/worker_hostsfile.go b/metropolis/node/core/roleserve/worker_hostsfile.go
index 8574235..6e1a1ca 100644
--- a/metropolis/node/core/roleserve/worker_hostsfile.go
+++ b/metropolis/node/core/roleserve/worker_hostsfile.go
@@ -6,8 +6,8 @@
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/core/network"
 	"source.monogon.dev/metropolis/node/core/network/hostsfile"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 )
diff --git a/metropolis/node/core/roleserve/worker_kubernetes.go b/metropolis/node/core/roleserve/worker_kubernetes.go
index c3fcfb3..eaa092a 100644
--- a/metropolis/node/core/roleserve/worker_kubernetes.go
+++ b/metropolis/node/core/roleserve/worker_kubernetes.go
@@ -13,10 +13,10 @@
 	"source.monogon.dev/metropolis/node/kubernetes"
 	"source.monogon.dev/metropolis/node/kubernetes/containerd"
 	kpki "source.monogon.dev/metropolis/node/kubernetes/pki"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	cpb "source.monogon.dev/metropolis/proto/common"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // workerKubernetes is the Kubernetes Worker, responsible for launching
diff --git a/metropolis/node/core/roleserve/worker_metrics.go b/metropolis/node/core/roleserve/worker_metrics.go
index 26ec940..e2a78b8 100644
--- a/metropolis/node/core/roleserve/worker_metrics.go
+++ b/metropolis/node/core/roleserve/worker_metrics.go
@@ -8,8 +8,8 @@
 	cpb "source.monogon.dev/metropolis/proto/common"
 
 	"source.monogon.dev/metropolis/node/core/metrics"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // workerMetrics runs the Metrics Service, which runs local Prometheus collectors
diff --git a/metropolis/node/core/roleserve/worker_nodemgmt.go b/metropolis/node/core/roleserve/worker_nodemgmt.go
index 17fd0d4..52f1086 100644
--- a/metropolis/node/core/roleserve/worker_nodemgmt.go
+++ b/metropolis/node/core/roleserve/worker_nodemgmt.go
@@ -5,9 +5,9 @@
 
 	"source.monogon.dev/metropolis/node/core/mgmt"
 	"source.monogon.dev/metropolis/node/core/update"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type workerNodeMgmt struct {
diff --git a/metropolis/node/core/roleserve/worker_rolefetch.go b/metropolis/node/core/roleserve/worker_rolefetch.go
index aaac076..726fc69 100644
--- a/metropolis/node/core/roleserve/worker_rolefetch.go
+++ b/metropolis/node/core/roleserve/worker_rolefetch.go
@@ -7,8 +7,8 @@
 
 	"source.monogon.dev/metropolis/node/core/curator/watcher"
 	"source.monogon.dev/metropolis/node/core/localstorage"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
diff --git a/metropolis/node/core/roleserve/worker_statuspush.go b/metropolis/node/core/roleserve/worker_statuspush.go
index 63ab227..1b269c6 100644
--- a/metropolis/node/core/roleserve/worker_statuspush.go
+++ b/metropolis/node/core/roleserve/worker_statuspush.go
@@ -8,10 +8,10 @@
 
 	common "source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/network"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	"source.monogon.dev/metropolis/version"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
diff --git a/metropolis/node/core/roleserve/worker_statuspush_test.go b/metropolis/node/core/roleserve/worker_statuspush_test.go
index 06e48e8..39222bd 100644
--- a/metropolis/node/core/roleserve/worker_statuspush_test.go
+++ b/metropolis/node/core/roleserve/worker_statuspush_test.go
@@ -18,9 +18,9 @@
 	common "source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/consensus"
 	"source.monogon.dev/metropolis/node/core/curator"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	"source.monogon.dev/metropolis/test/util"
 	mversion "source.monogon.dev/metropolis/version"
+	"source.monogon.dev/osbase/supervisor"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
diff --git a/metropolis/node/core/rpc/BUILD.bazel b/metropolis/node/core/rpc/BUILD.bazel
index bdddb1e..b1b4bfc 100644
--- a/metropolis/node/core/rpc/BUILD.bazel
+++ b/metropolis/node/core/rpc/BUILD.bazel
@@ -14,9 +14,9 @@
     visibility = ["//visibility:public"],
     deps = [
         "//metropolis/node/core/identity",
-        "//metropolis/pkg/logtree",
         "//metropolis/proto/api",
         "//metropolis/proto/ext",
+        "//osbase/logtree",
         "@org_golang_google_grpc//:go_default_library",
         "@org_golang_google_grpc//codes",
         "@org_golang_google_grpc//credentials",
@@ -38,10 +38,10 @@
     embed = [":rpc"],
     deps = [
         "//metropolis/node/core/curator/proto/api",
-        "//metropolis/pkg/logtree",
         "//metropolis/proto/api",
         "//metropolis/proto/ext",
         "//metropolis/test/util",
+        "//osbase/logtree",
         "@org_golang_google_grpc//:go_default_library",
         "@org_golang_google_grpc//codes",
         "@org_golang_google_grpc//status",
diff --git a/metropolis/node/core/rpc/server_authentication.go b/metropolis/node/core/rpc/server_authentication.go
index f847126..c7d6e91 100644
--- a/metropolis/node/core/rpc/server_authentication.go
+++ b/metropolis/node/core/rpc/server_authentication.go
@@ -13,7 +13,7 @@
 	"google.golang.org/grpc/status"
 
 	"source.monogon.dev/metropolis/node/core/identity"
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // ServerSecurity are the security options of a RPC server that will run
diff --git a/metropolis/node/core/rpc/trace.go b/metropolis/node/core/rpc/trace.go
index 0d43806..a686c06 100644
--- a/metropolis/node/core/rpc/trace.go
+++ b/metropolis/node/core/rpc/trace.go
@@ -10,7 +10,7 @@
 	"google.golang.org/protobuf/encoding/prototext"
 	"google.golang.org/protobuf/proto"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // Span implements a compatible subset of
diff --git a/metropolis/node/core/rpc/trace_test.go b/metropolis/node/core/rpc/trace_test.go
index 750ffe8..9bed935 100644
--- a/metropolis/node/core/rpc/trace_test.go
+++ b/metropolis/node/core/rpc/trace_test.go
@@ -6,7 +6,7 @@
 	"strings"
 	"testing"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // TestSpanRecording exercises the span->logtree forwarding functionality by
diff --git a/metropolis/node/core/sysctl.go b/metropolis/node/core/sysctl.go
index eb72aa3..01b576c 100644
--- a/metropolis/node/core/sysctl.go
+++ b/metropolis/node/core/sysctl.go
@@ -4,8 +4,8 @@
 	"context"
 	"strconv"
 
-	"source.monogon.dev/metropolis/pkg/supervisor"
-	"source.monogon.dev/metropolis/pkg/sysctl"
+	"source.monogon.dev/osbase/supervisor"
+	"source.monogon.dev/osbase/sysctl"
 )
 
 func nodeSysctls(ctx context.Context) error {
diff --git a/metropolis/node/core/time/BUILD.bazel b/metropolis/node/core/time/BUILD.bazel
index fb9af73..f113153 100644
--- a/metropolis/node/core/time/BUILD.bazel
+++ b/metropolis/node/core/time/BUILD.bazel
@@ -7,7 +7,7 @@
     visibility = ["//visibility:public"],
     deps = [
         "//metropolis/node",
-        "//metropolis/pkg/fileargs",
-        "//metropolis/pkg/supervisor",
+        "//osbase/fileargs",
+        "//osbase/supervisor",
     ],
 )
diff --git a/metropolis/node/core/time/time.go b/metropolis/node/core/time/time.go
index f57e892..3e37a0c 100644
--- a/metropolis/node/core/time/time.go
+++ b/metropolis/node/core/time/time.go
@@ -18,8 +18,8 @@
 	"strings"
 
 	"source.monogon.dev/metropolis/node"
-	"source.monogon.dev/metropolis/pkg/fileargs"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/fileargs"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // Service implements the time service. See package documentation for further
diff --git a/metropolis/node/core/update/BUILD.bazel b/metropolis/node/core/update/BUILD.bazel
index bc5561a..30ca20b 100644
--- a/metropolis/node/core/update/BUILD.bazel
+++ b/metropolis/node/core/update/BUILD.bazel
@@ -11,11 +11,11 @@
     deps = [
         "//metropolis/node/build/mkimage/osimage",
         "//metropolis/node/core/abloader/spec",
-        "//metropolis/pkg/blockdev",
-        "//metropolis/pkg/efivarfs",
-        "//metropolis/pkg/gpt",
-        "//metropolis/pkg/kexec",
-        "//metropolis/pkg/logtree",
+        "//osbase/blockdev",
+        "//osbase/efivarfs",
+        "//osbase/gpt",
+        "//osbase/kexec",
+        "//osbase/logtree",
         "@com_github_cenkalti_backoff_v4//:backoff",
         "@org_golang_google_grpc//codes",
         "@org_golang_google_grpc//status",
diff --git a/metropolis/node/core/update/e2e/BUILD.bazel b/metropolis/node/core/update/e2e/BUILD.bazel
index 0b3fbce..b96006c 100644
--- a/metropolis/node/core/update/e2e/BUILD.bazel
+++ b/metropolis/node/core/update/e2e/BUILD.bazel
@@ -16,8 +16,8 @@
     ],
     deps = [
         "//metropolis/node/build/mkimage/osimage",
-        "//metropolis/pkg/blkio",
-        "//metropolis/pkg/blockdev",
+        "//osbase/blkio",
+        "//osbase/blockdev",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
     ],
 )
diff --git a/metropolis/node/core/update/e2e/e2e_test.go b/metropolis/node/core/update/e2e/e2e_test.go
index 0f712a8..07c6bf4 100644
--- a/metropolis/node/core/update/e2e/e2e_test.go
+++ b/metropolis/node/core/update/e2e/e2e_test.go
@@ -19,8 +19,8 @@
 	"github.com/bazelbuild/rules_go/go/runfiles"
 
 	"source.monogon.dev/metropolis/node/build/mkimage/osimage"
-	"source.monogon.dev/metropolis/pkg/blkio"
-	"source.monogon.dev/metropolis/pkg/blockdev"
+	"source.monogon.dev/osbase/blkio"
+	"source.monogon.dev/osbase/blockdev"
 )
 
 const Mi = 1024 * 1024
diff --git a/metropolis/node/core/update/e2e/testos/BUILD.bazel b/metropolis/node/core/update/e2e/testos/BUILD.bazel
index 79fd0f9..275a44c 100644
--- a/metropolis/node/core/update/e2e/testos/BUILD.bazel
+++ b/metropolis/node/core/update/e2e/testos/BUILD.bazel
@@ -16,10 +16,10 @@
         "//metropolis/node/build/mkimage/osimage",
         "//metropolis/node/core/network",
         "//metropolis/node/core/update",
-        "//metropolis/pkg/blockdev",
-        "//metropolis/pkg/gpt",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/supervisor",
+        "//osbase/blockdev",
+        "//osbase/gpt",
+        "//osbase/logtree",
+        "//osbase/supervisor",
         "@org_golang_x_sys//unix",
     ],
 )
diff --git a/metropolis/node/core/update/e2e/testos/main.go b/metropolis/node/core/update/e2e/testos/main.go
index 95f865c..e77a4e2 100644
--- a/metropolis/node/core/update/e2e/testos/main.go
+++ b/metropolis/node/core/update/e2e/testos/main.go
@@ -11,10 +11,10 @@
 	"source.monogon.dev/metropolis/node/build/mkimage/osimage"
 	"source.monogon.dev/metropolis/node/core/network"
 	"source.monogon.dev/metropolis/node/core/update"
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/gpt"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/gpt"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 var Variant = "U"
diff --git a/metropolis/node/core/update/update.go b/metropolis/node/core/update/update.go
index 8490c78..28b2381 100644
--- a/metropolis/node/core/update/update.go
+++ b/metropolis/node/core/update/update.go
@@ -25,11 +25,11 @@
 
 	"source.monogon.dev/metropolis/node/build/mkimage/osimage"
 	abloaderpb "source.monogon.dev/metropolis/node/core/abloader/spec"
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/efivarfs"
-	"source.monogon.dev/metropolis/pkg/gpt"
-	"source.monogon.dev/metropolis/pkg/kexec"
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/efivarfs"
+	"source.monogon.dev/osbase/gpt"
+	"source.monogon.dev/osbase/kexec"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // Service contains data and functionality to perform A/B updates on a
diff --git a/metropolis/node/kubernetes/BUILD.bazel b/metropolis/node/kubernetes/BUILD.bazel
index 854f6c3..08666ab 100644
--- a/metropolis/node/kubernetes/BUILD.bazel
+++ b/metropolis/node/kubernetes/BUILD.bazel
@@ -33,14 +33,14 @@
         "//metropolis/node/kubernetes/pki",
         "//metropolis/node/kubernetes/plugins/kvmdevice",
         "//metropolis/node/kubernetes/reconciler",
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/event/memory",
-        "//metropolis/pkg/fileargs",
-        "//metropolis/pkg/fsquota",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/loop",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/api",
+        "//osbase/event",
+        "//osbase/event/memory",
+        "//osbase/fileargs",
+        "//osbase/fsquota",
+        "//osbase/logtree",
+        "//osbase/loop",
+        "//osbase/supervisor",
         "@com_github_container_storage_interface_spec//lib/go/csi",
         "@io_k8s_api//core/v1:core",
         "@io_k8s_api//storage/v1:storage",
diff --git a/metropolis/node/kubernetes/apiproxy.go b/metropolis/node/kubernetes/apiproxy.go
index d937824..0289111 100644
--- a/metropolis/node/kubernetes/apiproxy.go
+++ b/metropolis/node/kubernetes/apiproxy.go
@@ -8,7 +8,7 @@
 	"source.monogon.dev/metropolis/node"
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	"source.monogon.dev/metropolis/node/core/curator/watcher"
-	"source.monogon.dev/metropolis/pkg/event/memory"
+	"source.monogon.dev/osbase/event/memory"
 )
 
 // updateLoadBalancerAPIServers provides a tinylb BackendSet memory value with
diff --git a/metropolis/node/kubernetes/apiserver.go b/metropolis/node/kubernetes/apiserver.go
index 70c4707..45b2582 100644
--- a/metropolis/node/kubernetes/apiserver.go
+++ b/metropolis/node/kubernetes/apiserver.go
@@ -34,8 +34,8 @@
 	common "source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/kubernetes/pki"
-	"source.monogon.dev/metropolis/pkg/fileargs"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/fileargs"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type apiserverService struct {
diff --git a/metropolis/node/kubernetes/authproxy/BUILD.bazel b/metropolis/node/kubernetes/authproxy/BUILD.bazel
index 9cf57cb..263e846 100644
--- a/metropolis/node/kubernetes/authproxy/BUILD.bazel
+++ b/metropolis/node/kubernetes/authproxy/BUILD.bazel
@@ -9,7 +9,7 @@
         "//metropolis/node",
         "//metropolis/node/core/identity",
         "//metropolis/node/kubernetes/pki",
-        "//metropolis/pkg/supervisor",
+        "//osbase/supervisor",
         "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
     ],
 )
diff --git a/metropolis/node/kubernetes/authproxy/authproxy.go b/metropolis/node/kubernetes/authproxy/authproxy.go
index c4a844e..9b24d19 100644
--- a/metropolis/node/kubernetes/authproxy/authproxy.go
+++ b/metropolis/node/kubernetes/authproxy/authproxy.go
@@ -20,7 +20,7 @@
 	"source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/kubernetes/pki"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type Service struct {
diff --git a/metropolis/node/kubernetes/clusternet/BUILD.bazel b/metropolis/node/kubernetes/clusternet/BUILD.bazel
index 2452b74..6b4d744 100644
--- a/metropolis/node/kubernetes/clusternet/BUILD.bazel
+++ b/metropolis/node/kubernetes/clusternet/BUILD.bazel
@@ -7,9 +7,9 @@
     visibility = ["//metropolis/node/kubernetes:__subpackages__"],
     deps = [
         "//metropolis/node/core/clusternet",
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/supervisor",
+        "//osbase/event",
+        "//osbase/logtree",
+        "//osbase/supervisor",
         "@io_k8s_api//core/v1:core",
         "@io_k8s_apimachinery//pkg/fields",
         "@io_k8s_client_go//kubernetes",
diff --git a/metropolis/node/kubernetes/clusternet/clusternet.go b/metropolis/node/kubernetes/clusternet/clusternet.go
index 7b51c30..28e268d 100644
--- a/metropolis/node/kubernetes/clusternet/clusternet.go
+++ b/metropolis/node/kubernetes/clusternet/clusternet.go
@@ -42,9 +42,9 @@
 	"k8s.io/client-go/tools/cache"
 
 	oclusternet "source.monogon.dev/metropolis/node/core/clusternet"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type Service struct {
diff --git a/metropolis/node/kubernetes/containerd/BUILD.bazel b/metropolis/node/kubernetes/containerd/BUILD.bazel
index ef6606d..0c61925 100644
--- a/metropolis/node/kubernetes/containerd/BUILD.bazel
+++ b/metropolis/node/kubernetes/containerd/BUILD.bazel
@@ -7,7 +7,7 @@
     visibility = ["//metropolis/node/core:__subpackages__"],
     deps = [
         "//metropolis/node/core/localstorage",
-        "//metropolis/pkg/supervisor",
+        "//osbase/supervisor",
         "@com_github_containerd_containerd//:containerd",
         "@com_github_containerd_containerd//namespaces",
     ],
diff --git a/metropolis/node/kubernetes/containerd/main.go b/metropolis/node/kubernetes/containerd/main.go
index 28fc98d..6782137 100644
--- a/metropolis/node/kubernetes/containerd/main.go
+++ b/metropolis/node/kubernetes/containerd/main.go
@@ -30,7 +30,7 @@
 	"github.com/containerd/containerd/namespaces"
 
 	"source.monogon.dev/metropolis/node/core/localstorage"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 const (
diff --git a/metropolis/node/kubernetes/controller-manager.go b/metropolis/node/kubernetes/controller-manager.go
index 71918f9..0a49ce1 100644
--- a/metropolis/node/kubernetes/controller-manager.go
+++ b/metropolis/node/kubernetes/controller-manager.go
@@ -24,8 +24,8 @@
 	"os/exec"
 
 	"source.monogon.dev/metropolis/node/kubernetes/pki"
-	"source.monogon.dev/metropolis/pkg/fileargs"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/fileargs"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type controllerManagerConfig struct {
diff --git a/metropolis/node/kubernetes/csi.go b/metropolis/node/kubernetes/csi.go
index c0d81bb..6f6c3a3 100644
--- a/metropolis/node/kubernetes/csi.go
+++ b/metropolis/node/kubernetes/csi.go
@@ -34,10 +34,10 @@
 	pluginregistration "k8s.io/kubelet/pkg/apis/pluginregistration/v1"
 
 	"source.monogon.dev/metropolis/node/core/localstorage"
-	"source.monogon.dev/metropolis/pkg/fsquota"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/loop"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/fsquota"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/loop"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // Derived from K8s spec for acceptable names, but shortened to 130 characters
diff --git a/metropolis/node/kubernetes/kubelet.go b/metropolis/node/kubernetes/kubelet.go
index 1fefbca..19a79b2 100644
--- a/metropolis/node/kubernetes/kubelet.go
+++ b/metropolis/node/kubernetes/kubelet.go
@@ -33,8 +33,8 @@
 	"source.monogon.dev/metropolis/node/core/localstorage"
 	"source.monogon.dev/metropolis/node/kubernetes/pki"
 	"source.monogon.dev/metropolis/node/kubernetes/reconciler"
-	"source.monogon.dev/metropolis/pkg/fileargs"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/fileargs"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type kubeletService struct {
diff --git a/metropolis/node/kubernetes/metricsproxy/BUILD.bazel b/metropolis/node/kubernetes/metricsproxy/BUILD.bazel
index 95f8b2c..7f89450 100644
--- a/metropolis/node/kubernetes/metricsproxy/BUILD.bazel
+++ b/metropolis/node/kubernetes/metricsproxy/BUILD.bazel
@@ -8,7 +8,7 @@
     deps = [
         "//metropolis/node",
         "//metropolis/node/kubernetes/pki",
-        "//metropolis/pkg/supervisor",
+        "//osbase/supervisor",
         "@io_k8s_kubernetes//cmd/kubeadm/app/constants",
     ],
 )
diff --git a/metropolis/node/kubernetes/metricsproxy/metricsproxy.go b/metropolis/node/kubernetes/metricsproxy/metricsproxy.go
index bc44a34..afa142d 100644
--- a/metropolis/node/kubernetes/metricsproxy/metricsproxy.go
+++ b/metropolis/node/kubernetes/metricsproxy/metricsproxy.go
@@ -16,7 +16,7 @@
 
 	"source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/kubernetes/pki"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type Service struct {
diff --git a/metropolis/node/kubernetes/nfproxy/BUILD.bazel b/metropolis/node/kubernetes/nfproxy/BUILD.bazel
index 539516a..b445c63 100644
--- a/metropolis/node/kubernetes/nfproxy/BUILD.bazel
+++ b/metropolis/node/kubernetes/nfproxy/BUILD.bazel
@@ -6,7 +6,7 @@
     importpath = "source.monogon.dev/metropolis/node/kubernetes/nfproxy",
     visibility = ["//metropolis/node/kubernetes:__subpackages__"],
     deps = [
-        "//metropolis/pkg/supervisor",
+        "//osbase/supervisor",
         "@com_github_sbezverk_nfproxy//pkg/controller",
         "@com_github_sbezverk_nfproxy//pkg/nftables",
         "@com_github_sbezverk_nfproxy//pkg/proxy",
diff --git a/metropolis/node/kubernetes/nfproxy/nfproxy.go b/metropolis/node/kubernetes/nfproxy/nfproxy.go
index 637be7b..8e0450b 100644
--- a/metropolis/node/kubernetes/nfproxy/nfproxy.go
+++ b/metropolis/node/kubernetes/nfproxy/nfproxy.go
@@ -40,7 +40,7 @@
 	"k8s.io/client-go/tools/cache"
 	"k8s.io/client-go/tools/record"
 
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type Service struct {
diff --git a/metropolis/node/kubernetes/pki/BUILD.bazel b/metropolis/node/kubernetes/pki/BUILD.bazel
index 1471fd3..60121c7 100644
--- a/metropolis/node/kubernetes/pki/BUILD.bazel
+++ b/metropolis/node/kubernetes/pki/BUILD.bazel
@@ -8,7 +8,7 @@
     deps = [
         "//metropolis/node",
         "//metropolis/node/core/consensus",
-        "//metropolis/pkg/pki",
+        "//osbase/pki",
         "@io_etcd_go_etcd_client_v3//:client",
         "@io_k8s_client_go//tools/clientcmd",
         "@io_k8s_client_go//tools/clientcmd/api",
diff --git a/metropolis/node/kubernetes/pki/kubernetes.go b/metropolis/node/kubernetes/pki/kubernetes.go
index 66731ae..5ea1e3e 100644
--- a/metropolis/node/kubernetes/pki/kubernetes.go
+++ b/metropolis/node/kubernetes/pki/kubernetes.go
@@ -14,7 +14,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// package pki builds upon metropolis/pkg/pki/ to provide an
+// package pki builds upon osbase/pki/ to provide an
 // etcd-backed implementation of all x509 PKI Certificates/CAs required to run
 // Kubernetes.
 // Most elements of the PKI are 'static' long-standing certificates/credentials
@@ -41,7 +41,7 @@
 
 	common "source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/consensus"
-	opki "source.monogon.dev/metropolis/pkg/pki"
+	opki "source.monogon.dev/osbase/pki"
 )
 
 // KubeCertificateName is an enum-like unique name of a static Kubernetes
diff --git a/metropolis/node/kubernetes/plugins/kvmdevice/BUILD.bazel b/metropolis/node/kubernetes/plugins/kvmdevice/BUILD.bazel
index 7d9b43f..c8b4ca4 100644
--- a/metropolis/node/kubernetes/plugins/kvmdevice/BUILD.bazel
+++ b/metropolis/node/kubernetes/plugins/kvmdevice/BUILD.bazel
@@ -7,8 +7,8 @@
     visibility = ["//visibility:public"],
     deps = [
         "//metropolis/node/core/localstorage",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/supervisor",
+        "//osbase/logtree",
+        "//osbase/supervisor",
         "@io_k8s_api//core/v1:core",
         "@io_k8s_kubelet//pkg/apis/deviceplugin/v1beta1",
         "@io_k8s_kubelet//pkg/apis/pluginregistration/v1:pluginregistration",
diff --git a/metropolis/node/kubernetes/plugins/kvmdevice/kvmdevice.go b/metropolis/node/kubernetes/plugins/kvmdevice/kvmdevice.go
index 90fdc44..f285c47 100644
--- a/metropolis/node/kubernetes/plugins/kvmdevice/kvmdevice.go
+++ b/metropolis/node/kubernetes/plugins/kvmdevice/kvmdevice.go
@@ -40,8 +40,8 @@
 	pluginregistration "k8s.io/kubelet/pkg/apis/pluginregistration/v1"
 
 	"source.monogon.dev/metropolis/node/core/localstorage"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // Name is the name of the KVM devices this plugin exposes
diff --git a/metropolis/node/kubernetes/provisioner.go b/metropolis/node/kubernetes/provisioner.go
index 38de7df..923302e 100644
--- a/metropolis/node/kubernetes/provisioner.go
+++ b/metropolis/node/kubernetes/provisioner.go
@@ -40,9 +40,9 @@
 	"k8s.io/client-go/util/workqueue"
 
 	"source.monogon.dev/metropolis/node/core/localstorage"
-	"source.monogon.dev/metropolis/pkg/fsquota"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/fsquota"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // ONCHANGE(//metropolis/node/kubernetes/reconciler:resources_csi.go): needs to
diff --git a/metropolis/node/kubernetes/reconciler/BUILD.bazel b/metropolis/node/kubernetes/reconciler/BUILD.bazel
index f7bb47f..1616787 100644
--- a/metropolis/node/kubernetes/reconciler/BUILD.bazel
+++ b/metropolis/node/kubernetes/reconciler/BUILD.bazel
@@ -16,10 +16,10 @@
         "//metropolis/node/core/consensus/client",
         "//metropolis/node/core/curator",
         "//metropolis/node/core/curator/proto/private",
-        "//metropolis/pkg/event/etcd",
-        "//metropolis/pkg/event/memory",
-        "//metropolis/pkg/supervisor",
         "//metropolis/version",
+        "//osbase/event/etcd",
+        "//osbase/event/memory",
+        "//osbase/supervisor",
         "//version",
         "//version/spec",
         "@com_github_cenkalti_backoff_v4//:backoff",
@@ -50,9 +50,9 @@
         "//metropolis/node/core/consensus/client",
         "//metropolis/node/core/curator",
         "//metropolis/node/core/curator/proto/private",
-        "//metropolis/pkg/supervisor",
         "//metropolis/proto/common",
         "//metropolis/version",
+        "//osbase/supervisor",
         "//version",
         "//version/spec",
         "@io_etcd_go_etcd_tests_v3//integration",
diff --git a/metropolis/node/kubernetes/reconciler/reconciler.go b/metropolis/node/kubernetes/reconciler/reconciler.go
index 3bfaa4d..523b31b 100644
--- a/metropolis/node/kubernetes/reconciler/reconciler.go
+++ b/metropolis/node/kubernetes/reconciler/reconciler.go
@@ -38,7 +38,7 @@
 	meta "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/kubernetes"
 
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // True is a sad workaround for all the pointer booleans in K8s specs
diff --git a/metropolis/node/kubernetes/reconciler/reconciler_status.go b/metropolis/node/kubernetes/reconciler/reconciler_status.go
index 4abf6f8..b139e0a 100644
--- a/metropolis/node/kubernetes/reconciler/reconciler_status.go
+++ b/metropolis/node/kubernetes/reconciler/reconciler_status.go
@@ -16,10 +16,10 @@
 	"source.monogon.dev/metropolis/node/core/consensus/client"
 	"source.monogon.dev/metropolis/node/core/curator"
 	ppb "source.monogon.dev/metropolis/node/core/curator/proto/private"
-	"source.monogon.dev/metropolis/pkg/event/etcd"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	mversion "source.monogon.dev/metropolis/version"
+	"source.monogon.dev/osbase/event/etcd"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 	"source.monogon.dev/version"
 	vpb "source.monogon.dev/version/spec"
 )
diff --git a/metropolis/node/kubernetes/reconciler/reconciler_status_test.go b/metropolis/node/kubernetes/reconciler/reconciler_status_test.go
index bd627a2..9eedfbe 100644
--- a/metropolis/node/kubernetes/reconciler/reconciler_status_test.go
+++ b/metropolis/node/kubernetes/reconciler/reconciler_status_test.go
@@ -12,9 +12,9 @@
 	"source.monogon.dev/metropolis/node/core/consensus/client"
 	"source.monogon.dev/metropolis/node/core/curator"
 	ppb "source.monogon.dev/metropolis/node/core/curator/proto/private"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	cpb "source.monogon.dev/metropolis/proto/common"
 	mversion "source.monogon.dev/metropolis/version"
+	"source.monogon.dev/osbase/supervisor"
 	"source.monogon.dev/version"
 	vpb "source.monogon.dev/version/spec"
 )
diff --git a/metropolis/node/kubernetes/reconciler/reconciler_test.go b/metropolis/node/kubernetes/reconciler/reconciler_test.go
index b791dbe..f457859 100644
--- a/metropolis/node/kubernetes/reconciler/reconciler_test.go
+++ b/metropolis/node/kubernetes/reconciler/reconciler_test.go
@@ -33,7 +33,7 @@
 	installrbac "k8s.io/kubernetes/pkg/apis/rbac/install"
 	installstorage "k8s.io/kubernetes/pkg/apis/storage/install"
 
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // TestExpectedUniqueNames ensures that all the Expected objects of any
diff --git a/metropolis/node/kubernetes/scheduler.go b/metropolis/node/kubernetes/scheduler.go
index 1b9b12c..cfa338a 100644
--- a/metropolis/node/kubernetes/scheduler.go
+++ b/metropolis/node/kubernetes/scheduler.go
@@ -23,8 +23,8 @@
 	"os/exec"
 
 	"source.monogon.dev/metropolis/node/kubernetes/pki"
-	"source.monogon.dev/metropolis/pkg/fileargs"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/fileargs"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type schedulerConfig struct {
diff --git a/metropolis/node/kubernetes/service_controller.go b/metropolis/node/kubernetes/service_controller.go
index 6b4360b..8ce36aa 100644
--- a/metropolis/node/kubernetes/service_controller.go
+++ b/metropolis/node/kubernetes/service_controller.go
@@ -35,8 +35,8 @@
 	"source.monogon.dev/metropolis/node/kubernetes/metricsproxy"
 	"source.monogon.dev/metropolis/node/kubernetes/pki"
 	"source.monogon.dev/metropolis/node/kubernetes/reconciler"
-	"source.monogon.dev/metropolis/pkg/supervisor"
 	apb "source.monogon.dev/metropolis/proto/api"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 type ConfigController struct {
diff --git a/metropolis/node/kubernetes/service_worker.go b/metropolis/node/kubernetes/service_worker.go
index 7ad985f..b4daba1 100644
--- a/metropolis/node/kubernetes/service_worker.go
+++ b/metropolis/node/kubernetes/service_worker.go
@@ -21,9 +21,9 @@
 	"source.monogon.dev/metropolis/node/kubernetes/nfproxy"
 	kpki "source.monogon.dev/metropolis/node/kubernetes/pki"
 	"source.monogon.dev/metropolis/node/kubernetes/plugins/kvmdevice"
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/event/memory"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/event/memory"
+	"source.monogon.dev/osbase/supervisor"
 
 	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 )
diff --git a/metropolis/pkg/event/BUILD.bazel b/metropolis/pkg/event/BUILD.bazel
deleted file mode 100644
index e6506b5..0000000
--- a/metropolis/pkg/event/BUILD.bazel
+++ /dev/null
@@ -1,9 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
-    name = "event",
-    srcs = ["event.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/event",
-    visibility = ["//visibility:public"],
-    deps = ["//metropolis/pkg/supervisor"],
-)
diff --git a/metropolis/pkg/fileargs/BUILD.bazel b/metropolis/pkg/fileargs/BUILD.bazel
deleted file mode 100644
index 0b7b2fc..0000000
--- a/metropolis/pkg/fileargs/BUILD.bazel
+++ /dev/null
@@ -1,9 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
-    name = "fileargs",
-    srcs = ["fileargs.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/fileargs",
-    visibility = ["//metropolis:__subpackages__"],
-    deps = ["@org_golang_x_sys//unix"],
-)
diff --git a/metropolis/pkg/fsquota/fsxattrs/BUILD.bazel b/metropolis/pkg/fsquota/fsxattrs/BUILD.bazel
deleted file mode 100644
index 2d23e99..0000000
--- a/metropolis/pkg/fsquota/fsxattrs/BUILD.bazel
+++ /dev/null
@@ -1,9 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
-    name = "fsxattrs",
-    srcs = ["fsxattrs.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/fsquota/fsxattrs",
-    visibility = ["//metropolis:__subpackages__"],
-    deps = ["@org_golang_x_sys//unix"],
-)
diff --git a/metropolis/pkg/fsquota/quotactl/BUILD.bazel b/metropolis/pkg/fsquota/quotactl/BUILD.bazel
deleted file mode 100644
index 108b771..0000000
--- a/metropolis/pkg/fsquota/quotactl/BUILD.bazel
+++ /dev/null
@@ -1,9 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
-    name = "quotactl",
-    srcs = ["quotactl.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/fsquota/quotactl",
-    visibility = ["//metropolis:__subpackages__"],
-    deps = ["@org_golang_x_sys//unix"],
-)
diff --git a/metropolis/pkg/logtree/unraw/BUILD.bazel b/metropolis/pkg/logtree/unraw/BUILD.bazel
deleted file mode 100644
index 646d631..0000000
--- a/metropolis/pkg/logtree/unraw/BUILD.bazel
+++ /dev/null
@@ -1,24 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-
-go_library(
-    name = "unraw",
-    srcs = ["unraw.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/logtree/unraw",
-    visibility = ["//visibility:public"],
-    deps = [
-        "//metropolis/pkg/logbuffer",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/supervisor",
-    ],
-)
-
-go_test(
-    name = "unraw_test",
-    srcs = ["unraw_test.go"],
-    embed = [":unraw"],
-    deps = [
-        "//metropolis/pkg/logbuffer",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/supervisor",
-    ],
-)
diff --git a/metropolis/proto/api/BUILD.bazel b/metropolis/proto/api/BUILD.bazel
index 66ab06a..f573105 100644
--- a/metropolis/proto/api/BUILD.bazel
+++ b/metropolis/proto/api/BUILD.bazel
@@ -12,10 +12,10 @@
     ],
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/logtree/proto:proto_proto",
         "//metropolis/proto/common:common_proto",
         "//metropolis/proto/ext:ext_proto",
         "//net/proto:net_proto_proto",
+        "//osbase/logtree/proto:proto_proto",
         "@com_google_protobuf//:duration_proto",
     ],
 )
@@ -27,10 +27,10 @@
     proto = ":api_proto",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/logtree/proto",
         "//metropolis/proto/common",
         "//metropolis/proto/ext",
         "//net/proto",
+        "//osbase/logtree/proto",
     ],
 )
 
diff --git a/metropolis/proto/api/management.proto b/metropolis/proto/api/management.proto
index 421898a..cd95a8e 100644
--- a/metropolis/proto/api/management.proto
+++ b/metropolis/proto/api/management.proto
@@ -4,7 +4,7 @@
 
 import "google/protobuf/duration.proto";
 
-import "metropolis/pkg/logtree/proto/logtree.proto";
+import "osbase/logtree/proto/logtree.proto";
 import "metropolis/proto/common/common.proto";
 import "metropolis/proto/ext/authorization.proto";
 
@@ -334,7 +334,7 @@
   // GetLogs Returns historical and/or streaming logs for a given DN with given
   // filters from the system global LogTree.
   //
-  // For more information about this API, see //metropolis/pkg/logtree. But, in
+  // For more information about this API, see //osbase/logtree. But, in
   // summary:
   //   - All logging is performed to a DN (distinguished name), which is a
   //     dot-delimited string like foo.bar.baz.
@@ -398,11 +398,11 @@
 message GetLogsResponse {
   // Entries from the requested historical entries (via WithBackLog). They will
   // all be served before the first stream_entries are served (if any).
-  repeated metropolis.pkg.logtree.proto.LogEntry backlog_entries = 1;
+  repeated osbase.pkg.logtree.proto.LogEntry backlog_entries = 1;
   // Entries streamed as they arrive. Currently no server-side buffering is
   // enabled, instead every line is served as early as it arrives. However, this
   // might change in the future, so this behaviour cannot be depended upon.
-  repeated metropolis.pkg.logtree.proto.LogEntry stream_entries = 2;
+  repeated osbase.pkg.logtree.proto.LogEntry stream_entries = 2;
 }
 
 enum ActivationMode {
diff --git a/metropolis/proto/common/BUILD.bazel b/metropolis/proto/common/BUILD.bazel
index 10f7f84..f895f44 100644
--- a/metropolis/proto/common/BUILD.bazel
+++ b/metropolis/proto/common/BUILD.bazel
@@ -7,7 +7,7 @@
     srcs = ["common.proto"],
     visibility = ["//metropolis:__subpackages__"],
     deps = [
-        "//metropolis/pkg/logtree/proto:proto_proto",
+        "//osbase/logtree/proto:proto_proto",
         "//version/spec:spec_proto",
         "@com_google_protobuf//:timestamp_proto",
     ],
@@ -19,7 +19,7 @@
     proto = ":common_proto",
     visibility = ["//metropolis:__subpackages__"],
     deps = [
-        "//metropolis/pkg/logtree/proto",
+        "//osbase/logtree/proto",
         "//version/spec",
     ],
 )
diff --git a/metropolis/proto/common/common.proto b/metropolis/proto/common/common.proto
index a0e8c73..758631f 100644
--- a/metropolis/proto/common/common.proto
+++ b/metropolis/proto/common/common.proto
@@ -21,7 +21,7 @@
 import "google/protobuf/timestamp.proto";
 import "version/spec/spec.proto";
 
-import "metropolis/pkg/logtree/proto/logtree.proto";
+import "osbase/logtree/proto/logtree.proto";
 
 // NodeRoles are the possible roles that a Metropolis Node should run within the
 // cluster. These are configured by the cluster and can be retrieved through the
@@ -252,7 +252,7 @@
     // If leveled logs are returned, all entries at severity lower than `minimum`
     // will be discarded.
     message LeveledWithMinimumSeverity {
-        metropolis.pkg.logtree.proto.LeveledLogSeverity minimum = 1;
+        osbase.pkg.logtree.proto.LeveledLogSeverity minimum = 1;
     }
     oneof filter {
         WithChildren with_children = 1;
diff --git a/metropolis/test/e2e/BUILD.bazel b/metropolis/test/e2e/BUILD.bazel
index cb8645b..565223e 100644
--- a/metropolis/test/e2e/BUILD.bazel
+++ b/metropolis/test/e2e/BUILD.bazel
@@ -1,4 +1,4 @@
-load("//metropolis/pkg/localregistry:def.bzl", "localregistry_manifest")
+load("//metropolis/test/localregistry:def.bzl", "localregistry_manifest")
 
 localregistry_manifest(
     name = "testimages_manifest",
diff --git a/metropolis/test/e2e/k8s_cts/BUILD.bazel b/metropolis/test/e2e/k8s_cts/BUILD.bazel
index 8458b2d..6593a73 100644
--- a/metropolis/test/e2e/k8s_cts/BUILD.bazel
+++ b/metropolis/test/e2e/k8s_cts/BUILD.bazel
@@ -6,7 +6,7 @@
     importpath = "source.monogon.dev/metropolis/test/e2e/k8s_cts",
     visibility = ["//visibility:private"],
     deps = [
-        "//metropolis/test/launch/cluster",
+        "//metropolis/test/launch",
         "@io_k8s_api//core/v1:core",
         "@io_k8s_api//rbac/v1:rbac",
         "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
diff --git a/metropolis/test/e2e/k8s_cts/main.go b/metropolis/test/e2e/k8s_cts/main.go
index 6383cb8..6250a16 100644
--- a/metropolis/test/e2e/k8s_cts/main.go
+++ b/metropolis/test/e2e/k8s_cts/main.go
@@ -34,7 +34,7 @@
 	rbacv1 "k8s.io/api/rbac/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 
-	"source.monogon.dev/metropolis/test/launch/cluster"
+	mlaunch "source.monogon.dev/metropolis/test/launch"
 )
 
 // makeCTSPodSpec generates a spec for a standalone pod running the Kubernetes
@@ -100,7 +100,7 @@
 	}()
 
 	// TODO(q3k): bump up number of nodes after multi-node workflow gets reimplemented.
-	cl, err := cluster.LaunchCluster(ctx, cluster.ClusterOptions{NumNodes: 1})
+	cl, err := mlaunch.LaunchCluster(ctx, mlaunch.ClusterOptions{NumNodes: 1})
 	if err != nil {
 		log.Fatalf("Failed to launch cluster: %v", err)
 	}
diff --git a/metropolis/test/e2e/suites/core/BUILD.bazel b/metropolis/test/e2e/suites/core/BUILD.bazel
index 45ce438..223d7c7 100644
--- a/metropolis/test/e2e/suites/core/BUILD.bazel
+++ b/metropolis/test/e2e/suites/core/BUILD.bazel
@@ -17,12 +17,12 @@
     deps = [
         "//metropolis/node",
         "//metropolis/node/core/rpc",
-        "//metropolis/pkg/localregistry",
         "//metropolis/proto/api",
         "//metropolis/proto/common",
         "//metropolis/test/launch",
-        "//metropolis/test/launch/cluster",
+        "//metropolis/test/localregistry",
         "//metropolis/test/util",
+        "//osbase/test/launch",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
         "@org_golang_google_grpc//:go_default_library",
     ],
diff --git a/metropolis/test/e2e/suites/core/run_test.go b/metropolis/test/e2e/suites/core/run_test.go
index 8bbbf52..21640a6 100644
--- a/metropolis/test/e2e/suites/core/run_test.go
+++ b/metropolis/test/e2e/suites/core/run_test.go
@@ -19,10 +19,10 @@
 
 	common "source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/rpc"
-	"source.monogon.dev/metropolis/pkg/localregistry"
-	"source.monogon.dev/metropolis/test/launch"
-	"source.monogon.dev/metropolis/test/launch/cluster"
+	mlaunch "source.monogon.dev/metropolis/test/launch"
+	"source.monogon.dev/metropolis/test/localregistry"
 	"source.monogon.dev/metropolis/test/util"
+	"source.monogon.dev/osbase/test/launch"
 
 	apb "source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
@@ -62,7 +62,7 @@
 		t.Fatalf("Creating test image registry failed: %v", err)
 	}
 	// Launch cluster.
-	clusterOptions := cluster.ClusterOptions{
+	clusterOptions := mlaunch.ClusterOptions{
 		NumNodes:      2,
 		LocalRegistry: lr,
 		InitialClusterConfiguration: &cpb.ClusterConfiguration{
@@ -70,7 +70,7 @@
 			StorageSecurityPolicy: cpb.ClusterConfiguration_STORAGE_SECURITY_POLICY_NEEDS_INSECURE,
 		},
 	}
-	cluster, err := cluster.LaunchCluster(ctx, clusterOptions)
+	cluster, err := mlaunch.LaunchCluster(ctx, clusterOptions)
 	if err != nil {
 		t.Fatalf("LaunchCluster failed: %v", err)
 	}
diff --git a/metropolis/test/e2e/suites/ha/BUILD.bazel b/metropolis/test/e2e/suites/ha/BUILD.bazel
index 0a89977..5a2a4dd 100644
--- a/metropolis/test/e2e/suites/ha/BUILD.bazel
+++ b/metropolis/test/e2e/suites/ha/BUILD.bazel
@@ -15,10 +15,10 @@
         "resources:ram:7000",
     ],
     deps = [
-        "//metropolis/pkg/localregistry",
         "//metropolis/test/launch",
-        "//metropolis/test/launch/cluster",
+        "//metropolis/test/localregistry",
         "//metropolis/test/util",
+        "//osbase/test/launch",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
     ],
 )
diff --git a/metropolis/test/e2e/suites/ha/run_test.go b/metropolis/test/e2e/suites/ha/run_test.go
index 63a2acd..cc02df4 100644
--- a/metropolis/test/e2e/suites/ha/run_test.go
+++ b/metropolis/test/e2e/suites/ha/run_test.go
@@ -9,10 +9,10 @@
 
 	"github.com/bazelbuild/rules_go/go/runfiles"
 
-	"source.monogon.dev/metropolis/pkg/localregistry"
-	"source.monogon.dev/metropolis/test/launch"
-	"source.monogon.dev/metropolis/test/launch/cluster"
+	mlaunch "source.monogon.dev/metropolis/test/launch"
+	"source.monogon.dev/metropolis/test/localregistry"
 	"source.monogon.dev/metropolis/test/util"
+	"source.monogon.dev/osbase/test/launch"
 )
 
 const (
@@ -48,12 +48,12 @@
 		t.Fatalf("Creating test image registry failed: %v", err)
 	}
 	// Launch cluster.
-	clusterOptions := cluster.ClusterOptions{
+	clusterOptions := mlaunch.ClusterOptions{
 		NumNodes:        3,
 		LocalRegistry:   lr,
 		NodeLogsToFiles: true,
 	}
-	cluster, err := cluster.LaunchCluster(ctx, clusterOptions)
+	cluster, err := mlaunch.LaunchCluster(ctx, clusterOptions)
 	if err != nil {
 		t.Fatalf("LaunchCluster failed: %v", err)
 	}
diff --git a/metropolis/test/e2e/suites/ha_cold/BUILD.bazel b/metropolis/test/e2e/suites/ha_cold/BUILD.bazel
index d358f86..c2cfa0d 100644
--- a/metropolis/test/e2e/suites/ha_cold/BUILD.bazel
+++ b/metropolis/test/e2e/suites/ha_cold/BUILD.bazel
@@ -17,7 +17,7 @@
     deps = [
         "//metropolis/proto/common",
         "//metropolis/test/launch",
-        "//metropolis/test/launch/cluster",
         "//metropolis/test/util",
+        "//osbase/test/launch",
     ],
 )
diff --git a/metropolis/test/e2e/suites/ha_cold/run_test.go b/metropolis/test/e2e/suites/ha_cold/run_test.go
index 6670b8f..419d290 100644
--- a/metropolis/test/e2e/suites/ha_cold/run_test.go
+++ b/metropolis/test/e2e/suites/ha_cold/run_test.go
@@ -6,9 +6,9 @@
 	"testing"
 	"time"
 
-	"source.monogon.dev/metropolis/test/launch"
-	"source.monogon.dev/metropolis/test/launch/cluster"
+	mlaunch "source.monogon.dev/metropolis/test/launch"
 	"source.monogon.dev/metropolis/test/util"
+	"source.monogon.dev/osbase/test/launch"
 
 	cpb "source.monogon.dev/metropolis/proto/common"
 )
@@ -36,7 +36,7 @@
 	defer cancel()
 
 	// Launch cluster.
-	clusterOptions := cluster.ClusterOptions{
+	clusterOptions := mlaunch.ClusterOptions{
 		NumNodes:        3,
 		NodeLogsToFiles: true,
 		InitialClusterConfiguration: &cpb.ClusterConfiguration{
@@ -44,7 +44,7 @@
 			StorageSecurityPolicy: cpb.ClusterConfiguration_STORAGE_SECURITY_POLICY_NEEDS_INSECURE,
 		},
 	}
-	cluster, err := cluster.LaunchCluster(ctx, clusterOptions)
+	cluster, err := mlaunch.LaunchCluster(ctx, clusterOptions)
 	if err != nil {
 		t.Fatalf("LaunchCluster failed: %v", err)
 	}
diff --git a/metropolis/test/e2e/suites/kubernetes/BUILD.bazel b/metropolis/test/e2e/suites/kubernetes/BUILD.bazel
index 191ba35..6234e94 100644
--- a/metropolis/test/e2e/suites/kubernetes/BUILD.bazel
+++ b/metropolis/test/e2e/suites/kubernetes/BUILD.bazel
@@ -33,8 +33,8 @@
     ],
     deps = [
         "//metropolis/node",
-        "//metropolis/pkg/localregistry",
-        "//metropolis/test/launch/cluster",
+        "//metropolis/test/launch",
+        "//metropolis/test/localregistry",
         "//metropolis/test/util",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
         "@io_k8s_api//core/v1:core",
diff --git a/metropolis/test/e2e/suites/kubernetes/run_test.go b/metropolis/test/e2e/suites/kubernetes/run_test.go
index ec38aa3..f15fafd 100644
--- a/metropolis/test/e2e/suites/kubernetes/run_test.go
+++ b/metropolis/test/e2e/suites/kubernetes/run_test.go
@@ -23,8 +23,8 @@
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	podv1 "k8s.io/kubernetes/pkg/api/v1/pod"
 
-	"source.monogon.dev/metropolis/pkg/localregistry"
-	"source.monogon.dev/metropolis/test/launch/cluster"
+	mlaunch "source.monogon.dev/metropolis/test/launch"
+	"source.monogon.dev/metropolis/test/localregistry"
 	"source.monogon.dev/metropolis/test/util"
 
 	common "source.monogon.dev/metropolis/node"
@@ -64,11 +64,11 @@
 	}
 
 	// Launch cluster.
-	clusterOptions := cluster.ClusterOptions{
+	clusterOptions := mlaunch.ClusterOptions{
 		NumNodes:      2,
 		LocalRegistry: lr,
 	}
-	cluster, err := cluster.LaunchCluster(ctx, clusterOptions)
+	cluster, err := mlaunch.LaunchCluster(ctx, clusterOptions)
 	if err != nil {
 		t.Fatalf("LaunchCluster failed: %v", err)
 	}
diff --git a/metropolis/test/lacp/BUILD.bazel b/metropolis/test/lacp/BUILD.bazel
index d044de2..b5a0f7a 100644
--- a/metropolis/test/lacp/BUILD.bazel
+++ b/metropolis/test/lacp/BUILD.bazel
@@ -1,5 +1,5 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_test(
     name = "lacptest_test",
diff --git a/metropolis/test/launch/BUILD.bazel b/metropolis/test/launch/BUILD.bazel
index cc5ef6c..24296d1 100644
--- a/metropolis/test/launch/BUILD.bazel
+++ b/metropolis/test/launch/BUILD.bazel
@@ -3,17 +3,50 @@
 go_library(
     name = "launch",
     srcs = [
-        "launch.go",
-        "log.go",
+        "cluster.go",
+        "insecure_key.go",
+        "metroctl.go",
+        "prefixed_stdio.go",
+        "swtpm.go",
     ],
     data = [
+        "//metropolis/node:image",
+        "//metropolis/test/nanoswitch:initramfs",
+        "//metropolis/test/swtpm/certtool",
+        "//metropolis/test/swtpm/swtpm_cert",
+        "//osbase/test/ktest:linux-testing",
+        "//third_party/edk2:firmware",
         "@com_github_bonzini_qboot//:qboot-bin",
+        "@swtpm",
+        "@swtpm//:swtpm_localca",
+        "@swtpm//:swtpm_setup",
     ],
     importpath = "source.monogon.dev/metropolis/test/launch",
-    visibility = ["//metropolis:__subpackages__"],
+    visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/freeport",
+        "//go/qcow2",
+        "//metropolis/cli/metroctl/core",
+        "//metropolis/node",
+        "//metropolis/node/core/curator/proto/api",
+        "//metropolis/node/core/identity",
+        "//metropolis/node/core/rpc",
+        "//metropolis/node/core/rpc/resolver",
+        "//metropolis/proto/api",
+        "//metropolis/proto/common",
+        "//metropolis/test/localregistry",
+        "//osbase/logbuffer",
+        "//osbase/test/launch",
+        "@com_github_cenkalti_backoff_v4//:backoff",
+        "@com_github_kballard_go_shellquote//:go-shellquote",
         "@io_bazel_rules_go//go/runfiles:go_default_library",
+        "@io_k8s_client_go//kubernetes",
+        "@io_k8s_client_go//rest",
+        "@org_golang_google_grpc//:go_default_library",
+        "@org_golang_google_grpc//codes",
+        "@org_golang_google_grpc//status",
+        "@org_golang_google_protobuf//proto",
+        "@org_golang_x_net//proxy",
         "@org_golang_x_sys//unix",
+        "@org_uber_go_multierr//:multierr",
     ],
 )
diff --git a/metropolis/test/launch/cli/launch-cluster/BUILD.bazel b/metropolis/test/launch/cli/launch-cluster/BUILD.bazel
index 688228e..9e48795 100644
--- a/metropolis/test/launch/cli/launch-cluster/BUILD.bazel
+++ b/metropolis/test/launch/cli/launch-cluster/BUILD.bazel
@@ -8,7 +8,7 @@
     visibility = ["//visibility:private"],
     deps = [
         "//metropolis/cli/metroctl/core",
-        "//metropolis/test/launch/cluster",
+        "//metropolis/test/launch",
     ],
 )
 
diff --git a/metropolis/test/launch/cli/launch-cluster/main.go b/metropolis/test/launch/cli/launch-cluster/main.go
index c9b9dec..1529396 100644
--- a/metropolis/test/launch/cli/launch-cluster/main.go
+++ b/metropolis/test/launch/cli/launch-cluster/main.go
@@ -23,12 +23,12 @@
 	"os/signal"
 
 	metroctl "source.monogon.dev/metropolis/cli/metroctl/core"
-	"source.monogon.dev/metropolis/test/launch/cluster"
+	mlaunch "source.monogon.dev/metropolis/test/launch"
 )
 
 func main() {
 	ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
-	cl, err := cluster.LaunchCluster(ctx, cluster.ClusterOptions{
+	cl, err := mlaunch.LaunchCluster(ctx, mlaunch.ClusterOptions{
 		NumNodes:        3,
 		NodeLogsToFiles: true,
 	})
@@ -36,7 +36,7 @@
 		log.Fatalf("LaunchCluster: %v", err)
 	}
 
-	mpath, err := cluster.MetroctlRunfilePath()
+	mpath, err := mlaunch.MetroctlRunfilePath()
 	if err != nil {
 		log.Fatalf("MetroctlRunfilePath: %v", err)
 	}
diff --git a/metropolis/test/launch/cli/launch/BUILD.bazel b/metropolis/test/launch/cli/launch/BUILD.bazel
index 49df994..f0edefc 100644
--- a/metropolis/test/launch/cli/launch/BUILD.bazel
+++ b/metropolis/test/launch/cli/launch/BUILD.bazel
@@ -9,7 +9,7 @@
     deps = [
         "//metropolis/proto/api",
         "//metropolis/test/launch",
-        "//metropolis/test/launch/cluster",
+        "//osbase/test/launch",
     ],
 )
 
diff --git a/metropolis/test/launch/cli/launch/main.go b/metropolis/test/launch/cli/launch/main.go
index 2ae3a0c..71c7aa2 100644
--- a/metropolis/test/launch/cli/launch/main.go
+++ b/metropolis/test/launch/cli/launch/main.go
@@ -24,8 +24,9 @@
 	"path/filepath"
 
 	apb "source.monogon.dev/metropolis/proto/api"
-	"source.monogon.dev/metropolis/test/launch"
-	"source.monogon.dev/metropolis/test/launch/cluster"
+
+	mlaunch "source.monogon.dev/metropolis/test/launch"
+	"source.monogon.dev/osbase/test/launch"
 )
 
 func main() {
@@ -45,22 +46,22 @@
 	defer os.RemoveAll(sd)
 
 	var ports []uint16
-	for _, p := range cluster.NodePorts {
+	for _, p := range mlaunch.NodePorts {
 		ports = append(ports, uint16(p))
 	}
 	ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
 	doneC := make(chan error)
-	tpmf, err := cluster.NewTPMFactory(filepath.Join(ld, "tpm"))
+	tpmf, err := mlaunch.NewTPMFactory(filepath.Join(ld, "tpm"))
 	if err != nil {
 		log.Fatalf("NewTPMFactory: %v", err)
 	}
-	err = cluster.LaunchNode(ctx, ld, sd, tpmf, &cluster.NodeOptions{
+	err = mlaunch.LaunchNode(ctx, ld, sd, tpmf, &mlaunch.NodeOptions{
 		Name:       "test-node",
 		Ports:      launch.IdentityPortMap(ports),
 		SerialPort: os.Stdout,
 		NodeParameters: &apb.NodeParameters{
 			Cluster: &apb.NodeParameters_ClusterBootstrap_{
-				ClusterBootstrap: cluster.InsecureClusterBootstrap,
+				ClusterBootstrap: mlaunch.InsecureClusterBootstrap,
 			},
 		},
 	}, doneC)
diff --git a/metropolis/test/launch/cluster/cluster.go b/metropolis/test/launch/cluster.go
similarity index 99%
rename from metropolis/test/launch/cluster/cluster.go
rename to metropolis/test/launch/cluster.go
index dfeb457..7ae5f83 100644
--- a/metropolis/test/launch/cluster/cluster.go
+++ b/metropolis/test/launch/cluster.go
@@ -2,7 +2,7 @@
 // nodes and clusters in a virtualized environment using qemu. It's kept in a
 // separate package as it depends on a Metropolis node image, which might not be
 // required for some use of the launch library.
-package cluster
+package launch
 
 import (
 	"bytes"
@@ -48,8 +48,8 @@
 	"source.monogon.dev/metropolis/node/core/identity"
 	"source.monogon.dev/metropolis/node/core/rpc"
 	"source.monogon.dev/metropolis/node/core/rpc/resolver"
-	"source.monogon.dev/metropolis/pkg/localregistry"
-	"source.monogon.dev/metropolis/test/launch"
+	"source.monogon.dev/metropolis/test/localregistry"
+	"source.monogon.dev/osbase/test/launch"
 )
 
 const (
@@ -854,7 +854,7 @@
 		} else {
 			serialPort = newPrefixedStdio(99)
 		}
-		kernelPath, err := runfiles.Rlocation("_main/metropolis/test/ktest/vmlinux")
+		kernelPath, err := runfiles.Rlocation("_main/osbase/test/ktest/vmlinux")
 		if err != nil {
 			launch.Fatal("Failed to resolved nanoswitch kernel: %v", err)
 		}
diff --git a/metropolis/test/launch/cluster/BUILD.bazel b/metropolis/test/launch/cluster/BUILD.bazel
deleted file mode 100644
index efa04cb..0000000
--- a/metropolis/test/launch/cluster/BUILD.bazel
+++ /dev/null
@@ -1,52 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
-    name = "cluster",
-    srcs = [
-        "cluster.go",
-        "insecure_key.go",
-        "metroctl.go",
-        "prefixed_stdio.go",
-        "swtpm.go",
-    ],
-    data = [
-        "//metropolis/node:image",
-        "//metropolis/test/ktest:linux-testing",
-        "//metropolis/test/nanoswitch:initramfs",
-        "//metropolis/test/swtpm/certtool",
-        "//metropolis/test/swtpm/swtpm_cert",
-        "//third_party/edk2:firmware",
-        "@com_github_bonzini_qboot//:qboot-bin",
-        "@swtpm",
-        "@swtpm//:swtpm_localca",
-        "@swtpm//:swtpm_setup",
-    ],
-    importpath = "source.monogon.dev/metropolis/test/launch/cluster",
-    visibility = ["//visibility:public"],
-    deps = [
-        "//go/qcow2",
-        "//metropolis/cli/metroctl/core",
-        "//metropolis/node",
-        "//metropolis/node/core/curator/proto/api",
-        "//metropolis/node/core/identity",
-        "//metropolis/node/core/rpc",
-        "//metropolis/node/core/rpc/resolver",
-        "//metropolis/pkg/localregistry",
-        "//metropolis/pkg/logbuffer",
-        "//metropolis/proto/api",
-        "//metropolis/proto/common",
-        "//metropolis/test/launch",
-        "@com_github_cenkalti_backoff_v4//:backoff",
-        "@com_github_kballard_go_shellquote//:go-shellquote",
-        "@io_bazel_rules_go//go/runfiles:go_default_library",
-        "@io_k8s_client_go//kubernetes",
-        "@io_k8s_client_go//rest",
-        "@org_golang_google_grpc//:go_default_library",
-        "@org_golang_google_grpc//codes",
-        "@org_golang_google_grpc//status",
-        "@org_golang_google_protobuf//proto",
-        "@org_golang_x_net//proxy",
-        "@org_golang_x_sys//unix",
-        "@org_uber_go_multierr//:multierr",
-    ],
-)
diff --git a/metropolis/test/launch/cluster/insecure_key.go b/metropolis/test/launch/insecure_key.go
similarity index 98%
rename from metropolis/test/launch/cluster/insecure_key.go
rename to metropolis/test/launch/insecure_key.go
index 48cd6d8..72af26f 100644
--- a/metropolis/test/launch/cluster/insecure_key.go
+++ b/metropolis/test/launch/insecure_key.go
@@ -14,7 +14,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-package cluster
+package launch
 
 import (
 	"crypto/ed25519"
diff --git a/metropolis/test/launch/cluster/metroctl.go b/metropolis/test/launch/metroctl.go
similarity index 99%
rename from metropolis/test/launch/cluster/metroctl.go
rename to metropolis/test/launch/metroctl.go
index e985a64..e3196a6 100644
--- a/metropolis/test/launch/cluster/metroctl.go
+++ b/metropolis/test/launch/metroctl.go
@@ -1,4 +1,4 @@
-package cluster
+package launch
 
 import (
 	"context"
diff --git a/metropolis/test/launch/cluster/prefixed_stdio.go b/metropolis/test/launch/prefixed_stdio.go
similarity index 94%
rename from metropolis/test/launch/cluster/prefixed_stdio.go
rename to metropolis/test/launch/prefixed_stdio.go
index 3ea3e18..c851c44 100644
--- a/metropolis/test/launch/cluster/prefixed_stdio.go
+++ b/metropolis/test/launch/prefixed_stdio.go
@@ -1,11 +1,11 @@
-package cluster
+package launch
 
 import (
 	"fmt"
 	"io"
 	"strings"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
+	"source.monogon.dev/osbase/logbuffer"
 )
 
 // prefixedStdio is a io.ReadWriter which splits written bytes into lines,
diff --git a/metropolis/test/launch/cluster/swtpm.go b/metropolis/test/launch/swtpm.go
similarity index 98%
rename from metropolis/test/launch/cluster/swtpm.go
rename to metropolis/test/launch/swtpm.go
index 0f9b5c5..fa5cb78 100644
--- a/metropolis/test/launch/cluster/swtpm.go
+++ b/metropolis/test/launch/swtpm.go
@@ -1,4 +1,4 @@
-package cluster
+package launch
 
 import (
 	"context"
@@ -12,7 +12,7 @@
 
 	"github.com/bazelbuild/rules_go/go/runfiles"
 
-	"source.monogon.dev/metropolis/test/launch"
+	"source.monogon.dev/osbase/test/launch"
 )
 
 // A TPMFactory manufactures virtual TPMs using swtpm.
diff --git a/metropolis/pkg/localregistry/BUILD.bazel b/metropolis/test/localregistry/BUILD.bazel
similarity index 85%
rename from metropolis/pkg/localregistry/BUILD.bazel
rename to metropolis/test/localregistry/BUILD.bazel
index ae8c384..548960a 100644
--- a/metropolis/pkg/localregistry/BUILD.bazel
+++ b/metropolis/test/localregistry/BUILD.bazel
@@ -3,10 +3,10 @@
 go_library(
     name = "localregistry",
     srcs = ["localregistry.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/localregistry",
+    importpath = "source.monogon.dev/metropolis/test/localregistry",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/localregistry/spec",
+        "//metropolis/test/localregistry/spec",
         "@com_github_docker_distribution//:distribution",
         "@com_github_docker_distribution//manifest/manifestlist",
         "@com_github_docker_distribution//manifest/ocischema",
diff --git a/metropolis/pkg/localregistry/def.bzl b/metropolis/test/localregistry/def.bzl
similarity index 100%
rename from metropolis/pkg/localregistry/def.bzl
rename to metropolis/test/localregistry/def.bzl
diff --git a/metropolis/pkg/localregistry/localregistry.go b/metropolis/test/localregistry/localregistry.go
similarity index 98%
rename from metropolis/pkg/localregistry/localregistry.go
rename to metropolis/test/localregistry/localregistry.go
index dc0fdde..120eb61 100644
--- a/metropolis/pkg/localregistry/localregistry.go
+++ b/metropolis/test/localregistry/localregistry.go
@@ -23,7 +23,7 @@
 	"github.com/opencontainers/go-digest"
 	"google.golang.org/protobuf/encoding/prototext"
 
-	"source.monogon.dev/metropolis/pkg/localregistry/spec"
+	"source.monogon.dev/metropolis/test/localregistry/spec"
 )
 
 type Server struct {
diff --git a/metropolis/pkg/localregistry/spec/BUILD.bazel b/metropolis/test/localregistry/spec/BUILD.bazel
similarity index 77%
rename from metropolis/pkg/localregistry/spec/BUILD.bazel
rename to metropolis/test/localregistry/spec/BUILD.bazel
index 3d6b734..71253d1 100644
--- a/metropolis/pkg/localregistry/spec/BUILD.bazel
+++ b/metropolis/test/localregistry/spec/BUILD.bazel
@@ -10,7 +10,7 @@
 
 go_proto_library(
     name = "spec_go_proto",
-    importpath = "source.monogon.dev/metropolis/pkg/localregistry/spec",
+    importpath = "source.monogon.dev/metropolis/test/localregistry/spec",
     proto = ":spec_proto",
     visibility = ["//visibility:public"],
 )
@@ -18,6 +18,6 @@
 go_library(
     name = "spec",
     embed = [":spec_go_proto"],
-    importpath = "source.monogon.dev/metropolis/pkg/localregistry/spec",
+    importpath = "source.monogon.dev/metropolis/test/localregistry/spec",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/pkg/localregistry/spec/gomod-generated-placeholder.go b/metropolis/test/localregistry/spec/gomod-generated-placeholder.go
similarity index 100%
rename from metropolis/pkg/localregistry/spec/gomod-generated-placeholder.go
rename to metropolis/test/localregistry/spec/gomod-generated-placeholder.go
diff --git a/metropolis/pkg/localregistry/spec/manifest.proto b/metropolis/test/localregistry/spec/manifest.proto
similarity index 82%
rename from metropolis/pkg/localregistry/spec/manifest.proto
rename to metropolis/test/localregistry/spec/manifest.proto
index b28c8b7..bb53581 100644
--- a/metropolis/pkg/localregistry/spec/manifest.proto
+++ b/metropolis/test/localregistry/spec/manifest.proto
@@ -2,7 +2,7 @@
 
 package monogon.metropolis.pkg.localregistry;
 
-option go_package = "source.monogon.dev/metropolis/pkg/localregistry/spec";
+option go_package = "source.monogon.dev/metropolis/test/localregistry/spec";
 
 // Single image metadata
 message Image {
diff --git a/metropolis/test/nanoswitch/BUILD.bazel b/metropolis/test/nanoswitch/BUILD.bazel
index a3163f5..4954480 100644
--- a/metropolis/test/nanoswitch/BUILD.bazel
+++ b/metropolis/test/nanoswitch/BUILD.bazel
@@ -13,10 +13,10 @@
         "//metropolis/node",
         "//metropolis/node/core/network/dhcp4c",
         "//metropolis/node/core/network/dhcp4c/callback",
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/socksproxy",
-        "//metropolis/pkg/supervisor",
-        "//metropolis/test/launch",
+        "//osbase/logtree",
+        "//osbase/socksproxy",
+        "//osbase/supervisor",
+        "//osbase/test/launch",
         "@com_github_google_nftables//:nftables",
         "@com_github_google_nftables//expr",
         "@com_github_insomniacslk_dhcp//dhcpv4",
diff --git a/metropolis/test/nanoswitch/nanoswitch.go b/metropolis/test/nanoswitch/nanoswitch.go
index b4ced56..ca1d77d 100644
--- a/metropolis/test/nanoswitch/nanoswitch.go
+++ b/metropolis/test/nanoswitch/nanoswitch.go
@@ -45,9 +45,9 @@
 	common "source.monogon.dev/metropolis/node"
 	"source.monogon.dev/metropolis/node/core/network/dhcp4c"
 	dhcpcb "source.monogon.dev/metropolis/node/core/network/dhcp4c/callback"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
-	"source.monogon.dev/metropolis/test/launch"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
+	"source.monogon.dev/osbase/test/launch"
 )
 
 var switchIP = net.IP{10, 1, 0, 1}
diff --git a/metropolis/test/nanoswitch/socks.go b/metropolis/test/nanoswitch/socks.go
index b8e7107..1230903 100644
--- a/metropolis/test/nanoswitch/socks.go
+++ b/metropolis/test/nanoswitch/socks.go
@@ -5,13 +5,13 @@
 	"fmt"
 	"net"
 
-	"source.monogon.dev/metropolis/pkg/socksproxy"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/socksproxy"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // SOCKSPort is the port at which nanoswitch listens for SOCKS conenctions.
 //
-// ONCHANGE(//metropolis/test/launch/cluster:cluster.go): port must be kept in sync
+// ONCHANGE(//metropolis/test/launch:cluster.go): port must be kept in sync
 const SOCKSPort uint16 = 1080
 
 // socksHandler implements a socksproxy.Handler which permits and logs
diff --git a/metropolis/test/swtpm/swtpm_cert/BUILD.bazel b/metropolis/test/swtpm/swtpm_cert/BUILD.bazel
index dce12e6..f0a8050 100644
--- a/metropolis/test/swtpm/swtpm_cert/BUILD.bazel
+++ b/metropolis/test/swtpm/swtpm_cert/BUILD.bazel
@@ -9,7 +9,7 @@
     importpath = "source.monogon.dev/metropolis/test/swtpm/swtpm_cert",
     visibility = ["//visibility:private"],
     deps = [
-        "//metropolis/pkg/pki",
+        "//osbase/pki",
         "@com_github_spf13_pflag//:pflag",
     ],
 )
diff --git a/metropolis/test/swtpm/swtpm_cert/main.go b/metropolis/test/swtpm/swtpm_cert/main.go
index 7b14f3a..8d5663b 100644
--- a/metropolis/test/swtpm/swtpm_cert/main.go
+++ b/metropolis/test/swtpm/swtpm_cert/main.go
@@ -24,7 +24,7 @@
 
 	"github.com/spf13/pflag"
 
-	"source.monogon.dev/metropolis/pkg/pki"
+	"source.monogon.dev/osbase/pki"
 )
 
 func getSignkey() *rsa.PrivateKey {
diff --git a/metropolis/test/util/BUILD.bazel b/metropolis/test/util/BUILD.bazel
index 00790a2..3603daf 100644
--- a/metropolis/test/util/BUILD.bazel
+++ b/metropolis/test/util/BUILD.bazel
@@ -12,10 +12,10 @@
     deps = [
         "//metropolis/node/core/curator/proto/api",
         "//metropolis/node/core/identity",
-        "//metropolis/pkg/event/memory",
-        "//metropolis/pkg/pki",
         "//metropolis/proto/common",
-        "//metropolis/test/launch",
+        "//osbase/event/memory",
+        "//osbase/pki",
+        "//osbase/test/launch",
         "@com_zx2c4_golang_wireguard_wgctrl//wgtypes",
         "@org_golang_google_grpc//:go_default_library",
         "@org_golang_google_grpc//credentials/insecure",
diff --git a/metropolis/test/util/curator.go b/metropolis/test/util/curator.go
index 39b2610..28fa7b1 100644
--- a/metropolis/test/util/curator.go
+++ b/metropolis/test/util/curator.go
@@ -13,7 +13,7 @@
 	apb "source.monogon.dev/metropolis/node/core/curator/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
 
-	"source.monogon.dev/metropolis/pkg/event/memory"
+	"source.monogon.dev/osbase/event/memory"
 )
 
 // TestCurator is a shim Curator implementation that serves pending Watch
diff --git a/metropolis/test/util/rpc.go b/metropolis/test/util/rpc.go
index e4caece..030d8d0 100644
--- a/metropolis/test/util/rpc.go
+++ b/metropolis/test/util/rpc.go
@@ -9,7 +9,7 @@
 	"testing"
 
 	"source.monogon.dev/metropolis/node/core/identity"
-	"source.monogon.dev/metropolis/pkg/pki"
+	"source.monogon.dev/osbase/pki"
 )
 
 // NewEphemeralClusterCredentials creates a set of TLS certificates for use in a
diff --git a/metropolis/test/util/runners.go b/metropolis/test/util/runners.go
index bb7aa91..95de02a 100644
--- a/metropolis/test/util/runners.go
+++ b/metropolis/test/util/runners.go
@@ -9,7 +9,7 @@
 	"testing"
 	"time"
 
-	"source.monogon.dev/metropolis/test/launch"
+	"source.monogon.dev/osbase/test/launch"
 )
 
 // TestEventual creates a new subtest looping the given function until it either
diff --git a/metropolis/vm/smoketest/BUILD.bazel b/metropolis/vm/smoketest/BUILD.bazel
index 7264bcf..3c01a4a 100644
--- a/metropolis/vm/smoketest/BUILD.bazel
+++ b/metropolis/vm/smoketest/BUILD.bazel
@@ -23,7 +23,7 @@
     name = "smoketest",
     data = [
         ":initramfs",
-        "//metropolis/test/ktest:linux-testing",
+        "//osbase/test/ktest:linux-testing",
         "@qemu//:qemu-x86_64-softmmu",
     ],
     embed = [":smoketest_lib"],
diff --git a/metropolis/vm/smoketest/main.go b/metropolis/vm/smoketest/main.go
index d22a578..3f0b8ca 100644
--- a/metropolis/vm/smoketest/main.go
+++ b/metropolis/vm/smoketest/main.go
@@ -65,7 +65,7 @@
 		"-accel", "kvm", "-cpu", "host",
 		"-bios", biosPath,
 		"-M", "microvm,x-option-roms=off,pic=off,pit=off,rtc=off,isa-serial=off",
-		"-kernel", "metropolis/test/ktest/linux-testing.elf",
+		"-kernel", "osbase/test/ktest/linux-testing.elf",
 		"-append", "reboot=t console=hvc0 quiet",
 		"-initrd", "metropolis/vm/smoketest/initramfs.cpio.lz4",
 		"-device", "virtio-rng-device,max-bytes=1024,period=1000",
diff --git a/metropolis/pkg/blkio/BUILD.bazel b/osbase/blkio/BUILD.bazel
similarity index 71%
rename from metropolis/pkg/blkio/BUILD.bazel
rename to osbase/blkio/BUILD.bazel
index 8b071ec..8b23a34 100644
--- a/metropolis/pkg/blkio/BUILD.bazel
+++ b/osbase/blkio/BUILD.bazel
@@ -3,6 +3,6 @@
 go_library(
     name = "blkio",
     srcs = ["blkio.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/blkio",
+    importpath = "source.monogon.dev/osbase/blkio",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/pkg/blkio/blkio.go b/osbase/blkio/blkio.go
similarity index 100%
rename from metropolis/pkg/blkio/blkio.go
rename to osbase/blkio/blkio.go
diff --git a/metropolis/pkg/blockdev/BUILD.bazel b/osbase/blockdev/BUILD.bazel
similarity index 91%
rename from metropolis/pkg/blockdev/BUILD.bazel
rename to osbase/blockdev/BUILD.bazel
index 4eff0d4..0805ef6 100644
--- a/metropolis/pkg/blockdev/BUILD.bazel
+++ b/osbase/blockdev/BUILD.bazel
@@ -8,7 +8,7 @@
         "blockdev_linux.go",
         "memory.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/blockdev",
+    importpath = "source.monogon.dev/osbase/blockdev",
     visibility = ["//visibility:public"],
     deps = select({
         "@io_bazel_rules_go//go/platform:android": [
diff --git a/metropolis/pkg/blockdev/blockdev.go b/osbase/blockdev/blockdev.go
similarity index 100%
rename from metropolis/pkg/blockdev/blockdev.go
rename to osbase/blockdev/blockdev.go
diff --git a/metropolis/pkg/blockdev/blockdev_darwin.go b/osbase/blockdev/blockdev_darwin.go
similarity index 100%
rename from metropolis/pkg/blockdev/blockdev_darwin.go
rename to osbase/blockdev/blockdev_darwin.go
diff --git a/metropolis/pkg/blockdev/blockdev_linux.go b/osbase/blockdev/blockdev_linux.go
similarity index 100%
rename from metropolis/pkg/blockdev/blockdev_linux.go
rename to osbase/blockdev/blockdev_linux.go
diff --git a/metropolis/pkg/blockdev/memory.go b/osbase/blockdev/memory.go
similarity index 100%
rename from metropolis/pkg/blockdev/memory.go
rename to osbase/blockdev/memory.go
diff --git a/metropolis/pkg/bootparam/BUILD.bazel b/osbase/bootparam/BUILD.bazel
similarity index 80%
rename from metropolis/pkg/bootparam/BUILD.bazel
rename to osbase/bootparam/BUILD.bazel
index 4b63f28..5a5704e 100644
--- a/metropolis/pkg/bootparam/BUILD.bazel
+++ b/osbase/bootparam/BUILD.bazel
@@ -6,7 +6,7 @@
         "bootparam.go",
         "params.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/bootparam",
+    importpath = "source.monogon.dev/osbase/bootparam",
     visibility = ["//visibility:public"],
 )
 
@@ -19,7 +19,7 @@
     embed = [":bootparam"],
     gc_goopts = ["-d=libfuzzer"],
     deps = [
-        "//metropolis/pkg/bootparam/ref",
+        "//osbase/bootparam/ref",
         "@com_github_google_go_cmp//cmp",
     ],
 )
diff --git a/metropolis/pkg/bootparam/bootparam.go b/osbase/bootparam/bootparam.go
similarity index 100%
rename from metropolis/pkg/bootparam/bootparam.go
rename to osbase/bootparam/bootparam.go
diff --git a/metropolis/pkg/bootparam/bootparam_test.go b/osbase/bootparam/bootparam_test.go
similarity index 91%
rename from metropolis/pkg/bootparam/bootparam_test.go
rename to osbase/bootparam/bootparam_test.go
index a0032a4..d864523 100644
--- a/metropolis/pkg/bootparam/bootparam_test.go
+++ b/osbase/bootparam/bootparam_test.go
@@ -7,12 +7,12 @@
 
 	"github.com/google/go-cmp/cmp"
 
-	"source.monogon.dev/metropolis/pkg/bootparam"
-	"source.monogon.dev/metropolis/pkg/bootparam/ref"
+	"source.monogon.dev/osbase/bootparam"
+	"source.monogon.dev/osbase/bootparam/ref"
 )
 
 // Fuzzers can be run with
-// bazel test //metropolis/pkg/bootparam:bootparam_test
+// bazel test //osbase/bootparam:bootparam_test
 //   --test_arg=-test.fuzz=FuzzMarshal
 //   --test_arg=-test.fuzzcachedir=/tmp/fuzz
 //   --test_arg=-test.fuzztime=60s
diff --git a/metropolis/pkg/bootparam/params.go b/osbase/bootparam/params.go
similarity index 100%
rename from metropolis/pkg/bootparam/params.go
rename to osbase/bootparam/params.go
diff --git a/metropolis/pkg/bootparam/params_test.go b/osbase/bootparam/params_test.go
similarity index 100%
rename from metropolis/pkg/bootparam/params_test.go
rename to osbase/bootparam/params_test.go
diff --git a/metropolis/pkg/bootparam/ref/BUILD.bazel b/osbase/bootparam/ref/BUILD.bazel
similarity index 64%
rename from metropolis/pkg/bootparam/ref/BUILD.bazel
rename to osbase/bootparam/ref/BUILD.bazel
index d22540a..c849546 100644
--- a/metropolis/pkg/bootparam/ref/BUILD.bazel
+++ b/osbase/bootparam/ref/BUILD.bazel
@@ -5,7 +5,7 @@
     srcs = ["ref.go"],
     cgo = True,
     gc_goopts = ["-d=libfuzzer"],
-    importpath = "source.monogon.dev/metropolis/pkg/bootparam/ref",
+    importpath = "source.monogon.dev/osbase/bootparam/ref",
     visibility = ["//visibility:public"],
-    deps = ["//metropolis/pkg/bootparam"],
+    deps = ["//osbase/bootparam"],
 )
diff --git a/metropolis/pkg/bootparam/ref/ref.go b/osbase/bootparam/ref/ref.go
similarity index 98%
rename from metropolis/pkg/bootparam/ref/ref.go
rename to osbase/bootparam/ref/ref.go
index 9842ecd..cf16b09 100644
--- a/metropolis/pkg/bootparam/ref/ref.go
+++ b/osbase/bootparam/ref/ref.go
@@ -115,7 +115,7 @@
 import (
 	"unsafe"
 
-	"source.monogon.dev/metropolis/pkg/bootparam"
+	"source.monogon.dev/osbase/bootparam"
 )
 
 func Parse(str string) (params bootparam.Params, rest string) {
diff --git a/metropolis/pkg/cmd/BUILD.bazel b/osbase/cmd/BUILD.bazel
similarity index 63%
rename from metropolis/pkg/cmd/BUILD.bazel
rename to osbase/cmd/BUILD.bazel
index 7d5bbeb..dd5f66e 100644
--- a/metropolis/pkg/cmd/BUILD.bazel
+++ b/osbase/cmd/BUILD.bazel
@@ -3,9 +3,9 @@
 go_library(
     name = "cmd",
     srcs = ["run.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/cmd",
+    importpath = "source.monogon.dev/osbase/cmd",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/logbuffer",
+        "//osbase/logbuffer",
     ],
 )
diff --git a/metropolis/pkg/cmd/run.go b/osbase/cmd/run.go
similarity index 98%
rename from metropolis/pkg/cmd/run.go
rename to osbase/cmd/run.go
index 808a7c0..f569979 100644
--- a/metropolis/pkg/cmd/run.go
+++ b/osbase/cmd/run.go
@@ -10,7 +10,7 @@
 	"os/exec"
 	"strings"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
+	"source.monogon.dev/osbase/logbuffer"
 )
 
 // RunCommand starts a new process and waits until either its completion, or
diff --git a/metropolis/pkg/devicemapper/BUILD.bazel b/osbase/devicemapper/BUILD.bazel
similarity index 72%
rename from metropolis/pkg/devicemapper/BUILD.bazel
rename to osbase/devicemapper/BUILD.bazel
index 7d4c132..13957b9 100644
--- a/metropolis/pkg/devicemapper/BUILD.bazel
+++ b/osbase/devicemapper/BUILD.bazel
@@ -6,8 +6,8 @@
         "ctype.go",
         "devicemapper.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/devicemapper",
-    visibility = ["//metropolis:__subpackages__"],
+    importpath = "source.monogon.dev/osbase/devicemapper",
+    visibility = ["//visibility:public"],
     deps = [
         "@com_github_pkg_errors//:errors",
         "@com_github_yalue_native_endian//:native_endian",
diff --git a/metropolis/pkg/devicemapper/ctype.go b/osbase/devicemapper/ctype.go
similarity index 100%
rename from metropolis/pkg/devicemapper/ctype.go
rename to osbase/devicemapper/ctype.go
diff --git a/metropolis/pkg/devicemapper/devicemapper.go b/osbase/devicemapper/devicemapper.go
similarity index 100%
rename from metropolis/pkg/devicemapper/devicemapper.go
rename to osbase/devicemapper/devicemapper.go
diff --git a/metropolis/pkg/efivarfs/BUILD.bazel b/osbase/efivarfs/BUILD.bazel
similarity index 86%
rename from metropolis/pkg/efivarfs/BUILD.bazel
rename to osbase/efivarfs/BUILD.bazel
index 3e5339c..7f7539f 100644
--- a/metropolis/pkg/efivarfs/BUILD.bazel
+++ b/osbase/efivarfs/BUILD.bazel
@@ -8,10 +8,10 @@
         "efivarfs.go",
         "variables.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/efivarfs",
+    importpath = "source.monogon.dev/osbase/efivarfs",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/msguid",
+        "//osbase/msguid",
         "@com_github_google_uuid//:uuid",
         "@org_golang_x_text//encoding/unicode",
     ],
diff --git a/metropolis/pkg/efivarfs/boot.go b/osbase/efivarfs/boot.go
similarity index 100%
rename from metropolis/pkg/efivarfs/boot.go
rename to osbase/efivarfs/boot.go
diff --git a/metropolis/pkg/efivarfs/boot_test.go b/osbase/efivarfs/boot_test.go
similarity index 100%
rename from metropolis/pkg/efivarfs/boot_test.go
rename to osbase/efivarfs/boot_test.go
diff --git a/metropolis/pkg/efivarfs/devicepath.go b/osbase/efivarfs/devicepath.go
similarity index 99%
rename from metropolis/pkg/efivarfs/devicepath.go
rename to osbase/efivarfs/devicepath.go
index 38dd731..d06960c 100644
--- a/metropolis/pkg/efivarfs/devicepath.go
+++ b/osbase/efivarfs/devicepath.go
@@ -10,7 +10,7 @@
 
 	"github.com/google/uuid"
 
-	"source.monogon.dev/metropolis/pkg/msguid"
+	"source.monogon.dev/osbase/msguid"
 )
 
 // DevicePath represents a path consisting of one or more elements to an
diff --git a/metropolis/pkg/efivarfs/devicepath_test.go b/osbase/efivarfs/devicepath_test.go
similarity index 100%
rename from metropolis/pkg/efivarfs/devicepath_test.go
rename to osbase/efivarfs/devicepath_test.go
diff --git a/metropolis/pkg/efivarfs/efivarfs.go b/osbase/efivarfs/efivarfs.go
similarity index 100%
rename from metropolis/pkg/efivarfs/efivarfs.go
rename to osbase/efivarfs/efivarfs.go
diff --git a/metropolis/pkg/efivarfs/variables.go b/osbase/efivarfs/variables.go
similarity index 100%
rename from metropolis/pkg/efivarfs/variables.go
rename to osbase/efivarfs/variables.go
diff --git a/metropolis/pkg/erofs/BUILD.bazel b/osbase/erofs/BUILD.bazel
similarity index 86%
rename from metropolis/pkg/erofs/BUILD.bazel
rename to osbase/erofs/BUILD.bazel
index ce1622c..596b428 100644
--- a/metropolis/pkg/erofs/BUILD.bazel
+++ b/osbase/erofs/BUILD.bazel
@@ -1,5 +1,5 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "erofs",
@@ -10,7 +10,7 @@
         "inode_types.go",
         "uncompressed_inode_writer.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/erofs",
+    importpath = "source.monogon.dev/osbase/erofs",
     visibility = ["//visibility:public"],
     deps = ["@org_golang_x_sys//unix"],
 )
diff --git a/metropolis/pkg/erofs/compression.go b/osbase/erofs/compression.go
similarity index 100%
rename from metropolis/pkg/erofs/compression.go
rename to osbase/erofs/compression.go
diff --git a/metropolis/pkg/erofs/compression_test.go b/osbase/erofs/compression_test.go
similarity index 100%
rename from metropolis/pkg/erofs/compression_test.go
rename to osbase/erofs/compression_test.go
diff --git a/metropolis/pkg/erofs/defs.go b/osbase/erofs/defs.go
similarity index 100%
rename from metropolis/pkg/erofs/defs.go
rename to osbase/erofs/defs.go
diff --git a/metropolis/pkg/erofs/defs_test.go b/osbase/erofs/defs_test.go
similarity index 100%
rename from metropolis/pkg/erofs/defs_test.go
rename to osbase/erofs/defs_test.go
diff --git a/metropolis/pkg/erofs/doc.md b/osbase/erofs/doc.md
similarity index 100%
rename from metropolis/pkg/erofs/doc.md
rename to osbase/erofs/doc.md
diff --git a/metropolis/pkg/erofs/erofs.go b/osbase/erofs/erofs.go
similarity index 100%
rename from metropolis/pkg/erofs/erofs.go
rename to osbase/erofs/erofs.go
diff --git a/metropolis/pkg/erofs/erofs_test.go b/osbase/erofs/erofs_test.go
similarity index 100%
rename from metropolis/pkg/erofs/erofs_test.go
rename to osbase/erofs/erofs_test.go
diff --git a/metropolis/pkg/erofs/inode_types.go b/osbase/erofs/inode_types.go
similarity index 100%
rename from metropolis/pkg/erofs/inode_types.go
rename to osbase/erofs/inode_types.go
diff --git a/metropolis/pkg/erofs/uncompressed_inode_writer.go b/osbase/erofs/uncompressed_inode_writer.go
similarity index 100%
rename from metropolis/pkg/erofs/uncompressed_inode_writer.go
rename to osbase/erofs/uncompressed_inode_writer.go
diff --git a/osbase/event/BUILD.bazel b/osbase/event/BUILD.bazel
new file mode 100644
index 0000000..a8a2a0c
--- /dev/null
+++ b/osbase/event/BUILD.bazel
@@ -0,0 +1,9 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "event",
+    srcs = ["event.go"],
+    importpath = "source.monogon.dev/osbase/event",
+    visibility = ["//visibility:public"],
+    deps = ["//osbase/supervisor"],
+)
diff --git a/metropolis/pkg/event/etcd/BUILD.bazel b/osbase/event/etcd/BUILD.bazel
similarity index 80%
rename from metropolis/pkg/event/etcd/BUILD.bazel
rename to osbase/event/etcd/BUILD.bazel
index 22766ff..925eeaa 100644
--- a/metropolis/pkg/event/etcd/BUILD.bazel
+++ b/osbase/event/etcd/BUILD.bazel
@@ -3,10 +3,10 @@
 go_library(
     name = "etcd",
     srcs = ["etcd.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/event/etcd",
+    importpath = "source.monogon.dev/osbase/event/etcd",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/event",
+        "//osbase/event",
         "@com_github_cenkalti_backoff_v4//:backoff",
         "@io_etcd_go_etcd_client_v3//:client",
     ],
@@ -17,8 +17,8 @@
     srcs = ["etcd_test.go"],
     embed = [":etcd"],
     deps = [
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/logtree",
+        "//osbase/event",
+        "//osbase/logtree",
         "@io_etcd_go_etcd_api_v3//v3rpc/rpctypes",
         "@io_etcd_go_etcd_client_pkg_v3//testutil",
         "@io_etcd_go_etcd_client_v3//:client",
diff --git a/metropolis/pkg/event/etcd/etcd.go b/osbase/event/etcd/etcd.go
similarity index 99%
rename from metropolis/pkg/event/etcd/etcd.go
rename to osbase/event/etcd/etcd.go
index afcea35..8cf2440 100644
--- a/metropolis/pkg/event/etcd/etcd.go
+++ b/osbase/event/etcd/etcd.go
@@ -10,7 +10,7 @@
 	"github.com/cenkalti/backoff/v4"
 	clientv3 "go.etcd.io/etcd/client/v3"
 
-	"source.monogon.dev/metropolis/pkg/event"
+	"source.monogon.dev/osbase/event"
 )
 
 var (
diff --git a/metropolis/pkg/event/etcd/etcd_test.go b/osbase/event/etcd/etcd_test.go
similarity index 99%
rename from metropolis/pkg/event/etcd/etcd_test.go
rename to osbase/event/etcd/etcd_test.go
index bd96363..ee3672f 100644
--- a/metropolis/pkg/event/etcd/etcd_test.go
+++ b/osbase/event/etcd/etcd_test.go
@@ -20,8 +20,8 @@
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/grpclog"
 
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/logtree"
 )
 
 var (
diff --git a/metropolis/pkg/event/event.go b/osbase/event/event.go
similarity index 99%
rename from metropolis/pkg/event/event.go
rename to osbase/event/event.go
index a8b3526..e2e0bd8 100644
--- a/metropolis/pkg/event/event.go
+++ b/osbase/event/event.go
@@ -76,7 +76,7 @@
 	"context"
 	"errors"
 
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // A Value is an 'Event Value', some piece of data that can be updated ('Set')
diff --git a/metropolis/pkg/event/memory/BUILD.bazel b/osbase/event/memory/BUILD.bazel
similarity index 67%
rename from metropolis/pkg/event/memory/BUILD.bazel
rename to osbase/event/memory/BUILD.bazel
index da07dc3..f2cd4bd 100644
--- a/metropolis/pkg/event/memory/BUILD.bazel
+++ b/osbase/event/memory/BUILD.bazel
@@ -3,9 +3,9 @@
 go_library(
     name = "memory",
     srcs = ["memory.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/event/memory",
+    importpath = "source.monogon.dev/osbase/event/memory",
     visibility = ["//visibility:public"],
-    deps = ["//metropolis/pkg/event"],
+    deps = ["//osbase/event"],
 )
 
 go_test(
@@ -15,5 +15,5 @@
         "memory_test.go",
     ],
     embed = [":memory"],
-    deps = ["//metropolis/pkg/event"],
+    deps = ["//osbase/event"],
 )
diff --git a/metropolis/pkg/event/memory/example_test.go b/osbase/event/memory/example_test.go
similarity index 100%
rename from metropolis/pkg/event/memory/example_test.go
rename to osbase/event/memory/example_test.go
diff --git a/metropolis/pkg/event/memory/memory.go b/osbase/event/memory/memory.go
similarity index 98%
rename from metropolis/pkg/event/memory/memory.go
rename to osbase/event/memory/memory.go
index 7402d64..16818a0 100644
--- a/metropolis/pkg/event/memory/memory.go
+++ b/osbase/event/memory/memory.go
@@ -22,7 +22,7 @@
 	"fmt"
 	"sync"
 
-	"source.monogon.dev/metropolis/pkg/event"
+	"source.monogon.dev/osbase/event"
 )
 
 var (
diff --git a/metropolis/pkg/event/memory/memory_test.go b/osbase/event/memory/memory_test.go
similarity index 99%
rename from metropolis/pkg/event/memory/memory_test.go
rename to osbase/event/memory/memory_test.go
index eec0a37..b622565 100644
--- a/metropolis/pkg/event/memory/memory_test.go
+++ b/osbase/event/memory/memory_test.go
@@ -25,7 +25,7 @@
 	"testing"
 	"time"
 
-	"source.monogon.dev/metropolis/pkg/event"
+	"source.monogon.dev/osbase/event"
 )
 
 // TestAsync exercises the high-level behaviour of a Value, in which a
diff --git a/metropolis/pkg/fat32/BUILD.bazel b/osbase/fat32/BUILD.bazel
similarity index 87%
rename from metropolis/pkg/fat32/BUILD.bazel
rename to osbase/fat32/BUILD.bazel
index b39b40b..d9aec3d 100644
--- a/metropolis/pkg/fat32/BUILD.bazel
+++ b/osbase/fat32/BUILD.bazel
@@ -1,5 +1,5 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "fat32",
@@ -9,7 +9,7 @@
         "structs.go",
         "utils.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/fat32",
+    importpath = "source.monogon.dev/osbase/fat32",
     visibility = ["//visibility:public"],
 )
 
diff --git a/metropolis/pkg/fat32/dos83.go b/osbase/fat32/dos83.go
similarity index 100%
rename from metropolis/pkg/fat32/dos83.go
rename to osbase/fat32/dos83.go
diff --git a/metropolis/pkg/fat32/fat32.go b/osbase/fat32/fat32.go
similarity index 100%
rename from metropolis/pkg/fat32/fat32.go
rename to osbase/fat32/fat32.go
diff --git a/metropolis/pkg/fat32/fsck_test.go b/osbase/fat32/fsck_test.go
similarity index 100%
rename from metropolis/pkg/fat32/fsck_test.go
rename to osbase/fat32/fsck_test.go
diff --git a/metropolis/pkg/fat32/linux_test.go b/osbase/fat32/linux_test.go
similarity index 100%
rename from metropolis/pkg/fat32/linux_test.go
rename to osbase/fat32/linux_test.go
diff --git a/metropolis/pkg/fat32/structs.go b/osbase/fat32/structs.go
similarity index 100%
rename from metropolis/pkg/fat32/structs.go
rename to osbase/fat32/structs.go
diff --git a/metropolis/pkg/fat32/structs_test.go b/osbase/fat32/structs_test.go
similarity index 100%
rename from metropolis/pkg/fat32/structs_test.go
rename to osbase/fat32/structs_test.go
diff --git a/metropolis/pkg/fat32/utils.go b/osbase/fat32/utils.go
similarity index 100%
rename from metropolis/pkg/fat32/utils.go
rename to osbase/fat32/utils.go
diff --git a/osbase/fileargs/BUILD.bazel b/osbase/fileargs/BUILD.bazel
new file mode 100644
index 0000000..e716c6f
--- /dev/null
+++ b/osbase/fileargs/BUILD.bazel
@@ -0,0 +1,9 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "fileargs",
+    srcs = ["fileargs.go"],
+    importpath = "source.monogon.dev/osbase/fileargs",
+    visibility = ["//visibility:public"],
+    deps = ["@org_golang_x_sys//unix"],
+)
diff --git a/metropolis/pkg/fileargs/fileargs.go b/osbase/fileargs/fileargs.go
similarity index 100%
rename from metropolis/pkg/fileargs/fileargs.go
rename to osbase/fileargs/fileargs.go
diff --git a/metropolis/pkg/freeport/BUILD.bazel b/osbase/freeport/BUILD.bazel
similarity index 71%
rename from metropolis/pkg/freeport/BUILD.bazel
rename to osbase/freeport/BUILD.bazel
index ee965ee..b0fcd25 100644
--- a/metropolis/pkg/freeport/BUILD.bazel
+++ b/osbase/freeport/BUILD.bazel
@@ -3,6 +3,6 @@
 go_library(
     name = "freeport",
     srcs = ["freeport.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/freeport",
+    importpath = "source.monogon.dev/osbase/freeport",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/pkg/freeport/freeport.go b/osbase/freeport/freeport.go
similarity index 100%
rename from metropolis/pkg/freeport/freeport.go
rename to osbase/freeport/freeport.go
diff --git a/metropolis/pkg/fsquota/BUILD.bazel b/osbase/fsquota/BUILD.bazel
similarity index 67%
rename from metropolis/pkg/fsquota/BUILD.bazel
rename to osbase/fsquota/BUILD.bazel
index 5fa7037..350f33d 100644
--- a/metropolis/pkg/fsquota/BUILD.bazel
+++ b/osbase/fsquota/BUILD.bazel
@@ -1,14 +1,14 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "fsquota",
     srcs = ["fsquota.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/fsquota",
-    visibility = ["//metropolis:__subpackages__"],
+    importpath = "source.monogon.dev/osbase/fsquota",
+    visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/fsquota/fsxattrs",
-        "//metropolis/pkg/fsquota/quotactl",
+        "//osbase/fsquota/fsxattrs",
+        "//osbase/fsquota/quotactl",
         "@org_golang_x_sys//unix",
     ],
 )
diff --git a/metropolis/pkg/fsquota/fsquota.go b/osbase/fsquota/fsquota.go
similarity index 97%
rename from metropolis/pkg/fsquota/fsquota.go
rename to osbase/fsquota/fsquota.go
index af87d9f..57acf75 100644
--- a/metropolis/pkg/fsquota/fsquota.go
+++ b/osbase/fsquota/fsquota.go
@@ -29,8 +29,8 @@
 
 	"golang.org/x/sys/unix"
 
-	"source.monogon.dev/metropolis/pkg/fsquota/fsxattrs"
-	"source.monogon.dev/metropolis/pkg/fsquota/quotactl"
+	"source.monogon.dev/osbase/fsquota/fsxattrs"
+	"source.monogon.dev/osbase/fsquota/quotactl"
 )
 
 // SetQuota sets the quota of bytes and/or inodes in a given path. To not set a
diff --git a/metropolis/pkg/fsquota/fsquota_test.go b/osbase/fsquota/fsquota_test.go
similarity index 100%
rename from metropolis/pkg/fsquota/fsquota_test.go
rename to osbase/fsquota/fsquota_test.go
diff --git a/osbase/fsquota/fsxattrs/BUILD.bazel b/osbase/fsquota/fsxattrs/BUILD.bazel
new file mode 100644
index 0000000..b5217aa
--- /dev/null
+++ b/osbase/fsquota/fsxattrs/BUILD.bazel
@@ -0,0 +1,9 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "fsxattrs",
+    srcs = ["fsxattrs.go"],
+    importpath = "source.monogon.dev/osbase/fsquota/fsxattrs",
+    visibility = ["//visibility:public"],
+    deps = ["@org_golang_x_sys//unix"],
+)
diff --git a/metropolis/pkg/fsquota/fsxattrs/fsxattrs.go b/osbase/fsquota/fsxattrs/fsxattrs.go
similarity index 100%
rename from metropolis/pkg/fsquota/fsxattrs/fsxattrs.go
rename to osbase/fsquota/fsxattrs/fsxattrs.go
diff --git a/osbase/fsquota/quotactl/BUILD.bazel b/osbase/fsquota/quotactl/BUILD.bazel
new file mode 100644
index 0000000..57995fe
--- /dev/null
+++ b/osbase/fsquota/quotactl/BUILD.bazel
@@ -0,0 +1,9 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "quotactl",
+    srcs = ["quotactl.go"],
+    importpath = "source.monogon.dev/osbase/fsquota/quotactl",
+    visibility = ["//visibility:public"],
+    deps = ["@org_golang_x_sys//unix"],
+)
diff --git a/metropolis/pkg/fsquota/quotactl/quotactl.go b/osbase/fsquota/quotactl/quotactl.go
similarity index 100%
rename from metropolis/pkg/fsquota/quotactl/quotactl.go
rename to osbase/fsquota/quotactl/quotactl.go
diff --git a/metropolis/pkg/gpt/BUILD.bazel b/osbase/gpt/BUILD.bazel
similarity index 71%
rename from metropolis/pkg/gpt/BUILD.bazel
rename to osbase/gpt/BUILD.bazel
index 2bb0b4a..67a54ee 100644
--- a/metropolis/pkg/gpt/BUILD.bazel
+++ b/osbase/gpt/BUILD.bazel
@@ -1,5 +1,5 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "gpt",
@@ -7,11 +7,11 @@
         "gpt.go",
         "mbr.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/gpt",
+    importpath = "source.monogon.dev/osbase/gpt",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/blockdev",
-        "//metropolis/pkg/msguid",
+        "//osbase/blockdev",
+        "//osbase/msguid",
         "@com_github_google_uuid//:uuid",
     ],
 )
@@ -26,7 +26,7 @@
     ],
     embed = [":gpt"],
     deps = [
-        "//metropolis/pkg/blockdev",
+        "//osbase/blockdev",
         "@com_github_google_uuid//:uuid",
     ],
 )
diff --git a/metropolis/pkg/gpt/gpt.go b/osbase/gpt/gpt.go
similarity index 99%
rename from metropolis/pkg/gpt/gpt.go
rename to osbase/gpt/gpt.go
index 58c0527..be6fb7f 100644
--- a/metropolis/pkg/gpt/gpt.go
+++ b/osbase/gpt/gpt.go
@@ -16,8 +16,8 @@
 
 	"github.com/google/uuid"
 
-	"source.monogon.dev/metropolis/pkg/blockdev"
-	"source.monogon.dev/metropolis/pkg/msguid"
+	"source.monogon.dev/osbase/blockdev"
+	"source.monogon.dev/osbase/msguid"
 )
 
 var gptSignature = [8]byte{'E', 'F', 'I', ' ', 'P', 'A', 'R', 'T'}
diff --git a/metropolis/pkg/gpt/gpt_test.go b/osbase/gpt/gpt_test.go
similarity index 98%
rename from metropolis/pkg/gpt/gpt_test.go
rename to osbase/gpt/gpt_test.go
index 3f25db9..e662e69 100644
--- a/metropolis/pkg/gpt/gpt_test.go
+++ b/osbase/gpt/gpt_test.go
@@ -9,7 +9,7 @@
 
 	"github.com/google/uuid"
 
-	"source.monogon.dev/metropolis/pkg/blockdev"
+	"source.monogon.dev/osbase/blockdev"
 )
 
 func TestFreeSpaces(t *testing.T) {
diff --git a/metropolis/pkg/gpt/linux_test.go b/osbase/gpt/linux_test.go
similarity index 96%
rename from metropolis/pkg/gpt/linux_test.go
rename to osbase/gpt/linux_test.go
index 7f7f6de..030c8eb 100644
--- a/metropolis/pkg/gpt/linux_test.go
+++ b/osbase/gpt/linux_test.go
@@ -6,7 +6,7 @@
 
 	"github.com/google/uuid"
 
-	"source.monogon.dev/metropolis/pkg/blockdev"
+	"source.monogon.dev/osbase/blockdev"
 )
 
 var testUUID = uuid.MustParse("85c0b60f-caf9-40dd-86fa-f8797e26238d")
diff --git a/metropolis/pkg/gpt/mbr.go b/osbase/gpt/mbr.go
similarity index 100%
rename from metropolis/pkg/gpt/mbr.go
rename to osbase/gpt/mbr.go
diff --git a/metropolis/pkg/gpt/mbr_test.go b/osbase/gpt/mbr_test.go
similarity index 100%
rename from metropolis/pkg/gpt/mbr_test.go
rename to osbase/gpt/mbr_test.go
diff --git a/metropolis/pkg/gpt/structs_test.go b/osbase/gpt/structs_test.go
similarity index 100%
rename from metropolis/pkg/gpt/structs_test.go
rename to osbase/gpt/structs_test.go
diff --git a/metropolis/pkg/jsonpatch/BUILD.bazel b/osbase/jsonpatch/BUILD.bazel
similarity index 67%
rename from metropolis/pkg/jsonpatch/BUILD.bazel
rename to osbase/jsonpatch/BUILD.bazel
index e6dd37e..dc3dd00 100644
--- a/metropolis/pkg/jsonpatch/BUILD.bazel
+++ b/osbase/jsonpatch/BUILD.bazel
@@ -3,8 +3,8 @@
 go_library(
     name = "jsonpatch",
     srcs = ["jsonpatch.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/jsonpatch",
-    visibility = ["//metropolis:__subpackages__"],
+    importpath = "source.monogon.dev/osbase/jsonpatch",
+    visibility = ["//visibility:public"],
 )
 
 go_test(
diff --git a/metropolis/pkg/jsonpatch/jsonpatch.go b/osbase/jsonpatch/jsonpatch.go
similarity index 100%
rename from metropolis/pkg/jsonpatch/jsonpatch.go
rename to osbase/jsonpatch/jsonpatch.go
diff --git a/metropolis/pkg/jsonpatch/jsonpatch_test.go b/osbase/jsonpatch/jsonpatch_test.go
similarity index 100%
rename from metropolis/pkg/jsonpatch/jsonpatch_test.go
rename to osbase/jsonpatch/jsonpatch_test.go
diff --git a/metropolis/pkg/kexec/BUILD.bazel b/osbase/kexec/BUILD.bazel
similarity index 89%
rename from metropolis/pkg/kexec/BUILD.bazel
rename to osbase/kexec/BUILD.bazel
index 61da706..3004c5a 100644
--- a/metropolis/pkg/kexec/BUILD.bazel
+++ b/osbase/kexec/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "kexec",
     srcs = ["kexec.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/kexec",
+    importpath = "source.monogon.dev/osbase/kexec",
     visibility = ["//visibility:public"],
     deps = select({
         "@io_bazel_rules_go//go/platform:amd64": [
diff --git a/metropolis/pkg/kexec/kexec.go b/osbase/kexec/kexec.go
similarity index 100%
rename from metropolis/pkg/kexec/kexec.go
rename to osbase/kexec/kexec.go
diff --git a/metropolis/pkg/kmod/BUILD.bazel b/osbase/kmod/BUILD.bazel
similarity index 79%
rename from metropolis/pkg/kmod/BUILD.bazel
rename to osbase/kmod/BUILD.bazel
index 6264bf9..a8ade05 100644
--- a/metropolis/pkg/kmod/BUILD.bazel
+++ b/osbase/kmod/BUILD.bazel
@@ -1,6 +1,6 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 load("//metropolis/node/build/fwprune:def.bzl", "fsspec_linux_firmware")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "kmod",
@@ -11,10 +11,10 @@
         "radix.go",
         "syscall.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/kmod",
+    importpath = "source.monogon.dev/osbase/kmod",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/kmod/spec",
+        "//osbase/kmod/spec",
         "@org_golang_google_protobuf//proto",
         "@org_golang_x_sys//unix",
     ],
@@ -28,7 +28,7 @@
     ],
     embed = [":kmod"],
     deps = [
-        "//metropolis/pkg/kmod/spec",
+        "//osbase/kmod/spec",
         "@com_github_google_go_cmp//cmp",
         "@org_golang_google_protobuf//testing/protocmp",
     ],
@@ -37,7 +37,7 @@
 fsspec_linux_firmware(
     name = "firmware",
     firmware_files = ["@linux-firmware//:all_files"],
-    kernel = "//metropolis/test/ktest:linux-testing",
+    kernel = "//osbase/test/ktest:linux-testing",
     metadata = "@linux-firmware//:metadata",
 )
 
diff --git a/metropolis/pkg/kmod/manager.go b/osbase/kmod/manager.go
similarity index 98%
rename from metropolis/pkg/kmod/manager.go
rename to osbase/kmod/manager.go
index 3b3f875..6369212 100644
--- a/metropolis/pkg/kmod/manager.go
+++ b/osbase/kmod/manager.go
@@ -12,7 +12,7 @@
 	"golang.org/x/sys/unix"
 	"google.golang.org/protobuf/proto"
 
-	kmodpb "source.monogon.dev/metropolis/pkg/kmod/spec"
+	kmodpb "source.monogon.dev/osbase/kmod/spec"
 )
 
 // Manager contains all the logic and metadata required to efficiently load
diff --git a/metropolis/pkg/kmod/manager_test.go b/osbase/kmod/manager_test.go
similarity index 100%
rename from metropolis/pkg/kmod/manager_test.go
rename to osbase/kmod/manager_test.go
diff --git a/metropolis/pkg/kmod/meta.go b/osbase/kmod/meta.go
similarity index 96%
rename from metropolis/pkg/kmod/meta.go
rename to osbase/kmod/meta.go
index 2554c33..c005a7c 100644
--- a/metropolis/pkg/kmod/meta.go
+++ b/osbase/kmod/meta.go
@@ -4,7 +4,7 @@
 	"fmt"
 	"log"
 
-	kmodpb "source.monogon.dev/metropolis/pkg/kmod/spec"
+	kmodpb "source.monogon.dev/osbase/kmod/spec"
 )
 
 // MakeMetaFromModuleInfo is a more flexible alternative to MakeMeta. It only
diff --git a/metropolis/pkg/kmod/modinfo.go b/osbase/kmod/modinfo.go
similarity index 100%
rename from metropolis/pkg/kmod/modinfo.go
rename to osbase/kmod/modinfo.go
diff --git a/metropolis/pkg/kmod/radix.go b/osbase/kmod/radix.go
similarity index 98%
rename from metropolis/pkg/kmod/radix.go
rename to osbase/kmod/radix.go
index 7dfc68c..c20b48d 100644
--- a/metropolis/pkg/kmod/radix.go
+++ b/osbase/kmod/radix.go
@@ -7,7 +7,7 @@
 	"sort"
 	"strings"
 
-	kmodpb "source.monogon.dev/metropolis/pkg/kmod/spec"
+	kmodpb "source.monogon.dev/osbase/kmod/spec"
 )
 
 // LookupModules looks up all matching modules for a given modalias device
diff --git a/metropolis/pkg/kmod/radix_test.go b/osbase/kmod/radix_test.go
similarity index 98%
rename from metropolis/pkg/kmod/radix_test.go
rename to osbase/kmod/radix_test.go
index 7a815ba..62e9d95 100644
--- a/metropolis/pkg/kmod/radix_test.go
+++ b/osbase/kmod/radix_test.go
@@ -10,7 +10,7 @@
 	"github.com/google/go-cmp/cmp"
 	"google.golang.org/protobuf/testing/protocmp"
 
-	kmodpb "source.monogon.dev/metropolis/pkg/kmod/spec"
+	kmodpb "source.monogon.dev/osbase/kmod/spec"
 )
 
 func TestParsePattern(t *testing.T) {
diff --git a/metropolis/pkg/kmod/spec/BUILD.bazel b/osbase/kmod/spec/BUILD.bazel
similarity index 79%
rename from metropolis/pkg/kmod/spec/BUILD.bazel
rename to osbase/kmod/spec/BUILD.bazel
index 145ab7b..75bcf63 100644
--- a/metropolis/pkg/kmod/spec/BUILD.bazel
+++ b/osbase/kmod/spec/BUILD.bazel
@@ -10,7 +10,7 @@
 
 go_proto_library(
     name = "spec_go_proto",
-    importpath = "source.monogon.dev/metropolis/pkg/kmod/spec",
+    importpath = "source.monogon.dev/osbase/kmod/spec",
     proto = ":spec_proto",
     visibility = ["//visibility:public"],
 )
@@ -18,6 +18,6 @@
 go_library(
     name = "spec",
     embed = [":spec_go_proto"],
-    importpath = "source.monogon.dev/metropolis/pkg/kmod/spec",
+    importpath = "source.monogon.dev/osbase/kmod/spec",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/pkg/kmod/spec/gomod-generated-placeholder.go b/osbase/kmod/spec/gomod-generated-placeholder.go
similarity index 100%
rename from metropolis/pkg/kmod/spec/gomod-generated-placeholder.go
rename to osbase/kmod/spec/gomod-generated-placeholder.go
diff --git a/metropolis/pkg/kmod/spec/meta.proto b/osbase/kmod/spec/meta.proto
similarity index 95%
rename from metropolis/pkg/kmod/spec/meta.proto
rename to osbase/kmod/spec/meta.proto
index a608b69..ed2cc73 100644
--- a/metropolis/pkg/kmod/spec/meta.proto
+++ b/osbase/kmod/spec/meta.proto
@@ -2,7 +2,7 @@
 
 package metropolis.pkg.kmod;
 
-option go_package = "source.monogon.dev/metropolis/pkg/kmod/spec";
+option go_package = "source.monogon.dev/osbase/kmod/spec";
 
 // Module contains important metadata about a Linux kernel module.
 message Module {
diff --git a/metropolis/pkg/kmod/syscall.go b/osbase/kmod/syscall.go
similarity index 100%
rename from metropolis/pkg/kmod/syscall.go
rename to osbase/kmod/syscall.go
diff --git a/metropolis/pkg/logbuffer/BUILD.bazel b/osbase/logbuffer/BUILD.bazel
similarity index 69%
rename from metropolis/pkg/logbuffer/BUILD.bazel
rename to osbase/logbuffer/BUILD.bazel
index 8433802..3ce824a 100644
--- a/metropolis/pkg/logbuffer/BUILD.bazel
+++ b/osbase/logbuffer/BUILD.bazel
@@ -6,9 +6,9 @@
         "linebuffer.go",
         "logbuffer.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/logbuffer",
-    visibility = ["//metropolis:__subpackages__"],
-    deps = ["//metropolis/pkg/logtree/proto"],
+    importpath = "source.monogon.dev/osbase/logbuffer",
+    visibility = ["//visibility:public"],
+    deps = ["//osbase/logtree/proto"],
 )
 
 go_test(
diff --git a/metropolis/pkg/logbuffer/linebuffer.go b/osbase/logbuffer/linebuffer.go
similarity index 98%
rename from metropolis/pkg/logbuffer/linebuffer.go
rename to osbase/logbuffer/linebuffer.go
index 3892e0c..2195ec3 100644
--- a/metropolis/pkg/logbuffer/linebuffer.go
+++ b/osbase/logbuffer/linebuffer.go
@@ -22,7 +22,7 @@
 	"strings"
 	"sync"
 
-	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
+	lpb "source.monogon.dev/osbase/logtree/proto"
 )
 
 // Line is a line stored in the log buffer - a string, that has been perhaps
diff --git a/metropolis/pkg/logbuffer/linebuffer_test.go b/osbase/logbuffer/linebuffer_test.go
similarity index 100%
rename from metropolis/pkg/logbuffer/linebuffer_test.go
rename to osbase/logbuffer/linebuffer_test.go
diff --git a/metropolis/pkg/logbuffer/logbuffer.go b/osbase/logbuffer/logbuffer.go
similarity index 100%
rename from metropolis/pkg/logbuffer/logbuffer.go
rename to osbase/logbuffer/logbuffer.go
diff --git a/metropolis/pkg/logbuffer/logbuffer_test.go b/osbase/logbuffer/logbuffer_test.go
similarity index 100%
rename from metropolis/pkg/logbuffer/logbuffer_test.go
rename to osbase/logbuffer/logbuffer_test.go
diff --git a/metropolis/pkg/logtree/BUILD.bazel b/osbase/logtree/BUILD.bazel
similarity index 90%
rename from metropolis/pkg/logtree/BUILD.bazel
rename to osbase/logtree/BUILD.bazel
index a2f86ad..7c13aeb 100644
--- a/metropolis/pkg/logtree/BUILD.bazel
+++ b/osbase/logtree/BUILD.bazel
@@ -20,11 +20,11 @@
         "zap.go",
     ],
     # TODO(#189): move logtree to //go
-    importpath = "source.monogon.dev/metropolis/pkg/logtree",
+    importpath = "source.monogon.dev/osbase/logtree",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/logbuffer",
-        "//metropolis/pkg/logtree/proto",
+        "//osbase/logbuffer",
+        "//osbase/logtree/proto",
         "@com_github_mitchellh_go_wordwrap//:go-wordwrap",
         "@org_golang_google_grpc//grpclog",
         "@org_golang_google_protobuf//types/known/timestamppb",
diff --git a/metropolis/pkg/logtree/doc.go b/osbase/logtree/doc.go
similarity index 100%
rename from metropolis/pkg/logtree/doc.go
rename to osbase/logtree/doc.go
diff --git a/metropolis/pkg/logtree/grpc.go b/osbase/logtree/grpc.go
similarity index 100%
rename from metropolis/pkg/logtree/grpc.go
rename to osbase/logtree/grpc.go
diff --git a/metropolis/pkg/logtree/journal.go b/osbase/logtree/journal.go
similarity index 100%
rename from metropolis/pkg/logtree/journal.go
rename to osbase/logtree/journal.go
diff --git a/metropolis/pkg/logtree/journal_entry.go b/osbase/logtree/journal_entry.go
similarity index 98%
rename from metropolis/pkg/logtree/journal_entry.go
rename to osbase/logtree/journal_entry.go
index 1580f54..547a711 100644
--- a/metropolis/pkg/logtree/journal_entry.go
+++ b/osbase/logtree/journal_entry.go
@@ -16,7 +16,7 @@
 
 package logtree
 
-import "source.monogon.dev/metropolis/pkg/logbuffer"
+import "source.monogon.dev/osbase/logbuffer"
 
 // entry is a journal entry, representing a single log event (encompassed in a
 // Payload) at a given DN. See the journal struct for more information about the
diff --git a/metropolis/pkg/logtree/journal_subscriber.go b/osbase/logtree/journal_subscriber.go
similarity index 100%
rename from metropolis/pkg/logtree/journal_subscriber.go
rename to osbase/logtree/journal_subscriber.go
diff --git a/metropolis/pkg/logtree/journal_test.go b/osbase/logtree/journal_test.go
similarity index 100%
rename from metropolis/pkg/logtree/journal_test.go
rename to osbase/logtree/journal_test.go
diff --git a/metropolis/pkg/logtree/klog.go b/osbase/logtree/klog.go
similarity index 98%
rename from metropolis/pkg/logtree/klog.go
rename to osbase/logtree/klog.go
index 9d9b1ee..ad7e162 100644
--- a/metropolis/pkg/logtree/klog.go
+++ b/osbase/logtree/klog.go
@@ -24,7 +24,7 @@
 	"strings"
 	"time"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
+	"source.monogon.dev/osbase/logbuffer"
 )
 
 // KLogParser returns an io.WriteCloser to which raw logging from a klog emitter
diff --git a/metropolis/pkg/logtree/klog_test.go b/osbase/logtree/klog_test.go
similarity index 100%
rename from metropolis/pkg/logtree/klog_test.go
rename to osbase/logtree/klog_test.go
diff --git a/metropolis/pkg/logtree/kmsg.go b/osbase/logtree/kmsg.go
similarity index 100%
rename from metropolis/pkg/logtree/kmsg.go
rename to osbase/logtree/kmsg.go
diff --git a/metropolis/pkg/logtree/kmsg_test.go b/osbase/logtree/kmsg_test.go
similarity index 100%
rename from metropolis/pkg/logtree/kmsg_test.go
rename to osbase/logtree/kmsg_test.go
diff --git a/metropolis/pkg/logtree/leveled.go b/osbase/logtree/leveled.go
similarity index 98%
rename from metropolis/pkg/logtree/leveled.go
rename to osbase/logtree/leveled.go
index 0facbb1..98699b8 100644
--- a/metropolis/pkg/logtree/leveled.go
+++ b/osbase/logtree/leveled.go
@@ -19,7 +19,7 @@
 import (
 	"fmt"
 
-	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
+	lpb "source.monogon.dev/osbase/logtree/proto"
 )
 
 // LeveledLogger is a generic interface for glog-style logging. There are four
diff --git a/metropolis/pkg/logtree/leveled_payload.go b/osbase/logtree/leveled_payload.go
similarity index 98%
rename from metropolis/pkg/logtree/leveled_payload.go
rename to osbase/logtree/leveled_payload.go
index b4a0630..95b9d5c 100644
--- a/metropolis/pkg/logtree/leveled_payload.go
+++ b/osbase/logtree/leveled_payload.go
@@ -24,7 +24,7 @@
 
 	tpb "google.golang.org/protobuf/types/known/timestamppb"
 
-	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
+	lpb "source.monogon.dev/osbase/logtree/proto"
 )
 
 // LeveledPayload is a log entry for leveled logs (as per leveled.go). It contains
diff --git a/metropolis/pkg/logtree/logtree.go b/osbase/logtree/logtree.go
similarity index 98%
rename from metropolis/pkg/logtree/logtree.go
rename to osbase/logtree/logtree.go
index a773b7b..c20681d 100644
--- a/metropolis/pkg/logtree/logtree.go
+++ b/osbase/logtree/logtree.go
@@ -21,7 +21,7 @@
 	"strings"
 	"sync"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
+	"source.monogon.dev/osbase/logbuffer"
 )
 
 // LogTree is a tree-shaped logging system. For more information, see the package-
diff --git a/metropolis/pkg/logtree/logtree_access.go b/osbase/logtree/logtree_access.go
similarity index 100%
rename from metropolis/pkg/logtree/logtree_access.go
rename to osbase/logtree/logtree_access.go
diff --git a/metropolis/pkg/logtree/logtree_entry.go b/osbase/logtree/logtree_entry.go
similarity index 98%
rename from metropolis/pkg/logtree/logtree_entry.go
rename to osbase/logtree/logtree_entry.go
index d1c700e..5fcb392 100644
--- a/metropolis/pkg/logtree/logtree_entry.go
+++ b/osbase/logtree/logtree_entry.go
@@ -22,8 +22,8 @@
 
 	"github.com/mitchellh/go-wordwrap"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
-	lpb "source.monogon.dev/metropolis/pkg/logtree/proto"
+	"source.monogon.dev/osbase/logbuffer"
+	lpb "source.monogon.dev/osbase/logtree/proto"
 )
 
 // LogEntry contains a log entry, combining both leveled and raw logging into a
diff --git a/metropolis/pkg/logtree/logtree_publisher.go b/osbase/logtree/logtree_publisher.go
similarity index 98%
rename from metropolis/pkg/logtree/logtree_publisher.go
rename to osbase/logtree/logtree_publisher.go
index 0b945e3..6c4120a 100644
--- a/metropolis/pkg/logtree/logtree_publisher.go
+++ b/osbase/logtree/logtree_publisher.go
@@ -23,7 +23,7 @@
 	"strings"
 	"time"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
+	"source.monogon.dev/osbase/logbuffer"
 )
 
 type leveledPublisher struct {
diff --git a/metropolis/pkg/logtree/logtree_test.go b/osbase/logtree/logtree_test.go
similarity index 100%
rename from metropolis/pkg/logtree/logtree_test.go
rename to osbase/logtree/logtree_test.go
diff --git a/metropolis/pkg/logtree/proto/BUILD.bazel b/osbase/logtree/proto/BUILD.bazel
similarity index 80%
rename from metropolis/pkg/logtree/proto/BUILD.bazel
rename to osbase/logtree/proto/BUILD.bazel
index e7f8c82..92381f1 100644
--- a/metropolis/pkg/logtree/proto/BUILD.bazel
+++ b/osbase/logtree/proto/BUILD.bazel
@@ -11,7 +11,7 @@
 
 go_proto_library(
     name = "proto_go_proto",
-    importpath = "source.monogon.dev/metropolis/pkg/logtree/proto",
+    importpath = "source.monogon.dev/osbase/logtree/proto",
     proto = ":proto_proto",
     visibility = ["//visibility:public"],
 )
@@ -19,6 +19,6 @@
 go_library(
     name = "proto",
     embed = [":proto_go_proto"],
-    importpath = "source.monogon.dev/metropolis/pkg/logtree/proto",
+    importpath = "source.monogon.dev/osbase/logtree/proto",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/pkg/logtree/proto/gomod-generated-placeholder.go b/osbase/logtree/proto/gomod-generated-placeholder.go
similarity index 100%
rename from metropolis/pkg/logtree/proto/gomod-generated-placeholder.go
rename to osbase/logtree/proto/gomod-generated-placeholder.go
diff --git a/metropolis/pkg/logtree/proto/logtree.proto b/osbase/logtree/proto/logtree.proto
similarity index 86%
rename from metropolis/pkg/logtree/proto/logtree.proto
rename to osbase/logtree/proto/logtree.proto
index 7586187..bf341d4 100644
--- a/metropolis/pkg/logtree/proto/logtree.proto
+++ b/osbase/logtree/proto/logtree.proto
@@ -15,12 +15,12 @@
 // limitations under the License.
 
 syntax = "proto3";
-package metropolis.pkg.logtree.proto;
-option go_package = "source.monogon.dev/metropolis/pkg/logtree/proto";
+package osbase.pkg.logtree.proto;
+option go_package = "source.monogon.dev/osbase/logtree/proto";
 
 import "google/protobuf/timestamp.proto";
 
-// Severity level corresponding to //metropolis/pkg/logtree.Severity.
+// Severity level corresponding to //osbase/logtree.Severity.
 enum LeveledLogSeverity {
   INVALID = 0;
   INFO = 1;
@@ -29,7 +29,7 @@
   FATAL = 4;
 }
 
-// LogEntry corresponding to logtree.LogEntry in //metropolis/pkg/logtree.
+// LogEntry corresponding to logtree.LogEntry in //osbase/logtree.
 message LogEntry {
   // A leveled log entry emitted from a compatible system, eg. Metorpolis code
   // or a klog-parsed line.
diff --git a/metropolis/pkg/logtree/testhelpers.go b/osbase/logtree/testhelpers.go
similarity index 100%
rename from metropolis/pkg/logtree/testhelpers.go
rename to osbase/logtree/testhelpers.go
diff --git a/osbase/logtree/unraw/BUILD.bazel b/osbase/logtree/unraw/BUILD.bazel
new file mode 100644
index 0000000..3ae4da1
--- /dev/null
+++ b/osbase/logtree/unraw/BUILD.bazel
@@ -0,0 +1,24 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+
+go_library(
+    name = "unraw",
+    srcs = ["unraw.go"],
+    importpath = "source.monogon.dev/osbase/logtree/unraw",
+    visibility = ["//visibility:public"],
+    deps = [
+        "//osbase/logbuffer",
+        "//osbase/logtree",
+        "//osbase/supervisor",
+    ],
+)
+
+go_test(
+    name = "unraw_test",
+    srcs = ["unraw_test.go"],
+    embed = [":unraw"],
+    deps = [
+        "//osbase/logbuffer",
+        "//osbase/logtree",
+        "//osbase/supervisor",
+    ],
+)
diff --git a/metropolis/pkg/logtree/unraw/unraw.go b/osbase/logtree/unraw/unraw.go
similarity index 97%
rename from metropolis/pkg/logtree/unraw/unraw.go
rename to osbase/logtree/unraw/unraw.go
index ef9d913..5c4e8e9 100644
--- a/metropolis/pkg/logtree/unraw/unraw.go
+++ b/osbase/logtree/unraw/unraw.go
@@ -24,9 +24,9 @@
 	"syscall"
 	"time"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/logbuffer"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 // Parser is a user-defined function for converting a log line received from an
diff --git a/metropolis/pkg/logtree/unraw/unraw_test.go b/osbase/logtree/unraw/unraw_test.go
similarity index 95%
rename from metropolis/pkg/logtree/unraw/unraw_test.go
rename to osbase/logtree/unraw/unraw_test.go
index 71c88fd..994e55e 100644
--- a/metropolis/pkg/logtree/unraw/unraw_test.go
+++ b/osbase/logtree/unraw/unraw_test.go
@@ -8,9 +8,9 @@
 	"syscall"
 	"testing"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/supervisor"
+	"source.monogon.dev/osbase/logbuffer"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/supervisor"
 )
 
 func testParser(l *logbuffer.Line, w LeveledWriter) {
diff --git a/metropolis/pkg/logtree/zap.go b/osbase/logtree/zap.go
similarity index 98%
rename from metropolis/pkg/logtree/zap.go
rename to osbase/logtree/zap.go
index 7fd364a..f3ae6e3 100644
--- a/metropolis/pkg/logtree/zap.go
+++ b/osbase/logtree/zap.go
@@ -10,7 +10,7 @@
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
 
-	"source.monogon.dev/metropolis/pkg/logbuffer"
+	"source.monogon.dev/osbase/logbuffer"
 )
 
 // Zapify turns a LeveledLogger into a zap.Logger which pipes its output into the
diff --git a/metropolis/pkg/logtree/zap_test.go b/osbase/logtree/zap_test.go
similarity index 100%
rename from metropolis/pkg/logtree/zap_test.go
rename to osbase/logtree/zap_test.go
diff --git a/metropolis/pkg/loop/BUILD.bazel b/osbase/loop/BUILD.bazel
similarity index 81%
rename from metropolis/pkg/loop/BUILD.bazel
rename to osbase/loop/BUILD.bazel
index 8c4e10a..cc52c8d 100644
--- a/metropolis/pkg/loop/BUILD.bazel
+++ b/osbase/loop/BUILD.bazel
@@ -1,10 +1,10 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "loop",
     srcs = ["loop.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/loop",
+    importpath = "source.monogon.dev/osbase/loop",
     visibility = ["//visibility:public"],
     deps = ["@org_golang_x_sys//unix"],
 )
diff --git a/metropolis/pkg/loop/loop.go b/osbase/loop/loop.go
similarity index 100%
rename from metropolis/pkg/loop/loop.go
rename to osbase/loop/loop.go
diff --git a/metropolis/pkg/loop/loop_test.go b/osbase/loop/loop_test.go
similarity index 100%
rename from metropolis/pkg/loop/loop_test.go
rename to osbase/loop/loop_test.go
diff --git a/metropolis/pkg/msguid/BUILD.bazel b/osbase/msguid/BUILD.bazel
similarity index 86%
rename from metropolis/pkg/msguid/BUILD.bazel
rename to osbase/msguid/BUILD.bazel
index 9be5fdb..1e345eb 100644
--- a/metropolis/pkg/msguid/BUILD.bazel
+++ b/osbase/msguid/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "msguid",
     srcs = ["msguid.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/msguid",
+    importpath = "source.monogon.dev/osbase/msguid",
     visibility = ["//visibility:public"],
     deps = ["@com_github_google_uuid//:uuid"],
 )
diff --git a/metropolis/pkg/msguid/msguid.go b/osbase/msguid/msguid.go
similarity index 100%
rename from metropolis/pkg/msguid/msguid.go
rename to osbase/msguid/msguid.go
diff --git a/metropolis/pkg/msguid/msguid_test.go b/osbase/msguid/msguid_test.go
similarity index 100%
rename from metropolis/pkg/msguid/msguid_test.go
rename to osbase/msguid/msguid_test.go
diff --git a/metropolis/pkg/nvme/BUILD.bazel b/osbase/nvme/BUILD.bazel
similarity index 92%
rename from metropolis/pkg/nvme/BUILD.bazel
rename to osbase/nvme/BUILD.bazel
index 6a2438b..237d331 100644
--- a/metropolis/pkg/nvme/BUILD.bazel
+++ b/osbase/nvme/BUILD.bazel
@@ -13,7 +13,7 @@
         "selftest.go",
         "uint128le.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/nvme",
+    importpath = "source.monogon.dev/osbase/nvme",
     visibility = ["//visibility:public"],
     deps = select({
         "@io_bazel_rules_go//go/platform:android": [
diff --git a/metropolis/pkg/nvme/cmd_linux.go b/osbase/nvme/cmd_linux.go
similarity index 100%
rename from metropolis/pkg/nvme/cmd_linux.go
rename to osbase/nvme/cmd_linux.go
diff --git a/metropolis/pkg/nvme/cmd_unsupported.go b/osbase/nvme/cmd_unsupported.go
similarity index 100%
rename from metropolis/pkg/nvme/cmd_unsupported.go
rename to osbase/nvme/cmd_unsupported.go
diff --git a/metropolis/pkg/nvme/error.go b/osbase/nvme/error.go
similarity index 100%
rename from metropolis/pkg/nvme/error.go
rename to osbase/nvme/error.go
diff --git a/metropolis/pkg/nvme/format.go b/osbase/nvme/format.go
similarity index 100%
rename from metropolis/pkg/nvme/format.go
rename to osbase/nvme/format.go
diff --git a/metropolis/pkg/nvme/health.go b/osbase/nvme/health.go
similarity index 100%
rename from metropolis/pkg/nvme/health.go
rename to osbase/nvme/health.go
diff --git a/metropolis/pkg/nvme/identify.go b/osbase/nvme/identify.go
similarity index 100%
rename from metropolis/pkg/nvme/identify.go
rename to osbase/nvme/identify.go
diff --git a/metropolis/pkg/nvme/nvme.go b/osbase/nvme/nvme.go
similarity index 100%
rename from metropolis/pkg/nvme/nvme.go
rename to osbase/nvme/nvme.go
diff --git a/metropolis/pkg/nvme/selftest.go b/osbase/nvme/selftest.go
similarity index 100%
rename from metropolis/pkg/nvme/selftest.go
rename to osbase/nvme/selftest.go
diff --git a/metropolis/pkg/nvme/struct_test.go b/osbase/nvme/struct_test.go
similarity index 100%
rename from metropolis/pkg/nvme/struct_test.go
rename to osbase/nvme/struct_test.go
diff --git a/metropolis/pkg/nvme/uint128le.go b/osbase/nvme/uint128le.go
similarity index 100%
rename from metropolis/pkg/nvme/uint128le.go
rename to osbase/nvme/uint128le.go
diff --git a/metropolis/pkg/pki/BUILD.bazel b/osbase/pki/BUILD.bazel
similarity index 74%
rename from metropolis/pkg/pki/BUILD.bazel
rename to osbase/pki/BUILD.bazel
index d122ef4..c7087d1 100644
--- a/metropolis/pkg/pki/BUILD.bazel
+++ b/osbase/pki/BUILD.bazel
@@ -8,12 +8,12 @@
         "crl.go",
         "x509.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/pki",
+    importpath = "source.monogon.dev/osbase/pki",
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/event",
-        "//metropolis/pkg/event/etcd",
-        "//metropolis/pkg/fileargs",
+        "//osbase/event",
+        "//osbase/event/etcd",
+        "//osbase/fileargs",
         "@io_etcd_go_etcd_client_v3//:client",
     ],
 )
@@ -26,7 +26,7 @@
     ],
     embed = [":pki"],
     deps = [
-        "//metropolis/pkg/logtree",
+        "//osbase/logtree",
         "@io_etcd_go_etcd_client_pkg_v3//testutil",
         "@io_etcd_go_etcd_tests_v3//integration",
         "@org_uber_go_zap//:zap",
diff --git a/metropolis/pkg/pki/ca.go b/osbase/pki/ca.go
similarity index 100%
rename from metropolis/pkg/pki/ca.go
rename to osbase/pki/ca.go
diff --git a/metropolis/pkg/pki/certificate.go b/osbase/pki/certificate.go
similarity index 99%
rename from metropolis/pkg/pki/certificate.go
rename to osbase/pki/certificate.go
index a423680..b925958 100644
--- a/metropolis/pkg/pki/certificate.go
+++ b/osbase/pki/certificate.go
@@ -31,7 +31,7 @@
 
 	clientv3 "go.etcd.io/etcd/client/v3"
 
-	"source.monogon.dev/metropolis/pkg/fileargs"
+	"source.monogon.dev/osbase/fileargs"
 )
 
 // Namespace represents some path in etcd where certificate/CA data will be
diff --git a/metropolis/pkg/pki/certificate_test.go b/osbase/pki/certificate_test.go
similarity index 98%
rename from metropolis/pkg/pki/certificate_test.go
rename to osbase/pki/certificate_test.go
index 19baf94..e751c54 100644
--- a/metropolis/pkg/pki/certificate_test.go
+++ b/osbase/pki/certificate_test.go
@@ -12,7 +12,7 @@
 	"go.etcd.io/etcd/tests/v3/integration"
 	"go.uber.org/zap"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // TestManaged ensures Managed Certificates work, including re-ensuring
diff --git a/metropolis/pkg/pki/crl.go b/osbase/pki/crl.go
similarity index 97%
rename from metropolis/pkg/pki/crl.go
rename to osbase/pki/crl.go
index f72fb2d..40118aa 100644
--- a/metropolis/pkg/pki/crl.go
+++ b/osbase/pki/crl.go
@@ -11,8 +11,8 @@
 
 	clientv3 "go.etcd.io/etcd/client/v3"
 
-	"source.monogon.dev/metropolis/pkg/event"
-	"source.monogon.dev/metropolis/pkg/event/etcd"
+	"source.monogon.dev/osbase/event"
+	"source.monogon.dev/osbase/event/etcd"
 )
 
 // crlPath returns the etcd path under which the marshaled X.509 Certificate
diff --git a/metropolis/pkg/pki/crl_test.go b/osbase/pki/crl_test.go
similarity index 100%
rename from metropolis/pkg/pki/crl_test.go
rename to osbase/pki/crl_test.go
diff --git a/metropolis/pkg/pki/x509.go b/osbase/pki/x509.go
similarity index 100%
rename from metropolis/pkg/pki/x509.go
rename to osbase/pki/x509.go
diff --git a/metropolis/pkg/pstore/BUILD.bazel b/osbase/pstore/BUILD.bazel
similarity index 80%
rename from metropolis/pkg/pstore/BUILD.bazel
rename to osbase/pstore/BUILD.bazel
index ac84095..47ad496 100644
--- a/metropolis/pkg/pstore/BUILD.bazel
+++ b/osbase/pstore/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "pstore",
     srcs = ["pstore.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/pstore",
+    importpath = "source.monogon.dev/osbase/pstore",
     visibility = ["//visibility:public"],
 )
 
diff --git a/metropolis/pkg/pstore/pstore.go b/osbase/pstore/pstore.go
similarity index 100%
rename from metropolis/pkg/pstore/pstore.go
rename to osbase/pstore/pstore.go
diff --git a/metropolis/pkg/pstore/pstore_test.go b/osbase/pstore/pstore_test.go
similarity index 100%
rename from metropolis/pkg/pstore/pstore_test.go
rename to osbase/pstore/pstore_test.go
diff --git a/metropolis/pkg/scsi/BUILD.bazel b/osbase/scsi/BUILD.bazel
similarity index 90%
rename from metropolis/pkg/scsi/BUILD.bazel
rename to osbase/scsi/BUILD.bazel
index 9c00b26..d4bb662 100644
--- a/metropolis/pkg/scsi/BUILD.bazel
+++ b/osbase/scsi/BUILD.bazel
@@ -13,7 +13,7 @@
         "sensekeydata.go",
     ],
     cgo = True,
-    importpath = "source.monogon.dev/metropolis/pkg/scsi",
+    importpath = "source.monogon.dev/osbase/scsi",
     visibility = ["//visibility:public"],
     deps = select({
         "@io_bazel_rules_go//go/platform:android": [
diff --git a/metropolis/pkg/scsi/dev_block.go b/osbase/scsi/dev_block.go
similarity index 100%
rename from metropolis/pkg/scsi/dev_block.go
rename to osbase/scsi/dev_block.go
diff --git a/metropolis/pkg/scsi/health.go b/osbase/scsi/health.go
similarity index 100%
rename from metropolis/pkg/scsi/health.go
rename to osbase/scsi/health.go
diff --git a/metropolis/pkg/scsi/inquiry.go b/osbase/scsi/inquiry.go
similarity index 100%
rename from metropolis/pkg/scsi/inquiry.go
rename to osbase/scsi/inquiry.go
diff --git a/metropolis/pkg/scsi/log.go b/osbase/scsi/log.go
similarity index 100%
rename from metropolis/pkg/scsi/log.go
rename to osbase/scsi/log.go
diff --git a/metropolis/pkg/scsi/scsi.go b/osbase/scsi/scsi.go
similarity index 100%
rename from metropolis/pkg/scsi/scsi.go
rename to osbase/scsi/scsi.go
diff --git a/metropolis/pkg/scsi/scsi_linux.go b/osbase/scsi/scsi_linux.go
similarity index 100%
rename from metropolis/pkg/scsi/scsi_linux.go
rename to osbase/scsi/scsi_linux.go
diff --git a/metropolis/pkg/scsi/scsi_linux_defs.go b/osbase/scsi/scsi_linux_defs.go
similarity index 100%
rename from metropolis/pkg/scsi/scsi_linux_defs.go
rename to osbase/scsi/scsi_linux_defs.go
diff --git a/metropolis/pkg/scsi/scsi_linux_defs1.go b/osbase/scsi/scsi_linux_defs1.go
similarity index 100%
rename from metropolis/pkg/scsi/scsi_linux_defs1.go
rename to osbase/scsi/scsi_linux_defs1.go
diff --git a/metropolis/pkg/scsi/sensekeydata.go b/osbase/scsi/sensekeydata.go
similarity index 100%
rename from metropolis/pkg/scsi/sensekeydata.go
rename to osbase/scsi/sensekeydata.go
diff --git a/metropolis/pkg/smbios/BUILD.bazel b/osbase/smbios/BUILD.bazel
similarity index 76%
rename from metropolis/pkg/smbios/BUILD.bazel
rename to osbase/smbios/BUILD.bazel
index f29f559..b974095 100644
--- a/metropolis/pkg/smbios/BUILD.bazel
+++ b/osbase/smbios/BUILD.bazel
@@ -6,6 +6,6 @@
         "smbios.go",
         "structures.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/smbios",
+    importpath = "source.monogon.dev/osbase/smbios",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/pkg/smbios/smbios.go b/osbase/smbios/smbios.go
similarity index 100%
rename from metropolis/pkg/smbios/smbios.go
rename to osbase/smbios/smbios.go
diff --git a/metropolis/pkg/smbios/structures.go b/osbase/smbios/structures.go
similarity index 100%
rename from metropolis/pkg/smbios/structures.go
rename to osbase/smbios/structures.go
diff --git a/metropolis/pkg/socksproxy/BUILD.bazel b/osbase/socksproxy/BUILD.bazel
similarity index 84%
rename from metropolis/pkg/socksproxy/BUILD.bazel
rename to osbase/socksproxy/BUILD.bazel
index c953dbf..2365f12 100644
--- a/metropolis/pkg/socksproxy/BUILD.bazel
+++ b/osbase/socksproxy/BUILD.bazel
@@ -6,7 +6,7 @@
         "protocol.go",
         "socksproxy.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/socksproxy",
+    importpath = "source.monogon.dev/osbase/socksproxy",
     visibility = ["//visibility:public"],
 )
 
diff --git a/metropolis/pkg/socksproxy/protocol.go b/osbase/socksproxy/protocol.go
similarity index 100%
rename from metropolis/pkg/socksproxy/protocol.go
rename to osbase/socksproxy/protocol.go
diff --git a/metropolis/pkg/socksproxy/socksproxy.go b/osbase/socksproxy/socksproxy.go
similarity index 100%
rename from metropolis/pkg/socksproxy/socksproxy.go
rename to osbase/socksproxy/socksproxy.go
diff --git a/metropolis/pkg/socksproxy/socksproxy_test.go b/osbase/socksproxy/socksproxy_test.go
similarity index 100%
rename from metropolis/pkg/socksproxy/socksproxy_test.go
rename to osbase/socksproxy/socksproxy_test.go
diff --git a/metropolis/pkg/supervisor/BUILD.bazel b/osbase/supervisor/BUILD.bazel
similarity index 82%
rename from metropolis/pkg/supervisor/BUILD.bazel
rename to osbase/supervisor/BUILD.bazel
index e6e3a22..12263ff 100644
--- a/metropolis/pkg/supervisor/BUILD.bazel
+++ b/osbase/supervisor/BUILD.bazel
@@ -9,11 +9,11 @@
         "supervisor_support.go",
         "supervisor_testhelpers.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/supervisor",
+    importpath = "source.monogon.dev/osbase/supervisor",
     # TODO(#189): move supervisor to //go
     visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/logtree",
+        "//osbase/logtree",
         "@com_github_cenkalti_backoff_v4//:backoff",
         "@org_golang_google_grpc//:go_default_library",
     ],
@@ -25,5 +25,5 @@
     embed = [":supervisor"],
     # TODO: https://github.com/monogon-dev/monogon/issues/131
     flaky = True,
-    deps = ["//metropolis/pkg/logtree"],
+    deps = ["//osbase/logtree"],
 )
diff --git a/metropolis/pkg/supervisor/supervisor.go b/osbase/supervisor/supervisor.go
similarity index 98%
rename from metropolis/pkg/supervisor/supervisor.go
rename to osbase/supervisor/supervisor.go
index 2af5e67..c7b0c0f 100644
--- a/metropolis/pkg/supervisor/supervisor.go
+++ b/osbase/supervisor/supervisor.go
@@ -27,7 +27,7 @@
 	"io"
 	"sync"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // A Runnable is a function that will be run in a goroutine, and supervised
diff --git a/metropolis/pkg/supervisor/supervisor_node.go b/osbase/supervisor/supervisor_node.go
similarity index 100%
rename from metropolis/pkg/supervisor/supervisor_node.go
rename to osbase/supervisor/supervisor_node.go
diff --git a/metropolis/pkg/supervisor/supervisor_processor.go b/osbase/supervisor/supervisor_processor.go
similarity index 100%
rename from metropolis/pkg/supervisor/supervisor_processor.go
rename to osbase/supervisor/supervisor_processor.go
diff --git a/metropolis/pkg/supervisor/supervisor_support.go b/osbase/supervisor/supervisor_support.go
similarity index 98%
rename from metropolis/pkg/supervisor/supervisor_support.go
rename to osbase/supervisor/supervisor_support.go
index 8d836f2..54d0fd3 100644
--- a/metropolis/pkg/supervisor/supervisor_support.go
+++ b/osbase/supervisor/supervisor_support.go
@@ -28,7 +28,7 @@
 
 	"google.golang.org/grpc"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // GRPCServer creates a Runnable that serves gRPC requests as longs as it's not
diff --git a/metropolis/pkg/supervisor/supervisor_test.go b/osbase/supervisor/supervisor_test.go
similarity index 99%
rename from metropolis/pkg/supervisor/supervisor_test.go
rename to osbase/supervisor/supervisor_test.go
index a735de4..f812531 100644
--- a/metropolis/pkg/supervisor/supervisor_test.go
+++ b/osbase/supervisor/supervisor_test.go
@@ -22,7 +22,7 @@
 	"testing"
 	"time"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // waitSettle waits until the supervisor reaches a 'settled' state - ie., one
diff --git a/metropolis/pkg/supervisor/supervisor_testhelpers.go b/osbase/supervisor/supervisor_testhelpers.go
similarity index 98%
rename from metropolis/pkg/supervisor/supervisor_testhelpers.go
rename to osbase/supervisor/supervisor_testhelpers.go
index d3f994f..ba015a2 100644
--- a/metropolis/pkg/supervisor/supervisor_testhelpers.go
+++ b/osbase/supervisor/supervisor_testhelpers.go
@@ -24,7 +24,7 @@
 	"testing"
 	"time"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
+	"source.monogon.dev/osbase/logtree"
 )
 
 // TestHarness runs a supervisor in a harness designed for unit testing
diff --git a/metropolis/pkg/sysctl/BUILD.bazel b/osbase/sysctl/BUILD.bazel
similarity index 72%
rename from metropolis/pkg/sysctl/BUILD.bazel
rename to osbase/sysctl/BUILD.bazel
index a945a03..f77c80b 100644
--- a/metropolis/pkg/sysctl/BUILD.bazel
+++ b/osbase/sysctl/BUILD.bazel
@@ -3,6 +3,6 @@
 go_library(
     name = "sysctl",
     srcs = ["options.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/sysctl",
+    importpath = "source.monogon.dev/osbase/sysctl",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/pkg/sysctl/options.go b/osbase/sysctl/options.go
similarity index 100%
rename from metropolis/pkg/sysctl/options.go
rename to osbase/sysctl/options.go
diff --git a/metropolis/pkg/sysfs/BUILD.bazel b/osbase/sysfs/BUILD.bazel
similarity index 63%
rename from metropolis/pkg/sysfs/BUILD.bazel
rename to osbase/sysfs/BUILD.bazel
index 06995e2..9e25da1 100644
--- a/metropolis/pkg/sysfs/BUILD.bazel
+++ b/osbase/sysfs/BUILD.bazel
@@ -6,7 +6,7 @@
         "block.go",
         "uevents.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/sysfs",
-    visibility = ["//metropolis:__subpackages__"],
+    importpath = "source.monogon.dev/osbase/sysfs",
+    visibility = ["//visibility:public"],
     deps = ["@com_github_google_uuid//:uuid"],
 )
diff --git a/metropolis/pkg/sysfs/block.go b/osbase/sysfs/block.go
similarity index 100%
rename from metropolis/pkg/sysfs/block.go
rename to osbase/sysfs/block.go
diff --git a/metropolis/pkg/sysfs/uevents.go b/osbase/sysfs/uevents.go
similarity index 100%
rename from metropolis/pkg/sysfs/uevents.go
rename to osbase/sysfs/uevents.go
diff --git a/metropolis/test/ktest/BUILD.bazel b/osbase/test/ktest/BUILD.bazel
similarity index 87%
rename from metropolis/test/ktest/BUILD.bazel
rename to osbase/test/ktest/BUILD.bazel
index 952d7e8..16612e5 100644
--- a/metropolis/test/ktest/BUILD.bazel
+++ b/osbase/test/ktest/BUILD.bazel
@@ -5,9 +5,9 @@
 go_library(
     name = "ktest_lib",
     srcs = ["main.go"],
-    importpath = "source.monogon.dev/metropolis/test/ktest",
+    importpath = "source.monogon.dev/osbase/test/ktest",
     visibility = ["//visibility:private"],
-    deps = ["//metropolis/test/launch"],
+    deps = ["//osbase/test/launch"],
 )
 
 go_binary(
@@ -17,6 +17,7 @@
     visibility = [
         "//go/net/psample:__pkg__",
         "//metropolis:__subpackages__",
+        "//osbase:__subpackages__",
     ],
 )
 
@@ -46,6 +47,7 @@
     visibility = [
         "//go/net/psample:__pkg__",
         "//metropolis:__subpackages__",
+        "//osbase:__subpackages__",
     ],
 )
 
@@ -55,5 +57,6 @@
     visibility = [
         "//go/net/psample:__pkg__",
         "//metropolis:__subpackages__",
+        "//osbase:__subpackages__",
     ],
 )
diff --git a/metropolis/test/ktest/init/BUILD.bazel b/osbase/test/ktest/init/BUILD.bazel
similarity index 68%
rename from metropolis/test/ktest/init/BUILD.bazel
rename to osbase/test/ktest/init/BUILD.bazel
index e48bcb2..56b262c 100644
--- a/metropolis/test/ktest/init/BUILD.bazel
+++ b/osbase/test/ktest/init/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "init_lib",
     srcs = ["main.go"],
-    importpath = "source.monogon.dev/metropolis/test/ktest/init",
+    importpath = "source.monogon.dev/osbase/test/ktest/init",
     visibility = ["//visibility:private"],
     deps = ["@org_golang_x_sys//unix"],
 )
@@ -13,7 +13,6 @@
     embed = [":init_lib"],
     pure = "on",
     visibility = [
-        "//go/net/psample:__pkg__",
-        "//metropolis:__subpackages__",
+        "//visibility:public",
     ],
 )
diff --git a/metropolis/test/ktest/init/main.go b/osbase/test/ktest/init/main.go
similarity index 100%
rename from metropolis/test/ktest/init/main.go
rename to osbase/test/ktest/init/main.go
diff --git a/metropolis/test/ktest/ktest.bzl b/osbase/test/ktest/ktest.bzl
similarity index 81%
rename from metropolis/test/ktest/ktest.bzl
rename to osbase/test/ktest/ktest.bzl
index 8cb5257..a9f5fdd 100644
--- a/metropolis/test/ktest/ktest.bzl
+++ b/osbase/test/ktest/ktest.bzl
@@ -33,7 +33,7 @@
             "//metropolis/node/build:earlydev.fsspec",
         ] + fsspecs,
         files = _dict_union({
-            "//metropolis/test/ktest/init": "/init",
+            "//osbase/test/ktest/init": "/init",
             tester: "/tester",
         }, files),
         files_cc = files_cc,
@@ -43,16 +43,16 @@
     native.sh_test(
         name = "ktest",
         args = [
-            "$(location //metropolis/test/ktest)",
+            "$(location //osbase/test/ktest)",
             "$(location :test_initramfs)",
-            "$(location //metropolis/test/ktest:linux-testing)",
+            "$(location //osbase/test/ktest:linux-testing)",
             cmdline,
         ],
         size = "small",
-        srcs = ["//metropolis/test/ktest:test-script"],
+        srcs = ["//osbase/test/ktest:test-script"],
         data = [
-            "//metropolis/test/ktest",
+            "//osbase/test/ktest",
             ":test_initramfs",
-            "//metropolis/test/ktest:linux-testing",
+            "//osbase/test/ktest:linux-testing",
         ],
     )
diff --git a/metropolis/test/ktest/main.go b/osbase/test/ktest/main.go
similarity index 97%
rename from metropolis/test/ktest/main.go
rename to osbase/test/ktest/main.go
index 27cd919..7d76bc5 100644
--- a/metropolis/test/ktest/main.go
+++ b/osbase/test/ktest/main.go
@@ -26,7 +26,7 @@
 	"os"
 	"time"
 
-	"source.monogon.dev/metropolis/test/launch"
+	"source.monogon.dev/osbase/test/launch"
 )
 
 var (
diff --git a/metropolis/test/ktest/run_ktest.sh b/osbase/test/ktest/run_ktest.sh
similarity index 100%
rename from metropolis/test/ktest/run_ktest.sh
rename to osbase/test/ktest/run_ktest.sh
diff --git a/osbase/test/launch/BUILD.bazel b/osbase/test/launch/BUILD.bazel
new file mode 100644
index 0000000..10be93d
--- /dev/null
+++ b/osbase/test/launch/BUILD.bazel
@@ -0,0 +1,22 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "launch",
+    srcs = [
+        "launch.go",
+        "log.go",
+    ],
+    data = [
+        "@com_github_bonzini_qboot//:qboot-bin",
+    ],
+    importpath = "source.monogon.dev/osbase/test/launch",
+    visibility = [
+        "//metropolis:__subpackages__",
+        "//osbase:__subpackages__",
+    ],
+    deps = [
+        "//osbase/freeport",
+        "@io_bazel_rules_go//go/runfiles:go_default_library",
+        "@org_golang_x_sys//unix",
+    ],
+)
diff --git a/metropolis/test/launch/launch.go b/osbase/test/launch/launch.go
similarity index 99%
rename from metropolis/test/launch/launch.go
rename to osbase/test/launch/launch.go
index 953025d..d030b22 100644
--- a/metropolis/test/launch/launch.go
+++ b/osbase/test/launch/launch.go
@@ -33,7 +33,7 @@
 	"github.com/bazelbuild/rules_go/go/runfiles"
 	"golang.org/x/sys/unix"
 
-	"source.monogon.dev/metropolis/pkg/freeport"
+	"source.monogon.dev/osbase/freeport"
 )
 
 type QemuValue map[string][]string
diff --git a/metropolis/test/launch/log.go b/osbase/test/launch/log.go
similarity index 100%
rename from metropolis/test/launch/log.go
rename to osbase/test/launch/log.go
diff --git a/metropolis/pkg/tpm/BUILD.bazel b/osbase/tpm/BUILD.bazel
similarity index 67%
rename from metropolis/pkg/tpm/BUILD.bazel
rename to osbase/tpm/BUILD.bazel
index d8f59af..d75c9fb 100644
--- a/metropolis/pkg/tpm/BUILD.bazel
+++ b/osbase/tpm/BUILD.bazel
@@ -6,12 +6,12 @@
         "credactivation_compat.go",
         "tpm.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/tpm",
-    visibility = ["//metropolis:__subpackages__"],
+    importpath = "source.monogon.dev/osbase/tpm",
+    visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/logtree",
-        "//metropolis/pkg/sysfs",
-        "//metropolis/pkg/tpm/proto",
+        "//osbase/logtree",
+        "//osbase/sysfs",
+        "//osbase/tpm/proto",
         "@com_github_google_go_tpm//tpm2",
         "@com_github_google_go_tpm//tpmutil",
         "@com_github_google_go_tpm_tools//client",
diff --git a/metropolis/pkg/tpm/credactivation_compat.go b/osbase/tpm/credactivation_compat.go
similarity index 100%
rename from metropolis/pkg/tpm/credactivation_compat.go
rename to osbase/tpm/credactivation_compat.go
diff --git a/metropolis/pkg/tpm/eventlog/BUILD.bazel b/osbase/tpm/eventlog/BUILD.bazel
similarity index 64%
rename from metropolis/pkg/tpm/eventlog/BUILD.bazel
rename to osbase/tpm/eventlog/BUILD.bazel
index 7bbd464..301219c 100644
--- a/metropolis/pkg/tpm/eventlog/BUILD.bazel
+++ b/osbase/tpm/eventlog/BUILD.bazel
@@ -7,10 +7,10 @@
         "eventlog.go",
         "secureboot.go",
     ],
-    importpath = "source.monogon.dev/metropolis/pkg/tpm/eventlog",
-    visibility = ["//metropolis:__subpackages__"],
+    importpath = "source.monogon.dev/osbase/tpm/eventlog",
+    visibility = ["//visibility:public"],
     deps = [
-        "//metropolis/pkg/tpm/eventlog/internal",
+        "//osbase/tpm/eventlog/internal",
         "@com_github_google_certificate_transparency_go//x509",
         "@com_github_google_go_tpm//tpm2",
     ],
diff --git a/metropolis/pkg/tpm/eventlog/LICENSE-3RD-PARTY.txt b/osbase/tpm/eventlog/LICENSE-3RD-PARTY.txt
similarity index 100%
rename from metropolis/pkg/tpm/eventlog/LICENSE-3RD-PARTY.txt
rename to osbase/tpm/eventlog/LICENSE-3RD-PARTY.txt
diff --git a/metropolis/pkg/tpm/eventlog/compat.go b/osbase/tpm/eventlog/compat.go
similarity index 100%
rename from metropolis/pkg/tpm/eventlog/compat.go
rename to osbase/tpm/eventlog/compat.go
diff --git a/metropolis/pkg/tpm/eventlog/eventlog.go b/osbase/tpm/eventlog/eventlog.go
similarity index 100%
rename from metropolis/pkg/tpm/eventlog/eventlog.go
rename to osbase/tpm/eventlog/eventlog.go
diff --git a/metropolis/pkg/tpm/eventlog/internal/BUILD.bazel b/osbase/tpm/eventlog/internal/BUILD.bazel
similarity index 64%
rename from metropolis/pkg/tpm/eventlog/internal/BUILD.bazel
rename to osbase/tpm/eventlog/internal/BUILD.bazel
index f134e7c..1e7199d 100644
--- a/metropolis/pkg/tpm/eventlog/internal/BUILD.bazel
+++ b/osbase/tpm/eventlog/internal/BUILD.bazel
@@ -3,8 +3,8 @@
 go_library(
     name = "internal",
     srcs = ["events.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/tpm/eventlog/internal",
-    visibility = ["//metropolis/pkg/tpm/eventlog:__subpackages__"],
+    importpath = "source.monogon.dev/osbase/tpm/eventlog/internal",
+    visibility = ["//osbase/tpm/eventlog:__subpackages__"],
     deps = [
         "@com_github_google_certificate_transparency_go//asn1",
         "@com_github_google_certificate_transparency_go//x509",
diff --git a/metropolis/pkg/tpm/eventlog/internal/events.go b/osbase/tpm/eventlog/internal/events.go
similarity index 100%
rename from metropolis/pkg/tpm/eventlog/internal/events.go
rename to osbase/tpm/eventlog/internal/events.go
diff --git a/metropolis/pkg/tpm/eventlog/secureboot.go b/osbase/tpm/eventlog/secureboot.go
similarity index 98%
rename from metropolis/pkg/tpm/eventlog/secureboot.go
rename to osbase/tpm/eventlog/secureboot.go
index 090be5c..6fd4f1f 100644
--- a/metropolis/pkg/tpm/eventlog/secureboot.go
+++ b/osbase/tpm/eventlog/secureboot.go
@@ -24,7 +24,7 @@
 
 	"github.com/google/certificate-transparency-go/x509"
 
-	"source.monogon.dev/metropolis/pkg/tpm/eventlog/internal"
+	"source.monogon.dev/osbase/tpm/eventlog/internal"
 )
 
 // SecurebootState describes the secure boot status of a machine, as determined
diff --git a/metropolis/pkg/tpm/proto/BUILD.bazel b/osbase/tpm/proto/BUILD.bazel
similarity index 83%
rename from metropolis/pkg/tpm/proto/BUILD.bazel
rename to osbase/tpm/proto/BUILD.bazel
index 81c42e6..712e3a3 100644
--- a/metropolis/pkg/tpm/proto/BUILD.bazel
+++ b/osbase/tpm/proto/BUILD.bazel
@@ -11,7 +11,7 @@
 
 go_proto_library(
     name = "proto_go_proto",
-    importpath = "source.monogon.dev/metropolis/pkg/tpm/proto",
+    importpath = "source.monogon.dev/osbase/tpm/proto",
     proto = ":proto_proto",
     visibility = ["//visibility:public"],
     deps = ["@com_github_google_go_tpm_tools//proto/tpm"],  #keep
@@ -20,6 +20,6 @@
 go_library(
     name = "proto",
     embed = [":proto_go_proto"],
-    importpath = "source.monogon.dev/metropolis/pkg/tpm/proto",
+    importpath = "source.monogon.dev/osbase/tpm/proto",
     visibility = ["//visibility:public"],
 )
diff --git a/metropolis/pkg/tpm/proto/gomod-generated-placeholder.go b/osbase/tpm/proto/gomod-generated-placeholder.go
similarity index 100%
rename from metropolis/pkg/tpm/proto/gomod-generated-placeholder.go
rename to osbase/tpm/proto/gomod-generated-placeholder.go
diff --git a/metropolis/pkg/tpm/proto/tpm.proto b/osbase/tpm/proto/tpm.proto
similarity index 87%
rename from metropolis/pkg/tpm/proto/tpm.proto
rename to osbase/tpm/proto/tpm.proto
index 9f86291..e5455d2 100644
--- a/metropolis/pkg/tpm/proto/tpm.proto
+++ b/osbase/tpm/proto/tpm.proto
@@ -1,5 +1,5 @@
 syntax = "proto3";
-option go_package = "source.monogon.dev/metropolis/pkg/tpm/proto";
+option go_package = "source.monogon.dev/osbase/tpm/proto";
 package metropolis.pkg.tpm;
 
 import "proto/tpm/tpm.proto";
diff --git a/metropolis/pkg/tpm/tpm.go b/osbase/tpm/tpm.go
similarity index 98%
rename from metropolis/pkg/tpm/tpm.go
rename to osbase/tpm/tpm.go
index 13a3e59..b77c36d 100644
--- a/metropolis/pkg/tpm/tpm.go
+++ b/osbase/tpm/tpm.go
@@ -39,10 +39,10 @@
 	"golang.org/x/sys/unix"
 	"google.golang.org/protobuf/proto"
 
-	tpmpb "source.monogon.dev/metropolis/pkg/tpm/proto"
+	tpmpb "source.monogon.dev/osbase/tpm/proto"
 
-	"source.monogon.dev/metropolis/pkg/logtree"
-	"source.monogon.dev/metropolis/pkg/sysfs"
+	"source.monogon.dev/osbase/logtree"
+	"source.monogon.dev/osbase/sysfs"
 )
 
 var (
diff --git a/metropolis/pkg/verity/BUILD.bazel b/osbase/verity/BUILD.bazel
similarity index 74%
rename from metropolis/pkg/verity/BUILD.bazel
rename to osbase/verity/BUILD.bazel
index 7e0e465..69cd10f 100644
--- a/metropolis/pkg/verity/BUILD.bazel
+++ b/osbase/verity/BUILD.bazel
@@ -1,10 +1,10 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
-load("//metropolis/test/ktest:ktest.bzl", "ktest")
+load("//osbase/test/ktest:ktest.bzl", "ktest")
 
 go_library(
     name = "verity",
     srcs = ["encoder.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/verity",
+    importpath = "source.monogon.dev/osbase/verity",
     visibility = ["//visibility:public"],
 )
 
@@ -13,7 +13,7 @@
     srcs = ["encoder_test.go"],
     embed = [":verity"],
     deps = [
-        "//metropolis/pkg/devicemapper",
+        "//osbase/devicemapper",
         "@com_github_stretchr_testify//require",
         "@org_golang_x_sys//unix",
     ],
diff --git a/metropolis/pkg/verity/encoder.go b/osbase/verity/encoder.go
similarity index 100%
rename from metropolis/pkg/verity/encoder.go
rename to osbase/verity/encoder.go
diff --git a/metropolis/pkg/verity/encoder_test.go b/osbase/verity/encoder_test.go
similarity index 99%
rename from metropolis/pkg/verity/encoder_test.go
rename to osbase/verity/encoder_test.go
index 116c6a4..31e765c 100644
--- a/metropolis/pkg/verity/encoder_test.go
+++ b/osbase/verity/encoder_test.go
@@ -28,7 +28,7 @@
 	"github.com/stretchr/testify/require"
 	"golang.org/x/sys/unix"
 
-	dm "source.monogon.dev/metropolis/pkg/devicemapper"
+	dm "source.monogon.dev/osbase/devicemapper"
 )
 
 const (
diff --git a/metropolis/pkg/watchdog/BUILD.bazel b/osbase/watchdog/BUILD.bazel
similarity index 75%
rename from metropolis/pkg/watchdog/BUILD.bazel
rename to osbase/watchdog/BUILD.bazel
index 0363883..66879b8 100644
--- a/metropolis/pkg/watchdog/BUILD.bazel
+++ b/osbase/watchdog/BUILD.bazel
@@ -3,7 +3,7 @@
 go_library(
     name = "watchdog",
     srcs = ["watchdog.go"],
-    importpath = "source.monogon.dev/metropolis/pkg/watchdog",
+    importpath = "source.monogon.dev/osbase/watchdog",
     visibility = ["//visibility:public"],
     deps = ["@org_golang_x_sys//unix"],
 )
diff --git a/metropolis/pkg/watchdog/watchdog.go b/osbase/watchdog/watchdog.go
similarity index 100%
rename from metropolis/pkg/watchdog/watchdog.go
rename to osbase/watchdog/watchdog.go
diff --git a/third_party/go/patches/k8s-removed-block-device-pseudo-locks.patch b/third_party/go/patches/k8s-removed-block-device-pseudo-locks.patch
index 8ae3140..c0da3e0 100644
--- a/third_party/go/patches/k8s-removed-block-device-pseudo-locks.patch
+++ b/third_party/go/patches/k8s-removed-block-device-pseudo-locks.patch
@@ -27,7 +27,7 @@
 
 Because this code calls the losetup utility which Metropolis doesn't want to ship and also repeatedly lists loop devices
 in an inefficient manner which will cause problems with the anticipated density of VM-hosting Metropolis nodes and
-does nothing for us, let's just nuke it instead of rewriting it against //metropolis/pkg/loop.
+does nothing for us, let's just nuke it instead of rewriting it against //osbase/loop.
 ---
  pkg/volume/util/util.go | 18 ------------------
  1 file changed, 18 deletions(-)