function constructor(oModel, sPath, oContext, mParameters) {
		var iPos = sPath.indexOf("(...)"),
			that = this;

		ContextBinding.call(this, oModel, sPath);
		// initialize mixin members
		asODataParentBinding.call(this);

		if (sPath.endsWith("/")) {
			throw new Error("Invalid path: " + sPath);
		}
		// Whether the binding has fetched its own $select/$expand in the current parent cache
		this.bHasFetchedExpandSelectProperties = false;
		this.oOperation = undefined;
		this.oParameterContext = null;
		this.oReturnValueContext = null;
		if (iPos >= 0) { // deferred operation binding
			if (iPos !== this.sPath.length - /*"(...)".length*/5) {
				throw new Error(
					"The path must not continue after a deferred operation: " + this.sPath);
			}

			this.oOperation = {
				bAction : undefined,
				// Whether the operation is a bound action with a navigation property inside the
				// path to its binding parameter, and thus additional ($expand/$select) query
				// options have been computed to facilitate a RVC.
				// undefined: unknown whether it is possible to determine the needed query options
				// true: query options are determined
				// false: the preconditions are not given to determine the query options
				bAdditionalQueryOptionsForRVC : undefined,
				mChangeListeners : {}, // map from path to an array of change listeners
				mParameters : {},
				mRefreshParameters : {}
			};
			if (!this.bRelative) {
				this.oParameterContext = Context.create(this.oModel, this,
					this.sPath + "/$Parameter");
			}
		}

		mParameters = _Helper.clone(mParameters) || {};
		// Note: needs this.oOperation
		this.checkBindingParameters(mParameters, ["$$canonicalPath", "$$groupId",
			"$$inheritExpandSelect", "$$ownRequest", "$$patchWithoutSideEffects",
			"$$updateGroupId"]);
		this.sGroupId = mParameters.$$groupId;
		this.bInheritExpandSelect = mParameters.$$inheritExpandSelect;
		this.sUpdateGroupId = mParameters.$$updateGroupId;

		this.applyParameters(mParameters);
		this.oElementContext = this.bRelative
			? null
			: Context.createNewContext(this.oModel, this, sPath);
		if (!this.oOperation
			&& (!this.bRelative || oContext && !oContext.fetchValue)) { // @see #isRoot
			// do this before #setContext fires an event!
			this.createReadGroupLock(this.getGroupId(), true);
		}
		this.setContext(oContext);
		oModel.bindingCreated(this);

		Promise.resolve().then(function () {
			// bInitial must be true initially, but false later. Then suspend on a just
			// created binding causes a change event on resume; otherwise further changes
			// on the suspended binding are required (see doSuspend)
			that.bInitial = false;
		});
	}
******************************************************************************************
	// ODataContextBinding
	//*********************************************************************************************

	/**
Do <strong>NOT</strong> call this private constructor, but rather use
{@link sap.ui.model.odata.v4.ODataModel#bindContext} instead!

@param {sap.ui.model.odata.v4.ODataModel} oModel
  The OData V4 model
@param {string} sPath
  The binding path in the model; must not end with a slash
@param {sap.ui.model.Context} [oContext]
  The context which is required as base for a relative path
@param {object} [mParameters]
  Map of binding parameters
@throws {Error}
  If disallowed binding parameters are provided