/** {@inheritDoc} */
  @Nullable
  @Override
  public GridDeployment explicitDeploy(Class<?> cls, ClassLoader clsLdr) throws GridException {
    try {
      // Make sure not to deploy peer loaded tasks with non-local class loader,
      // if local one exists.
      if (clsLdr.getClass().equals(GridDeploymentClassLoader.class)) clsLdr = clsLdr.getParent();

      GridDeployment dep;

      synchronized (mux) {
        boolean deployed = spi.register(clsLdr, cls);

        if (deployed) {
          dep = getDeployment(cls.getName());

          if (dep == null) {
            GridDeploymentResource rsrc = spi.findResource(cls.getName());

            if (rsrc != null && rsrc.getClassLoader() == clsLdr) {
              dep =
                  deploy(
                      ctx.config().getDeploymentMode(),
                      rsrc.getClassLoader(),
                      rsrc.getResourceClass(),
                      rsrc.getName());
            }
          }

          if (dep != null) {
            recordDeploy(cls, cls.getName(), true);
          }
        } else {
          dep = getDeployment(cls.getName());
        }
      }

      return dep;
    } catch (GridSpiException e) {
      recordDeployFailed(cls, clsLdr, true);

      // Avoid double wrapping.
      if (e.getCause() instanceof GridException) {
        throw (GridException) e.getCause();
      }

      throw new GridException("Failed to deploy class: " + cls.getName(), e);
    }
  }