function getVisualizationInfo(oChange, oAppComponent) {
		function getSelectorIds(aSelectorList) {
			if (!aSelectorList) {
				return undefined;
			}
			return aSelectorList
			.map(function(vSelector) {
				const oElement = typeof vSelector.getId === "function"
					? vSelector
					: JsControlTreeModifier.bySelector(vSelector, oAppComponent);
				return oElement && oElement.getId();
			})
			.filter(Boolean);
		}

		return getInfoFromChangeHandler(oAppComponent, oChange)
		.then(function(oInfoFromChangeHandler) {
			const mVisualizationInfo = oInfoFromChangeHandler || {};
			const aChangeSelectors = oChange.getSelector && oChange.getSelector() && [oChange.getSelector()];
			const aAffectedElementSelectors = mVisualizationInfo.affectedControls || aChangeSelectors || [];
			// If there is an original selector (e.g. control is inside a template),
			// the indicator should be displayed on the host control (change selector)
			const oChangeOriginalSelector = oChange.getOriginalSelector && oChange.getOriginalSelector();
			const aDisplayElementSelectors = oChangeOriginalSelector ? aChangeSelectors : aAffectedElementSelectors;

			return {
				affectedElementIds: getSelectorIds(aAffectedElementSelectors),
				dependentElementIds: getSelectorIds(mVisualizationInfo.dependentControls) || [],
				displayElementIds: getSelectorIds(mVisualizationInfo.displayControls || getSelectorIds(aDisplayElementSelectors)),
				updateRequired: mVisualizationInfo.updateRequired,
				descriptionPayload: mVisualizationInfo.descriptionPayload || {}
			};
		});
	}
Registers a change under its ID.

@param {object} oChange - The change to register
@param {string} sCommandName - Command name of the change
@param {string} oVersionsModel - Model with versioning data
@returns {Promise<undefined>} Resolves as soon as the change is registered