function checkPendingChanges() {
			assert.strictEqual(oBusinessPartnerList.getBinding("items").hasPendingChanges(), true);
			assert.strictEqual(oBusinessPartnerContext.hasPendingChanges(), true);
		}
******************************************************************************************
	// Scenario: Create entity for a ListBinding relative to a newly created entity
	QUnit.test("Create relative, on newly created entity", function (assert) {
		var oEmployeeCreatedContext,
			oModel = this.createTeaBusiModel(),
			oTable,
			oTeamCreatedContext,
			sView = '\
<FlexBox binding="{path : \'\',\
		parameters : {\
			$expand : {\
				\'TEAM_2_EMPLOYEES\' : {\
					$select : \'__CT__FAKE__Message/__FAKE__Messages,ID\'\
				}\
			}\
		}}" id="form">\
	<Table id="table" items="{TEAM_2_EMPLOYEES}">\
		<Input id="id" value="{ID}"/>\
	</Table>\
</FlexBox>',
			that = this;

		this.expectChange("id", []);

		return this.createView(assert, sView, oModel).then(function () {
			// create a new team
			that.expectRequest({
					method : "POST",
					url : "TEAMS",
					payload : {}
				}, {Team_Id : "23"});

			oTeamCreatedContext = oModel.bindList("/TEAMS").create({}, true);

			return Promise.all([
				oTeamCreatedContext.created(),
				that.waitForChanges(assert)
			]);
		}).then(function () {
			assert.strictEqual(oTeamCreatedContext.getPath(), "/TEAMS('23')");

			that.expectRequest("TEAMS('23')?$expand=TEAM_2_EMPLOYEES("
					+ "$select=__CT__FAKE__Message/__FAKE__Messages,ID)", {
					Team_Id : "23",
					TEAM_2_EMPLOYEES : [{
						ID : "3",
						__CT__FAKE__Message : {__FAKE__Messages : []}
					}]
				})
				.expectChange("id", ["3"])
				.expectMessages([]);

			that.oView.byId("form").setBindingContext(oTeamCreatedContext);

			return that.waitForChanges(assert);
		}).then(function () {
			// create new relative entity
			that.expectRequest({
					method : "POST",
					url : "TEAMS('23')/TEAM_2_EMPLOYEES",
					payload : {ID : null}
				}, {
					ID : "7",
					__CT__FAKE__Message : {
						__FAKE__Messages : [{
							code : "1",
							message : "Enter an ID",
							numericSeverity : 3,
							target : "ID",
							transition : false
						}]
					}
				})
				.expectChange("id", [""]) // from setValue(null)
				.expectChange("id", ["7", "3"])
				.expectMessages([{
					code : "1",
					message : "Enter an ID",
					target : "/TEAMS('23')/TEAM_2_EMPLOYEES('7')/ID",
					type : "Warning"
				}]);

			oTable = that.oView.byId("table");
			oEmployeeCreatedContext = oTable.getBinding("items").create({ID : null}, true);

			return Promise.all([
				oEmployeeCreatedContext.created(),
				that.waitForChanges(assert)
			]);
		}).then(function () {
			// the new one is at the top
			var oInput = oTable.getItems()[0].getCells()[0];

			assert.strictEqual(oEmployeeCreatedContext.getPath(),
				 "/TEAMS('23')/TEAM_2_EMPLOYEES('7')");
			assert.strictEqual(oInput.getBindingContext().getPath(),
				oEmployeeCreatedContext.getPath(), "we got the right input control");

			return that.checkValueState(assert, oInput, "Warning", "Enter an ID");
		});
	});

	//*********************************************************************************************
	// Scenario: if a 1 to n navigation occurs we use the deep path for this case instead of the
	// canonical path; the app can opt-out of this behavior with a binding specific parameter
	// CPOUI5UISERVICESV3-1567
	// Delete and Patch still use the canonical path. Messages have to be reported with the deep
	// path.
	// CPOUI5UISERVICESV3-1813
	// No "sap-cancel-on-close" header in DELETE request (JIRA: CPOUI5ODATAV4-2506)
	[false, true].forEach(function (bUseCanonicalPath) {
		QUnit.test("read with deep path, $$canonicalPath: " + bUseCanonicalPath, function (assert) {
			var sEntityPath = bUseCanonicalPath
					? "BusinessPartnerList('23')"
					: "SalesOrderList('0500000000')/SO_2_BP",
				oModel = this.createSalesOrdersModel({
					autoExpandSelect : true,
					groupId : "$direct"
				}),
				sParameters = bUseCanonicalPath
					? "parameters : {$$canonicalPath : true}"
					: "parameters : {$$ownRequest : true}",
				oTable,
				sView = '\
<FlexBox binding="{/SalesOrderList(\'0500000000\')/SO_2_BP}">\
	<Text text="{BusinessPartnerID}"/>\
	<FlexBox binding="{path : \'\',\
		' + sParameters + '\
		}">\
		<layoutData><FlexItemData/></layoutData>\
		<Text id="street" text="{Address/Street}"/>\
	</FlexBox>\
	<Table id="table" items="{path : \'BP_2_PRODUCT\', ' + sParameters + '\ }">\
		<Text text="{ProductID}"/>\
		<Input value="{Name}"/>\
	</Table>\
</FlexBox>',
				that = this;

			this.expectRequest("SalesOrderList('0500000000')/SO_2_BP?$select=BusinessPartnerID", {
					BusinessPartnerID : "23"
				})
				.expectRequest(sEntityPath + "?$select=Address/Street,BusinessPartnerID", {
					Address : {Street : "Bakerstreet"},
					BusinessPartnerID : "23"
				})
				.expectRequest(sEntityPath + "/BP_2_PRODUCT?$select=Name,ProductID&$skip=0"
					+ "&$top=100", {
					value : [{
						"@odata.etag" : "ETag",
						ProductID : "1",
						Name : "NoName"
					}]
				});

			return this.createView(assert, sView, oModel).then(function () {
				var oError = createError({
						code : "top_patch",
						message : "Error occurred while processing the request",
						details : [{
							code : "bound_patch",
							message : "Must not change mock data",
							"@Common.longtextUrl" : "Messages(1)/LongText",
							"@Common.numericSeverity" : 4,
							target : "Name"
						}]
					});

				oTable = that.oView.byId("table");

				that.oLogMock.expects("error").twice() // Note: twice, w/ different class name :-(
					.withArgs("Failed to update path /SalesOrderList('0500000000')/SO_2_BP/"
						+ "BP_2_PRODUCT('1')/Name", sinon.match(oError.message));
				that.expectRequest({
						method : "PATCH",
						url : "ProductList('1')",
						headers : {"If-Match" : "ETag"},
						payload : {Name : "A product with no name"}
					}, oError)
					.expectMessages([{
						code : "top_patch",
						message : "Error occurred while processing the request",
						persistent : true,
						technical : true,
						type : "Error"
					}, {
						code : "bound_patch",
						descriptionUrl : sSalesOrderService + "Messages(1)/LongText",
						message : "Must not change mock data",
						persistent : true,
						target : "/SalesOrderList('0500000000')/SO_2_BP/BP_2_PRODUCT('1')/Name",
						type : "Error"
					}]);

				// code under test
				oTable.getItems("items")[0].getCells()[1].getBinding("value")
					.setValue("A product with no name");

				return that.waitForChanges(assert);
			}).then(function () {
				var oInput = oTable.getItems("items")[0].getCells()[1];

				return that.checkValueState(assert, oInput, "Error", "Must not change mock data");
			}).then(function () {
				var oError = createError({
						code : "top_delete",
						message : "Error occurred while processing the request",
						details : [{
							code : "bound_delete",
							message : "Must not delete mock data",
							"@Common.longtextUrl" : "./Messages(1)/LongText",
							"@Common.numericSeverity" : 4,
							target : ""
						}]
					});

				that.oLogMock.expects("error").withExactArgs("Failed to delete"
						+ " /SalesOrderList('0500000000')/SO_2_BP/BP_2_PRODUCT('1')",
						sinon.match(oError.message), sContext);
				that.expectRequest({
						method : "DELETE",
						url : "ProductList('1')",
						headers : {"If-Match" : "ETag"/*, NO "sap-cancel-on-close"