@Override
  public void outputAjaxDiff(
      PipelineContext pipelineContext,
      ContentHandlerHelper ch,
      XFormsControl other,
      AttributesImpl attributesImpl,
      boolean isNewlyVisibleSubtree) {
    // Output regular diff
    super.outputAjaxDiff(pipelineContext, ch, other, attributesImpl, isNewlyVisibleSubtree);

    // Output itemset diff
    if (mustSendItemsetUpdate(pipelineContext, (XFormsSelect1Control) other)) {
      ch.startElement(
          "xxf",
          XFormsConstants.XXFORMS_NAMESPACE_URI,
          "itemset",
          new String[] {"id", XFormsUtils.namespaceId(containingDocument, getEffectiveId())});
      {
        final Itemset itemset = getItemset(pipelineContext);
        if (itemset != null) {
          final String result =
              itemset.getJSONTreeInfo(pipelineContext, null, false, getLocationData());
          if (result.length() > 0) ch.text(result);
        }
      }
      ch.endElement();
    }
  }
  @Override
  public void outputAjaxDiff(
      ContentHandlerHelper ch,
      XFormsControl other,
      AttributesImpl attributesImpl,
      boolean isNewlyVisibleSubtree) {
    // Output regular diff
    super.outputAjaxDiff(ch, other, attributesImpl, isNewlyVisibleSubtree);

    // Output switch-specific diff if needed only
    final XFormsSwitchControl otherSwitchControl = (XFormsSwitchControl) other;
    if (!compareSelectedCase(otherSwitchControl)) {

      if (isRelevant()) {

        // Output newly selected case id
        final String selectedCaseEffectiveId = getSelectedCaseEffectiveId();
        assert selectedCaseEffectiveId != null;
        ch.element(
            "xxf",
            XFormsConstants.XXFORMS_NAMESPACE_URI,
            "div",
            new String[] {
              "id",
              XFormsUtils.namespaceId(containingDocument(), selectedCaseEffectiveId),
              "visibility",
              "visible"
            });

        if (otherSwitchControl != null && otherSwitchControl.isRelevant()) {
          // Used to be relevant, simply output deselected case ids
          final String previousSelectedCaseId = getOtherSelectedCaseEffectiveId(otherSwitchControl);
          assert previousSelectedCaseId != null;
          ch.element(
              "xxf",
              XFormsConstants.XXFORMS_NAMESPACE_URI,
              "div",
              new String[] {
                "id",
                XFormsUtils.namespaceId(containingDocument(), previousSelectedCaseId),
                "visibility",
                "hidden"
              });
        } else {
          // Control was not relevant, send all deselected to be sure
          // TODO: This should not be needed because the repeat template should have a reasonable
          // default.
          final List<XFormsCaseControl> children = getChildrenCases();
          if (children != null && children.size() > 0) {
            for (final XFormsCaseControl caseControl : children) {
              if (!caseControl.getEffectiveId().equals(selectedCaseEffectiveId)) {
                ch.element(
                    "xxf",
                    XFormsConstants.XXFORMS_NAMESPACE_URI,
                    "div",
                    new String[] {
                      "id",
                      XFormsUtils.namespaceId(containingDocument(), caseControl.getEffectiveId()),
                      "visibility",
                      "hidden"
                    });
              }
            }
          }
        }
      }
    }
  }