public boolean closePanel(ActivityInstance ai, ClosePanelScenario scenario, Object parameters) {
    FacesContext facesContext = FacesContext.getCurrentInstance();

    if (ActivityInteractionControllerUtils.isExternalWebAppInterventionRequired(scenario)) {
      trace.info("Triggering asynchronous close of activity panel ...");

      InteractionRegistry registry =
          (InteractionRegistry)
              ManagedBeanUtils.getManagedBean(facesContext, InteractionRegistry.BEAN_ID);

      Interaction interaction = registry.getInteraction(Interaction.getInteractionId(ai));
      if ((null != interaction) && (Interaction.Status.Complete == interaction.getStatus())) {
        // out data mapping was already performed
        return true;
      }

      Map<String, Object> sessionMap = facesContext.getExternalContext().getSessionMap();

      sessionMap.put(IframePanelConstants.KEY_COMMAND, scenario.getId());
      sessionMap.put(IframePanelConstants.KEY_INTERACTION_ID, Interaction.getInteractionId(ai));
      if (!isIceFacesPanel(ai)) {
        sessionMap.put(IframePanelConstants.KEY_VIEW_ID, VIEW_ID_NON_IFACE_FACELET_CONTAINER);
      }

      PortalApplicationEventScript.getInstance()
          .addEventScript(
              "parent.InfinityBpm.ProcessPortal.sendCloseCommandToExternalWebApp('"
                  + getContentFrameId(ai)
                  + "', '"
                  + scenario.getId()
                  + "');");

      // close panel asynchronously after ICEfaces page responds via JavaScript
      return false;
    } else {
      // destroy interaction
      unregisterInteraction(ai);

      // synchronously close panel as no custom post processing needs to occur
      return true;
    }
  }