Index: /trunk/src/VBox/Main/Makefile.kmk
===================================================================
--- /trunk/src/VBox/Main/Makefile.kmk	(revision 82501)
+++ /trunk/src/VBox/Main/Makefile.kmk	(revision 82502)
@@ -1033,8 +1033,4 @@
 	src-client/GuestDnDTargetImpl.cpp
 endif
-ifdef VBOX_WITH_SHARED_CLIPBOARD
- VBoxC_SOURCES += \
-	src-client/SharedClipboardPrivate.cpp
-endif
 ifdef VBOX_WITH_XPCOM
  VBoxC_SOURCES += \
Index: /trunk/src/VBox/Main/include/ConsoleImpl.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 82501)
+++ /trunk/src/VBox/Main/include/ConsoleImpl.h	(revision 82502)
@@ -884,12 +884,4 @@
 #endif
 
-#ifdef VBOX_WITH_SHARED_CLIPBOARD
-    /** @name Shared Clipboard support
-     * @{ */
-    static DECLCALLBACK(int) i_sharedClipboardServiceCallback(void *pvExtension, uint32_t u32Function,
-                                                              void *pvParms, uint32_t cbParms);
-    /** @} */
-#endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
-
     /** @name Disk encryption support
      * @{ */
@@ -1065,7 +1057,4 @@
     Bstr mstrUuid;
 
-#ifdef VBOX_WITH_SHARED_CLIPBOARD
-    HGCMSVCEXTHANDLE m_hHgcmSvcExtShrdClipboard;
-#endif
 #ifdef VBOX_WITH_DRAG_AND_DROP
     HGCMSVCEXTHANDLE m_hHgcmSvcExtDragAndDrop;
Index: /trunk/src/VBox/Main/include/ConsoleVRDPServer.h
===================================================================
--- /trunk/src/VBox/Main/include/ConsoleVRDPServer.h	(revision 82501)
+++ /trunk/src/VBox/Main/include/ConsoleVRDPServer.h	(revision 82502)
@@ -139,6 +139,4 @@
     void SendAudioVolume (uint16_t left, uint16_t right) const;
     void SendUSBRequest (uint32_t u32ClientId, void *pvParms, uint32_t cbParms) const;
-    void SendClipboard (uint32_t u32Function, uint32_t u32Format,
-                        void *pvData, uint32_t cbData, uint32_t *pcbActualRead) const;
 
     void QueryInfo (uint32_t index, void *pvBuffer, uint32_t cbBuffer, uint32_t *pcbOut) const;
@@ -222,7 +220,9 @@
 
     int mcClipboardRefs;
+    HGCMSVCEXTHANDLE mhClipboard;
     PFNVRDPCLIPBOARDEXTCALLBACK mpfnClipboardCallback;
 
     static DECLCALLBACK(int) ClipboardCallback (void *pvCallback, uint32_t u32ClientId, uint32_t u32Function, uint32_t u32Format, const void *pvData, uint32_t cbData);
+    static DECLCALLBACK(int) ClipboardServiceExtension(void *pvExtension, uint32_t u32Function, void *pvParms, uint32_t cbParms);
 
 #ifdef VBOX_WITH_USB
