function executeRenderer(oControl, bTriggerEvent) {
			// trigger onBeforeRendering hook of the control if needed
			if (bTriggerEvent) {
				triggerBeforeRendering(oControl);
			}

			// unbind any generically bound browser event handlers
			if (oControl.bOutput == true) {
				var aBindings = oControl.aBindParameters;
				if (aBindings && aBindings.length > 0) {
					var $Control = oControl.$();
					aBindings.forEach(function(mParams) {
						$Control.off(mParams.sEventType, mParams.fnProxy);
					});
				}
			}

			// if the control uses default visible property then use the InvisibleRenderer, otherwise the renderer of the control
			var oRenderer = getCurrentRenderer(oControl);
			if (oRenderer == InvisibleRenderer) {

				// invoke the InvisibleRenderer in case the control uses the default visible property
				InvisibleRenderer.render(bDomInterface ? oDomInterface : oStringInterface, oControl);

				// if an invisible placeholder was rendered, mark with invisible marker
				oControl.bOutput = "invisible";

			} else if (oRenderer && typeof oRenderer.render === "function") {

				// before the control rendering get custom style classes of the control
				var oControlStyles = {};
				if (oControl.aCustomStyleClasses && oControl.aCustomStyleClasses.length > 0) {
					oControlStyles.aCustomStyleClasses = oControl.aCustomStyleClasses;
				}

				// push them to the style stack that will be read by the first writeClasses/openEnd/voidEnd call to append additional classes
				aStyleStack.push(oControlStyles);

				// mark that the rendering phase has been started
				oControl._bRenderingPhase = true;

				// execute the control renderer according to rendering interface
				if (bDomInterface) {

					// remember the cursor of the Patcher before the control renderer is executed
					var oCurrentNode = oPatcher.getCurrentNode();

					// let the rendering happen with DOM rendering interface
					oRenderer.render(oDomInterface, oControl);

					// determine whether an output is produced
					if (oPatcher.getCurrentNode() == oCurrentNode) {

						// during the rendering the cursor of the Patcher should move to the next element when openStart or voidStart is called
						// compare after rendering cursor with before rendering cursor to determine whether the control produced any output
						// we need to remove the control DOM if there is no output produced
						oPatcher.unsafeHtml("", oControl.getId());
						oControl.bOutput = false;

					} else {

						// the cursor of the patcher is moved so the output is produced
						oControl.bOutput = true;
					}

				} else {

					// remember the buffer size before the control renderer is executed
					var iBufferLength = aBuffer.length;

					// let the rendering happen with DOM rendering interface
					oRenderer.render(oStringInterface, oControl);

					// compare after rendering buffer size with the before rendering buffer size to determine whether the control produced any output
					oControl.bOutput = (aBuffer.length != iBufferLength);
				}

				// mark that the rendering phase is over
				oControl._bRenderingPhase = false;

				// pop from the style stack after rendering for the next control
				aStyleStack.pop();

			} else {
				Log.error("The renderer for class " + oControl.getMetadata().getName() + " is not defined or does not define a render function! Rendering of " + oControl.getId() + " will be skipped!");
			}

			// store the rendered control
			aRenderedControls.push(oControl);

			// clear the controls dirty marker
			oControl._bNeedsRendering = false;

			// let the UIArea know that this control has been rendered
			var oUIArea = oControl.getUIArea();
			if (oUIArea) {
				oUIArea._onControlRendered(oControl);
			}
		}
Executes the control renderer with the valid rendering interface.

@param {sap.ui.core.Control} oControl The control that should be rendered
@param {boolean} bTriggerEvent Whether onBeforeRendering event should be triggered or not
@private