diff --git a/apps/nativescript-demo-ng/src/tests/renderer-tests.spec.ts b/apps/nativescript-demo-ng/src/tests/renderer-tests.spec.ts
index ed549ac7..1ad0f518 100644
--- a/apps/nativescript-demo-ng/src/tests/renderer-tests.spec.ts
+++ b/apps/nativescript-demo-ng/src/tests/renderer-tests.spec.ts
@@ -1,688 +1,694 @@
-// // make sure you import mocha-config before @angular/core
-
-// import { assert } from "./test-config";
-// import { Component, ComponentRef, ElementRef, NgZone, Renderer2, ViewChild } from "@angular/core";
-// import { ProxyViewContainer, LayoutBase, StackLayout, ContentView, Button, isIOS, View, Label } from "@nativescript/core";
-// import { Red } from "@nativescript/core/color/known-colors";
-// import { dumpView } from "./test-utils";
-// import { registerElement } from "@nativescript/angular";
-// import { fontInternalProperty, backgroundInternalProperty } from "@nativescript/core/ui/core/view"
-// import { nsTestBedAfterEach, nsTestBedBeforeEach, nsTestBedRender } from "@nativescript/angular/testing";
-// import { ComponentFixture, TestBed, async } from "@angular/core/testing";
-// import { Observable, ReplaySubject } from "rxjs";
-
-// @Component({
-// template: ``
-// })
-// export class ZonedRenderer {
-// constructor(public elementRef: ElementRef, public renderer: Renderer2) { }
-// }
-
-// @Component({
-// template: ``
-// })
-// export class LayoutWithLabel {
-// constructor(public elementRef: ElementRef) { }
-// }
-
-// @Component({
-// selector: "label-cmp",
-// template: ``
-// })
-// export class LabelCmp {
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// @Component({
-// template: ``
-// })
-// export class LabelContainer {
-// constructor(public elementRef: ElementRef) { }
-// }
-
-// @Component({
-// selector: "projectable-cmp",
-// template: ``
-// })
-// export class ProjectableCmp {
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-// @Component({
-// template: `
-//
-// `
-// })
-// export class ProjectionContainer {
-// constructor(public elementRef: ElementRef) { }
-// }
-
-// @Component({
-// selector: "styled-label-cmp",
-// styles: [
-// "Label { color: red; }",
-// ],
-// template: ``
-// })
-// export class StyledLabelCmp {
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// @Component({
-// selector: "styled-label-cmp2",
-// styles: [
-// `Label { color: red; }`,
-// `
-// StackLayout { color: brown; }
-// TextField { color: red; background-color: lime; }
-// `,
-// ],
-// template: `
-//
-//
-//
-//
-// `
-// })
-// export class StyledLabelCmp2 {
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// @Component({
-// selector: "host-styled",
-// styles: [`
-// Label {
-// color: blue;
-// }
-
-// :host Label {
-// color: red;
-// }
-// `
-// ],
-// template: ``
-// })
-// export class HostStyledCmp {
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// @Component({
-// selector: "host-styled-parent",
-// template: `
-//
-//
-// `
-// })
-// export class HostStyledParentCmp {
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// @Component({
-// selector: "ng-if-label",
-// template: ``
-// })
-// export class NgIfLabel {
-// public show: boolean = false;
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// @Component({
-// selector: "ng-if-two-elements",
-// template: `
-//
-//
-//
-//
-// `
-// })
-// export class NgIfTwoElements {
-// public show: boolean = false;
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// @Component({
-// selector: "ng-if-multiple",
-// template: `
-//
-//
-//
-//
-//
-//
-//
-// `
-// })
-// export class NgIfMultiple {
-// public show: boolean = false;
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// @Component({
-// selector: "ng-if-else",
-// template: `
-//
-//
-
-//
-//
-//
-//
-// `
-// })
-// export class NgIfElseComponent {
-// public show: boolean = true;
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// @Component({
-// selector: "ng-if-then-else",
-// template: `
-//
-//
-//
-
-//
-//
-//
-
-//
-//
-//
-//
-// `
-// })
-// export class NgIfThenElseComponent {
-// public show: boolean = true;
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// export class ButtonCounter extends Button {
-// nativeBackgroundRedraws = 0;
-// backgroundInternalSetNativeCount = 0;
-// fontInternalSetNativeCount = 0;
-
-// [backgroundInternalProperty.setNative](value) {
-// this.backgroundInternalSetNativeCount++;
-// return super[backgroundInternalProperty.setNative](value);
-// }
-// [fontInternalProperty.setNative](value) {
-// this.fontInternalSetNativeCount++;
-// return super[fontInternalProperty.setNative](value);
-// }
-// _redrawNativeBackground(value: any): void {
-// this.nativeBackgroundRedraws++;
-// super["_redrawNativeBackground"](value);
-// }
-// }
-// registerElement("ButtonCounter", () => ButtonCounter);
-
-// @Component({
-// selector: "ng-control-setters-count",
-// template: `
-//
-//
-//
-//
-//
-//
-// `,
-// styles: [`
-// #btn2, #btn3, #btn4 {
-// border-width: 2;
-// border-color: teal;
-// border-radius: 20;
-// font-weight: 400;
-// font-size: 32;
-// }`]
-// })
-// export class NgControlSettersCount {
-// @ViewChild("btn1", { static: false }) btn1: ElementRef;
-// @ViewChild("btn2", { static: false }) btn2: ElementRef;
-// @ViewChild("btn3", { static: false }) btn3: ElementRef;
-// @ViewChild("btn3", { static: false }) btn4: ElementRef;
-
-// get buttons(): ElementRef[] { return [this.btn1, this.btn2, this.btn3, this.btn4]; }
-
-// ready$: Observable = new ReplaySubject(1);
-
-// ngAfterViewInit() {
-// (this.ready$ as ReplaySubject).next(true);
-// }
-// }
-
-// @Component({
-// selector: "ng-for-label",
-// template: ``
-// })
-// export class NgForLabel {
-// public items: Array = ["one", "two", "three"];
-// constructor(public elementRef: ElementRef) {
-// }
-// }
-
-// describe("Renderer E2E", () => {
-// beforeEach(nsTestBedBeforeEach([
-// LayoutWithLabel, LabelCmp, LabelContainer,
-// ProjectableCmp, ProjectionContainer,
-// StyledLabelCmp, StyledLabelCmp2,
-// HostStyledCmp, HostStyledParentCmp,
-// NgIfLabel, NgIfThenElseComponent, NgIfMultiple,
-// NgIfTwoElements, NgIfMultiple,
-// NgIfElseComponent, NgIfThenElseComponent,
-// NgForLabel, ZonedRenderer
-// ]));
-// afterEach(nsTestBedAfterEach(false));
-
-// it("component with a layout", () => {
-// return nsTestBedRender(LayoutWithLabel).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const componentRoot = componentRef.instance.elementRef.nativeElement;
-// assert.equal("(proxyviewcontainer (stacklayout (label)))", dumpView(componentRoot));
-// });
-// });
-
-// it("component without a layout", () => {
-// return nsTestBedRender(LabelContainer).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const componentRoot = componentRef.instance.elementRef.nativeElement;
-// assert.equal("(proxyviewcontainer (gridlayout (proxyviewcontainer (label))))", dumpView(componentRoot));
-// });
-// });
-
-// it("projects content into components", () => {
-// return nsTestBedRender(ProjectionContainer).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const componentRoot = componentRef.instance.elementRef.nativeElement;
-// assert.equal(
-// "(proxyviewcontainer (gridlayout (proxyviewcontainer (stacklayout (button)))))",
-// dumpView(componentRoot));
-// });
-// });
-
-// it("applies component styles from single source", () => {
-// return nsTestBedRender(StyledLabelCmp).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const componentRoot = componentRef.instance.elementRef.nativeElement;
-// const label = (componentRoot).getChildAt(0);
-// assert.equal(Red, label.style.color.hex);
-// });
-// });
-
-// it("applies component :host styles", () => {
-// return nsTestBedRender(HostStyledParentCmp).then((fixture) => {
-// const proxyView = fixture.componentRef.instance.elementRef.nativeElement;
-
-// for (let i = 0; i < 2; i += 1) {
-// const child = proxyView.getChildAt(i) as ProxyViewContainer;
-// const label = child.getChildAt(0) as Label;
-// assert.equal(Red, label.style.color.hex);
-// }
-// });
-// });
-
-// it("applies component styles from multiple sources", () => {
-// return nsTestBedRender(StyledLabelCmp2).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const componentRoot = componentRef.instance.elementRef.nativeElement;
-// const layout = (componentRoot).getChildAt(0);
-
-// const label = (layout).getChildAt(0);
-// assert.equal(Red, label.style.color.hex);
-
-// const textField = (layout).getChildAt(1);
-// console.log("TEXT style.color: " + textField.style.color);
-// assert.equal(Red, textField.style.color.hex);
-// });
-// });
-
-// it("executes events inside NgZone when listen is called inside NgZone", async(() => {
-// const eventName = "someEvent";
-// const view = new StackLayout();
-// const eventArg = { eventName, object: view };
-// const callback = (arg) => {
-// assert.equal(arg, eventArg);
-// assert.isTrue(NgZone.isInAngularZone(), "Event should be executed inside NgZone");
-// };
-
-// nsTestBedRender(ZonedRenderer).then((fixture: ComponentFixture) => {
-// fixture.ngZone.run(() => {
-// fixture.componentInstance.renderer.listen(view, eventName, callback);
-// });
-
-// setTimeout(() => {
-// fixture.ngZone.runOutsideAngular(() => {
-// view.notify(eventArg);
-// });
-// }, 10);
-// });
-
-// }));
-
-// it("executes events inside NgZone when listen is called outside NgZone", async(() => {
-// const eventName = "someEvent";
-// const view = new StackLayout();
-// const eventArg = { eventName, object: view };
-// const callback = (arg) => {
-// assert.equal(arg, eventArg);
-// assert.isTrue(NgZone.isInAngularZone(), "Event should be executed inside NgZone");
-// };
-// nsTestBedRender(ZonedRenderer).then((fixture: ComponentFixture) => {
-// fixture.ngZone.runOutsideAngular(() => {
-// fixture.componentInstance.renderer.listen(view, eventName, callback);
-
-// view.notify(eventArg);
-// });
-// });
-// }));
-
-// describe("Structural directives", () => {
-// it("ngIf hides component when false", () => {
-// return nsTestBedRender(NgIfLabel).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const componentRoot = componentRef.instance.elementRef.nativeElement;
-// assert.equal("(proxyviewcontainer)", dumpView(componentRoot));
-// });
-// });
-
-// it("ngIf show component when true", () => {
-// return nsTestBedRender(NgIfLabel).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const component = componentRef.instance;
-// const componentRoot = component.elementRef.nativeElement;
-
-// component.show = true;
-// fixture.detectChanges();
-// assert.equal("(proxyviewcontainer (label))", dumpView(componentRoot));
-// });
-// });
-
-// it("ngIf shows elements in correct order when two are rendered", () => {
-// return nsTestBedRender(NgIfTwoElements).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const component = componentRef.instance;
-// const componentRoot = component.elementRef.nativeElement;
-
-// component.show = true;
-// fixture.detectChanges();
-// assert.equal(
-// "(proxyviewcontainer (stacklayout (label), (button)))",
-// dumpView(componentRoot));
-// });
-// });
-
-// it("ngIf shows elements in correct order when multiple are rendered and there's *ngIf", () => {
-// return nsTestBedRender(NgIfMultiple).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const component = componentRef.instance;
-// const componentRoot = component.elementRef.nativeElement;
-
-// component.show = true;
-// fixture.detectChanges();
-// assert.equal(
-// "(proxyviewcontainer " +
-// "(stacklayout " +
-// "(label[text=1]), " +
-// "(label[text=2]), " +
-// "(label[text=3]), " +
-// "(label[text=4]), " + // the content to be conditionally displayed
-// "(label[text=5])" +
-// ")" +
-// ")",
-// dumpView(componentRoot, true));
-// });
-// });
-
-// it("ngIfElse show 'if' template when condition is true", () => {
-// return nsTestBedRender(NgIfElseComponent).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const component = componentRef.instance;
-// const componentRoot = component.elementRef.nativeElement;
-
-// fixture.detectChanges();
-
-// assert.equal(
-// "(proxyviewcontainer " +
-// "(stacklayout " +
-// "(label[text=If])" +
-// ")" +
-// ")",
-
-// dumpView(componentRoot, true));
-// });
-// });
-
-// it("ngIfElse show 'else' template when condition is false", () => {
-// return nsTestBedRender(NgIfElseComponent).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const component = componentRef.instance;
-// const componentRoot = component.elementRef.nativeElement;
-
-// component.show = false;
-// fixture.detectChanges();
-// assert.equal(
-// "(proxyviewcontainer " +
-// "(stacklayout " +
-// "(label[text=Else])" +
-// ")" +
-// ")",
-
-// dumpView(componentRoot, true));
-// });
-// });
-
-// it("ngIfThenElse show 'then' template when condition is true", () => {
-// return nsTestBedRender(NgIfThenElseComponent).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const component = componentRef.instance;
-// const componentRoot = component.elementRef.nativeElement;
-
-// fixture.detectChanges();
-// assert.equal(
-// "(proxyviewcontainer " +
-// "(stacklayout " +
-// "(label[text=Then])" +
-// ")" +
-// ")",
-
-// dumpView(componentRoot, true));
-// });
-// });
-
-// it("ngIfThenElse show 'else' template when condition is false", () => {
-// return nsTestBedRender(NgIfThenElseComponent).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const component = componentRef.instance;
-// const componentRoot = component.elementRef.nativeElement;
-
-// component.show = false;
-// fixture.detectChanges();
-// assert.equal(
-// "(proxyviewcontainer " +
-// "(stacklayout " +
-// "(label[text=Else])" +
-// ")" +
-// ")",
-
-// dumpView(componentRoot, true));
-// });
-// });
-
-// it("ngFor creates element for each item", () => {
-// return nsTestBedRender(NgForLabel).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const componentRoot = componentRef.instance.elementRef.nativeElement;
-// assert.equal(
-// "(proxyviewcontainer (label[text=one]), (label[text=two]), (label[text=three]))",
-// dumpView(componentRoot, true));
-// });
-// });
-
-// it("ngFor updates when item is removed", () => {
-// return nsTestBedRender(NgForLabel).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const component = componentRef.instance;
-// const componentRoot = component.elementRef.nativeElement;
-
-// component.items.splice(1, 1);
-// fixture.detectChanges();
-
-// assert.equal(
-// "(proxyviewcontainer (label[text=one]), (label[text=three]))",
-// dumpView(componentRoot, true));
-// });
-// });
-
-// it("ngFor updates when item is inserted", () => {
-// return nsTestBedRender(NgForLabel).then((fixture) => {
-// const componentRef: ComponentRef = fixture.componentRef;
-// const component = componentRef.instance;
-// const componentRoot = component.elementRef.nativeElement;
-
-// component.items.splice(1, 0, "new");
-// fixture.detectChanges();
-
-// assert.equal(
-// "(proxyviewcontainer " +
-// "(label[text=one]), (label[text=new]), (label[text=two]), (label[text=three]))",
-// dumpView(componentRoot, true));
-// });
-// });
-// });
-// });
-
-// describe("Renderer createElement", () => {
-// let renderer: Renderer2 = null;
-// beforeEach(nsTestBedBeforeEach([ZonedRenderer]));
-// afterEach(nsTestBedAfterEach(false));
-// beforeEach(() => {
-// return nsTestBedRender(ZonedRenderer).then((fixture: ComponentFixture) => {
-// fixture.ngZone.run(() => {
-// renderer = fixture.componentInstance.renderer;
-// });
-// });
-// });
-
-// it("creates element from CamelCase", () => {
-// const result = renderer.createElement("StackLayout");
-// assert.instanceOf(result, StackLayout, "Renderer should create StackLayout form 'StackLayout'");
-// });
-
-// it("creates element from lowercase", () => {
-// const result = renderer.createElement("stacklayout");
-// assert.instanceOf(result, StackLayout, "Renderer should create StackLayout form 'stacklayout'");
-// });
-
-// it("creates element from kebab-case", () => {
-// const result = renderer.createElement("stack-layout");
-// assert.instanceOf(result, StackLayout, "Renderer should create StackLayout form 'stack-layout'");
-// });
-
-// it("creates ProxyViewContainer for unknownTag", () => {
-// const result = renderer.createElement("unknown-tag");
-// assert.instanceOf(result, ProxyViewContainer, "Renderer should create ProxyViewContainer form 'unknown-tag'");
-// });
-// });
-
-// describe("Renderer attach/detach", () => {
-// let renderer: Renderer2 = null;
-// beforeEach(nsTestBedBeforeEach([ZonedRenderer]));
-// afterEach(nsTestBedAfterEach(false));
-// beforeEach(() => {
-// return nsTestBedRender(ZonedRenderer).then((fixture: ComponentFixture) => {
-// fixture.ngZone.run(() => {
-// renderer = fixture.componentInstance.renderer;
-// });
-// });
-// });
-
-// it("createElement element with parent attaches element to content view", () => {
-// const parent = renderer.createElement("ContentView");
-// const button =