diff --git a/zircon/kernel/object/guest_dispatcher.cpp b/zircon/kernel/object/guest_dispatcher.cpp
index d1b4d4316555e5b329b112cb0d3438176d13c9f2..2d78522ffcdc019ad1b1fb65c5786b790500e07a 100644
--- a/zircon/kernel/object/guest_dispatcher.cpp
+++ b/zircon/kernel/object/guest_dispatcher.cpp
@@ -16,7 +16,7 @@ KCOUNTER(dispatcher_guest_create_count, "dispatcher.guest.create")
 KCOUNTER(dispatcher_guest_destroy_count, "dispatcher.guest.destroy")
 
 // static
-zx_status_t GuestDispatcher::Create(fbl::RefPtr<Dispatcher>* guest_dispatcher,
+zx_status_t GuestDispatcher::Create(KernelHandle<GuestDispatcher>* guest_handle,
                                     zx_rights_t* guest_rights,
                                     KernelHandle<VmAddressRegionDispatcher>* vmar_handle,
                                     zx_rights_t* vmar_rights) {
@@ -27,19 +27,20 @@ zx_status_t GuestDispatcher::Create(fbl::RefPtr<Dispatcher>* guest_dispatcher,
     }
 
     fbl::AllocChecker ac;
-    auto disp = fbl::AdoptRef(new (&ac) GuestDispatcher(ktl::move(guest)));
+    KernelHandle new_guest_handle(fbl::AdoptRef(new (&ac) GuestDispatcher(ktl::move(guest))));
     if (!ac.check()) {
         return ZX_ERR_NO_MEMORY;
     }
 
-    status = VmAddressRegionDispatcher::Create(disp->guest()->AddressSpace()->RootVmar(), 0,
-                                               vmar_handle, vmar_rights);
+    status = VmAddressRegionDispatcher::Create(
+        new_guest_handle.dispatcher()->guest()->AddressSpace()->RootVmar(), 0, vmar_handle,
+        vmar_rights);
     if (status != ZX_OK) {
         return status;
     }
 
     *guest_rights = default_rights();
-    *guest_dispatcher = ktl::move(disp);
+    *guest_handle = ktl::move(new_guest_handle);
     return ZX_OK;
 }
 
diff --git a/zircon/kernel/object/include/object/guest_dispatcher.h b/zircon/kernel/object/include/object/guest_dispatcher.h
index 1256182aebc978f53ef390212d071d6f49b433cc..f722e6ed02ad53eeb7e308962d7158e98543ec67 100644
--- a/zircon/kernel/object/include/object/guest_dispatcher.h
+++ b/zircon/kernel/object/include/object/guest_dispatcher.h
@@ -16,7 +16,7 @@ class VmObject;
 
 class GuestDispatcher final : public SoloDispatcher<GuestDispatcher, ZX_DEFAULT_GUEST_RIGHTS> {
 public:
-    static zx_status_t Create(fbl::RefPtr<Dispatcher>* guest_dispatcher,
+    static zx_status_t Create(KernelHandle<GuestDispatcher>* guest_handle,
                               zx_rights_t* guest_rights,
                               KernelHandle<VmAddressRegionDispatcher>* vmar_handle,
                               zx_rights_t* vmar_rights);
diff --git a/zircon/kernel/syscalls/hypervisor.cpp b/zircon/kernel/syscalls/hypervisor.cpp
index 13af7c642c0e450e984460045411a9812f94288b..4277c75b19af41621a8a7fc3909c5972edabff48 100644
--- a/zircon/kernel/syscalls/hypervisor.cpp
+++ b/zircon/kernel/syscalls/hypervisor.cpp
@@ -29,15 +29,15 @@ zx_status_t sys_guest_create(zx_handle_t resource, uint32_t options, user_out_ha
     if (status != ZX_OK)
         return status;
 
-    fbl::RefPtr<Dispatcher> guest_dispatcher;
+    KernelHandle<GuestDispatcher> new_guest_handle;
     KernelHandle<VmAddressRegionDispatcher> new_vmar_handle;
     zx_rights_t guest_rights, vmar_rights;
     status =
-        GuestDispatcher::Create(&guest_dispatcher, &guest_rights, &new_vmar_handle, &vmar_rights);
+        GuestDispatcher::Create(&new_guest_handle, &guest_rights, &new_vmar_handle, &vmar_rights);
     if (status != ZX_OK)
         return status;
 
-    status = guest_handle->make(ktl::move(guest_dispatcher), guest_rights);
+    status = guest_handle->make(ktl::move(new_guest_handle), guest_rights);
     if (status != ZX_OK)
         return status;
     return vmar_handle->make(ktl::move(new_vmar_handle), vmar_rights);