// Save the current state of the Workbench
  private void saveState() {

    onClose();

    final PerspectiveDefinition perspective = panelManager.getPerspective();

    if (perspective == null) {
      // On startup the Workbench has not been set to contain a perspective
      loadState();

    } else if (perspective.isTransient()) {
      // Transient Perspectives are not saved
      placeManager.closeAllPlaces();
      loadState();

    } else {
      // Save first, then close all places before loading persisted state
      wbServices
          .call(
              new RemoteCallback<Void>() {
                @Override
                public void callback(Void response) {
                  placeManager.closeAllPlaces();
                  loadState();
                }
              })
          .save(perspective);
    }
  }
  // Load the persisted state of the Workbench or use the default Perspective definition if no saved
  // state found
  private void loadState() {

    // Call OnStartup before getting the Perspective definition in case any setup is required by
    // @WorkbenchPerspective's
    onStartup(place);

    final PerspectiveDefinition perspective = getPerspective();

    if (perspective.isTransient()) {
      // Transient Perspectives are not saved and hence cannot be loaded
      initialisePerspective(perspective);

    } else {

      wbServices
          .call(
              new RemoteCallback<PerspectiveDefinition>() {
                @Override
                public void callback(PerspectiveDefinition response) {
                  if (response == null) {
                    initialisePerspective(perspective);
                  } else {
                    initialisePerspective(response);
                  }
                }
              })
          .load(perspective.getName());
    }
  }