function fnIsValidForMove(oOverlay, bOnRegistration) {
		var	oDesignTimeMetadata = oOverlay.getDesignTimeMetadata();
		var oParentElementOverlay = oOverlay.getParentElementOverlay();
		// if the overlay has 'not-adaptable' as action it should also not be movable
		var bNotAdaptable = oDesignTimeMetadata.markedAsNotAdaptable();

		if (!oDesignTimeMetadata || !oParentElementOverlay || bNotAdaptable) {
			return Promise.resolve(false);
		}

		// Direct children of template aggregations should not be movable
		// because their order is defined based on the underlying data
		var oElement = oOverlay.getElement();
		if (oElement.isDestroyStarted() || ElementUtil.isElementDirectTemplateChild(oElement)) {
			return Promise.resolve(false);
		}

		var oRelevantContainer = oOverlay.getRelevantContainer();
		var oRelevantContainerOverlay = OverlayRegistry.getOverlay(oRelevantContainer);
		if (!oRelevantContainerOverlay) {
			return Promise.resolve(false);
		}

		return this.isMoveAvailableOnRelevantContainer(oOverlay)
		.then(function(bValid) {
			bValid &&= this.oBasePlugin.hasStableId(oOverlay) &&
					this.oBasePlugin.hasStableId(oParentElementOverlay) &&
					this.oBasePlugin.hasStableId(oRelevantContainerOverlay);
			return bValid;
		}.bind(this))
		.then(function(bValid) {
			// element is only valid for move if it can be moved to somewhere else
			if (bValid) {
				return fnCheckForValidTargetZones.call(this, oOverlay, oRelevantContainerOverlay, bOnRegistration);
			}
			return bValid;
		}.bind(this));
	}
Check if the element is editable for the move
@param  {sap.ui.dt.Overlay}  oOverlay The overlay being moved or the aggregation overlay
@param  {boolean} bOnRegistration if embedded, false if not
@return {Promise.<boolean>} promise with true value if editable