docs: @Override
  	public TermedStatementDocument performEdit(WbEditingAction action, boolean editAsBot, String summary)
  			throws IOException, MediaWikiApiErrorException {
  		Map<String, TermImpl> labelUpdates = getLabelUpdates();
  		Map<String, TermImpl> descriptionUpdates = getDescriptionUpdates();
  		Map<String, List<TermImpl>> aliasUpdates = getAliasUpdates();
  		if (labelUpdates.isEmpty() && descriptionUpdates.isEmpty() && aliasUpdates.isEmpty()) {
  			return (TermedStatementDocument) super.performEdit(action, editAsBot, summary);	
  		} else {
  			if (super.isEmptyEdit()) {
  				if(labelUpdates.size() == 1
  					&& descriptionUpdates.isEmpty()
  					&& aliasUpdates.isEmpty()) {
  					// we only have a label in one language to update, so we use "wbsetlabel"
  					String language = labelUpdates.keySet().iterator().next();
  					MonolingualTextValue value = labelUpdates.get(language);
  					
  					JsonNode response = action.wbSetLabel(
  							currentDocument.getEntityId().getId(),
  							null, null, null, language, value.getText(), editAsBot,
  							currentDocument.getRevisionId(), summary);
  					
  					MonolingualTextValue respondedLabel = getDatamodelObjectFromResponse(response,
  							Arrays.asList("entity","labels",language), TermImpl.class);
  					long revisionId = getRevisionIdFromResponse(response);
  					
  					return this.currentDocument.withRevisionId(revisionId).withLabel(respondedLabel);
  				} else if (labelUpdates.isEmpty()
  					&& descriptionUpdates.size() == 1
  					&& aliasUpdates.isEmpty()) {
  					// we only have a label in one language to update, so we use "wbsetlabel"
  					String language = descriptionUpdates.keySet().iterator().next();
  					MonolingualTextValue value = descriptionUpdates.get(language);
  					
  					JsonNode response = action.wbSetDescription(
  							currentDocument.getEntityId().getId(),
  							null, null, null, language, value.getText(), editAsBot,
  							currentDocument.getRevisionId(), summary);
  					
  					MonolingualTextValue respondedDescription = getDatamodelObjectFromResponse(response,
  							Arrays.asList("entity","descriptions",language), TermImpl.class);
  					long revisionId = getRevisionIdFromResponse(response);
  					
  					return currentDocument.withRevisionId(revisionId).withDescription(respondedDescription);
  				} else if (labelUpdates.isEmpty()
  						&& descriptionUpdates.isEmpty()
  						&& aliasUpdates.size() == 1) {
  					// we only have aliases in one language to update, so we use "wbsetaliases"
  					String language = aliasUpdates.keySet().iterator().next();
  					List<MonolingualTextValue> addedValues = getAddedAliases(language);
  					List<MonolingualTextValue> removedValues = getRemovedAliases(language);
  					List<String> addedStrings = new ArrayList<>(addedValues.size());
  					for(MonolingualTextValue v : addedValues) {
  						addedStrings.add(v.getText());
  					}
  					List<String> removedStrings = new ArrayList<>(removedValues.size());
  					for(MonolingualTextValue v : removedValues) {
  						removedStrings.add(v.getText());
  					}
  					
  					JsonNode response = action.wbSetAliases(
  							currentDocument.getEntityId().getId(),
  							null, null, null, language, addedStrings, removedStrings, null, editAsBot,
  							currentDocument.getRevisionId(), summary);
  					
  					long revisionId = getRevisionIdFromResponse(response);
  
  					TermImpl[] respondedAliases = getDatamodelObjectFromResponse(response,
  							Arrays.asList("entity","aliases",language), TermImpl[].class);
  					List<MonolingualTextValue> newAliases = Arrays.asList(respondedAliases);
  					
  					return currentDocument.withRevisionId(revisionId).withAliases(language, newAliases);
  			    }
  			}
  			
  			// All other cases: we do a full-blown "wbeditentity"
  			EntityDocument response = action.wbEditEntity(currentDocument
  				.getEntityId().getId(), null, null, null, getJsonUpdateString(),
  				false, editAsBot, currentDocument
  				.getRevisionId(), summary);
  			return (TermedStatementDocument) response;
      	}
  	}