diff --git a/packages/core/test/acceptance/content_spec.ts b/packages/core/test/acceptance/content_spec.ts
index d0915c9538..24ca05122f 100644
--- a/packages/core/test/acceptance/content_spec.ts
+++ b/packages/core/test/acceptance/content_spec.ts
@@ -155,6 +155,84 @@ describe('projection', () => {
             `
Some content
Other content
`})
+    class Child {
+    }
+
+    @Component({selector: 'projected-comp', template: `Before
+          A
123
B
456
 `,
+    })
+    class Parent {
+    }
+
+    TestBed.configureTestingModule({declarations: [Parent, Child, ProjectedComp]});
+    const fixture = TestBed.createComponent(Parent);
+    fixture.detectChanges();
+
+    expect(fixture.nativeElement.innerHTML)
+        .toBe(
+            '' +
+            '
BeforeA
123
After ' +
+            '
BeforeB
456
After ' +
+            '
`})
+    class Child {
+    }
+
+    @Component({selector: 'projected-comp', template: `Before
+          A
123
B
456
 `,
+    })
+    class Parent {
+    }
+
+    @Component({
+      selector: 'app',
+      template: `
+        **ABC** 
+        **DEF** 
+     `,
+    })
+    class App {
+    }
+
+    TestBed.configureTestingModule({declarations: [App, Parent, Child, ProjectedComp]});
+    const fixture = TestBed.createComponent(App);
+    fixture.detectChanges();
+
+    expect(fixture.nativeElement.innerHTML)
+        .toBe(
+            '' +
+            '
BeforeA
**ABC**123
After ' +
+            '
BeforeB
456
After ' +
+            '
' +
+            '
BeforeA
**DEF**123
After ' +
+            '
BeforeB
456
After ' +
+            '
+          content `})
+    class Parent {
+    }
+
+    TestBed.configureTestingModule({declarations: [Parent, Child], imports: [CommonModule]});
+    const fixture = TestBed.createComponent(Parent);
+    fixture.detectChanges();
+
+    expect(getElementHtml(fixture.nativeElement))
+        .toBe('
content 
+      
+        content 
+       
+     
+      `
+    })
+    class Parent {
+    }
+
+    TestBed.configureTestingModule({declarations: [Parent, Child]});
+    const fixture = TestBed.createComponent(Parent);
+
+    fixture.detectChanges();
+    expect(getElementHtml(fixture.nativeElement)).toBe('content ');
+  });
+
+  it('should re-project ng-container at the content root', () => {
+    @Component({selector: 'grand-child', template: `
+       `
+    })
+    class Child {
+    }
+
+    @Component({
+      selector: 'parent',
+      template: `
+      
+        content 
+       
+     
+      `
+    })
+    class Parent {
+    }
+
+    TestBed.configureTestingModule({declarations: [Parent, Child, GrandChild]});
+    const fixture = TestBed.createComponent(Parent);
+
+    fixture.detectChanges();
+    expect(getElementHtml(fixture.nativeElement))
+        .toBe('content 
+          
`,
+      })
+      class Child {
+      }
+
+      @Component({
+        selector: 'parent',
+        template: `1 2 1 
2 
+          
`,
+      })
+      class Child {
+      }
+
+      @Component({
+        selector: 'parent',
+        template: `1 2 1 
2 
+          
`
+      })
+      class Child {
+      }
+
+      @Component({
+        selector: 'parent',
+        template:
+            `1 2 1 
2 
+          
`
+      })
+      class Child {
+      }
+
+      @Component({
+        selector: 'parent',
+        template: `1 2 1 2 
+          
`
+      })
+      class Child {
+      }
+
+      @Component({
+        selector: 'parent',
+        template:
+            `1 remaining more remaining1 
remaining more remaining
+          
`
+      })
+      class Child {
+      }
+
+      @Component({
+        selector: 'parent',
+        template: `1 2 remaining1 remaining
2 
+            in child template 
+           `
+      })
+      class Child {
+      }
+
+      @Component({selector: 'parent', template: `parent content in child template parent content 
+         Title 
+          `
+      })
+      class CardWithTitle {
+      }
+
+      @Component({selector: 'parent', template: `content `})
+      class Parent {
+      }
+
+      TestBed.configureTestingModule({declarations: [Card, CardWithTitle, Parent]});
+      const fixture = TestBed.createComponent(Parent);
+      fixture.detectChanges();
+
+      expect(getElementHtml(fixture.nativeElement))
+          .toEqual(
+              'Title should not project
should project
should project
 */
-    const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵelementStart(0, 'div');
-        { ɵɵprojection(1); }
-        ɵɵelementEnd();
-      }
-    }, 2);
-
-    /**
-     * 
-     *     (
-     *      % if (value) {
-     *        content
-     *      % }
-     *     )
-     *  
-     */
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: {value: any}) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'child');
-        {
-          ɵɵtext(1, '(');
-          ɵɵcontainer(2);
-          ɵɵtext(3, ')');
-        }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(2);
-        {
-          if (ctx.value) {
-            let rf0 = ɵɵembeddedViewStart(0, 1, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵtext(0, 'content');
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 4, 0, [Child]);
-
-    const parent = renderComponent(Parent);
-    expect(toHtml(parent)).toEqual('()
(content)
()
-     *    % if (value) {
-     *      content
-     *    % }
-     *  
-     */
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: {value: any}) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'child');
-        { ɵɵcontainer(1); }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(1);
-        {
-          if (ctx.value) {
-            let rf0 = ɵɵembeddedViewStart(0, 1, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵtext(0, 'content');
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 2, 0, [Child]);
-
-    const parent = renderComponent(Parent);
-    expect(toHtml(parent)).toEqual('content ');
-
-    parent.value = false;
-    detectChanges(parent);
-    expect(toHtml(parent)).toEqual('
 */
-    const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵelementStart(0, 'div');
-        { ɵɵprojection(1); }
-        ɵɵelementEnd();
-      }
-    }, 2);
-
-    /**
-     * 
-     *     (
-     *       % if (value) {
-     *         content
-     *       % } else {
-     *         else
-     *       % }
-     *     )
-     *  
-     */
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: {value: any}) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'child');
-        {
-          ɵɵtext(1, '(');
-          ɵɵcontainer(2);
-          ɵɵtext(3, ')');
-        }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(2);
-        {
-          if (ctx.value) {
-            let rf0 = ɵɵembeddedViewStart(0, 1, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵtext(0, 'content');
-            }
-            ɵɵembeddedViewEnd();
-          } else {
-            if (ɵɵembeddedViewStart(1, 1, 0)) {
-              ɵɵtext(0, 'else');
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 4, 0, [Child]);
-
-    const parent = renderComponent(Parent);
-    expect(toHtml(parent)).toEqual('(else)
(content)
(else)
-     *  % if (!skipContent) {
-     *    
-     *       
-     *  % }
-     * 
-     */
-    const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵelementStart(0, 'div');
-        { ɵɵcontainer(1); }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(1);
-        {
-          if (!ctx.skipContent) {
-            let rf0 = ɵɵembeddedViewStart(0, 2, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵelementStart(0, 'span');
-              ɵɵprojection(1);
-              ɵɵelementEnd();
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 2, 0);
-
-    /**
-     * 
-     *   text
-     *   content
-     *  
-     */
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'child');
-        {
-          ɵɵelementStart(1, 'div');
-          { ɵɵtext(2, 'text'); }
-          ɵɵelementEnd();
-          ɵɵtext(3, 'content');
-        }
-        ɵɵelementEnd();
-
-        // testing
-        childCmptInstance = getDirectiveOnNode(0);
-      }
-    }, 4, 0, [Child]);
-
-    const parent = renderComponent(Parent);
-    expect(toHtml(parent)).toEqual('
-     *  % if (!skipContent) {
-     *      
-     */
-    const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵelementStart(0, 'div');
-        { ɵɵcontainer(1); }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(1);
-        {
-          if (!ctx.skipContent) {
-            let rf0 = ɵɵembeddedViewStart(0, 2, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵprojection(0);
-              ɵɵtext(1, 'text');
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 2);
-
-    /** text
-        *  % if (!skipContent) {
-         *    
-        */
-       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-         if (rf & RenderFlags.Create) {
-           ɵɵprojectionDef();
-           ɵɵelementStart(0, 'div');
-           { ɵɵcontainer(1); }
-           ɵɵelementEnd();
-         }
-         if (rf & RenderFlags.Update) {
-           ɵɵcontainerRefreshStart(1);
-           {
-             if (!ctx.skipContent) {
-               let rf0 = ɵɵembeddedViewStart(0, 1, 0);
-               if (rf0 & RenderFlags.Create) {
-                 ɵɵprojection(0);
-               }
-               ɵɵembeddedViewEnd();
-             }
-           }
-           ɵɵcontainerRefreshEnd();
-         }
-       }, 2);
-
-       /**
-        * content 
-        */
-       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-         if (rf & RenderFlags.Create) {
-           ɵɵelementStart(0, 'child');
-           {
-             childCmptInstance = getDirectiveOnNode(0);
-             ɵɵtext(1, 'content');
-           }
-           ɵɵelementEnd();
-         }
-       }, 2, 0, [Child]);
-
-       const parent = renderComponent(Parent);
-       expect(toHtml(parent)).toEqual('content
-     *  Before (inside)
-     *  % if (!skipContent) {
-     *    
-     */
-    const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵelementStart(0, 'div');
-        {
-          ɵɵtext(1, 'Before (inside)-');
-          ɵɵcontainer(2);
-          ɵɵtext(3, '-After (inside)');
-        }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(2);
-        {
-          if (!ctx.skipContent) {
-            let rf0 = ɵɵembeddedViewStart(0, 1, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵprojection(0);
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 4);
-
-    /**
-     * 
-     *     Before text-
-     *     % if (!skipContent) {
-     *       content
-     *     % }
-     *     -After text
-     *  
-     */
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'child');
-        {
-          ɵɵtext(1, 'Before text-');
-          ɵɵcontainer(2);
-          ɵɵtext(3, '-After text');
-        }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(2);
-        {
-          if (!ctx.skipContent) {
-            let rf0 = ɵɵembeddedViewStart(0, 1, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵtext(0, 'content');
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 4, 0, [Child]);
-
-    const fixture = new ComponentFixture(Parent);
-    expect(fixture.html)
-        .toEqual(
-            'Before (inside)-Before text-content-After text-After (inside)
Before (inside)-Before text--After text-After (inside)
-     *  % if (!skipContent) {
-     *    
-     */
-    const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵelementStart(0, 'div');
-        { ɵɵcontainer(1); }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(1);
-        {
-          if (!ctx.skipContent) {
-            let rf0 = ɵɵembeddedViewStart(0, 1, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵprojection(0);
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 2);
-
-    /**
-     * 
-     *     Before text
-     *     % if (!skipContent) {
-     *        
-     */
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵelementStart(0, 'child');
-        {
-          ɵɵtext(1, 'Before text');
-          ɵɵcontainer(2);
-          ɵɵtext(3, '-After text');
-        }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(2);
-        {
-          if (!ctx.skipContent) {
-            let rf0 = ɵɵembeddedViewStart(0, 1, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵprojection(0);
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 4, 0, [Child]);
-
-    let parent: any;
-    /** text
Before text
text
-After text
Before text-After text
-        *  % if (!skipContent) {
-         *    before-
-        */
-       const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-         if (rf & RenderFlags.Create) {
-           ɵɵprojectionDef();
-           ɵɵelementStart(0, 'div');
-           { ɵɵcontainer(1); }
-           ɵɵelementEnd();
-         }
-         if (rf & RenderFlags.Update) {
-           ɵɵcontainerRefreshStart(1);
-           {
-             if (!ctx.skipContent) {
-               let rf0 = ɵɵembeddedViewStart(0, 3, 0);
-               if (rf0 & RenderFlags.Create) {
-                 ɵɵtext(0, 'before-');
-                 ɵɵprojection(1);
-                 ɵɵtext(2, '-after');
-               }
-               ɵɵembeddedViewEnd();
-             }
-           }
-           ɵɵcontainerRefreshEnd();
-         }
-       }, 2);
-
-       /**
-        * content 
-        */
-       const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-         if (rf & RenderFlags.Create) {
-           ɵɵelementStart(0, 'child');
-           {
-             childCmptInstance = getDirectiveOnNode(0);
-             ɵɵtext(1, 'content');
-           }
-           ɵɵelementEnd();
-         }
-       }, 2, 0, [Child]);
-
-       const parent = renderComponent(Parent);
-       expect(toHtml(parent)).toEqual('before-content-after
-     * content 
-     */
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'child');
-        { ɵɵtext(1, 'content'); }
-        ɵɵelementEnd();
-      }
-    }, 2, 0, [Child]);
-
-    const parent = renderComponent(Parent);
-    expect(toHtml(parent)).toEqual('
content  so we generate
-   * only one P(n, m, 0) instruction. It would make it consistent with the
-   * current Angular behavior:
-   * http://plnkr.co/edit/OAYkNawTDPkYBFTqovTP?p=preview
-   */
-  it('should project nodes into the last available ng-content', () => {
-    let childCmptInstance: any;
-    /**
-     *  
-     *  % if (show) {
-     *    
-     */
-    const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵprojection(0);
-        ɵɵelementStart(1, 'div');
-        { ɵɵcontainer(2); }
-        ɵɵelementEnd();
-      }
-      if (rf & RenderFlags.Update) {
-        ɵɵcontainerRefreshStart(2);
-        {
-          if (ctx.show) {
-            let rf0 = ɵɵembeddedViewStart(0, 1, 0);
-            if (rf0 & RenderFlags.Create) {
-              ɵɵprojection(0);
-            }
-            ɵɵembeddedViewEnd();
-          }
-        }
-        ɵɵcontainerRefreshEnd();
-      }
-    }, 3);
-
-    /**
-     * content 
-     */
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'child');
-        {
-          childCmptInstance = getDirectiveOnNode(0);
-          ɵɵtext(1, 'content');
-        }
-        ɵɵelementEnd();
-      }
-    }, 2, 0, [Child]);
-
-    const parent = renderComponent(Parent);
-    expect(toHtml(parent)).toEqual('content
 ');
-
-    childCmptInstance.show = true;
-    detectChanges(parent);
-    expect(toHtml(parent)).toEqual('content
-     *     A
-     *     123
-     *  
-     * 
-     *     B
-     *     456
-     *  
-     */
-    const AppComp = createComponent('app-comp', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'projection-comp');
-        {
-          ɵɵelementStart(1, 'div');
-          { ɵɵtext(2, 'A'); }
-          ɵɵelementEnd();
-          ɵɵelementStart(3, 'p');
-          { ɵɵtext(4, '123'); }
-          ɵɵelementEnd();
-        }
-        ɵɵelementEnd();
-        ɵɵelementStart(5, 'projection-comp');
-        {
-          ɵɵelementStart(6, 'div');
-          { ɵɵtext(7, 'B'); }
-          ɵɵelementEnd();
-          ɵɵelementStart(8, 'p');
-          { ɵɵtext(9, '456'); }
-          ɵɵelementEnd();
-        }
-        ɵɵelementEnd();
-      }
-    }, 10, 0, [ProjectionComp]);
-
-    const fixture = new ComponentFixture(AppComp);
-    fixture.update();
-    expect(fixture.html)
-        .toEqual(
-            'BeforeA
123
After ' +
-            'BeforeB
456
After ');
-  });
-
-  it('should re-project with multiple instances of a component with projection', () => {
-    /**
-     * Before
-     * 
-     *     A
-     *     123
-     *  
-     * 
-     *     B
-     *     456
-     *  
-     */
-    const ProjectionParent = createComponent('parent-comp', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵelementStart(0, 'projection-comp');
-        {
-          ɵɵelementStart(1, 'div');
-          { ɵɵtext(2, 'A'); }
-          ɵɵelementEnd();
-          ɵɵprojection(3, 0);
-          ɵɵelementStart(4, 'p');
-          { ɵɵtext(5, '123'); }
-          ɵɵelementEnd();
-        }
-        ɵɵelementEnd();
-        ɵɵelementStart(6, 'projection-comp');
-        {
-          ɵɵelementStart(7, 'div');
-          { ɵɵtext(8, 'B'); }
-          ɵɵelementEnd();
-          ɵɵelementStart(9, 'p');
-          { ɵɵtext(10, '456'); }
-          ɵɵelementEnd();
-        }
-        ɵɵelementEnd();
-      }
-    }, 11, 0, [ProjectionComp]);
-
-    /**
-     * 
-     *    **ABC**
-     *  
-     * 
-     *    **DEF**
-     *  
-     */
-    const AppComp = createComponent('app-comp', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'parent-comp');
-        { ɵɵtext(1, '**ABC**'); }
-        ɵɵelementEnd();
-        ɵɵelementStart(2, 'parent-comp');
-        { ɵɵtext(3, '**DEF**'); }
-        ɵɵelementEnd();
-      }
-    }, 4, 0, [ProjectionParent]);
-
-    const fixture = new ComponentFixture(AppComp);
-    fixture.update();
-    expect(fixture.html)
-        .toEqual(
-            '' +
-            'BeforeA
**ABC**123
After ' +
-            'BeforeB
456
After  ' +
-            '' +
-            'BeforeA
**DEF**123
After ' +
-            'BeforeB
456
After  ');
-  });
-
-  it('should project ng-container at the content root', () => {
-
-    `
-      
-        
-          content
-         
-       
-     `;
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'child');
-        {
-          ɵɵelementContainerStart(1);
-          {
-            ɵɵelementContainerStart(2);
-            { ɵɵtext(3, 'content'); }
-            ɵɵelementContainerEnd();
-          }
-          ɵɵelementContainerEnd();
-        }
-        ɵɵelementEnd();
-      }
-    }, 4, 0, [Child]);
-
-    const parent = renderComponent(Parent);
-    expect(toHtml(parent)).toEqual('content ');
-  });
-
-  it('should re-project ng-container at the content root', () => {
-
-    `
-       `;
-    const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵprojectionDef();
-        ɵɵelementStart(0, 'grand-child');
-        { ɵɵprojection(1); }
-        ɵɵelementEnd();
-      }
-    }, 2, 0, [GrandChild]);
-
-    `
-      
-        
-          content
-         
-       
-     `;
-    const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-      if (rf & RenderFlags.Create) {
-        ɵɵelementStart(0, 'child');
-        {
-          ɵɵelementContainerStart(1);
-          {
-            ɵɵelementContainerStart(2);
-            { ɵɵtext(3, 'content'); }
-            ɵɵelementContainerEnd();
-          }
-          ɵɵelementContainerEnd();
-        }
-        ɵɵelementEnd();
-      }
-    }, 4, 0, [Child]);
-
-    const parent = renderComponent(Parent);
-    expect(toHtml(parent)).toEqual('content 
-       *  
-       */
-      const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          // selectors are in lowercase once compiled
-          ɵɵprojectionDef(['*', [['span', 'title', 'tofirst']], [['span', 'title', 'tosecond']]]);
-          ɵɵelementStart(0, 'div', ['id', 'first']);
-          { ɵɵprojection(1, 1); }
-          ɵɵelementEnd();
-          ɵɵelementStart(2, 'div', ['id', 'second']);
-          { ɵɵprojection(3, 2); }
-          ɵɵelementEnd();
-        }
-      }, 4);
-
-      /**
-       * 
-       *  1 
-       *  2 
-       *  
-       */
-      const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵelementStart(0, 'child');
-          {
-            ɵɵelementStart(1, 'span', ['title', 'toFirst']);
-            { ɵɵtext(2, '1'); }
-            ɵɵelementEnd();
-            ɵɵelementStart(3, 'span', ['title', 'toSecond']);
-            { ɵɵtext(4, '2'); }
-            ɵɵelementEnd();
-          }
-          ɵɵelementEnd();
-        }
-      }, 5, 0, [Child]);
-
-      const parent = renderComponent(Parent);
-      expect(toHtml(parent))
-          .toEqual(
-              '1 
2 
-       *  
-       */
-      const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          // selectors are in lowercase once compiled
-          ɵɵprojectionDef([
-            '*', [['span', SelectorFlags.CLASS, 'tofirst']],
-            [['span', SelectorFlags.CLASS, 'tosecond']]
-          ]);
-          ɵɵelementStart(0, 'div', ['id', 'first']);
-          { ɵɵprojection(1, 1); }
-          ɵɵelementEnd();
-          ɵɵelementStart(2, 'div', ['id', 'second']);
-          { ɵɵprojection(3, 2); }
-          ɵɵelementEnd();
-        }
-      }, 4);
-
-      /**
-       * 
-       *  1 
-       *  2 
-       *  
-       */
-      const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵelementStart(0, 'child');
-          {
-            ɵɵelementStart(1, 'span', ['class', 'toFirst']);
-            { ɵɵtext(2, '1'); }
-            ɵɵelementEnd();
-            ɵɵelementStart(3, 'span', ['class', 'toSecond']);
-            { ɵɵtext(4, '2'); }
-            ɵɵelementEnd();
-          }
-          ɵɵelementEnd();
-        }
-      }, 5, 0, [Child]);
-
-      const parent = renderComponent(Parent);
-      expect(toHtml(parent))
-          .toEqual(
-              '1 
2 
-       *  
-       */
-      const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          // selectors are in lowercase once compiled
-          ɵɵprojectionDef([
-            '*', [['span', SelectorFlags.CLASS, 'tofirst']],
-            [['span', SelectorFlags.CLASS, 'tosecond']]
-          ]);
-          ɵɵelementStart(0, 'div', ['id', 'first']);
-          { ɵɵprojection(1, 1); }
-          ɵɵelementEnd();
-          ɵɵelementStart(2, 'div', ['id', 'second']);
-          { ɵɵprojection(3, 2); }
-          ɵɵelementEnd();
-        }
-      }, 4);
-
-      /**
-       * 
-       *  1 
-       *  2 
-       *  
-       */
-      const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵelementStart(0, 'child');
-          {
-            ɵɵelementStart(1, 'span', ['class', 'other toFirst']);
-            { ɵɵtext(2, '1'); }
-            ɵɵelementEnd();
-            ɵɵelementStart(3, 'span', ['class', 'toSecond noise']);
-            { ɵɵtext(4, '2'); }
-            ɵɵelementEnd();
-          }
-          ɵɵelementEnd();
-        }
-      }, 5, 0, [Child]);
-
-      const parent = renderComponent(Parent);
-      expect(toHtml(parent))
-          .toEqual(
-              '1 
2 
-       *  
-       */
-      const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵprojectionDef(['*', [['span']], [['span', SelectorFlags.CLASS, 'toSecond']]]);
-          ɵɵelementStart(0, 'div', ['id', 'first']);
-          { ɵɵprojection(1, 1); }
-          ɵɵelementEnd();
-          ɵɵelementStart(2, 'div', ['id', 'second']);
-          { ɵɵprojection(3, 2); }
-          ɵɵelementEnd();
-        }
-      }, 4);
-
-      /**
-       * 
-       *  1 
-       *  2 
-       *  
-       */
-      const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵelementStart(0, 'child');
-          {
-            ɵɵelementStart(1, 'span', ['class', 'toFirst']);
-            { ɵɵtext(2, '1'); }
-            ɵɵelementEnd();
-            ɵɵelementStart(3, 'span', ['class', 'toSecond']);
-            { ɵɵtext(4, '2'); }
-            ɵɵelementEnd();
-          }
-          ɵɵelementEnd();
-        }
-      }, 5, 0, [Child]);
-
-      const parent = renderComponent(Parent);
-      expect(toHtml(parent))
-          .toEqual(
-              '1 2 
-       *  
-       */
-      const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          // selectors are in lowercase once compiled
-          ɵɵprojectionDef(['*', [['span', SelectorFlags.CLASS, 'tofirst']]]);
-          ɵɵelementStart(0, 'div', ['id', 'first']);
-          { ɵɵprojection(1, 1); }
-          ɵɵelementEnd();
-          ɵɵelementStart(2, 'div', ['id', 'second']);
-          { ɵɵprojection(3); }
-          ɵɵelementEnd();
-        }
-      }, 4);
-
-      /**
-       * 
-       *  1 
-       *  2 
-       *  
-       */
-      const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵelementStart(0, 'child');
-          {
-            ɵɵelementStart(1, 'span', ['class', 'toFirst']);
-            { ɵɵtext(2, '1'); }
-            ɵɵelementEnd();
-            ɵɵelementStart(3, 'span');
-            { ɵɵtext(4, 'remaining'); }
-            ɵɵelementEnd();
-            ɵɵtext(5, 'more remaining');
-          }
-          ɵɵelementEnd();
-        }
-      }, 6, 0, [Child]);
-
-      const parent = renderComponent(Parent);
-      expect(toHtml(parent))
-          .toEqual(
-              '1 
remaining more remaining
-       *  
-       */
-      const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          // selectors are in lowercase once compiled
-          ɵɵprojectionDef(['*', [['span', SelectorFlags.CLASS, 'tosecond']]]);
-          ɵɵelementStart(0, 'div', ['id', 'first']);
-          { ɵɵprojection(1); }
-          ɵɵelementEnd();
-          ɵɵelementStart(2, 'div', ['id', 'second']);
-          { ɵɵprojection(3, 1); }
-          ɵɵelementEnd();
-        }
-      }, 4);
-
-      /**
-       * 
-       *  1 
-       *  2 
-       *  remaining
-       *  
-       */
-      const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵelementStart(0, 'child');
-          {
-            ɵɵelementStart(1, 'span');
-            { ɵɵtext(2, '1'); }
-            ɵɵelementEnd();
-            ɵɵelementStart(3, 'span', ['class', 'toSecond']);
-            { ɵɵtext(4, '2'); }
-            ɵɵelementEnd();
-            ɵɵtext(5, 'remaining');
-          }
-          ɵɵelementEnd();
-        }
-      }, 6, 0, [Child]);
-
-      const parent = renderComponent(Parent);
-      expect(toHtml(parent))
-          .toEqual(
-              '1 remaining
2 
-       *    in child template 
-       *   
-       */
-      const Child = createComponent('child', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵprojectionDef();
-          ɵɵelementStart(0, 'grand-child');
-          {
-            ɵɵprojection(1);
-            ɵɵelementStart(2, 'span');
-            { ɵɵtext(3, 'in child template'); }
-            ɵɵelementEnd();
-          }
-          ɵɵelementEnd();
-        }
-      }, 4, 0, [GrandChild]);
-
-      /**
-       * 
-       *  
-       *    parent content
-       *  
-       *  
-       */
-      const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵelementStart(0, 'child');
-          {
-            ɵɵelementStart(1, 'span');
-            { ɵɵtext(2, 'parent content'); }
-            ɵɵelementEnd();
-          }
-          ɵɵelementEnd();
-        }
-      }, 3, 0, [Child]);
-
-      const parent = renderComponent(Parent);
-      expect(toHtml(parent))
-          .toEqual(
-              'in child template parent content 
-       *  Title 
-       *   
-       */
-      const CardWithTitle = createComponent('card-with-title', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵprojectionDef();
-          ɵɵelementStart(0, 'card');
-          {
-            ɵɵelementStart(1, 'h1', ['card-title', '']);
-            { ɵɵtext(2, 'Title'); }
-            ɵɵelementEnd();
-            ɵɵprojection(3, 0, ['card-content', '']);
-          }
-          ɵɵelementEnd();
-        }
-      }, 4, 0, [Card]);
-
-      /**
-       * 
-       *  content
-       *  
-       */
-      const App = createComponent('app', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵelementStart(0, 'card-with-title');
-          { ɵɵtext(1, 'content'); }
-          ɵɵelementEnd();
-        }
-      }, 2, 0, [CardWithTitle]);
-
-      const app = renderComponent(App);
-      expect(toHtml(app))
-          .toEqual(
-              'Title 
-       *  should not project
-       *  should project
-       *  
-       */
-      const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) {
-        if (rf & RenderFlags.Create) {
-          ɵɵelementStart(0, 'child');
-          {
-            ɵɵelementStart(1, 'div', [AttributeMarker.ProjectAs, ['span']]);
-            { ɵɵtext(2, 'should not project'); }
-            ɵɵelementEnd();
-            ɵɵelementStart(3, 'div');
-            { ɵɵtext(4, 'should project'); }
-            ɵɵelementEnd();
-          }
-          ɵɵelementEnd();
-        }
-      }, 5, 0, [Child]);
-
-      const parent = renderComponent(Parent);
-      expect(toHtml(parent)).toEqual('should project