@Override
  public void destroy() {
    if (loaded) {
      loaded = false;

      if (interactionStream != null) {
        interactionStream.Disable();
        interactionStream.Release();
        interactionStream = null;
      }

      if (interactionClient != null) {
        interactionClient.Release();
        interactionClient = null;
      }

      if (colorStream != null) {
        Kernel32.INSTANCE.CloseHandle(colorStream);
        colorStream = null;
      }

      if (depthStream != null) {
        Kernel32.INSTANCE.CloseHandle(depthStream);
        depthStream = null;
      }

      if (nextColorImageFrame != null) {
        Kernel32.INSTANCE.CloseHandle(nextColorImageFrame);
        nextColorImageFrame = null;
      }

      if (nextDepthImageFrame != null) {
        Kernel32.INSTANCE.CloseHandle(nextDepthImageFrame);
        nextDepthImageFrame = null;
      }

      if (nextSkeletonFrame != null) {
        Kernel32.INSTANCE.CloseHandle(nextSkeletonFrame);
        nextSkeletonFrame = null;
      }

      if (nextInteractionFrame != null) {
        Kernel32.INSTANCE.CloseHandle(nextInteractionFrame);
        nextInteractionFrame = null;
      }

      if (device != null) {
        checkRC(device.NuiSkeletonTrackingDisable());
        device.NuiShutdown();
        device.Release();
        device = null;
      }

      // Remove all receivers connected to this driver
      EventManager.getInstance().removeReceivers(EventType.HAND_CREATED);
      EventManager.getInstance().removeReceivers(EventType.HAND_UPDATED);
      EventManager.getInstance().removeReceivers(EventType.HAND_DESTROYED);
    }
  }