diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
index 63cb1b80a4..3e3efec4a2 100644
--- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.cpp
@@ -19,9 +19,7 @@ const QString Basic2DWindowOpenGLDisplayPlugin::NAME("Desktop");
 
 static const QString FULLSCREEN = "Fullscreen";
 
-void Basic2DWindowOpenGLDisplayPlugin::internalActivate() {
-    Parent::internalActivate();
-
+bool Basic2DWindowOpenGLDisplayPlugin::internalActivate() {
     _framerateActions.clear();
     _container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), FULLSCREEN,
         [this](bool clicked) {
@@ -33,6 +31,8 @@ void Basic2DWindowOpenGLDisplayPlugin::internalActivate() {
         }, true, false);
 
     updateFramerate();
+
+    return Parent::internalActivate();
 }
 
 void Basic2DWindowOpenGLDisplayPlugin::submitSceneTexture(uint32_t frameIndex, const gpu::TexturePointer& sceneTexture) {
diff --git a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h
index 90b32a1924..40c6eb4381 100644
--- a/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/Basic2DWindowOpenGLDisplayPlugin.h
@@ -22,7 +22,7 @@ public:
 
     virtual float getTargetFrameRate() override { return  _framerateTarget ? (float) _framerateTarget : TARGET_FRAMERATE_Basic2DWindowOpenGL; }
 
-    virtual void internalActivate() override;
+    virtual bool internalActivate() override;
 
     virtual void submitSceneTexture(uint32_t frameIndex, const gpu::TexturePointer& sceneTexture) override;
 
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
index d842dc553b..8049e2d5a5 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.cpp
@@ -219,7 +219,7 @@ void OpenGLDisplayPlugin::cleanupForSceneTexture(const gpu::TexturePointer& scen
 }
 
 
-void OpenGLDisplayPlugin::activate() {
+bool OpenGLDisplayPlugin::activate() {
     if (!_cursorsData.size()) {
         auto& cursorManager = Cursor::Manager::instance();
         for (const auto iconId : cursorManager.registeredIcons()) {
@@ -238,7 +238,9 @@ void OpenGLDisplayPlugin::activate() {
 
     // Child classes may override this in order to do things like initialize 
     // libraries, etc
-    internalActivate();
+    if (!internalActivate()) {
+        return false;
+    }
 
 
 #if THREADED_PRESENT
@@ -263,7 +265,8 @@ void OpenGLDisplayPlugin::activate() {
     customizeContext();
     _container->makeRenderingContextCurrent();
 #endif
-    DisplayPlugin::activate();
+
+    return DisplayPlugin::activate();
 }
 
 void OpenGLDisplayPlugin::deactivate() {
diff --git a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
index 7295b07ad3..b9628deb6c 100644
--- a/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/OpenGLDisplayPlugin.h
@@ -32,7 +32,7 @@ public:
 
     // These must be final to ensure proper ordering of operations 
     // between the main thread and the presentation thread
-    void activate() override final;
+    bool activate() override final;
     void deactivate() override final;
 
     bool eventFilter(QObject* receiver, QEvent* event) override;
@@ -77,7 +77,8 @@ protected:
     virtual void customizeContext();
     virtual void uncustomizeContext();
 
-    virtual void internalActivate() {}
+    // Returns true on successful activation
+    virtual bool internalActivate() { return true; }
     virtual void internalDeactivate() {}
     virtual void cleanupForSceneTexture(const gpu::TexturePointer& sceneTexture);
     // Plugin specific functionality to send the composed scene to the output window or device
diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp
index b022b10887..5be3f0d96a 100644
--- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp
@@ -32,7 +32,7 @@ glm::uvec2 HmdDisplayPlugin::getRecommendedUiSize() const {
     return CompositorHelper::VIRTUAL_SCREEN_SIZE;
 }
 
-void HmdDisplayPlugin::internalActivate() {
+bool HmdDisplayPlugin::internalActivate() {
     _monoPreview = _container->getBoolSetting("monoPreview", DEFAULT_MONO_VIEW);
 
     _container->addMenuItem(PluginType::DISPLAY_PLUGIN, MENU_PATH(), MONO_PREVIEW,
@@ -41,7 +41,8 @@ void HmdDisplayPlugin::internalActivate() {
         _container->setBoolSetting("monoPreview", _monoPreview);
     }, true, _monoPreview);
     _container->removeMenu(FRAMERATE);
-    Parent::internalActivate();
+
+    return Parent::internalActivate();
 }
 
 void HmdDisplayPlugin::customizeContext() {
diff --git a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h
index fede16c3a5..080a44bc66 100644
--- a/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.h
@@ -33,7 +33,7 @@ protected:
     virtual bool isHmdMounted() const = 0;
     virtual void postPreview() {};
 
-    void internalActivate() override;
+    bool internalActivate() override;
     void compositeOverlay() override;
     void compositePointer() override;
     void internalPresent() override;
diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp
index ae9f18e20d..66a4ba4835 100644
--- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp
+++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.cpp
@@ -58,7 +58,7 @@ glm::mat4 StereoDisplayPlugin::getEyeProjection(Eye eye, const glm::mat4& basePr
 static const QString FRAMERATE = DisplayPlugin::MENU_PATH() + ">Framerate";
 
 std::vector<QAction*> _screenActions;
-void StereoDisplayPlugin::internalActivate() {
+bool StereoDisplayPlugin::internalActivate() {
     auto screens = qApp->screens();
     _screenActions.resize(screens.size());
     for (int i = 0; i < screens.size(); ++i) {
@@ -77,7 +77,8 @@ void StereoDisplayPlugin::internalActivate() {
 
     _screen = qApp->primaryScreen();
     _container->setFullscreen(_screen);
-    Parent::internalActivate();
+
+    return Parent::internalActivate();
 }
 
 void StereoDisplayPlugin::updateScreen() {
diff --git a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h
index 6563c2ae89..3b481dce97 100644
--- a/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h
+++ b/libraries/display-plugins/src/display-plugins/stereo/StereoDisplayPlugin.h
@@ -29,7 +29,7 @@ public:
     // virtual glm::mat4 getEyeToHeadTransform(Eye eye) const override;
 
 protected:
-    virtual void internalActivate() override;
+    virtual bool internalActivate() override;
     virtual void internalDeactivate() override;
     void updateScreen();
 
diff --git a/libraries/plugins/src/plugins/DisplayPlugin.cpp b/libraries/plugins/src/plugins/DisplayPlugin.cpp
index 3860639614..c7fa5f5671 100644
--- a/libraries/plugins/src/plugins/DisplayPlugin.cpp
+++ b/libraries/plugins/src/plugins/DisplayPlugin.cpp
@@ -4,11 +4,11 @@
 
 #include "PluginContainer.h"
 
-void DisplayPlugin::activate() {
-    Parent::activate();
+bool DisplayPlugin::activate() {
     if (isHmd() && (getHmdScreen() >= 0)) {
         _container->showDisplayPluginsTools();
     }
+    return Parent::activate();
 }
 
 void DisplayPlugin::deactivate() {
diff --git a/libraries/plugins/src/plugins/DisplayPlugin.h b/libraries/plugins/src/plugins/DisplayPlugin.h
index e5ac78036e..f4f28176c7 100644
--- a/libraries/plugins/src/plugins/DisplayPlugin.h
+++ b/libraries/plugins/src/plugins/DisplayPlugin.h
@@ -59,7 +59,7 @@ class DisplayPlugin : public Plugin {
     Q_OBJECT
     using Parent = Plugin;
 public:
-    void activate() override;
+    bool activate() override;
     void deactivate() override;
     virtual bool isHmd() const { return false; }
     virtual int getHmdScreen() const { return -1; }
diff --git a/libraries/plugins/src/plugins/Plugin.h b/libraries/plugins/src/plugins/Plugin.h
index ee10ce331c..fb5bf0ba55 100644
--- a/libraries/plugins/src/plugins/Plugin.h
+++ b/libraries/plugins/src/plugins/Plugin.h
@@ -38,8 +38,10 @@ public:
     virtual void deinit();
 
     /// Called when a plugin is being activated for use.  May be called multiple times.
-    virtual void activate() {
+    /// Returns true if plugin was successfully activated.
+    virtual bool activate() {
         _active = true;
+        return _active;
     }
 
     /// Called when a plugin is no longer being used.  May be called multiple times.
diff --git a/plugins/hifiNeuron/src/NeuronPlugin.cpp b/plugins/hifiNeuron/src/NeuronPlugin.cpp
index e2143dbdcf..f2b8c04827 100644
--- a/plugins/hifiNeuron/src/NeuronPlugin.cpp
+++ b/plugins/hifiNeuron/src/NeuronPlugin.cpp
@@ -451,10 +451,10 @@ bool NeuronPlugin::isSupported() const {
 #endif
 }
 
-void NeuronPlugin::activate() {
-#ifdef HAVE_NEURON
+bool NeuronPlugin::activate() {
     InputPlugin::activate();
 
+#ifdef HAVE_NEURON
     // register with userInputMapper
     auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
     userInputMapper->registerDevice(_inputDevice);
@@ -473,11 +473,15 @@ void NeuronPlugin::activate() {
     if (!_socketRef) {
         // error
         qCCritical(inputplugins) << "NeuronPlugin: error connecting to " << _serverAddress.c_str() << ":" << _serverPort << ", error = " << BRGetLastErrorMessage();
+        return false;
     } else {
         qCDebug(inputplugins) << "NeuronPlugin: success connecting to " << _serverAddress.c_str() << ":" << _serverPort;
 
         BRRegisterAutoSyncParmeter(_socketRef, Cmd_CombinationMode);
+        return true;
     }
+#else
+    return false;
 #endif
 }
 
diff --git a/plugins/hifiNeuron/src/NeuronPlugin.h b/plugins/hifiNeuron/src/NeuronPlugin.h
index afe8530b07..99859dcacb 100644
--- a/plugins/hifiNeuron/src/NeuronPlugin.h
+++ b/plugins/hifiNeuron/src/NeuronPlugin.h
@@ -31,7 +31,7 @@ public:
     virtual const QString& getName() const override { return NAME; }
     const QString& getID() const override { return NEURON_ID_STRING; }
 
-    virtual void activate() override;
+    virtual bool activate() override;
     virtual void deactivate() override;
 
     virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); }
diff --git a/plugins/hifiSdl2/src/SDL2Manager.cpp b/plugins/hifiSdl2/src/SDL2Manager.cpp
index 58da2c5df0..7091b20d21 100644
--- a/plugins/hifiSdl2/src/SDL2Manager.cpp
+++ b/plugins/hifiSdl2/src/SDL2Manager.cpp
@@ -99,15 +99,19 @@ void SDL2Manager::deinit() {
 #endif
 }
 
-void SDL2Manager::activate() {
+bool SDL2Manager::activate() {
+    InputPlugin::activate();
+
 #ifdef HAVE_SDL2
     auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
     for (auto joystick : _openJoysticks) {
         userInputMapper->registerDevice(joystick);
         emit joystickAdded(joystick.get());
     }
+    return true;
+#else
+    return false;
 #endif
-    InputPlugin::activate();
 }
 
 void SDL2Manager::deactivate() {
diff --git a/plugins/hifiSdl2/src/SDL2Manager.h b/plugins/hifiSdl2/src/SDL2Manager.h
index a88e41128d..5e3e16d090 100644
--- a/plugins/hifiSdl2/src/SDL2Manager.h
+++ b/plugins/hifiSdl2/src/SDL2Manager.h
@@ -34,9 +34,7 @@ public:
     virtual void init() override;
     virtual void deinit() override;
 
-    /// Called when a plugin is being activated for use.  May be called multiple times.
-    virtual void activate() override;
-    /// Called when a plugin is no longer being used.  May be called multiple times.
+    virtual bool activate() override;
     virtual void deactivate() override;
 
     virtual void pluginFocusOutEvent() override;
diff --git a/plugins/hifiSixense/src/SixenseManager.cpp b/plugins/hifiSixense/src/SixenseManager.cpp
index 9fdce3add4..eb55d84664 100644
--- a/plugins/hifiSixense/src/SixenseManager.cpp
+++ b/plugins/hifiSixense/src/SixenseManager.cpp
@@ -79,7 +79,7 @@ bool SixenseManager::isSupported() const {
 #endif
 }
 
-void SixenseManager::activate() {
+bool SixenseManager::activate() {
     InputPlugin::activate();
 
 #ifdef HAVE_SIXENSE
@@ -101,6 +101,9 @@ void SixenseManager::activate() {
 
     loadSettings();
     _sixenseLoaded = (sixenseInit() == SIXENSE_SUCCESS);
+    return _sixenseLoaded;
+#else
+    return false;
 #endif
 }
 
diff --git a/plugins/hifiSixense/src/SixenseManager.h b/plugins/hifiSixense/src/SixenseManager.h
index 5106c87836..a46614b17a 100644
--- a/plugins/hifiSixense/src/SixenseManager.h
+++ b/plugins/hifiSixense/src/SixenseManager.h
@@ -32,7 +32,7 @@ public:
     virtual const QString& getName() const override { return NAME; }
     virtual const QString& getID() const override { return HYDRA_ID_STRING; }
 
-    virtual void activate() override;
+    virtual bool activate() override;
     virtual void deactivate() override;
 
     virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); }
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
index 1ed5c9f22a..e23d8cade6 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.cpp
@@ -34,8 +34,11 @@ void OculusBaseDisplayPlugin::customizeContext() {
     Parent::customizeContext();
 }
 
-void OculusBaseDisplayPlugin::internalActivate() {
+bool OculusBaseDisplayPlugin::internalActivate() {
     _session = acquireOculusSession();
+    if (!_session) {
+        return false;
+    }
 
     _hmdDesc = ovr_GetHmdDesc(_session);
 
@@ -81,7 +84,7 @@ void OculusBaseDisplayPlugin::internalActivate() {
     // This must come after the initialization, so that the values calculated 
     // above are available during the customizeContext call (when not running
     // in threaded present mode)
-    Parent::internalActivate();
+    return Parent::internalActivate();
 }
 
 void OculusBaseDisplayPlugin::internalDeactivate() {
diff --git a/plugins/oculus/src/OculusBaseDisplayPlugin.h b/plugins/oculus/src/OculusBaseDisplayPlugin.h
index 5455b61a60..d21b0561bc 100644
--- a/plugins/oculus/src/OculusBaseDisplayPlugin.h
+++ b/plugins/oculus/src/OculusBaseDisplayPlugin.h
@@ -24,7 +24,7 @@ public:
 
 protected:
     void customizeContext() override;
-    void internalActivate() override;
+    bool internalActivate() override;
     void internalDeactivate() override;
 
 protected:
diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp
index 0e7541066e..c4d8b252f0 100644
--- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp
+++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp
@@ -41,14 +41,18 @@ bool OpenVrDisplayPlugin::isSupported() const {
     return !isOculusPresent() && vr::VR_IsHmdPresent();
 }
 
-void OpenVrDisplayPlugin::internalActivate() {
+bool OpenVrDisplayPlugin::internalActivate() {
     Parent::internalActivate();
+
     _container->setIsOptionChecked(StandingHMDSensorMode, true);
 
     if (!_system) {
         _system = acquireOpenVrSystem();
     }
-    Q_ASSERT(_system);
+    if (!_system) {
+        qWarning() << "Failed to initialize OpenVR";
+        return false;
+    }
 
     _system->GetRecommendedRenderTargetSize(&_renderTargetSize.x, &_renderTargetSize.y);
     // Recommended render target size is per-eye, so double the X size for 
@@ -86,6 +90,8 @@ void OpenVrDisplayPlugin::internalActivate() {
     } else {
         qDebug() << "OpenVR: error could not get chaperone pointer";
     }
+
+    return true;
 }
 
 void OpenVrDisplayPlugin::internalDeactivate() {
diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.h b/plugins/openvr/src/OpenVrDisplayPlugin.h
index 78b76cb78d..022af5b06d 100644
--- a/plugins/openvr/src/OpenVrDisplayPlugin.h
+++ b/plugins/openvr/src/OpenVrDisplayPlugin.h
@@ -30,7 +30,7 @@ public:
     virtual void updateHeadPose(uint32_t frameIndex) override;
 
 protected:
-    void internalActivate() override;
+    bool internalActivate() override;
     void internalDeactivate() override;
 
     void hmdPresent() override;
diff --git a/plugins/openvr/src/ViveControllerManager.cpp b/plugins/openvr/src/ViveControllerManager.cpp
index 2e2c0face0..c1ed5aa880 100644
--- a/plugins/openvr/src/ViveControllerManager.cpp
+++ b/plugins/openvr/src/ViveControllerManager.cpp
@@ -53,8 +53,9 @@ bool ViveControllerManager::isSupported() const {
     return !isOculusPresent() && vr::VR_IsHmdPresent();
 }
 
-void ViveControllerManager::activate() {
+bool ViveControllerManager::activate() {
     InputPlugin::activate();
+
     _container->addMenu(MENU_PATH);
     _container->addMenuItem(PluginType::INPUT_PLUGIN, MENU_PATH, RENDER_CONTROLLERS,
         [this] (bool clicked) { this->setRenderControllers(clicked); },
@@ -122,6 +123,8 @@ void ViveControllerManager::activate() {
     auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
     userInputMapper->registerDevice(_inputDevice);
     _registeredWithInputMapper = true;
+
+    return true;
 }
 
 void ViveControllerManager::deactivate() {
diff --git a/plugins/openvr/src/ViveControllerManager.h b/plugins/openvr/src/ViveControllerManager.h
index 480fbfeb90..d3645304c5 100644
--- a/plugins/openvr/src/ViveControllerManager.h
+++ b/plugins/openvr/src/ViveControllerManager.h
@@ -37,7 +37,7 @@ public:
     virtual bool isJointController() const override { return true; }
     const QString& getName() const override { return NAME; }
 
-    virtual void activate() override;
+    virtual bool activate() override;
     virtual void deactivate() override;
 
     virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); }
@@ -111,8 +111,6 @@ private:
     std::shared_ptr<InputDevice> _inputDevice { std::make_shared<InputDevice>(_system) };
 
     static const QString NAME;
-
-
 };
 
 #endif // hifi__ViveControllerManager