Index: unk/src/VBox/Main/include/SharedClipboardPrivate.h
===================================================================
--- /trunk/src/VBox/Main/include/SharedClipboardPrivate.h	(revision 82501)
+++ 	(revision )
@@ -1,102 +1,0 @@
-/* $Id$ */
-/** @file
- * Private Shared Clipboard code. */
-
-/*
- * Copyright (C) 2019 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- */
-
-#ifndef MAIN_INCLUDED_SharedClipboardPrivate_h
-#define MAIN_INCLUDED_SharedClipboardPrivate_h
-#ifndef RT_WITHOUT_PRAGMA_ONCE
-# pragma once
-#endif
-
-#include <iprt/dir.h>
-#include <iprt/file.h>
-#include <iprt/path.h>
-
-#include <VBox/hgcmsvc.h> /* For PVBOXHGCMSVCPARM. */
-#include <VBox/HostServices/VBoxClipboardSvc.h>
-
-
-/* Prototypes. */
-class Console;
-
-/**
- * Private singleton class for the Shared Clipboard
- * implementation. Can't be instanciated directly, only via
- * the factory pattern.
- */
-class SharedClipboard
-{
-public:
-
-    static SharedClipboard *createInstance(const ComObjPtr<Console>& pConsole)
-    {
-        Assert(NULL == SharedClipboard::s_pInstance);
-        SharedClipboard::s_pInstance = new SharedClipboard(pConsole);
-        return SharedClipboard::s_pInstance;
-    }
-
-    static void destroyInstance(void)
-    {
-        if (SharedClipboard::s_pInstance)
-        {
-            delete SharedClipboard::s_pInstance;
-            SharedClipboard::s_pInstance = NULL;
-        }
-    }
-
-    static inline SharedClipboard *getInstance(void)
-    {
-        AssertPtr(SharedClipboard::s_pInstance);
-        return SharedClipboard::s_pInstance;
-    }
-
-protected:
-
-    SharedClipboard(const ComObjPtr<Console>& pConsole);
-    virtual ~SharedClipboard(void);
-
-public:
-
-    /** @name Public helper functions.
-     * @{ */
-    int hostCall(uint32_t u32Function, uint32_t cParms, PVBOXHGCMSVCPARM paParms) const;
-    /** @}  */
-
-public:
-
-    /** @name Static low-level HGCM callback handler.
-     * @{ */
-    static DECLCALLBACK(int) hostServiceCallback(void *pvExtension, uint32_t u32Function, void *pvParms, uint32_t cbParms);
-    /** @}  */
-
-protected:
-
-    /** @name Singleton properties.
-     * @{ */
-    /** Pointer to console implementation. */
-    const ComObjPtr<Console>   m_pConsole;
-    /** @}  */
-
-private:
-
-    /** Staic pointer to singleton instance. */
-    static SharedClipboard    *s_pInstance;
-};
-
-/** Access to the Shared Clipboard's singleton instance. */
-#define SHAREDCLIPBOARDINST() SharedClipboard::getInstance()
-
-#endif /* !MAIN_INCLUDED_SharedClipboardPrivate_h */
-
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 82501)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl.cpp	(revision 82502)
@@ -125,8 +125,5 @@
 
 #ifdef VBOX_WITH_SHARED_CLIPBOARD
-#include <VBox/HostServices/VBoxClipboardSvc.h>
-# ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
-#  include "SharedClipboardPrivate.h"
-# endif
+# include <VBox/HostServices/VBoxClipboardSvc.h>
 #endif
 #include <VBox/HostServices/DragAndDropSvc.h>
@@ -8248,10 +8245,6 @@
         alock.release();
 
-# ifdef VBOX_WITH_SHARED_CLIPBOARD
-        if (m_hHgcmSvcExtShrdClipboard)
-        {
-            HGCMHostUnregisterServiceExtension(m_hHgcmSvcExtShrdClipboard);
-            m_hHgcmSvcExtShrdClipboard = NULL;
-        }
+# ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
+        /** @todo Deregister area callbacks?   */
 # endif
 # ifdef VBOX_WITH_DRAG_AND_DROP
@@ -8420,152 +8413,4 @@
     return rc;
 }
-
-#ifdef VBOX_WITH_SHARED_CLIPBOARD
-/* static */
-DECLCALLBACK(int) Console::i_sharedClipboardServiceCallback(void *pvExtension, uint32_t u32Function,
-                                                            void *pvParms, uint32_t cbParms)
-{
-    LogFlowFunc(("pvExtension=%p, u32Function=%RU32, pvParms=%p, cbParms=%RU32\n",
-                 pvExtension, u32Function, pvParms, cbParms));
-
-    RT_NOREF(pvParms, cbParms);
-
-    Console *pThis = reinterpret_cast<Console *>(pvExtension);
-    AssertPtrReturn(pThis, VERR_INVALID_POINTER);
-
-    ComPtr<IInternalMachineControl> pControl = pThis->mControl;
-
-    int rc = VINF_SUCCESS;
-
-# ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
-    HRESULT hrc = S_OK;
-# endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
-
-    LogFunc(("mConsoleVRDPServer=%p\n", pThis->mConsoleVRDPServer));
-
-    switch (u32Function)
-    {
-        case VBOX_CLIPBOARD_EXT_FN_SET_CALLBACK:
-        {
-            LogFlowFunc(("VBOX_CLIPBOARD_EXT_FN_SET_CALLBACK\n"));
-        } break;
-
-        case VBOX_CLIPBOARD_EXT_FN_FORMAT_ANNOUNCE:
-        {
-            LogFlowFunc(("VBOX_CLIPBOARD_EXT_FN_FORMAT_ANNOUNCE\n"));
-
-            SHCLEXTPARMS *pParms = (SHCLEXTPARMS *)pvParms;
-            AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
-
-            /* The guest announces clipboard formats. This must be delivered to all clients. */
-            if (pThis->mConsoleVRDPServer)
-                pThis->mConsoleVRDPServer->SendClipboard(VRDE_CLIPBOARD_FUNCTION_FORMAT_ANNOUNCE,
-                                                         pParms->uFormat,
-                                                         NULL,
-                                                         0,
-                                                         NULL);
-        } break;
-
-        case VBOX_CLIPBOARD_EXT_FN_DATA_READ:
-        {
-            LogFlowFunc(("VBOX_CLIPBOARD_EXT_FN_DATA_READ\n"));
-
-            SHCLEXTPARMS *pParms = (SHCLEXTPARMS *)pvParms;
-            AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
-
-            /* The clipboard service expects that the pvData buffer will be filled
-             * with clipboard data. The server returns the data from the client that
-             * announced the requested format most recently.
-             */
-            if (pThis->mConsoleVRDPServer)
-                pThis->mConsoleVRDPServer->SendClipboard(VRDE_CLIPBOARD_FUNCTION_DATA_READ,
-                                                         pParms->uFormat,
-                                                         pParms->u.pvData,
-                                                         pParms->cbData,
-                                                         &pParms->cbData);
-        } break;
-
-        case VBOX_CLIPBOARD_EXT_FN_DATA_WRITE:
-        {
-            LogFlowFunc(("VBOX_CLIPBOARD_EXT_FN_DATA_WRITE\n"));
-
-            SHCLEXTPARMS *pParms = (SHCLEXTPARMS *)pvParms;
-            AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
-
-            if (pThis->mConsoleVRDPServer)
-                pThis->mConsoleVRDPServer->SendClipboard(VRDE_CLIPBOARD_FUNCTION_DATA_WRITE,
-                                                         pParms->uFormat,
-                                                         pParms->u.pvData,
-                                                         pParms->cbData,
-                                                         NULL);
-        } break;
-
-# ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
-        case VBOX_CLIPBOARD_EXT_FN_AREA_REGISTER:
-        {
-            com::SafeArray<BSTR> abstrParms; /* Empty for now. */
-            ULONG uID;
-            hrc = pControl->ClipboardAreaRegister(ComSafeArrayAsInParam(abstrParms), &uID);
-            if (SUCCEEDED(hrc))
-            {
-                PSHCLEXTAREAPARMS pParms = (PSHCLEXTAREAPARMS)pvParms;
-                AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
-
-                /* Return the registered area ID back to the caller. */
-                pParms->uID = uID;
-            }
-            else
-                LogFunc(("Registering clipboard area failed with %Rhrc\n", hrc));
-        } break;
-
-        case VBOX_CLIPBOARD_EXT_FN_AREA_UNREGISTER:
-        {
-            PSHCLEXTAREAPARMS pParms = (PSHCLEXTAREAPARMS)pvParms;
-            AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
-
-            hrc = pControl->ClipboardAreaUnregister(pParms->uID);
-            if (FAILED(hrc))
-                LogFunc(("Unregistering clipboard area %RU32 failed with %Rhrc\n", pParms->uID, hrc));
-        } break;
-
-        case VBOX_CLIPBOARD_EXT_FN_AREA_ATTACH:
-        {
-            PSHCLEXTAREAPARMS pParms = (PSHCLEXTAREAPARMS)pvParms;
-            AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
-
-            hrc = pControl->ClipboardAreaAttach(pParms->uID);
-            if (FAILED(hrc))
-                LogFunc(("Attaching to clipboard area %RU32 failed with %Rhrc\n", pParms->uID, hrc));
-        } break;
-
-        case VBOX_CLIPBOARD_EXT_FN_AREA_DETACH:
-        {
-            PSHCLEXTAREAPARMS pParms = (PSHCLEXTAREAPARMS)pvParms;
-            AssertPtrBreakStmt(pParms, rc = VERR_INVALID_POINTER);
-
-            hrc = pControl->ClipboardAreaDetach(pParms->uID);
-            if (FAILED(hrc))
-                LogFunc(("Detaching from clipboard area %RU32 failed with %Rhrc\n", pParms->uID, hrc));
-        } break;
-# endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
-
-        default:
-        {
-            rc = VERR_NOT_SUPPORTED;
-        } break;
-    }
-
-# ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
-    if (FAILED(hrc))
-    {
-        LogRel(("Shared Clipboard: Area handling failed with %Rhrc\n", hrc));
-        rc = VERR_GENERAL_FAILURE; /** @todo Fudge; fix this. */
-    }
-# endif
-
-    LogFlowFuncLeaveRC(rc);
-    return rc;
-}
-#endif /* VBOX_WITH_SHARED_CLIPBOARD */
 
 /**
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 82501)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 82502)
@@ -76,5 +76,4 @@
 #ifdef VBOX_WITH_SHARED_CLIPBOARD
 # include <VBox/HostServices/VBoxClipboardSvc.h>
-# include "SharedClipboardPrivate.h"
 #endif
 #ifdef VBOX_WITH_GUEST_PROPS
@@ -3062,60 +3061,40 @@
          */
         {
-            if (SharedClipboard::createInstance(this /* pConsole */) == NULL)
-            {
-                rc = VERR_NO_MEMORY;
+            ClipboardMode_T enmClipboardMode = ClipboardMode_Disabled;
+            hrc = pMachine->COMGETTER(ClipboardMode)(&enmClipboardMode); H();
+# ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
+            BOOL fFileTransfersEnabled;
+            hrc = pMachine->COMGETTER(ClipboardFileTransfersEnabled)(&fFileTransfersEnabled); H();
+#endif
+
+            /* Load the service */
+            rc = pVMMDev->hgcmLoadService("VBoxSharedClipboard", "VBoxSharedClipboard");
+            if (RT_SUCCESS(rc))
+            {
+                LogRel(("Shared Clipboard: Service loaded\n"));
+
+                /* Set initial clipboard mode. */
+                rc = i_changeClipboardMode(enmClipboardMode);
+                AssertLogRelMsg(RT_SUCCESS(rc), ("Shared Clipboard: Failed to set initial clipboard mode (%d): rc=%Rrc\n",
+                                                 enmClipboardMode, rc));
+
+                /* Setup the service. */
+                VBOXHGCMSVCPARM parm;
+                HGCMSvcSetU32(&parm, !i_useHostClipboard());
+                rc = pVMMDev->hgcmHostCall("VBoxSharedClipboard", VBOX_SHCL_HOST_FN_SET_HEADLESS, 1, &parm);
+                AssertLogRelMsg(RT_SUCCESS(rc), ("Shared Clipboard: Failed to set initial headless mode (%RTbool): rc=%Rrc\n",
+                                                 !i_useHostClipboard(), rc));
+
+# ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
+                rc = i_changeClipboardFileTransferMode(RT_BOOL(fFileTransfersEnabled));
+                AssertLogRelMsg(RT_SUCCESS(rc), ("Shared Clipboard: Failed to set initial file transfers mode (%u): rc=%Rrc\n",
+                                                 fFileTransfersEnabled, rc));
+
+                /** @todo Register area callbacks? (See also deregistration todo in Console::i_powerDown.) */
+# endif
             }
             else
-            {
-                /* Load the service */
-                rc = pVMMDev->hgcmLoadService("VBoxSharedClipboard", "VBoxSharedClipboard");
-                if (RT_SUCCESS(rc))
-                {
-                    LogRel(("Shared Clipboard: Service loaded\n"));
-                    rc = HGCMHostRegisterServiceExtension(&m_hHgcmSvcExtShrdClipboard, "VBoxSharedClipboard",
-                                                          &Console::i_sharedClipboardServiceCallback,
-                                                          this /* pvExtension */);
-                    if (RT_FAILURE(rc))
-                    {
-                        LogRel(("Shared Clipboard: Cannot register service extension, rc=%Rrc\n", rc));
-                    }
-                    else
-                    {
-                        /* Set initial clipboard mode. */
-                        ClipboardMode_T mode = ClipboardMode_Disabled;
-                        hrc = pMachine->COMGETTER(ClipboardMode)(&mode); H();
-
-                        rc = i_changeClipboardMode(mode);
-                        if (RT_SUCCESS(rc))
-                        {
-                            /* Setup the service. */
-                            VBOXHGCMSVCPARM parm;
-                            HGCMSvcSetU32(&parm, !i_useHostClipboard());
-                            rc = SHAREDCLIPBOARDINST()->hostCall(VBOX_SHCL_HOST_FN_SET_HEADLESS, 1, &parm);
-                            if (RT_FAILURE(rc))
-                                LogRel(("Shared Clipboard: Unable to set initial headless mode, rc=%Rrc\n", rc));
-
-#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
-                            /* Setup file transfer mode. */
-                            BOOL fFileTransfersEnabled;
-                            hrc = pMachine->COMGETTER(ClipboardFileTransfersEnabled)(&fFileTransfersEnabled); H();
-                            int rc2 = i_changeClipboardFileTransferMode(RT_BOOL(fFileTransfersEnabled));
-                            if (RT_FAILURE(rc2))
-                                LogRel(("Shared Clipboard: Unable to set initial file transfers mode, rc=%Rrc\n", rc2));
-                            /* Note: Don't let the Shared Clipboard fail as a whole if file transfers aren't available. */
-#endif /* VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS */
-                        }
-                        else
-                            LogRel(("Shared Clipboard: Unable to set initial clipboard mode, rc=%Rrc\n", rc));
-                    }
-                }
-            }
-
-            if (RT_FAILURE(rc))
-            {
                 LogRel(("Shared Clipboard: Not available, rc=%Rrc\n", rc));
-                /* That is not a fatal failure. */
-                rc = VINF_SUCCESS;
-            }
+            rc = VINF_SUCCESS;  /* None of the potential failures above are fatal. */
         }
 #endif /* VBOX_WITH_SHARED_CLIPBOARD */
Index: /trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp	(revision 82501)
+++ /trunk/src/VBox/Main/src-client/ConsoleVRDPServer.cpp	(revision 82502)
@@ -1336,4 +1336,5 @@
 
 ConsoleVRDPServer::ConsoleVRDPServer(Console *console)
+    : mhClipboard(NULL)
 {
     mConsole = console;
@@ -3320,4 +3321,75 @@
 }
 
+/*static*/ DECLCALLBACK(int)
+ConsoleVRDPServer::ClipboardServiceExtension(void *pvExtension, uint32_t u32Function, void *pvParms, uint32_t cbParms)
+{
+    RT_NOREF(cbParms);
+    LogFlowFunc(("pvExtension = %p, u32Function = %d, pvParms = %p, cbParms = %d\n",
+                 pvExtension, u32Function, pvParms, cbParms));
+
+    int rc = VINF_SUCCESS;
+
+    ConsoleVRDPServer *pServer = static_cast <ConsoleVRDPServer *>(pvExtension);
+
+    SHCLEXTPARMS *pParms = (SHCLEXTPARMS *)pvParms;
+
+    switch (u32Function)
+    {
+        case VBOX_CLIPBOARD_EXT_FN_SET_CALLBACK:
+        {
+            pServer->mpfnClipboardCallback = pParms->u.pfnCallback;
+        } break;
+
+        case VBOX_CLIPBOARD_EXT_FN_FORMAT_ANNOUNCE:
+        {
+            /* The guest announces clipboard formats. This must be delivered to all clients. */
+            if (mpEntryPoints && pServer->mhServer)
+            {
+                mpEntryPoints->VRDEClipboard(pServer->mhServer,
+                                             VRDE_CLIPBOARD_FUNCTION_FORMAT_ANNOUNCE,
+                                             pParms->uFormat,
+                                             NULL,
+                                             0,
+                                             NULL);
+            }
+        } break;
+
+        case VBOX_CLIPBOARD_EXT_FN_DATA_READ:
+        {
+            /* The clipboard service expects that the pvData buffer will be filled
+             * with clipboard data. The server returns the data from the client that
+             * announced the requested format most recently.
+             */
+            if (mpEntryPoints && pServer->mhServer)
+            {
+                mpEntryPoints->VRDEClipboard(pServer->mhServer,
+                                             VRDE_CLIPBOARD_FUNCTION_DATA_READ,
+                                             pParms->uFormat,
+                                             pParms->u.pvData,
+                                             pParms->cbData,
+                                             &pParms->cbData);
+            }
+        } break;
+
+        case VBOX_CLIPBOARD_EXT_FN_DATA_WRITE:
+        {
+            if (mpEntryPoints && pServer->mhServer)
+            {
+                mpEntryPoints->VRDEClipboard(pServer->mhServer,
+                                             VRDE_CLIPBOARD_FUNCTION_DATA_WRITE,
+                                             pParms->uFormat,
+                                             pParms->u.pvData,
+                                             pParms->cbData,
+                                             NULL);
+            }
+        } break;
+
+        default:
+            rc = VERR_NOT_SUPPORTED;
+    }
+
+    return rc;
+}
+
 void ConsoleVRDPServer::ClipboardCreate(uint32_t u32ClientId)
 {
@@ -3328,5 +3400,10 @@
     {
         if (mcClipboardRefs == 0)
+        {
+            rc = HGCMHostRegisterServiceExtension(&mhClipboard, "VBoxSharedClipboard", ClipboardServiceExtension, this);
+            AssertRC(rc);
+
             mcClipboardRefs++;
+        }
 
         unlockConsoleVRDPServer();
@@ -3342,5 +3419,14 @@
     {
         Assert(mcClipboardRefs);
-        mcClipboardRefs--;
+        if (mcClipboardRefs > 0)
+        {
+            mcClipboardRefs--;
+
+            if (mcClipboardRefs == 0 && mhClipboard)
+            {
+                HGCMHostUnregisterServiceExtension(mhClipboard);
+                mhClipboard = NULL;
+            }
+        }
 
         unlockConsoleVRDPServer();
@@ -3665,13 +3751,4 @@
     {
         mpEntryPoints->VRDEUSBRequest(mhServer, u32ClientId, pvParms, cbParms);
-    }
-}
-
-void ConsoleVRDPServer::SendClipboard(uint32_t u32Function, uint32_t u32Format,
-                                      void *pvData, uint32_t cbData, uint32_t *pcbActualRead) const
-{
-    if (mpEntryPoints && mhServer)
-    {
-        mpEntryPoints->VRDEClipboard(mhServer, u32Function, u32Format, pvData, cbData, pcbActualRead);
     }
 }
Index: unk/src/VBox/Main/src-client/SharedClipboardPrivate.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/SharedClipboardPrivate.cpp	(revision 82501)
+++ 	(revision )
@@ -1,73 +1,0 @@
-/* $Id$ */
-/** @file
- * Private Shared Clipboard code.
- */
-
-/*
- * Copyright (C) 2019 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- */
-
-#define LOG_GROUP LOG_GROUP_SHARED_CLIPBOARD
-#include "LoggingNew.h"
-
-#include <VMMDev.h>
-
-#include <VBox/err.h>
-
-#ifdef VBOX_WITH_SHARED_CLIPBOARD_TRANSFERS
-# include <VBox/GuestHost/SharedClipboard-transfers.h>
-#endif
-
-#include "ConsoleImpl.h"
-#include "SharedClipboardPrivate.h"
-
-SharedClipboard* SharedClipboard::s_pInstance = NULL;
-
-SharedClipboard::SharedClipboard(const ComObjPtr<Console> &pConsole)
-    : m_pConsole(pConsole)
-{
-    LogFlowFuncEnter();
-}
-
-SharedClipboard::~SharedClipboard(void)
-{
-    LogFlowFuncEnter();
-}
-
-int SharedClipboard::hostCall(uint32_t u32Function, uint32_t cParms, PVBOXHGCMSVCPARM paParms) const
-{
-    /* Forward the information to the VMM device. */
-    Assert(!m_pConsole.isNull());
-    VMMDev *pVMMDev = m_pConsole->i_getVMMDev();
-    if (!pVMMDev)
-        return VERR_COM_OBJECT_NOT_FOUND;
-
-    return pVMMDev->hgcmHostCall("VBoxSharedClipboard", u32Function, cParms, paParms);
-}
-
-/* static */
-DECLCALLBACK(int) SharedClipboard::hostServiceCallback(void *pvExtension, uint32_t u32Function,
-                                                       void *pvParms, uint32_t cbParms)
-{
-    LogFlowFunc(("pvExtension=%p, u32Function=%RU32, pvParms=%p, cbParms=%RU32\n",
-                 pvExtension, u32Function, pvParms, cbParms));
-
-    RT_NOREF(u32Function, pvParms, cbParms);
-
-    SharedClipboard *pThis = reinterpret_cast<SharedClipboard *>(pvExtension);
-    AssertPtrReturn(pThis, VERR_INVALID_POINTER);
-
-    int rc = VINF_SUCCESS;
-
-    LogFlowFuncLeaveRC(rc);
-    return rc;
-}
-
